{"_id":"@bnomei/emdash-actions","_rev":"9-4b6bcddc2ba304d0ef256f0f18894e6c","name":"@bnomei/emdash-actions","dist-tags":{"latest":"0.4.1"},"versions":{"0.1.0":{"name":"@bnomei/emdash-actions","version":"0.1.0","keywords":["astro","cloudflare","cms","emdash","emdash-plugin","react","serverless","typescript"],"author":{"url":"https://bnomei.com","name":"Bruno Meilick","email":"b@bnomei.com"},"license":"MIT","_id":"@bnomei/emdash-actions@0.1.0","maintainers":[{"name":"bnomei","email":"b@bnomei.com"}],"homepage":"https://github.com/bnomei/emdash-actions#readme","bugs":{"url":"https://github.com/bnomei/emdash-actions/issues"},"dist":{"shasum":"3ac8e8cf5feaa7ad864c99b1817f447dfb0b2f90","tarball":"https://registry.npmjs.org/@bnomei/emdash-actions/-/emdash-actions-0.1.0.tgz","fileCount":9,"integrity":"sha512-yxQI6N68XuJvmHlDLLkRLxbFLeThQC251ozkQWgw6qApsO3fVWycV/NxHulhs0+fAa8FqNambKaD3qfII/ErLQ==","signatures":[{"sig":"MEUCIQCPYLgzykyykWzAIhoy6qwGzIPiq/+2GU4qHoC7pQKj1AIgf2vH7an1PJ+4OLi1hedSzN3zl7T3WiqvaG7OEOt2s0o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":65434},"main":"./dist/index.mjs","type":"module","types":"./dist/index.d.mts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs"},"./admin":{"types":"./dist/admin.d.mts","import":"./dist/admin.mjs"}},"gitHead":"7a23ad1dc5369ab1f44752c95569e6c0b9058030","scripts":{"build":"vp pack src/index.ts src/admin.tsx --format esm --dts --clean --tsconfig tsconfig.json","check":"vp check .","prepack":"npm run build","typecheck":"tsc --noEmit","pack:check":"vp pack src/index.ts src/admin.tsx --format esm --dts --clean --tsconfig tsconfig.json --publint","types:check":"attw --pack . --profile esm-only --no-summary","prepublishOnly":"npm run check && npm run typecheck && npm run pack:check && npm run types:check"},"_npmUser":{"name":"bnomei","email":"b@bnomei.com"},"repository":{"url":"git+https://github.com/bnomei/emdash-actions.git","type":"git"},"_npmVersion":"11.16.0","description":"Native action surface for EmDash provider plugins.","directories":{},"sideEffects":false,"_nodeVersion":"26.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.6.0","devDependencies":{"react":"^19.2.7","emdash":"^0.19.0","publint":"^0.3.21","react-dom":"^19.2.7","vite-plus":"^0.1.24","typescript":"^6.0.3","@types/react":"^19.2.17","@cloudflare/kumo":"^2.5.2","@types/react-dom":"^19.2.3","@arethetypeswrong/cli":"^0.18.3","@phosphor-icons/react":"^2.1.10"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","emdash":">=0.17.0","react-dom":"^18.0.0 || ^19.0.0","@cloudflare/kumo":"^2.5.0","@phosphor-icons/react":"^2.1.10"},"_npmOperationalInternal":{"tmp":"tmp/emdash-actions_0.1.0_1781535818160_0.8923716098096606","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@bnomei/emdash-actions","version":"0.2.0","keywords":["astro","cloudflare","cms","emdash","emdash-plugin","react","serverless","typescript"],"author":{"url":"https://bnomei.com","name":"Bruno Meilick","email":"b@bnomei.com"},"license":"MIT","_id":"@bnomei/emdash-actions@0.2.0","maintainers":[{"name":"bnomei","email":"b@bnomei.com"}],"homepage":"https://github.com/bnomei/emdash-actions#readme","bugs":{"url":"https://github.com/bnomei/emdash-actions/issues"},"dist":{"shasum":"e98b639b61e4cf7007d132d56d9ce825ee1b36be","tarball":"https://registry.npmjs.org/@bnomei/emdash-actions/-/emdash-actions-0.2.0.tgz","fileCount":9,"integrity":"sha512-lXBveLLG60zpWZdaNM+AdvG/3Qx8cL2MVL6ZbIAhtCUvQvd5zCse39/250Fjljopyh1rpbRS5YP9wJTEgKGZWA==","signatures":[{"sig":"MEYCIQCRs0buEENvszOI0vvkCqQ4HiklAXgyjmwrCb8mWfeXmQIhAMcxYfy9PqRHlCJxbAxrZC54zYuUlUD3cpJbEH19Hvil","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":93665},"main":"./dist/index.mjs","type":"module","types":"./dist/index.d.mts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs"},"./admin":{"types":"./dist/admin.d.mts","import":"./dist/admin.mjs"}},"gitHead":"7de3644ad3e431ff1fc0abb49f5f2016da535e01","scripts":{"build":"vp pack src/index.ts src/admin.tsx --format esm --dts --clean --tsconfig tsconfig.json","check":"vp check .","prepack":"npm run build","typecheck":"tsc --noEmit","pack:check":"vp pack src/index.ts src/admin.tsx --format esm --dts --clean --tsconfig tsconfig.json --publint","types:check":"attw --pack . --profile esm-only --no-summary","prepublishOnly":"npm run check && npm run typecheck && npm run pack:check && npm run types:check"},"_npmUser":{"name":"bnomei","email":"b@bnomei.com"},"repository":{"url":"git+https://github.com/bnomei/emdash-actions.git","type":"git"},"_npmVersion":"11.16.0","description":"Native action surface for EmDash provider plugins.","directories":{},"sideEffects":false,"_nodeVersion":"26.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.6.0","devDependencies":{"react":"^19.2.7","emdash":"^0.19.0","publint":"^0.3.21","react-dom":"^19.2.7","vite-plus":"^0.1.24","typescript":"^6.0.3","@types/react":"^19.2.17","@cloudflare/kumo":"^2.5.2","@types/react-dom":"^19.2.3","@arethetypeswrong/cli":"^0.18.3","@phosphor-icons/react":"^2.1.10"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","emdash":">=0.17.0","react-dom":"^18.0.0 || ^19.0.0","@cloudflare/kumo":"^2.5.0","@phosphor-icons/react":"^2.1.10"},"_npmOperationalInternal":{"tmp":"tmp/emdash-actions_0.2.0_1781606414017_0.3186968623130879","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@bnomei/emdash-actions","version":"0.2.1","keywords":["astro","cloudflare","cms","emdash","emdash-plugin","react","serverless","typescript"],"author":{"url":"https://bnomei.com","name":"Bruno Meilick","email":"b@bnomei.com"},"license":"MIT","_id":"@bnomei/emdash-actions@0.2.1","maintainers":[{"name":"bnomei","email":"b@bnomei.com"}],"homepage":"https://github.com/bnomei/emdash-actions#readme","bugs":{"url":"https://github.com/bnomei/emdash-actions/issues"},"dist":{"shasum":"670e2a5d85acf883c0b05654c07c74d60d45fde7","tarball":"https://registry.npmjs.org/@bnomei/emdash-actions/-/emdash-actions-0.2.1.tgz","fileCount":9,"integrity":"sha512-q45gR0jI5KN3xKmlsogEtCNZ9Bl72VPqnS+6Mgioyy23OhiiZlCIaD6OagDKt53mzW+CvjsxEGaFAw8BDlLFhw==","signatures":[{"sig":"MEQCIATmWMqJN2XyQ5k8ySNeYlvjpNsLcLslzJrp5bG/Gc82AiAuRa38VzYcpkFk2/9FOrjtyV9Hss7+PrGD13sxU3SqrA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":93828},"main":"./dist/index.mjs","type":"module","types":"./dist/index.d.mts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs"},"./admin":{"types":"./dist/admin.d.mts","import":"./dist/admin.mjs"}},"gitHead":"bbfd30705c99af22dc29eee6f96c19e59095836a","scripts":{"build":"vp pack src/index.ts src/admin.tsx --format esm --dts --clean --tsconfig tsconfig.json","check":"vp check .","prepack":"npm run build","typecheck":"tsc --noEmit","pack:check":"vp pack src/index.ts src/admin.tsx --format esm --dts --clean --tsconfig tsconfig.json --publint","types:check":"attw --pack . --profile esm-only --no-summary","prepublishOnly":"npm run check && npm run typecheck && npm run pack:check && npm run types:check"},"_npmUser":{"name":"bnomei","email":"b@bnomei.com"},"repository":{"url":"git+https://github.com/bnomei/emdash-actions.git","type":"git"},"_npmVersion":"11.16.0","description":"Native action surface for EmDash provider plugins.","directories":{},"sideEffects":false,"_nodeVersion":"26.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.6.0","devDependencies":{"react":"^19.2.7","emdash":"^0.19.0","publint":"^0.3.21","react-dom":"^19.2.7","vite-plus":"^0.1.24","typescript":"^6.0.3","@types/react":"^19.2.17","@cloudflare/kumo":"^2.5.2","@types/react-dom":"^19.2.3","@arethetypeswrong/cli":"^0.18.3","@phosphor-icons/react":"^2.1.10"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","emdash":">=0.17.0","react-dom":"^18.0.0 || ^19.0.0","@cloudflare/kumo":"^2.5.0","@phosphor-icons/react":"^2.1.10"},"_npmOperationalInternal":{"tmp":"tmp/emdash-actions_0.2.1_1781609763169_0.906794381930838","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@bnomei/emdash-actions","version":"0.2.2","keywords":["astro","cloudflare","cms","emdash","emdash-plugin","react","serverless","typescript"],"author":{"url":"https://bnomei.com","name":"Bruno Meilick","email":"b@bnomei.com"},"license":"MIT","_id":"@bnomei/emdash-actions@0.2.2","maintainers":[{"name":"bnomei","email":"b@bnomei.com"}],"homepage":"https://github.com/bnomei/emdash-actions#readme","bugs":{"url":"https://github.com/bnomei/emdash-actions/issues"},"dist":{"shasum":"67105d91f09634d3fbc87c1529d6e9e25f2e4539","tarball":"https://registry.npmjs.org/@bnomei/emdash-actions/-/emdash-actions-0.2.2.tgz","fileCount":9,"integrity":"sha512-/klj3aP5GW1xKGV7o2U3+ioafrlvuqtPks8bparWFeZXC+4fLvIDp8lBlYr9M29w+lzKy044iBnzaSPdKsNyaA==","signatures":[{"sig":"MEQCIHf7DsKh68dADrBnvRVfAGlNPgL8dT3JREP0sfdhUVXWAiB31nc19ft/SWwd/lsiirAU5MHv2z9T57GzTS8uA+qKHg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":95025},"main":"./dist/index.mjs","type":"module","types":"./dist/index.d.mts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs"},"./admin":{"types":"./dist/admin.d.mts","import":"./dist/admin.mjs"}},"gitHead":"714d591ac7f1c4a990f92ae54b5f3fef53842d89","scripts":{"build":"vp pack src/index.ts src/admin.tsx --format esm --dts --clean --tsconfig tsconfig.json","check":"vp check .","prepack":"npm run build","typecheck":"tsc --noEmit","pack:check":"vp pack src/index.ts src/admin.tsx --format esm --dts --clean --tsconfig tsconfig.json --publint","types:check":"attw --pack . --profile esm-only --no-summary","prepublishOnly":"npm run check && npm run typecheck && npm run pack:check && npm run types:check"},"_npmUser":{"name":"bnomei","email":"b@bnomei.com"},"repository":{"url":"git+https://github.com/bnomei/emdash-actions.git","type":"git"},"_npmVersion":"11.16.0","description":"Native action surface for EmDash provider plugins.","directories":{},"sideEffects":false,"_nodeVersion":"26.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.6.0","devDependencies":{"react":"^19.2.7","emdash":"^0.19.0","publint":"^0.3.21","react-dom":"^19.2.7","vite-plus":"^0.1.24","typescript":"^6.0.3","@types/react":"^19.2.17","@cloudflare/kumo":"^2.5.2","@types/react-dom":"^19.2.3","@arethetypeswrong/cli":"^0.18.3","@phosphor-icons/react":"^2.1.10"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","emdash":">=0.17.0","react-dom":"^18.0.0 || ^19.0.0","@cloudflare/kumo":"^2.5.0","@phosphor-icons/react":"^2.1.10"},"_npmOperationalInternal":{"tmp":"tmp/emdash-actions_0.2.2_1781612553318_0.1771904012956098","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@bnomei/emdash-actions","version":"0.2.3","keywords":["astro","cloudflare","cms","emdash","emdash-plugin","react","serverless","typescript"],"author":{"url":"https://bnomei.com","name":"Bruno Meilick","email":"b@bnomei.com"},"license":"MIT","_id":"@bnomei/emdash-actions@0.2.3","maintainers":[{"name":"bnomei","email":"b@bnomei.com"}],"homepage":"https://github.com/bnomei/emdash-actions#readme","bugs":{"url":"https://github.com/bnomei/emdash-actions/issues"},"dist":{"shasum":"650a809fd43d28f13364b4e858ccc8a9cccb88a4","tarball":"https://registry.npmjs.org/@bnomei/emdash-actions/-/emdash-actions-0.2.3.tgz","fileCount":9,"integrity":"sha512-ZuLShXqMDviTtDvdTLZKPsKXiM4RU9q+p/pf/oDkq108E3iH0z77HOk7VWmqJLsGeEQZHNxHsd3+rzb5uNbWuA==","signatures":[{"sig":"MEUCIBM6eVVzRPK9CWdLyV05mTAgAPDZqMgA23kZVE7LLgntAiEA+a51dyXPOYrYyI6JdDeTeB2olzXr1XRAQybK28iwI98=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":97311},"main":"./dist/index.mjs","type":"module","types":"./dist/index.d.mts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs"},"./admin":{"types":"./dist/admin.d.mts","import":"./dist/admin.mjs"}},"gitHead":"2fa15a4b5ab5844291bcdfac59f5a2002ac63c75","scripts":{"build":"vp pack src/index.ts src/admin.tsx --format esm --dts --clean --tsconfig tsconfig.json","check":"vp check .","prepack":"npm run build","typecheck":"tsc --noEmit","pack:check":"vp pack src/index.ts src/admin.tsx --format esm --dts --clean --tsconfig tsconfig.json --publint","types:check":"attw --pack . --profile esm-only --no-summary","prepublishOnly":"npm run check && npm run typecheck && npm run pack:check && npm run types:check"},"_npmUser":{"name":"bnomei","email":"b@bnomei.com"},"repository":{"url":"git+https://github.com/bnomei/emdash-actions.git","type":"git"},"_npmVersion":"11.16.0","description":"Native action surface for EmDash provider plugins.","directories":{},"sideEffects":false,"_nodeVersion":"26.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.6.0","devDependencies":{"react":"^19.2.7","emdash":"^0.19.0","publint":"^0.3.21","react-dom":"^19.2.7","vite-plus":"^0.1.24","typescript":"^6.0.3","@types/react":"^19.2.17","@cloudflare/kumo":"^2.5.2","@types/react-dom":"^19.2.3","@arethetypeswrong/cli":"^0.18.3","@phosphor-icons/react":"^2.1.10"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","emdash":">=0.17.0","react-dom":"^18.0.0 || ^19.0.0","@cloudflare/kumo":"^2.5.0","@phosphor-icons/react":"^2.1.10"},"_npmOperationalInternal":{"tmp":"tmp/emdash-actions_0.2.3_1781616869332_0.37245580114549925","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@bnomei/emdash-actions","version":"0.2.4","keywords":["astro","cloudflare","cms","emdash","emdash-plugin","react","serverless","typescript"],"author":{"url":"https://bnomei.com","name":"Bruno Meilick","email":"b@bnomei.com"},"license":"MIT","_id":"@bnomei/emdash-actions@0.2.4","maintainers":[{"name":"bnomei","email":"b@bnomei.com"}],"homepage":"https://github.com/bnomei/emdash-actions#readme","bugs":{"url":"https://github.com/bnomei/emdash-actions/issues"},"dist":{"shasum":"f935bc79e16882c4810f9fe2a7a8f614a1c6fd42","tarball":"https://registry.npmjs.org/@bnomei/emdash-actions/-/emdash-actions-0.2.4.tgz","fileCount":9,"integrity":"sha512-v/iniAJ9i8meHGWihjdN1TpFFIJopo0+9JrDnxZyVnwFKDgtYImg3NwHUvVf52Q37QYd/XWK3HNUhiR8x2xEgQ==","signatures":[{"sig":"MEUCICpmzp+3K994n5mGZNaK+lgAI3VDMjq8dc6Bv2z/UEnvAiEA+mEULmqWdT0iqYJgfYF9uGiMc9ZtaCn/NWcGIgPTNGA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":85388},"main":"./dist/index.mjs","type":"module","types":"./dist/index.d.mts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs"},"./admin":{"types":"./dist/admin.d.mts","import":"./dist/admin.mjs"}},"gitHead":"ce42ae62499eda6b4af9604216db5243ee847c98","scripts":{"build":"vp pack src/index.ts src/admin.tsx --format esm --dts --clean --tsconfig tsconfig.json","check":"vp check .","prepack":"npm run build","typecheck":"tsc --noEmit","pack:check":"vp pack src/index.ts src/admin.tsx --format esm --dts --clean --tsconfig tsconfig.json --publint","types:check":"attw --pack . --profile esm-only --no-summary","prepublishOnly":"npm run check && npm run typecheck && npm run pack:check && npm run types:check"},"_npmUser":{"name":"bnomei","email":"b@bnomei.com"},"repository":{"url":"git+https://github.com/bnomei/emdash-actions.git","type":"git"},"_npmVersion":"11.16.0","description":"Native action surface for EmDash provider plugins.","directories":{},"sideEffects":false,"_nodeVersion":"26.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.6.0","devDependencies":{"react":"^19.2.7","emdash":"^0.19.0","publint":"^0.3.21","react-dom":"^19.2.7","vite-plus":"^0.1.24","typescript":"^6.0.3","@types/react":"^19.2.17","@cloudflare/kumo":"^2.5.2","@types/react-dom":"^19.2.3","@arethetypeswrong/cli":"^0.18.3","@phosphor-icons/react":"^2.1.10"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","emdash":">=0.17.0","react-dom":"^18.0.0 || ^19.0.0","@cloudflare/kumo":"^2.5.0","@phosphor-icons/react":"^2.1.10"},"_npmOperationalInternal":{"tmp":"tmp/emdash-actions_0.2.4_1781625187526_0.7739091607701436","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@bnomei/emdash-actions","version":"0.3.0","keywords":["astro","cloudflare","cms","emdash","emdash-plugin","react","serverless","typescript"],"author":{"url":"https://bnomei.com","name":"Bruno Meilick","email":"b@bnomei.com"},"license":"MIT","_id":"@bnomei/emdash-actions@0.3.0","maintainers":[{"name":"bnomei","email":"b@bnomei.com"}],"homepage":"https://github.com/bnomei/emdash-actions#readme","bugs":{"url":"https://github.com/bnomei/emdash-actions/issues"},"dist":{"shasum":"a69b9e9ef9e81f82996fb06e68db411270682917","tarball":"https://registry.npmjs.org/@bnomei/emdash-actions/-/emdash-actions-0.3.0.tgz","fileCount":9,"integrity":"sha512-6QkSnD28x1UF4Vu7+slozqkUUN/EA8yi6jllVHS0XPCtnU4oke0RCqvPIz7pu3xX5qMHDfgKiEli3JLfLzbRDA==","signatures":[{"sig":"MEUCIAE0Cs75m6E5bUQSsunR5katcPAgjFIEsS5PG16nlUnkAiEA7hou5Bf+rMYZ5QIvjMCJYUz52isJkHM+g5pv+9aYgjw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":102837},"main":"./dist/index.mjs","type":"module","types":"./dist/index.d.mts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs"},"./admin":{"types":"./dist/admin.d.mts","import":"./dist/admin.mjs"}},"gitHead":"99b4c79ec9d99b0c34acef9128c94b75e2b964d7","scripts":{"test":"vp test run test/*.test.ts && tsc -p test/tsconfig.json && npm run build && node --test test/*.test.mjs tests/*.test.mjs","build":"vp pack src/index.ts src/admin.tsx --format esm --dts --clean --tsconfig tsconfig.json","check":"vp check .","prepack":"npm run build","typecheck":"tsc --noEmit","pack:check":"vp pack src/index.ts src/admin.tsx --format esm --dts --clean --tsconfig tsconfig.json --publint","types:check":"attw --pack . --profile esm-only --no-summary","prepublishOnly":"npm run check && npm run typecheck && npm run pack:check && npm run types:check"},"_npmUser":{"name":"bnomei","email":"b@bnomei.com"},"repository":{"url":"git+https://github.com/bnomei/emdash-actions.git","type":"git"},"_npmVersion":"11.16.0","description":"Native action surface for EmDash provider plugins.","directories":{},"sideEffects":false,"_nodeVersion":"26.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.7","emdash":"^0.19.0","publint":"^0.3.21","react-dom":"^19.2.7","vite-plus":"^0.1.24","typescript":"^6.0.3","@types/react":"^19.2.17","@cloudflare/kumo":"^2.5.2","@types/react-dom":"^19.2.3","@arethetypeswrong/cli":"^0.18.3","@phosphor-icons/react":"^2.1.10"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","emdash":">=0.17.0","react-dom":"^18.0.0 || ^19.0.0","@cloudflare/kumo":"^2.5.0","@phosphor-icons/react":"^2.1.10"},"_npmOperationalInternal":{"tmp":"tmp/emdash-actions_0.3.0_1781814840260_0.16120896058207856","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@bnomei/emdash-actions","version":"0.4.0","keywords":["astro","cloudflare","cms","emdash","emdash-plugin","react","serverless","typescript"],"author":{"url":"https://bnomei.com","name":"Bruno Meilick","email":"b@bnomei.com"},"license":"MIT","_id":"@bnomei/emdash-actions@0.4.0","maintainers":[{"name":"bnomei","email":"b@bnomei.com"}],"homepage":"https://github.com/bnomei/emdash-actions#readme","bugs":{"url":"https://github.com/bnomei/emdash-actions/issues"},"dist":{"shasum":"b8758b524ceb2305a6d62a5125d13de68b4f7a02","tarball":"https://registry.npmjs.org/@bnomei/emdash-actions/-/emdash-actions-0.4.0.tgz","fileCount":9,"integrity":"sha512-rZswmGZmDIEb1lr3CCXG/nM88OVpryCY3sY8Cz8j2PQQs7VNHSeRi2ByS6R35fFqkUJm6s34gIG8t5c+vwMIPg==","signatures":[{"sig":"MEYCIQDwfXnr2hIoKZqrlVWmW/Abk18Z6OuwRRfRvU2By3v3jQIhAKrqgXUy7nJXo3dqqGYmkS5cjZzJLMVSuV3kaARPFC0P","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":141067},"main":"./dist/index.mjs","type":"module","types":"./dist/index.d.mts","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs"},"./admin":{"types":"./dist/admin.d.mts","import":"./dist/admin.mjs"}},"gitHead":"68228d8650b26605d0de0d4eb8e359c1483d8628","scripts":{"test":"vp test run test/*.test.ts && tsc -p test/tsconfig.json && npm run build && node --test test/*.test.mjs tests/*.test.mjs","build":"vp pack src/index.ts src/admin.tsx --format esm --dts --clean --tsconfig tsconfig.json","check":"vp check .","prepack":"npm run build","typecheck":"tsc --noEmit","pack:check":"vp pack src/index.ts src/admin.tsx --format esm --dts --clean --tsconfig tsconfig.json --publint","types:check":"attw --pack . --profile esm-only --no-summary","prepublishOnly":"npm run check && npm run typecheck && npm run pack:check && npm run types:check"},"_npmUser":{"name":"bnomei","email":"b@bnomei.com"},"repository":{"url":"git+https://github.com/bnomei/emdash-actions.git","type":"git"},"_npmVersion":"11.16.0","description":"Native action surface for EmDash provider plugins.","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.7","emdash":"^0.19.0","publint":"^0.3.21","react-dom":"^19.2.7","vite-plus":"^0.1.24","typescript":"^6.0.3","@types/react":"^19.2.17","@cloudflare/kumo":"^2.5.2","@types/react-dom":"^19.2.3","@arethetypeswrong/cli":"^0.18.3","@phosphor-icons/react":"^2.1.10"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","emdash":">=0.17.0","react-dom":"^18.0.0 || ^19.0.0","@cloudflare/kumo":"^2.5.0","@phosphor-icons/react":"^2.1.10"},"_npmOperationalInternal":{"tmp":"tmp/emdash-actions_0.4.0_1781975214884_0.969839501951749","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@bnomei/emdash-actions","version":"0.4.1","description":"Native action surface for EmDash provider plugins.","keywords":["astro","cloudflare","cms","emdash","emdash-plugin","react","serverless","typescript"],"homepage":"https://github.com/bnomei/emdash-actions#readme","bugs":{"url":"https://github.com/bnomei/emdash-actions/issues"},"license":"MIT","author":{"name":"Bruno Meilick","email":"b@bnomei.com","url":"https://bnomei.com"},"repository":{"type":"git","url":"git+https://github.com/bnomei/emdash-actions.git"},"type":"module","sideEffects":false,"main":"./dist/index.mjs","types":"./dist/index.d.mts","exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs"},"./admin":{"types":"./dist/admin.d.mts","import":"./dist/admin.mjs"}},"publishConfig":{"access":"public"},"scripts":{"build":"vp pack src/index.ts src/admin.tsx --format esm --dts --clean --tsconfig tsconfig.json","check":"vp check .","pack:check":"vp pack src/index.ts src/admin.tsx --format esm --dts --clean --tsconfig tsconfig.json --publint","prepack":"npm run build","prepublishOnly":"npm run check && npm run typecheck && npm run pack:check && npm run types:check","typecheck":"tsc --noEmit","types:check":"attw --pack . --profile esm-only --no-summary","test":"vp test run test/*.test.ts && tsc -p test/tsconfig.json && npm run build && node --test test/*.test.mjs tests/*.test.mjs"},"devDependencies":{"@arethetypeswrong/cli":"^0.18.3","@cloudflare/kumo":"^2.5.2","@phosphor-icons/react":"^2.1.10","@types/react":"^19.2.17","@types/react-dom":"^19.2.3","emdash":"^0.19.0","publint":"^0.3.21","react":"^19.2.7","react-dom":"^19.2.7","typescript":"^6.0.3","vite-plus":"^0.1.24"},"peerDependencies":{"@cloudflare/kumo":"^2.5.0","@phosphor-icons/react":"^2.1.10","emdash":">=0.17.0","react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"engines":{"node":">=22.12.0"},"gitHead":"51acc070d60d7b7a514b9ac622e1ef565c62abea","_id":"@bnomei/emdash-actions@0.4.1","_nodeVersion":"26.4.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-tAEHyaeQOtNjU2jrVREh+zwopLHcvHrRCtSo5qphjG0HWIcnHgZs9odfV1g0Rf1o4o4BVe9a3lPLF+PxNLOiyw==","shasum":"671b61e6d54859da8caf7de0728561e1803c0498","tarball":"https://registry.npmjs.org/@bnomei/emdash-actions/-/emdash-actions-0.4.1.tgz","fileCount":9,"unpackedSize":155196,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQC2vAbO+/Wy9ScEzod6ZaqUgHc83qsQ9HXQe/gImI6d0gIgEWA/KFJOuUXStT9uMtuZUIzJHiUK6tn2KTmvb9dE490="}]},"_npmUser":{"name":"bnomei","email":"b@bnomei.com"},"directories":{},"maintainers":[{"name":"bnomei","email":"b@bnomei.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/emdash-actions_0.4.1_1782743306833_0.8534982322619071"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-15T15:03:37.942Z","modified":"2026-06-29T14:28:27.137Z","0.1.0":"2026-06-15T15:03:38.301Z","0.2.0":"2026-06-16T10:40:14.155Z","0.2.1":"2026-06-16T11:36:03.302Z","0.2.2":"2026-06-16T12:22:33.483Z","0.2.3":"2026-06-16T13:34:29.461Z","0.2.4":"2026-06-16T15:53:07.698Z","0.3.0":"2026-06-18T20:34:00.401Z","0.4.0":"2026-06-20T17:06:55.039Z","0.4.1":"2026-06-29T14:28:27.033Z"},"bugs":{"url":"https://github.com/bnomei/emdash-actions/issues"},"author":{"name":"Bruno Meilick","email":"b@bnomei.com","url":"https://bnomei.com"},"license":"MIT","homepage":"https://github.com/bnomei/emdash-actions#readme","keywords":["astro","cloudflare","cms","emdash","emdash-plugin","react","serverless","typescript"],"repository":{"type":"git","url":"git+https://github.com/bnomei/emdash-actions.git"},"description":"Native action surface for EmDash provider plugins.","maintainers":[{"name":"bnomei","email":"b@bnomei.com"}],"readme":"# @bnomei/emdash-actions\n\n[![npm version](https://img.shields.io/npm/v/@bnomei/emdash-actions.svg)](https://www.npmjs.com/package/@bnomei/emdash-actions)\n[![npm downloads](https://img.shields.io/npm/dm/@bnomei/emdash-actions.svg)](https://www.npmjs.com/package/@bnomei/emdash-actions)\n[![license](https://img.shields.io/npm/l/@bnomei/emdash-actions.svg)](https://www.npmjs.com/package/@bnomei/emdash-actions)\n[![types](https://img.shields.io/badge/types-included-blue.svg)](./package.json)\n[![source](https://img.shields.io/badge/source-GitHub-181717.svg?logo=github)](https://github.com/bnomei/emdash-actions)\n\nAction buttons for EmDash fields and dashboards.\n\n`@bnomei/emdash-actions` adds configurable buttons to the EmDash admin. A button\ncan copy a field value in the browser, call an EmDash plugin route, write a\nreturned value back into a field, or trigger a dashboard-level provider action.\n\nThe core split is simple:\n\n- `emdash-actions` owns the admin UI trigger surfaces.\n- Provider plugins own the backend work behind those triggers.\n\nThat means a provider can be native, standard trusted, or sandboxed, as long as\nit exposes normal EmDash plugin API routes.\n\n## Install\n\n```sh\nnpm install @bnomei/emdash-actions\n```\n\n## Quick Start\n\nThis quick start wires a single dashboard button that runs backend TypeScript in\nan EmDash provider route. The example action clears a cache placeholder, writes\nplugin-local state with `ctx.kv`, logs through `ctx.log`, and returns feedback to\nthe clicked button.\n\n### 1. Create A Provider\n\nCreate `src/emdash/cache-actions.ts`:\n\n```ts\nimport { definePlugin, type RouteContext } from \"emdash\";\nimport { defineActionsManifest, type ActionsManifest } from \"@bnomei/emdash-actions\";\n\nexport function cacheActions() {\n  return definePlugin({\n    id: \"cache-actions\",\n    version: \"0.1.0\",\n    routes: {\n      actions: {\n        handler: cacheActionsManifestRoute,\n      },\n      \"cache/clear\": {\n        handler: clearCacheRoute,\n      },\n    },\n  });\n}\n\nasync function cacheActionsManifestRoute(): Promise<ActionsManifest> {\n  return defineActionsManifest({\n    actions: [\n      {\n        id: \"cache.clear\",\n        label: \"Clear cache\",\n        route: \"cache/clear\",\n        method: \"POST\",\n        placement: \"dashboard\",\n        icon: \"bolt\",\n        tone: \"warning\",\n        confirm: \"Clear the site cache?\",\n      },\n    ],\n  });\n}\n\nasync function clearCacheRoute(ctx: RouteContext) {\n  const serverTime = new Date().toISOString();\n  const clearCount = ((await ctx.kv.get<number>(\"state:clearCount\")) ?? 0) + 1;\n\n  await clearSiteCache(ctx);\n  await ctx.kv.set(\"state:clearCount\", clearCount);\n\n  ctx.log.info(\"Cache clear action completed\", {\n    clearCount,\n    site: ctx.site.name,\n    serverTime,\n  });\n\n  return {\n    ok: true,\n    status: 200,\n    severity: \"success\",\n    message: `Cache cleared on the server at ${serverTime}.`,\n    toast: {\n      type: \"success\",\n      title: \"Cache cleared\",\n      message: `${ctx.site.name} cache has been cleared ${clearCount} time(s).`,\n    },\n  };\n}\n\nasync function clearSiteCache(ctx: RouteContext) {\n  // Replace this with your cache provider, CDN, build, or deployment logic.\n  await ctx.kv.set(\"state:lastClearedAt\", new Date().toISOString());\n}\n```\n\n### 2. Register The UI And Provider\n\nAdd `actionsPlugin()` and the provider plugin to the EmDash plugin list in\n`astro.config.mjs`:\n\n```ts\nimport { defineConfig } from \"astro/config\";\nimport emdash from \"emdash/astro\";\nimport { actionsPlugin } from \"@bnomei/emdash-actions\";\nimport { cacheActions } from \"./src/emdash/cache-actions\";\n\nconst cacheActionsProvider = {\n  pluginId: \"cache-actions\",\n  label: \"Cache actions\",\n  manifestRoute: \"actions\",\n};\n\nexport default defineConfig({\n  integrations: [\n    emdash({\n      plugins: [\n        actionsPlugin({\n          providers: [cacheActionsProvider],\n        }),\n        cacheActions(),\n      ],\n    }),\n  ],\n});\n```\n\n### 3. Click The Button\n\nOpen the EmDash dashboard. The `Actions` widget loads:\n\n```txt\nGET /_emdash/api/plugins/cache-actions/actions\n```\n\nIt renders `Clear cache`. Clicking the button calls:\n\n```txt\nPOST /_emdash/api/plugins/cache-actions/cache/clear\n```\n\nThe provider route runs on the server, uses EmDash `ctx`, and returns the inline\nbutton feedback plus toast.\n\n> [!NOTE]\n> This quick start uses a dashboard action because it shows the whole provider\n> loop without needing collection schema changes. Field buttons use the same\n> provider route model.\n\n## What To Use\n\n| Goal                                                | Start here                                                           |\n| --------------------------------------------------- | -------------------------------------------------------------------- |\n| Copy a value without backend code                   | [Clipboard Field Button](./examples/clipboard-field-button.md)       |\n| Call one backend route from a field                 | [Direct Route Field Action](./examples/direct-route-field-action.md) |\n| Use provider-owned action UI and routes             | [Manifest Field Action](./examples/manifest-field-action.md)         |\n| Use one safe provider-owned runner route            | [Runner Field Action](./examples/runner-field-action.md)             |\n| Add a runner-backed dashboard action                | [Runner Dashboard Action](./examples/runner-dashboard-action.md)     |\n| Collect a few scalar inputs before submit           | [Inline Form Action](./examples/inline-form-action.md)               |\n| Target a host-provided nested row                   | [Row Target Action](./examples/row-target-action.md)                 |\n| Add a dashboard action                              | [Dashboard Action](./examples/dashboard-action.md)                   |\n| Return clipboard, open, download, or reload effects | [Response effect examples](./examples/README.md)                     |\n| Show a Kumo toast                                   | [Toast Notification](./examples/toast-notification.md)               |\n| Patch a clicked button after success                | [Action Patch](./examples/action-patch.md)                           |\n| Poll long-running work                              | [Async Job](./examples/async-job.md)                                 |\n| Run the provider in a sandbox                       | [Sandboxed Provider](./examples/sandboxed-provider.md)               |\n\nThe full recipe index is in [examples](./examples/README.md).\n\n## Core Concepts\n\n### Surfaces\n\n- `actions:button`: field widget for content forms. It supports `clipboard`\n  mode for browser-native copying and `run` mode for provider-backed actions.\n- `Actions`: dashboard widget for provider/global actions. It reads configured\n  provider manifests and renders matching action buttons.\n\n### Action Labels And Icons\n\nEvery action must have a human-readable `label`. The action `label` is the\nuser-facing command text for the rendered button. `icon` is optional decoration\nonly; it must not be the only visible affordance for the action.\n\nField labels and action labels describe different things. The collection field\n`label` names the field or slot, while the manifest action `label` or field\n`options.label` names the command the button runs. They may match, but the\nbutton still renders the resolved action label as visible text.\n\nIdle buttons show the resolved action label. The button `title`, tooltip text,\nand `aria-label` use that same resolved label. Feedback, progress, success, and\nerror text may temporarily replace or supplement the label after interaction,\nbut the idle state should always remain clear.\n\n### Providers And Manifests\n\nA provider manifest describes buttons:\n\n```ts\n{\n  actions: [\n    {\n      id: \"cache.clear\",\n      label: \"Clear cache\",\n      route: \"cache/clear\",\n      method: \"POST\",\n      placement: \"dashboard\",\n    },\n  ],\n}\n```\n\nUse clear labels for every action surface:\n\n```ts\n{\n  actions: [\n    {\n      id: \"cache.clear\",\n      label: \"Clear cache\",\n      route: \"cache/clear\",\n      method: \"POST\",\n      placement: \"dashboard\",\n      target: { surfaces: [\"dashboard\"] },\n      icon: \"bolt\",\n    },\n    {\n      id: \"entry.rebuild\",\n      label: \"Rebuild entry\",\n      runner: { route: \"actions/run-entry\" },\n      placement: \"entry\",\n      target: { surfaces: [\"entry\"], idFrom: \"entryId\" },\n      icon: \"refresh\",\n    },\n    {\n      id: \"field.summarize\",\n      label: \"Summarize field\",\n      runner: true,\n      placement: \"field\",\n      target: { surfaces: [\"field\"], idFrom: \"entryId\" },\n      icon: \"bolt\",\n    },\n    {\n      id: \"row.translate\",\n      label: \"Translate row\",\n      runner: true,\n      placement: \"field\",\n      target: { surfaces: [\"row\"], idFrom: \"rowId\" },\n      icon: \"repeat\",\n    },\n  ],\n}\n```\n\n`emdash-actions` loads the manifest from a provider route such as:\n\n```txt\nGET /_emdash/api/plugins/cache-actions/actions\n```\n\nClicking the action calls the manifest route target:\n\n```txt\nPOST /_emdash/api/plugins/cache-actions/cache/clear\n```\n\nField buttons can also skip the manifest and call a direct route from field\noptions. Dashboard discovery uses `actionsPlugin({ providers })`.\n\n> **Manifest caching:** the dashboard widget fetches provider manifests once per\n> mount (and again when the target surface changes). Manifests are treated as\n> deployment-static, so adding or changing actions server-side mid-session is\n> picked up after a page reload rather than automatically. This is intentional —\n> background refetching would discard in-memory action patches (toggle labels,\n> updated payloads) and churn the action list. During provider development,\n> reload the admin page to see manifest changes.\n\nManifest actions can also use runner mode:\n\n```ts\n{\n  actions: [\n    {\n      id: \"field.summarize\",\n      runner: true,\n      label: \"Summarize\",\n      placement: \"field\",\n      target: { surfaces: [\"field\"], idFrom: \"entryId\" },\n      payload: { format: \"short\" },\n      form: {\n        mode: \"inline\",\n        fields: [{ name: \"format\", type: \"select\", options: [\"short\", \"long\"] }],\n      },\n    },\n  ],\n}\n```\n\nRunner actions always call the provider-owned runner route, defaulting to:\n\n```txt\nPOST /_emdash/api/plugins/<provider>/.well-known/actions/run\n```\n\nwith a normalized invocation:\n\n```json\n{\n  \"invocationId\": \"inv_...\",\n  \"actionId\": \"field.summarize\",\n  \"payload\": {\n    \"format\": \"long\"\n  },\n  \"target\": {\n    \"type\": \"field\",\n    \"surface\": \"field\",\n    \"collection\": \"posts\",\n    \"entryId\": \"post-1\",\n    \"fieldName\": \"summary\",\n    \"value\": \"Current field value\"\n  }\n}\n```\n\nUse direct route mode when the browser should call one explicit provider route\nsuch as `field/slugify`. Use runner mode when the provider should keep a fixed\nserver-side action registry and avoid exposing one callable route per button.\nRunner providers must treat `actionId` as an identifier only, look it up in that\nregistry, authorize it server-side, and re-read target documents before mutating\ncontent or protected state.\n\nRunner actions may use the provider default runner route or override it per\naction:\n\n```ts\n{ id: \"entry.rebuild\", runner: { route: \"actions/run-entry\" }, label: \"Rebuild\" }\n```\n\n`payload` is only static action input defaults. Inline `form` values and field\noption payload values are merged into the request payload at submit time, and\nuser-provided form values win over defaults. `context` and `target` stay\ntop-level in runner invocations.\n\n`target.idFrom` and `target.idKeys` can produce client-side missing-target\nwarnings before a request is sent. They are ergonomics only: provider runners\nmust re-read and validate the authoritative target server-side.\n\n> [!IMPORTANT]\n> Field JSON belongs in the target collection schema's `fields` array. It does\n> not go inside `actionsPlugin()` or `astro.config.mjs`.\n\n> [!WARNING]\n> Provider routes must be relative plugin routes such as `cache/clear` or\n> `.well-known/actions`. Absolute URLs, query strings, hashes, encoded paths,\n> traversal segments, spaces, and backslashes are rejected.\n\n### Action Responses\n\nProvider routes return JSON that controls the clicked button and optional browser\neffects:\n\n- `message`, `severity`, `color`, `backgroundColor`, and `borderColor` drive\n  temporary inline feedback.\n- `action` patches the stable clicked button descriptor, useful for toggles.\n- `effects` or top-level aliases can run `clipboard`, `open`, `download`, and\n  `reload`.\n- `effects.reload` accepts `true` or `{ scope, delayMs }`, where `scope` is\n  `field`, `entry`, `dashboard`, or `page`. Scoped reloads dispatch the\n  cancelable `emdash-actions:reload` browser event so hosts can refresh a\n  narrower surface; if unhandled, they fall back to a page reload.\n- `toast` shows a Kumo toast.\n- `status: 202`, `jobStatus`, and `statusRoute` start async polling.\n- An action result body with `status: 409`, `severity: \"warning\"`, and a reload\n  effect is the canonical stale-target conflict result. Return this as the\n  normal JSON action response body so the widget can run result effects.\n- `resultValueKey` on a field button can write a returned value back into the\n  field.\n\nSee the focused response recipes for complete payloads:\n[Clipboard Effect](./examples/clipboard-effect.md),\n[Open Effect](./examples/open-effect.md),\n[Download Effect](./examples/download-effect.md),\n[Toast Notification](./examples/toast-notification.md),\n[Feedback And Colors](./examples/feedback-and-colors.md),\n[Action Patch](./examples/action-patch.md), and\n[Async Job](./examples/async-job.md).\n\n### Entry Context\n\nField buttons can use inferred entry context. For direct-route actions,\n`contextKey` and `contextValueKey` merge that context into the flat request\npayload for compatibility. Runner actions keep the same context top-level in the\n`ActionInvocation` body instead of hiding it inside `payload`.\n\nWithout a host-provided field-widget context, the plugin infers what it can from\nthe admin route and saved EmDash APIs: collection, entry id, new/edit state,\nfield name, current field value, saved entry data, and current user when\navailable.\n\n> [!WARNING]\n> Entry context is best-effort. It cannot infer live unsaved values from sibling\n> fields. Pass the current field value with `valueKey`, use static `payload`, or\n> have the provider read the latest saved entry server-side.\n\n### Provider Formats\n\n`emdash-actions` is a native EmDash UI plugin and belongs in `plugins: []`.\nProvider plugins can use different formats:\n\n- Native providers use `definePlugin()` from `emdash` and receive one merged\n  `RouteContext` argument.\n- Standard trusted providers can expose the same manifest and routes in\n  `plugins: []`.\n- Standard sandboxed providers export a `SandboxedPlugin` route map, run in\n  `sandboxed: []`, and receive `(routeCtx, ctx)`.\n\nSee [Sandboxed Provider](./examples/sandboxed-provider.md) for the sandboxed\nshape and caveats.\n\n## Configuration At A Glance\n\n### `actionsPlugin()` Options\n\n- `providers`: provider plugins the dashboard widget should discover.\n- `placement`: dashboard manifest placement to render. Defaults to `dashboard`.\n  Set to `null` to show all placements.\n- `title`: dashboard widget title. Defaults to `Actions`.\n- `size`: dashboard widget size, `full`, `half`, or `third`.\n- `entrypoint` and `adminEntry`: advanced descriptor overrides.\n\n### Provider Options\n\n- `pluginId`: provider plugin id.\n- `label`: human-readable provider label. This names the provider, not an\n  action button.\n- `manifestRoute`: provider route that returns the manifest. Defaults to\n  `.well-known/actions`.\n- `runnerRoute`: provider route for `runner` actions. Defaults to\n  `.well-known/actions/run`.\n- `allowedTargetPluginIds`: cross-plugin route targets this provider may call.\n\n### Field Button Options\n\nThe most common field options are:\n\n- `mode`: `clipboard` or `run`.\n- `provider` or `pluginId`: provider plugin id.\n- `route`: direct provider route.\n- `action`: provider manifest action id.\n- `label`: field-local button command text. With `action`, this overrides the\n  manifest action label for this field. Without it, manifest-backed buttons use\n  the manifest action label.\n- `description`, `icon`, `tone`, `confirm`: button UI. `icon` is optional\n  decoration and the text label still renders.\n- `payload`: static JSON body values.\n- `valueKey`: include the current field value in the request body.\n- `contextKey` and `contextValueKey`: include inferred context in direct-route\n  payloads. Runner actions receive context top-level.\n- `resultValueKey`: write a returned result value back into the field.\n- `clipboardText`, `clipboardValueKey`, `clipboardContextValueKey`,\n  `clipboardSuccess`: clipboard mode.\n- `feedback`, `buttonStyle`, `cooldownMs`: temporary feedback and styling.\n- `resultEffect`, `pollIntervalMs`, `pollTimeoutMs`: response shortcuts and\n  async polling.\n\nThe exported TypeScript contracts live in [src/types.ts](./src/types.ts).\n\n## Special Cases\n\n> [!NOTE]\n> Clipboard mode uses `navigator.clipboard.writeText()` in the browser. It does\n> not call the backend, and browsers require HTTPS or localhost plus clipboard\n> permission.\n\n> [!CAUTION]\n> Use `confirm` for destructive dashboard actions such as cache clearing,\n> maintenance toggles, deploys, exports, or purge operations.\n\n- Direct field routes can specify `options.provider` and `options.route` in the\n  field JSON. They do not need to be listed in `actionsPlugin({ providers })`\n  unless the dashboard should discover them too.\n- Cross-plugin target routes require `allowedTargetPluginIds`; otherwise a\n  provider manifest can only target its own plugin id.\n- `DELETE` actions do not receive a JSON body, so payload, value, and context\n  keys are useful with `POST`, `PUT`, and `PATCH`.\n- Protected downloads can use `effects.download.route` to fetch through the\n  action target plugin with EmDash auth headers. Sandboxed providers should\n  prefer public or signed URLs for binary downloads, or delegate streaming to a\n  trusted native route.\n- Async jobs need a provider-owned `statusRoute`. Without one, the widget can\n  show that work was accepted but cannot infer queued, running, failed, or\n  completed state.\n\n## Development\n\n```sh\nnpm ci\nnpm run check\nnpm run typecheck\nnpm run build\nnpm run pack:check\n```\n","readmeFilename":"README.md"}