@inneranimalmedia/agentsam-sdk 2.6.4 → 2.6.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (418) hide show
  1. package/AGENTSAM.md +11 -0
  2. package/README.md +15 -9
  3. package/apps/client-cms-editor/AGENTS.md +12 -0
  4. package/apps/client-cms-editor/IMPORT_PROVENANCE.json +8 -0
  5. package/apps/client-cms-editor/README.md +72 -0
  6. package/apps/client-cms-editor/agentsam.app.json +57 -0
  7. package/apps/client-cms-editor/backend/README.md +5 -0
  8. package/apps/client-cms-editor/backend/package.json +22 -0
  9. package/apps/client-cms-editor/backend/src/api/client.ts +200 -0
  10. package/apps/client-cms-editor/backend/src/demo-bootstrap.ts +145 -0
  11. package/apps/client-cms-editor/backend/src/index.ts +6 -0
  12. package/apps/client-cms-editor/backend/src/model.ts +115 -0
  13. package/apps/client-cms-editor/backend/src/preview/bridge.ts +79 -0
  14. package/apps/client-cms-editor/backend/src/preview/urls.ts +55 -0
  15. package/apps/client-cms-editor/backend/src/routing/cms-route.js +293 -0
  16. package/apps/client-cms-editor/backend/src/routing/index.js +10 -0
  17. package/apps/client-cms-editor/backend/src/storefront.ts +52 -0
  18. package/apps/client-cms-editor/backend/tsconfig.json +15 -0
  19. package/apps/client-cms-editor/backend/worker/index.js +34 -0
  20. package/apps/client-cms-editor/backend/wrangler.jsonc +11 -0
  21. package/apps/client-cms-editor/bin/agentsam-cms.mjs +229 -0
  22. package/apps/client-cms-editor/frontend/index.html +12 -0
  23. package/apps/client-cms-editor/frontend/package.json +33 -0
  24. package/apps/client-cms-editor/frontend/src/AgentSamDrawer.tsx +188 -0
  25. package/apps/client-cms-editor/frontend/src/CmsAgentSurface.tsx +191 -0
  26. package/apps/client-cms-editor/frontend/src/CmsEditor.tsx +1345 -0
  27. package/apps/client-cms-editor/frontend/src/env.d.ts +14 -0
  28. package/apps/client-cms-editor/frontend/src/index.ts +8 -0
  29. package/apps/client-cms-editor/frontend/src/lib/content-safety.ts +63 -0
  30. package/apps/client-cms-editor/frontend/src/main.tsx +17 -0
  31. package/apps/client-cms-editor/frontend/src/mount.tsx +51 -0
  32. package/apps/client-cms-editor/frontend/src/styles/agentsam-drawer.css +214 -0
  33. package/apps/client-cms-editor/frontend/src/styles/cmsShell.css +1739 -0
  34. package/apps/client-cms-editor/frontend/src/styles/studio.css +106 -0
  35. package/apps/client-cms-editor/frontend/src/surfaces/CmsDashboard.tsx +313 -0
  36. package/apps/client-cms-editor/frontend/src/surfaces/CmsGuidedChatHero.tsx +121 -0
  37. package/apps/client-cms-editor/frontend/src/surfaces/CmsHubPage.tsx +132 -0
  38. package/apps/client-cms-editor/frontend/src/surfaces/CmsSiteSwitcher.tsx +176 -0
  39. package/apps/client-cms-editor/frontend/src/surfaces/index.ts +5 -0
  40. package/apps/client-cms-editor/frontend/src/surfaces/types.ts +48 -0
  41. package/apps/client-cms-editor/frontend/tsconfig.json +25 -0
  42. package/apps/client-cms-editor/frontend/vite.config.ts +13 -0
  43. package/apps/client-cms-editor/package-lock.json +3832 -0
  44. package/apps/client-cms-editor/package.json +23 -0
  45. package/apps/client-cms-editor/reference/DONOR_README.md +52 -0
  46. package/apps/client-cms-editor/reference/DONOR_package-lock.json +1253 -0
  47. package/apps/client-cms-editor/reference/DONOR_tsconfig.json +15 -0
  48. package/apps/client-cms-editor/shared/cms/package.json +21 -0
  49. package/apps/client-cms-editor/shared/cms/src/agent-context.ts +35 -0
  50. package/apps/client-cms-editor/shared/cms/src/cloudflare-bindings.ts +51 -0
  51. package/apps/client-cms-editor/shared/cms/src/editor-types.ts +58 -0
  52. package/apps/client-cms-editor/shared/cms/src/index.ts +5 -0
  53. package/apps/client-cms-editor/shared/cms/src/publication.ts +24 -0
  54. package/apps/client-cms-editor/shared/cms/src/routes.ts +11 -0
  55. package/apps/client-cms-editor/shared/cms/tsconfig.json +12 -0
  56. package/bin/agentsam-rapid-rust +36 -0
  57. package/docs/AUTH_IDENTITY_CONTRACT.md +2 -0
  58. package/docs/MACHINE_INTELLIGENCE.md +120 -0
  59. package/docs/WINDOWS_RUNTIME_INSTALL.md +30 -0
  60. package/docs/architecture/AGENTSAM_APPLICATION_CONTRACT.md +188 -0
  61. package/docs/architecture/AGENTSAM_RUNTIME_PROTOCOL.md +151 -0
  62. package/docs/architecture/LOCAL_STUDIO_CLOUDFLARE_OAUTH.md +12 -4
  63. package/docs/architecture/R2_SLUG_NAMESPACE.md +20 -0
  64. package/docs/architecture/WORK_PRODUCT_EXTRACTION.md +97 -0
  65. package/docs/brand/AGENT_SAM_ICON_GRAMMAR.md +70 -0
  66. package/docs/content-studio/HOST_MOUNT_CHECKLIST.md +71 -0
  67. package/docs/content-studio/REVISION_GATE_2026-09-27.md +501 -0
  68. package/docs/contracts/capability-install-planner.md +67 -0
  69. package/docs/contracts/environment-vocabulary.md +195 -0
  70. package/docs/contracts/google-cloud-oauth-setup.md +199 -0
  71. package/docs/local-studio/WORKMODE_DONOR_NOTES.md +1 -1
  72. package/docs/plans/LOCAL-STUDIO-GRADUATION-2026-09-26.md +290 -0
  73. package/docs/plans/LOCAL-STUDIO-REAL-APP-CONTRACT-ADDENDUM-2026-09-27.md +394 -0
  74. package/docs/plans/MACHINE-FIRST-APPS-TUI-2026-09-24.md +227 -0
  75. package/docs/plans/TOMORROW-EXTENSIVE-TODO-2026-09-26.md +221 -0
  76. package/docs/plans/TOMORROW-MACHINE-FIRST-BRIEFING.md +145 -0
  77. package/docs/plans/UNIVERSAL-INGEST-MACHINE-FIRST-2026-09-24.md +215 -0
  78. package/docs/plugins.md +2 -2
  79. package/docs/product/AGENTSAM_PRODUCT_EXPERIENCE_STANDARD.md +280 -0
  80. package/docs/product/LOCAL_STUDIO_DESKTOP_EXPERIENCE.md +139 -0
  81. package/docs/product/README.md +8 -0
  82. package/docs/rapid-rust-wasm.md +35 -0
  83. package/migrations/d1/0016_cloudflare_oauth_user_oauth_tokens_ssot.sql +14 -0
  84. package/package.json +73 -14
  85. package/packages/agentsam-brand/README.md +106 -11
  86. package/packages/agentsam-brand/bin/agentsam-brand.mjs +9 -0
  87. package/packages/agentsam-brand/package.json +39 -7
  88. package/packages/agentsam-brand/src/adapters/cloudflare-images.js +453 -0
  89. package/packages/agentsam-brand/src/adapters/cloudflare-r2.js +74 -0
  90. package/packages/agentsam-brand/src/adapters/d1-registry.js +26 -0
  91. package/packages/agentsam-brand/src/adapters/filesystem.js +59 -0
  92. package/packages/agentsam-brand/src/adapters/memory.js +31 -0
  93. package/packages/agentsam-brand/src/cli/controller.js +503 -0
  94. package/packages/agentsam-brand/src/cli/wizard.js +526 -0
  95. package/packages/agentsam-brand/src/core/capabilities.js +201 -0
  96. package/packages/agentsam-brand/src/core/derivatives.js +211 -0
  97. package/packages/agentsam-brand/src/core/errors.js +12 -0
  98. package/packages/agentsam-brand/src/core/ingest.js +195 -0
  99. package/packages/agentsam-brand/src/core/inspect.js +109 -0
  100. package/packages/agentsam-brand/src/core/keys.js +83 -0
  101. package/packages/agentsam-brand/src/core/naming.js +142 -0
  102. package/packages/agentsam-brand/src/core/optimize.js +316 -0
  103. package/packages/agentsam-brand/src/core/pack.js +305 -0
  104. package/packages/agentsam-brand/src/core/plan.js +276 -0
  105. package/packages/agentsam-brand/src/core/preview.js +159 -0
  106. package/packages/agentsam-brand/src/core/processors/cloudflare.js +68 -0
  107. package/packages/agentsam-brand/src/core/processors/contract.js +203 -0
  108. package/packages/agentsam-brand/src/core/processors/index.js +148 -0
  109. package/packages/agentsam-brand/src/core/processors/native.js +82 -0
  110. package/packages/agentsam-brand/src/core/processors/sharp.js +113 -0
  111. package/packages/agentsam-brand/src/core/processors/squoosh-binary.js +195 -0
  112. package/packages/agentsam-brand/src/core/promote.js +288 -0
  113. package/packages/agentsam-brand/src/core/receipts.js +155 -0
  114. package/packages/agentsam-brand/src/core/v2/compile.js +280 -0
  115. package/packages/agentsam-brand/src/core/v2/derivatives-semantic.js +207 -0
  116. package/packages/agentsam-brand/src/core/v2/ingest-graph.js +387 -0
  117. package/packages/agentsam-brand/src/core/v2/roles.js +180 -0
  118. package/packages/agentsam-brand/src/core/v2/schema.js +209 -0
  119. package/packages/agentsam-brand/src/core/v2/templates.js +114 -0
  120. package/packages/agentsam-brand/src/index.js +193 -36
  121. package/packages/agentsam-brand/src/presets/app-icon.json +16 -0
  122. package/packages/agentsam-brand/src/presets/favicon.json +17 -0
  123. package/packages/agentsam-brand/src/presets/hero.json +12 -0
  124. package/packages/agentsam-brand/src/presets/index.js +40 -0
  125. package/packages/agentsam-brand/src/presets/logo.json +12 -0
  126. package/packages/agentsam-brand/src/presets/model.json +8 -0
  127. package/packages/agentsam-brand/src/presets/og-image.json +10 -0
  128. package/packages/agentsam-brand/src/presets/product-shot.json +11 -0
  129. package/packages/agentsam-brand/src/presets/social-image.json +10 -0
  130. package/packages/agentsam-brand/src/presets/web-image.json +10 -0
  131. package/packages/agentsam-contracts/src/artifacts.ts +41 -0
  132. package/packages/agentsam-knowledge/src/autorag/index.js +1 -1
  133. package/packages/agentsam-knowledge/src/providers/index.js +6 -4
  134. package/packages/agentsam-knowledge/src/providers/ollama-endpoint.js +31 -0
  135. package/packages/agentsam-knowledge/test/autorag.test.mjs +22 -1
  136. package/packages/agentsam-nav/package.json +2 -2
  137. package/packages/agentsam-rapid-rust/Cargo.lock +344 -0
  138. package/packages/agentsam-rapid-rust/Cargo.toml +18 -0
  139. package/packages/agentsam-rapid-rust/README.md +5 -0
  140. package/packages/agentsam-rapid-rust/src/main.rs +718 -0
  141. package/packages/agentsam-rapid-rust/templates/api/Cargo.toml.tmpl +18 -0
  142. package/packages/agentsam-rapid-rust/templates/api/src/lib.rs.tmpl +17 -0
  143. package/packages/agentsam-rapid-rust/templates/common/README.md.tmpl +22 -0
  144. package/packages/agentsam-rapid-rust/templates/common/package.json.tmpl +12 -0
  145. package/packages/agentsam-rapid-rust/templates/common/wrangler.toml.tmpl +6 -0
  146. package/packages/agentsam-rapid-rust/templates/crypto-auth/Cargo.toml.tmpl +21 -0
  147. package/packages/agentsam-rapid-rust/templates/crypto-auth/src/lib.rs.tmpl +32 -0
  148. package/packages/agentsam-rapid-rust/templates/data-processor/Cargo.toml.tmpl +18 -0
  149. package/packages/agentsam-rapid-rust/templates/data-processor/src/lib.rs.tmpl +41 -0
  150. package/packages/agentsam-rapid-rust/templates/shared-core/Cargo.toml.tmpl +9 -0
  151. package/packages/agentsam-rapid-rust/templates/shared-core/core/Cargo.toml.tmpl +7 -0
  152. package/packages/agentsam-rapid-rust/templates/shared-core/core/src/lib.rs.tmpl +23 -0
  153. package/packages/agentsam-rapid-rust/templates/shared-core/worker/Cargo.toml.tmpl +12 -0
  154. package/packages/agentsam-rapid-rust/templates/shared-core/worker/src/lib.rs.tmpl +16 -0
  155. package/packages/agentsam-rapid-rust/templates/shared-core/wrangler.toml.tmpl +6 -0
  156. package/packages/agentsam-repository/src/index.js +1 -0
  157. package/packages/agentsam-repository/src/merkle/semantic.js +3 -10
  158. package/packages/agentsam-repository/src/source-types.js +85 -0
  159. package/packages/agentsam-vault/README.md +96 -0
  160. package/packages/agentsam-vault/package.json +32 -0
  161. package/packages/agentsam-vault/src/contracts/credential.d.ts +78 -0
  162. package/packages/agentsam-vault/src/contracts/credential.js +132 -0
  163. package/packages/agentsam-vault/src/crypto/aes-gcm.d.ts +30 -0
  164. package/packages/agentsam-vault/src/crypto/aes-gcm.js +107 -0
  165. package/packages/agentsam-vault/src/crypto/oauth-envelope.js +150 -0
  166. package/packages/agentsam-vault/src/index.d.ts +9 -0
  167. package/packages/agentsam-vault/src/index.js +27 -0
  168. package/packages/agentsam-vault/src/providers/registry.js +90 -0
  169. package/packages/agentsam-vault/src/runtime/resolver.js +77 -0
  170. package/packages/agentsam-workbench/README.md +24 -0
  171. package/packages/agentsam-workbench/package.json +38 -0
  172. package/packages/agentsam-workbench/src/agent/AgentPanel.tsx +41 -0
  173. package/packages/agentsam-workbench/src/agent/ArtifactCard.tsx +9 -0
  174. package/packages/agentsam-workbench/src/agent/Composer.tsx +102 -0
  175. package/packages/agentsam-workbench/src/agent/ConnectedAgentPanel.tsx +194 -0
  176. package/packages/agentsam-workbench/src/agent/ContextualComposer.tsx +788 -0
  177. package/packages/agentsam-workbench/src/agent/GoalStatusStrip.tsx +38 -0
  178. package/packages/agentsam-workbench/src/agent/MiniAgentSam.tsx +86 -0
  179. package/packages/agentsam-workbench/src/agent/ModelSelect.tsx +19 -0
  180. package/packages/agentsam-workbench/src/agent/Thread.tsx +56 -0
  181. package/packages/agentsam-workbench/src/agent/ToolReceipt.tsx +11 -0
  182. package/packages/agentsam-workbench/src/agent/contextual-composer.css +611 -0
  183. package/packages/agentsam-workbench/src/agent/index.ts +10 -0
  184. package/packages/agentsam-workbench/src/agent/mini-agentsam.css +12 -0
  185. package/packages/agentsam-workbench/src/browser/BrowserFrame.tsx +37 -0
  186. package/packages/agentsam-workbench/src/browser/index.ts +1 -0
  187. package/packages/agentsam-workbench/src/index.ts +6 -0
  188. package/packages/agentsam-workbench/src/project-control.css +160 -0
  189. package/packages/agentsam-workbench/src/projects/ProjectsSurface.tsx +131 -0
  190. package/packages/agentsam-workbench/src/projects/index.ts +1 -0
  191. package/packages/agentsam-workbench/src/shell/Breadcrumb.tsx +35 -0
  192. package/packages/agentsam-workbench/src/shell/ResizableStage.tsx +99 -0
  193. package/packages/agentsam-workbench/src/shell/SidePanel.tsx +5 -0
  194. package/packages/agentsam-workbench/src/shell/index.ts +4 -0
  195. package/packages/agentsam-workbench/src/shell/surfaceRegistry.ts +29 -0
  196. package/packages/agentsam-workbench/src/terminal/TerminalSurface.tsx +5 -0
  197. package/packages/agentsam-workbench/src/terminal/index.ts +1 -0
  198. package/packages/agentsam-workbench/src/timeline/GanttBoard.tsx +258 -0
  199. package/packages/agentsam-workbench/src/timeline/index.ts +1 -0
  200. package/packages/agentsam-workbench/tsconfig.json +13 -0
  201. package/packages/connectors/cloudflare/OAUTH_STORAGE_AUDIT.md +53 -0
  202. package/packages/connectors/cloudflare/package.json +3 -1
  203. package/packages/connectors/cloudflare/src/api-client.js +279 -0
  204. package/packages/connectors/cloudflare/src/capabilities.js +585 -0
  205. package/packages/connectors/cloudflare/src/credential.js +318 -0
  206. package/packages/connectors/cloudflare/src/families/brand-protection.js +123 -0
  207. package/packages/connectors/cloudflare/src/families/keyless.js +114 -0
  208. package/packages/connectors/cloudflare/src/families/pages.js +151 -0
  209. package/packages/connectors/cloudflare/src/families/scanner.js +123 -0
  210. package/packages/connectors/cloudflare/src/families/snippets.js +207 -0
  211. package/packages/connectors/cloudflare/src/families/tag-gateway.js +46 -0
  212. package/packages/connectors/cloudflare/src/families/tags.js +124 -0
  213. package/packages/connectors/cloudflare/src/families/token-validation.js +95 -0
  214. package/packages/connectors/cloudflare/src/families/workflows.js +156 -0
  215. package/packages/connectors/cloudflare/src/index.js +102 -265
  216. package/packages/connectors/cloudflare/src/oauth-persist.js +336 -0
  217. package/packages/connectors/cloudflare/src/owner.js +42 -12
  218. package/packages/connectors/cloudflare/src/permission-options.js +1064 -0
  219. package/packages/connectors/cloudflare/src/routes.js +309 -144
  220. package/packages/connectors/cloudflare/src/scope-catalog.js +345 -0
  221. package/packages/connectors/cloudflare/src/vault.js +2 -2
  222. package/packages/connectors/cloudflare/tests/capabilities.test.mjs +276 -0
  223. package/packages/connectors/cloudflare/tests/connector.test.mjs +26 -30
  224. package/packages/connectors/cloudflare/tests/oauth-persist.test.mjs +125 -0
  225. package/packages/identity/.agentsam/features/oauth-login-portal/providers.json +22 -2
  226. package/packages/identity/.agentsam/features/oauth-login-portal/resources.json +10 -4
  227. package/packages/identity/.agentsam/features/oauth-login-portal/routes.json +20 -0
  228. package/packages/identity/README.md +1 -1
  229. package/packages/identity/backend/README.md +1 -1
  230. package/packages/identity/migrations/D1_SCHEMA_MAPPING.md +3 -2
  231. package/packages/identity/migrations/sqlite/004_identity_oauth_consent_catalog.sql +48 -0
  232. package/packages/identity/package.json +4 -3
  233. package/packages/identity/scripts/local-identity-bridge.mjs +184 -0
  234. package/packages/identity/scripts/preview-auth-portal.mjs +7 -7
  235. package/packages/identity/src/adapters/cloudflare-d1/index.js +31 -2
  236. package/packages/identity/src/adapters/sqlite/index.js +4 -1
  237. package/packages/identity/src/contracts/auth-config.js +28 -8
  238. package/packages/identity/src/contracts/external-identity.js +1 -1
  239. package/packages/identity/src/contracts/provider.js +1 -0
  240. package/packages/identity/src/frontend/auth-portal/README.md +2 -1
  241. package/packages/identity/src/frontend/auth-portal/pages/login.html +6 -5
  242. package/packages/identity/src/frontend/auth-portal/pages/reset.html +6 -5
  243. package/packages/identity/src/frontend/auth-portal/pages/signup.html +6 -5
  244. package/packages/identity/src/frontend/auth-portal/shared/company-branding.js +1 -1
  245. package/packages/identity/src/frontend/auth-portal/shared/desktop-identity-bridge.js +207 -0
  246. package/packages/identity/src/index.js +16 -0
  247. package/packages/identity/src/migrations/0001_identity_core.sql +19 -2
  248. package/packages/identity/src/migrations/0003_accounts_ssot.sql +20 -0
  249. package/packages/identity/src/migrations/README.md +5 -2
  250. package/packages/identity/src/oauth/README.md +10 -5
  251. package/packages/identity/src/oauth/consent-view.js +388 -0
  252. package/packages/identity/src/oauth/credentials.js +31 -11
  253. package/packages/identity/src/oauth/google-desktop-exchange.js +173 -0
  254. package/packages/identity/src/providers/cloudflare/oauth.js +3 -4
  255. package/packages/identity/src/providers/cloudflare/profile.js +49 -14
  256. package/packages/identity/src/providers/iam/index.js +27 -5
  257. package/packages/identity/src/server/identity-service.js +31 -2
  258. package/packages/identity/src/server/worker-router.js +111 -81
  259. package/packages/identity/tests/auth-config.test.mjs +3 -2
  260. package/packages/identity/tests/identity-init-scaffold.test.mjs +3 -0
  261. package/packages/identity/tests/identity-service.test.mjs +16 -0
  262. package/packages/identity/tests/native-session-worker.test.mjs +64 -0
  263. package/packages/identity/tests/oauth-consent-view.test.mjs +106 -0
  264. package/packages/identity/tests/oauth-credentials.test.mjs +17 -4
  265. package/packages/identity/tests/oauth-presets-accounts-ssot.test.mjs +58 -0
  266. package/packages/identity/tests/preview-auth-portal.test.mjs +3 -3
  267. package/packages/runtime-protocol/src/index.js +154 -0
  268. package/packages/theme-scenes/README.md +164 -0
  269. package/packages/theme-scenes/package.json +53 -0
  270. package/packages/theme-scenes/src/blocks/index.js +30 -0
  271. package/packages/theme-scenes/src/contracts/index.js +286 -0
  272. package/packages/theme-scenes/src/demos/index.js +65 -0
  273. package/packages/theme-scenes/src/index.js +75 -0
  274. package/packages/theme-scenes/src/presets/index.js +263 -0
  275. package/packages/theme-scenes/src/runtime/compile.js +119 -0
  276. package/packages/theme-scenes/src/scenes/index.js +146 -0
  277. package/packages/theme-scenes/src/shell/index.js +47 -0
  278. package/packages/theme-scenes/src/themes/index.js +129 -0
  279. package/packages/theme-scenes/src/visuals/index.js +41 -0
  280. package/packages/theme-scenes/test/theme-scenes.test.mjs +179 -0
  281. package/packages/work-graph/src/index.js +34 -1
  282. package/packages/work-graph/src/renderers/gantt-model.js +24 -0
  283. package/packages/work-graph/test/work-graph.test.mjs +27 -7
  284. package/protocol/README.md +15 -7
  285. package/protocol/apps/agentsam.app.v1.schema.json +89 -7
  286. package/protocol/apps/agentsam.host-install.v1.schema.json +36 -0
  287. package/protocol/assets/README.md +9 -0
  288. package/protocol/assets/asset-record.v1.schema.json +64 -0
  289. package/protocol/runtime/agentsam.runtime.v1.schema.json +75 -0
  290. package/protocol/scoring/README.md +10 -0
  291. package/protocol/scoring/scorecard.v1.schema.json +65 -0
  292. package/protocol/ui/icon-registry.mjs +1 -0
  293. package/registry/cms-rust-machine-20260928/installable-products.json +31 -0
  294. package/registry/cms-rust-machine-20260928/manifest.json +22 -0
  295. package/registry/cms-rust-machine-20260928/migration.sql +237 -0
  296. package/registry/cms-rust-machine-20260928/receipt.json +21 -0
  297. package/registry/cms-rust-machine-20260928/receipt.sql +27 -0
  298. package/scripts/build_rapid_rust_cli.py +83 -0
  299. package/src/attachments/index.js +6 -0
  300. package/src/attachments/intake.js +235 -0
  301. package/src/capabilities/repository-snapshot.js +19 -2
  302. package/src/cli/command-catalog.js +8 -0
  303. package/src/cli.js +182 -26
  304. package/src/commands/account-auth.js +94 -8
  305. package/src/commands/app.js +307 -3
  306. package/src/commands/billing.js +127 -0
  307. package/src/commands/brand.js +74 -60
  308. package/src/commands/cheat-sheet.js +154 -0
  309. package/src/commands/cloudflare-login.js +222 -0
  310. package/src/commands/cloudflare.js +453 -23
  311. package/src/commands/codebaseindex.js +6 -1
  312. package/src/commands/compute.js +4 -0
  313. package/src/commands/connections.js +11 -5
  314. package/src/commands/credentials.js +116 -0
  315. package/src/commands/gcloud-auth.js +427 -0
  316. package/src/commands/google-cloud.js +375 -0
  317. package/src/commands/identity-init.js +2 -2
  318. package/src/commands/mcp.js +226 -33
  319. package/src/commands/ollama.js +3 -2
  320. package/src/commands/plugins.js +7 -2
  321. package/src/commands/product.js +36 -0
  322. package/src/commands/runtime-status.js +28 -9
  323. package/src/commands/runtime.js +313 -0
  324. package/src/commands/rust.js +24 -0
  325. package/src/commands/setup.js +279 -0
  326. package/src/commands/shell.js +16 -3
  327. package/src/commands/start-local.js +2 -2
  328. package/src/commands/terminal.js +171 -0
  329. package/src/commands/update.js +140 -0
  330. package/src/commands/whoami.js +329 -65
  331. package/src/features/resolve.js +1 -0
  332. package/src/index.js +4 -0
  333. package/src/indexing/ingest/inventory.js +254 -19
  334. package/src/indexing/ingest/materials.js +3 -9
  335. package/src/indexing/ingest/style-evidence.js +181 -0
  336. package/src/knowledge/source.js +3 -3
  337. package/src/lib/account-session.js +11 -4
  338. package/src/lib/app-authority.js +172 -0
  339. package/src/lib/auth.js +94 -21
  340. package/src/lib/core-client.js +5 -6
  341. package/src/lib/credentials-audit.js +451 -0
  342. package/src/lib/deploy/health.js +24 -6
  343. package/src/lib/detect-context.js +7 -1
  344. package/src/lib/google-cloud-connection.js +270 -0
  345. package/src/lib/google-cloud-inventory.js +385 -0
  346. package/src/lib/google-desktop-oauth.js +372 -0
  347. package/src/lib/google-studio-brokered-oauth.js +158 -0
  348. package/src/lib/identity-scaffold.js +24 -6
  349. package/src/lib/init-options.js +192 -0
  350. package/src/lib/local-scaffold.js +48 -16
  351. package/src/lib/provider-command-remediation.js +308 -0
  352. package/src/lib/provider-credentials.js +8 -0
  353. package/src/lib/scaffold/index.js +8 -2
  354. package/src/lib/scaffold/mcp-server.js +43 -0
  355. package/src/lib/scaffold/templates/mcp-server/index.js +397 -0
  356. package/src/lib/scaffold/templates/mcp-server/presets.js +39 -0
  357. package/src/lib/scaffold/wizards/cms.js +93 -0
  358. package/src/lib/scaffold/wizards/mcp-server.js +61 -0
  359. package/src/lib/setup/contract.js +26 -0
  360. package/src/lib/setup/discover.js +116 -0
  361. package/src/lib/setup/execute.js +205 -0
  362. package/src/lib/setup/planner.js +134 -0
  363. package/src/lib/setup/recipes.js +235 -0
  364. package/src/lib/setup/runtime-persist.js +197 -0
  365. package/src/lib/setup/runtime.js +394 -0
  366. package/src/lib/slash-commands.js +2 -0
  367. package/src/lib/terminal/machine-identity.js +95 -0
  368. package/src/lib/terminal-local.js +164 -0
  369. package/src/lib/terminal-scopes.js +52 -0
  370. package/src/lib/whoami-capabilities.js +184 -0
  371. package/src/local-pty/server.js +34 -5
  372. package/src/mcp/authority.js +58 -108
  373. package/src/mcp/client-adapters.js +68 -144
  374. package/src/mcp/client.js +142 -122
  375. package/src/mcp/cloudflare-bundles.js +225 -0
  376. package/src/mcp/index.js +12 -0
  377. package/src/plugins/cloudflare.js +1 -1
  378. package/src/providers/ollama-chat.js +2 -1
  379. package/src/sam/types.js +27 -2
  380. package/src/security/inventory.js +12 -2
  381. package/src/security/local-vault.js +2 -0
  382. package/src/security/scan.js +1 -1
  383. package/test/account-session.test.mjs +3 -3
  384. package/test/app-authority-context.test.mjs +32 -0
  385. package/test/cli/codebaseindex-plan-ux.test.mjs +1 -1
  386. package/test/cli/mcp-client.test.mjs +21 -10
  387. package/test/cli/runtime-persist.test.mjs +56 -0
  388. package/test/cli/rust-command.test.mjs +21 -0
  389. package/test/credentials-audit.test.mjs +113 -0
  390. package/test/deploy-health-scan.test.mjs +29 -1
  391. package/test/gcloud-auth.test.mjs +111 -0
  392. package/test/google-cloud-connection.test.mjs +83 -0
  393. package/test/google-cloud-inventory.test.mjs +64 -0
  394. package/test/init-options.test.mjs +35 -0
  395. package/test/integration/app-command.test.mjs +30 -0
  396. package/test/integration/cad-project.test.mjs +4 -1
  397. package/test/integration/cms-app-scaffold.test.mjs +71 -0
  398. package/test/integration/cms-site-tenancy-contract.test.mjs +3 -2
  399. package/test/integration/codebaseindex-ingest.test.mjs +48 -0
  400. package/test/integration/features-resolve.test.mjs +30 -11
  401. package/test/integration/inspect-path-cli.test.mjs +46 -0
  402. package/test/integration/inventory-evidence.test.mjs +125 -0
  403. package/test/integration/runtime-status.integration.test.mjs +2 -1
  404. package/test/knowledge.test.mjs +35 -1
  405. package/test/loopback-oauth.test.mjs +53 -0
  406. package/test/ollama.test.mjs +22 -0
  407. package/test/security.test.mjs +23 -0
  408. package/test/setup-planner.test.mjs +74 -0
  409. package/test/setup-runtime.test.mjs +51 -0
  410. package/test/terminal/local-pty.mock.test.mjs +3 -1
  411. package/test/terminal-machine-identity.test.mjs +88 -0
  412. package/test/whoami-resume.test.mjs +27 -6
  413. package/packages/agentsam-brand/test/brand-scan.test.mjs +0 -106
  414. package/packages/work-graph/prototype/README.md +0 -32
  415. package/packages/work-graph/prototype/data/demo-workgraph.js +0 -47
  416. package/packages/work-graph/prototype/renderers/timeline-model.js +0 -21
  417. package/packages/work-graph/prototype/renderers/workgraph-runtime.js +0 -38
  418. package/packages/work-graph/prototype-gnantt.html +0 -655
@@ -0,0 +1,43 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { writeFileTree } from './writer.js';
4
+ import {
5
+ mcpServerTemplates,
6
+ resolveMcpServerTemplateConfig,
7
+ } from './templates/mcp-server/index.js';
8
+
9
+ async function directoryHasEntries(dir) {
10
+ try {
11
+ const entries = await fs.readdir(dir);
12
+ return entries.length > 0;
13
+ } catch (error) {
14
+ if (error?.code === 'ENOENT') return false;
15
+ throw error;
16
+ }
17
+ }
18
+
19
+ export async function createMcpServerProject(input = {}, options = {}) {
20
+ const config = resolveMcpServerTemplateConfig(input);
21
+ const cwd = path.resolve(options.cwd || process.cwd());
22
+ const outputDir = path.resolve(cwd, input.outputDir || input.output || config.projectName);
23
+ const force = Boolean(input.force || options.force);
24
+
25
+ if (!force && await directoryHasEntries(outputDir)) {
26
+ throw new Error(`mcp_output_not_empty:${outputDir}`);
27
+ }
28
+
29
+ const files = mcpServerTemplates(config);
30
+ await writeFileTree(outputDir, files);
31
+
32
+ return Object.freeze({
33
+ ok: true,
34
+ preset: config.preset,
35
+ project_name: config.projectName,
36
+ display_name: config.displayName,
37
+ output_dir: outputDir,
38
+ file_count: Object.keys(files).length,
39
+ manifest_path: path.join(outputDir, 'agentsam.mcp.json'),
40
+ transport: 'streamable_http',
41
+ endpoint_path: '/mcp',
42
+ });
43
+ }
@@ -0,0 +1,397 @@
1
+ import { getMcpServerPreset } from './presets.js';
2
+
3
+ function slug(value) {
4
+ const normalized = String(value || '')
5
+ .trim()
6
+ .toLowerCase()
7
+ .replace(/[^a-z0-9]+/g, '-')
8
+ .replace(/^-+|-+$/g, '');
9
+ if (!normalized) throw new Error('mcp_project_name_required');
10
+ return normalized;
11
+ }
12
+
13
+ // Deterministic seed helpers for generated migrations. SQL literals only --
14
+ // no JS-generated timestamps (SQL unixepoch() is authoritative), no free
15
+ // text passed through unescaped.
16
+ function sqlString(value) {
17
+ return `'${String(value).replaceAll("'", "''")}'`;
18
+ }
19
+ function sqlStringOrNull(value) {
20
+ const v = value == null ? '' : String(value).trim();
21
+ return v ? sqlString(v) : 'NULL';
22
+ }
23
+
24
+ function buildManifest(config) {
25
+ return {
26
+ schema_version: 'agentsam.mcp.v1',
27
+ name: config.projectName,
28
+ display_name: config.displayName,
29
+ runtime: { kind: 'cloudflare-worker', language: 'javascript' },
30
+ transport: { kind: 'streamable_http', path: '/mcp', stateless: true },
31
+ resource: {
32
+ audience: config.audience,
33
+ homepage_url: config.homepageUrl,
34
+ company_slug: config.companySlug,
35
+ },
36
+ auth: {
37
+ type: config.authMode,
38
+ issuer: config.issuer,
39
+ protected_resource_metadata: '/.well-known/oauth-protected-resource',
40
+ verifier_env: 'MCP_TOKEN_VERIFY_URL',
41
+ fail_closed: config.authMode === 'oauth',
42
+ },
43
+ scopes: config.scopes,
44
+ };
45
+ }
46
+
47
+ function workerSource(manifest) {
48
+ const manifestLiteral = JSON.stringify(manifest, null, 2);
49
+ return `import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
50
+ import { WebStandardStreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js';
51
+ import { z } from 'zod';
52
+ import { authorizeMcpRequest, protectedResourceMetadata } from './oauth.js';
53
+
54
+ const manifest = ${manifestLiteral};
55
+
56
+ function jsonResponse(value, status = 200, headers = {}) {
57
+ return new Response(JSON.stringify(value, null, 2), {
58
+ status,
59
+ headers: { 'content-type': 'application/json; charset=utf-8', ...headers },
60
+ });
61
+ }
62
+
63
+ function createServer() {
64
+ const server = new McpServer({ name: manifest.name, version: '0.1.0' });
65
+
66
+ server.registerTool(
67
+ 'mcp_manifest',
68
+ {
69
+ title: 'MCP Manifest',
70
+ description: 'Return this generated MCP server contract.',
71
+ inputSchema: {},
72
+ },
73
+ async () => ({
74
+ content: [{ type: 'text', text: JSON.stringify(manifest, null, 2) }],
75
+ }),
76
+ );
77
+
78
+ return server;
79
+ }
80
+
81
+ export default {
82
+ async fetch(request, env) {
83
+ const url = new URL(request.url);
84
+
85
+ if (url.pathname === '/health') {
86
+ return jsonResponse({
87
+ ok: true,
88
+ name: manifest.name,
89
+ transport: manifest.transport.kind,
90
+ auth: manifest.auth.type,
91
+ });
92
+ }
93
+
94
+ if (url.pathname === '/.well-known/oauth-protected-resource') {
95
+ return jsonResponse(protectedResourceMetadata(manifest, env));
96
+ }
97
+
98
+ if (url.pathname !== manifest.transport.path) {
99
+ return new Response('Not found', { status: 404 });
100
+ }
101
+
102
+ const auth = await authorizeMcpRequest(request, manifest, env);
103
+ if (!auth.ok) return auth.response;
104
+
105
+ const transport = new WebStandardStreamableHTTPServerTransport({
106
+ sessionIdGenerator: undefined,
107
+ });
108
+ const server = createServer();
109
+ await server.connect(transport);
110
+ return transport.handleRequest(request);
111
+ },
112
+ };
113
+ `;
114
+ }
115
+
116
+ function oauthSource() {
117
+ return `function clean(value) {
118
+ return value == null ? '' : String(value).trim();
119
+ }
120
+
121
+ function list(value) {
122
+ if (Array.isArray(value)) return value.map(String).filter(Boolean);
123
+ return clean(value).split(/[\\\\s,]+/).filter(Boolean);
124
+ }
125
+
126
+ function bearer(request) {
127
+ const match = clean(request.headers.get('authorization')).match(/^Bearer\\\\s+(.+)$/i);
128
+ return match ? match[1].trim() : '';
129
+ }
130
+
131
+ function unauthorized(request, error = 'invalid_token') {
132
+ const metadataUrl = new URL('/.well-known/oauth-protected-resource', request.url).toString();
133
+ return new Response(JSON.stringify({ ok: false, error }), {
134
+ status: 401,
135
+ headers: {
136
+ 'content-type': 'application/json; charset=utf-8',
137
+ 'www-authenticate': \`Bearer resource_metadata="\${metadataUrl}"\`,
138
+ },
139
+ });
140
+ }
141
+
142
+ export function protectedResourceMetadata(manifest, env = {}) {
143
+ const issuer = clean(env.MCP_AUTH_ISSUER) || manifest.auth.issuer;
144
+ const audience = clean(env.MCP_RESOURCE_AUDIENCE) || manifest.resource.audience;
145
+ return {
146
+ resource: audience,
147
+ authorization_servers: issuer ? [issuer] : [],
148
+ scopes_supported: (manifest.scopes || []).map((item) => item.scope),
149
+ bearer_methods_supported: ['header'],
150
+ resource_documentation: manifest.resource.homepage_url || undefined,
151
+ };
152
+ }
153
+
154
+ export async function authorizeMcpRequest(request, manifest, env = {}) {
155
+ const mode = clean(env.MCP_AUTH_MODE) || manifest.auth.type || 'oauth';
156
+ if (mode === 'public') return { ok: true, principal: { kind: 'public' } };
157
+ if (mode !== 'oauth') {
158
+ return {
159
+ ok: false,
160
+ response: new Response(JSON.stringify({ ok: false, error: 'unsupported_auth_mode' }), {
161
+ status: 500,
162
+ headers: { 'content-type': 'application/json; charset=utf-8' },
163
+ }),
164
+ };
165
+ }
166
+
167
+ const token = bearer(request);
168
+ if (!token) return { ok: false, response: unauthorized(request, 'bearer_token_required') };
169
+
170
+ const verifier = clean(env.MCP_TOKEN_VERIFY_URL);
171
+ if (!verifier) {
172
+ return {
173
+ ok: false,
174
+ response: new Response(JSON.stringify({ ok: false, error: 'oauth_verifier_not_configured' }), {
175
+ status: 503,
176
+ headers: { 'content-type': 'application/json; charset=utf-8' },
177
+ }),
178
+ };
179
+ }
180
+
181
+ let verified;
182
+ try {
183
+ const response = await fetch(verifier, {
184
+ headers: { authorization: \`Bearer \${token}\`, accept: 'application/json' },
185
+ });
186
+ verified = await response.json().catch(() => ({}));
187
+ if (!response.ok || verified?.active === false || verified?.ok === false) {
188
+ return { ok: false, response: unauthorized(request) };
189
+ }
190
+ } catch {
191
+ return {
192
+ ok: false,
193
+ response: new Response(JSON.stringify({ ok: false, error: 'oauth_verifier_unreachable' }), {
194
+ status: 503,
195
+ headers: { 'content-type': 'application/json; charset=utf-8' },
196
+ }),
197
+ };
198
+ }
199
+
200
+ const expectedAudience = clean(env.MCP_RESOURCE_AUDIENCE) || manifest.resource.audience;
201
+ const audiences = list(verified?.aud ?? verified?.audience);
202
+ if (expectedAudience && !audiences.includes(expectedAudience)) {
203
+ return {
204
+ ok: false,
205
+ response: new Response(JSON.stringify({ ok: false, error: 'token_audience_mismatch' }), {
206
+ status: 403,
207
+ headers: { 'content-type': 'application/json; charset=utf-8' },
208
+ }),
209
+ };
210
+ }
211
+
212
+ return { ok: true, principal: verified };
213
+ }
214
+ `;
215
+ }
216
+
217
+ function companyMigration(config) {
218
+ return `-- Portable identity issuer-brand SSOT.
219
+ CREATE TABLE IF NOT EXISTS company (
220
+ id TEXT PRIMARY KEY NOT NULL,
221
+ slug TEXT NOT NULL,
222
+ name TEXT NOT NULL,
223
+ legal_name TEXT,
224
+ logo_url TEXT,
225
+ favicon_url TEXT,
226
+ primary_color TEXT,
227
+ auth_bg_color TEXT,
228
+ support_email TEXT,
229
+ website_url TEXT,
230
+ tagline TEXT,
231
+ meta_json TEXT,
232
+ created_at INTEGER NOT NULL,
233
+ updated_at INTEGER NOT NULL
234
+ );
235
+
236
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_company_slug ON company(slug);
237
+
238
+ INSERT OR IGNORE INTO company (
239
+ id, slug, name, website_url, created_at, updated_at
240
+ ) VALUES (
241
+ ${sqlString(`co_${config.companySlug}`)},
242
+ ${sqlString(config.companySlug)},
243
+ ${sqlString(config.displayName)},
244
+ ${sqlStringOrNull(config.homepageUrl)},
245
+ unixepoch(),
246
+ unixepoch()
247
+ );
248
+ `;
249
+ }
250
+
251
+ function consentCatalogMigration(config) {
252
+ return `-- OAuth resource/scope semantics. Issuer branding remains in company.
253
+ CREATE TABLE IF NOT EXISTS identity_oauth_resources (
254
+ id TEXT PRIMARY KEY NOT NULL,
255
+ audience TEXT NOT NULL UNIQUE,
256
+ resource_type TEXT NOT NULL DEFAULT 'mcp',
257
+ display_name TEXT NOT NULL,
258
+ description TEXT,
259
+ logo_url TEXT,
260
+ homepage_url TEXT,
261
+ metadata_json TEXT NOT NULL DEFAULT '{}',
262
+ is_active INTEGER NOT NULL DEFAULT 1 CHECK (is_active IN (0,1)),
263
+ created_at INTEGER NOT NULL,
264
+ updated_at INTEGER NOT NULL
265
+ );
266
+
267
+ CREATE TABLE IF NOT EXISTS identity_oauth_scopes (
268
+ scope TEXT PRIMARY KEY NOT NULL,
269
+ label TEXT NOT NULL,
270
+ description TEXT NOT NULL,
271
+ category TEXT NOT NULL DEFAULT 'general',
272
+ sensitivity TEXT NOT NULL DEFAULT 'normal'
273
+ CHECK (sensitivity IN ('normal','elevated','sensitive')),
274
+ is_active INTEGER NOT NULL DEFAULT 1 CHECK (is_active IN (0,1)),
275
+ sort_order INTEGER NOT NULL DEFAULT 50,
276
+ created_at INTEGER NOT NULL,
277
+ updated_at INTEGER NOT NULL
278
+ );
279
+
280
+ CREATE TABLE IF NOT EXISTS identity_oauth_resource_scopes (
281
+ resource_id TEXT NOT NULL,
282
+ scope TEXT NOT NULL,
283
+ required INTEGER NOT NULL DEFAULT 0 CHECK (required IN (0,1)),
284
+ sort_order INTEGER NOT NULL DEFAULT 50,
285
+ PRIMARY KEY (resource_id, scope),
286
+ FOREIGN KEY (resource_id) REFERENCES identity_oauth_resources(id) ON DELETE CASCADE,
287
+ FOREIGN KEY (scope) REFERENCES identity_oauth_scopes(scope) ON DELETE CASCADE
288
+ );
289
+
290
+ INSERT OR IGNORE INTO identity_oauth_resources (
291
+ id, audience, display_name, homepage_url, created_at, updated_at
292
+ ) VALUES (
293
+ ${sqlString(`res_${config.projectName}`)},
294
+ ${sqlString(config.audience)},
295
+ ${sqlString(config.displayName)},
296
+ ${sqlStringOrNull(config.homepageUrl)},
297
+ unixepoch(),
298
+ unixepoch()
299
+ );
300
+ ${(config.scopes || []).map((s) => `
301
+ INSERT OR IGNORE INTO identity_oauth_scopes (
302
+ scope, label, description, category, sensitivity, created_at, updated_at
303
+ ) VALUES (
304
+ ${sqlString(s.scope)},
305
+ ${sqlString(s.label)},
306
+ ${sqlString(s.description)},
307
+ ${sqlString(s.category)},
308
+ ${sqlString(s.sensitivity)},
309
+ unixepoch(),
310
+ unixepoch()
311
+ );
312
+
313
+ INSERT OR IGNORE INTO identity_oauth_resource_scopes (
314
+ resource_id, scope
315
+ ) VALUES (
316
+ ${sqlString(`res_${config.projectName}`)},
317
+ ${sqlString(s.scope)}
318
+ );
319
+ `).join('')}
320
+ `;
321
+ }
322
+
323
+ export function resolveMcpServerTemplateConfig(input = {}) {
324
+ const preset = getMcpServerPreset(input.preset || 'heuristics');
325
+ const projectName = slug(input.projectName || input.name || 'my-mcp-server');
326
+ return Object.freeze({
327
+ preset: preset.key,
328
+ projectName,
329
+ displayName: String(input.displayName || preset.displayName || projectName),
330
+ companyName: String(input.companyName || preset.companyName || 'Your Company'),
331
+ companySlug: String(input.companySlug || preset.companySlug || 'default'),
332
+ homepageUrl: String(input.homepageUrl || preset.homepageUrl),
333
+ audience: String(input.audience || preset.audience),
334
+ issuer: String(input.issuer || preset.issuer),
335
+ authMode: String(input.authMode || preset.authMode || 'oauth'),
336
+ scopes: Array.isArray(input.scopes) ? input.scopes : preset.scopes,
337
+ });
338
+ }
339
+
340
+ export function mcpServerTemplates(input = {}) {
341
+ const config = resolveMcpServerTemplateConfig(input);
342
+ const manifest = buildManifest(config);
343
+
344
+ return {
345
+ 'package.json': JSON.stringify({
346
+ name: config.projectName,
347
+ version: '0.1.0',
348
+ private: true,
349
+ type: 'module',
350
+ scripts: { dev: 'wrangler dev', deploy: 'wrangler deploy' },
351
+ dependencies: {
352
+ '@modelcontextprotocol/sdk': '1.30.0',
353
+ zod: '4.6.5',
354
+ },
355
+ devDependencies: { wrangler: '4.141.0' },
356
+ }, null, 2) + '\n',
357
+
358
+ 'agentsam.mcp.json': JSON.stringify(manifest, null, 2) + '\n',
359
+
360
+ 'wrangler.jsonc': JSON.stringify({
361
+ name: config.projectName,
362
+ main: 'src/index.js',
363
+ compatibility_date: '2026-09-27',
364
+ vars: {
365
+ MCP_AUTH_MODE: config.authMode,
366
+ MCP_AUTH_ISSUER: config.issuer,
367
+ MCP_RESOURCE_AUDIENCE: config.audience,
368
+ },
369
+ }, null, 2) + '\n',
370
+
371
+ '.dev.vars.example': [
372
+ '# Local-only proof. Production remains fail-closed OAuth.',
373
+ 'MCP_AUTH_MODE=public',
374
+ '# MCP_TOKEN_VERIFY_URL=https://your-issuer.example/api/oauth/token/verify',
375
+ '',
376
+ ].join('\n'),
377
+
378
+ 'src/index.js': workerSource(manifest),
379
+ 'src/oauth.js': oauthSource(),
380
+ 'migrations/001_identity_company.sql': companyMigration(config),
381
+ 'migrations/002_oauth_consent_catalog.sql': consentCatalogMigration(config),
382
+
383
+ 'README.md': `# ${config.displayName}
384
+
385
+ Generated by AgentSam MCP factory.
386
+
387
+ - MCP Streamable HTTP: \`/mcp\`
388
+ - Protected-resource metadata: \`/.well-known/oauth-protected-resource\`
389
+ - OAuth is fail-closed by default.
390
+ - Configure \`MCP_TOKEN_VERIFY_URL\` with a verifier that returns token audience and scope data.
391
+ - Issuer branding comes from the portable \`company\` table.
392
+ - OAuth resource and scope semantics are separate from issuer branding.
393
+
394
+ For local protocol testing only, copy \`.dev.vars.example\` to \`.dev.vars\`.
395
+ `,
396
+ };
397
+ }
@@ -0,0 +1,39 @@
1
+ export const MCP_SERVER_PRESETS = Object.freeze({
2
+ heuristics: Object.freeze({
3
+ key: 'heuristics',
4
+ displayName: 'Heuristics MCP',
5
+ description: 'Machine-first MCP starter with portable OAuth, identity branding, and deterministic diagnostics.',
6
+ companyName: 'Your Company',
7
+ companySlug: 'default',
8
+ homepageUrl: 'https://example.com',
9
+ audience: 'https://example.com/mcp',
10
+ issuer: 'https://example.com',
11
+ authMode: 'oauth',
12
+ scopes: [
13
+ {
14
+ scope: 'mcp:read',
15
+ label: 'MCP resources',
16
+ description: 'Read approved MCP resources.',
17
+ category: 'mcp',
18
+ sensitivity: 'normal',
19
+ },
20
+ ],
21
+ }),
22
+ });
23
+
24
+ export function getMcpServerPreset(key = 'heuristics') {
25
+ const normalized = String(key || 'heuristics').trim().toLowerCase();
26
+ const preset = MCP_SERVER_PRESETS[normalized];
27
+ if (!preset) throw new Error('unknown_mcp_server_preset:' + normalized);
28
+ return preset;
29
+ }
30
+
31
+ export function listMcpServerPresets() {
32
+ return Object.values(MCP_SERVER_PRESETS).map((preset) => ({
33
+ key: preset.key,
34
+ display_name: preset.displayName,
35
+ description: preset.description,
36
+ company_name: preset.companyName,
37
+ audience: preset.audience,
38
+ }));
39
+ }
@@ -9,6 +9,7 @@
9
9
  * - wrangler.toml ready to deploy
10
10
  */
11
11
 
12
+ import path from 'node:path';
12
13
  import {
13
14
  text,
14
15
  select,
@@ -23,8 +24,100 @@ import pc from 'picocolors';
23
24
  import { writeFileTree } from '../writer.js';
24
25
  import { cmsTemplates } from '../templates/cms/index.js';
25
26
  import { resolveCloudflareAccountId } from '../resolve-cloudflare-account.js';
27
+ import { runApp } from '../../../commands/app.js';
28
+
29
+ async function runCmsEditorWizard() {
30
+ note(
31
+ 'Scaffold the reusable client-cms-editor app. SQLite and D1 are authorities; localStorage is cache-only.',
32
+ 'CMS Editor app',
33
+ );
34
+
35
+ const projectName = await text({
36
+ message: 'Editor project name?',
37
+ placeholder: 'my-cms-editor',
38
+ validate(val) {
39
+ if (!val || val.trim().length === 0) return 'Required.';
40
+ if (!/^[a-z0-9-]+$/.test(val.trim())) return 'Lowercase letters, numbers, and hyphens only.';
41
+ },
42
+ });
43
+ if (isCancel(projectName)) { cancel('Cancelled.'); process.exit(0); }
44
+
45
+ const persistence = await select({
46
+ message: 'Primary persistence?',
47
+ options: [
48
+ {
49
+ value: 'sqlite',
50
+ label: 'SQLite — local authority',
51
+ hint: 'Desktop/offline authority; Local Studio/Tauri adapter target',
52
+ },
53
+ {
54
+ value: 'd1',
55
+ label: 'Cloudflare D1 — cloud authority',
56
+ hint: 'Existing /api/cms/* + D1 host path',
57
+ },
58
+ {
59
+ value: 'localStorage',
60
+ label: 'Browser localStorage — cache only',
61
+ hint: 'Draft/offline cache; never authoritative publish state',
62
+ },
63
+ ],
64
+ });
65
+ if (isCancel(persistence)) { cancel('Cancelled.'); process.exit(0); }
66
+
67
+ const targetDir = path.resolve(process.cwd(), projectName.trim());
68
+ const s = spinner();
69
+ s.start('Scaffolding CMS Editor...');
70
+ await runApp([
71
+ 'scaffold',
72
+ 'client-cms-editor',
73
+ targetDir,
74
+ '--persistence',
75
+ persistence,
76
+ ]);
77
+ s.stop(pc.green(`CMS Editor scaffolded at ${targetDir}`));
78
+
79
+ const next = persistence === 'sqlite'
80
+ ? [
81
+ `cd ${projectName}`,
82
+ 'npm install',
83
+ 'npm run dev',
84
+ 'Open in Local Studio.app when the Tauri CMS adapter is enabled.',
85
+ ]
86
+ : persistence === 'd1'
87
+ ? [
88
+ `cd ${projectName}`,
89
+ 'npm install',
90
+ 'agentsam connections setup',
91
+ 'npm run dev',
92
+ ]
93
+ : [
94
+ `cd ${projectName}`,
95
+ 'npm install',
96
+ 'npm run dev',
97
+ 'Configure SQLite or D1 before publish; localStorage remains cache-only.',
98
+ ];
99
+ note(next.join('\n'), 'Next steps');
100
+ }
26
101
 
27
102
  export async function runCmsWizard() {
103
+ const mode = await select({
104
+ message: 'What kind of CMS do you want to scaffold?',
105
+ options: [
106
+ {
107
+ value: 'site',
108
+ label: 'CMS Site',
109
+ hint: 'Cloudflare Worker + D1 + R2 with nav, pages, and reusable templates',
110
+ },
111
+ {
112
+ value: 'editor',
113
+ label: 'CMS Editor app',
114
+ hint: 'Full reusable client-cms-editor source with explicit persistence',
115
+ },
116
+ ],
117
+ });
118
+ if (isCancel(mode)) { cancel('Cancelled.'); process.exit(0); }
119
+ if (mode === 'editor') return runCmsEditorWizard();
120
+
28
121
  note('A Cloudflare Worker + D1 + R2 CMS site with reusable page templates.', 'CMS Site');
29
122
 
30
123
  // ── Step 1: Project name ──────────────────────────────────────────────────
@@ -0,0 +1,61 @@
1
+ import {
2
+ text,
3
+ select,
4
+ confirm,
5
+ note,
6
+ isCancel,
7
+ cancel,
8
+ } from '@clack/prompts';
9
+ import pc from 'picocolors';
10
+ import { createMcpServerProject } from '../mcp-server.js';
11
+ import { listMcpServerPresets } from '../templates/mcp-server/presets.js';
12
+
13
+ export async function runMcpServerWizard() {
14
+ const presets = listMcpServerPresets();
15
+ const preset = await select({
16
+ message: 'MCP server preset?',
17
+ options: presets.map((item) => ({
18
+ value: item.key,
19
+ label: item.display_name,
20
+ hint: item.description || 'Portable MCP Worker',
21
+ })),
22
+ });
23
+ if (isCancel(preset)) { cancel('Cancelled.'); process.exit(0); }
24
+
25
+ const projectName = await text({
26
+ message: 'Project name?',
27
+ placeholder: 'my-mcp-server',
28
+ validate(value) {
29
+ if (!String(value || '').trim()) return 'Required.';
30
+ if (!/^[a-z0-9-]+$/.test(String(value).trim())) {
31
+ return 'Lowercase letters, numbers, and hyphens only.';
32
+ }
33
+ },
34
+ });
35
+ if (isCancel(projectName)) { cancel('Cancelled.'); process.exit(0); }
36
+
37
+ const confirmed = await confirm({
38
+ message: `Generate ./${String(projectName).trim()}?`,
39
+ });
40
+ if (isCancel(confirmed) || !confirmed) {
41
+ cancel('Cancelled.');
42
+ process.exit(0);
43
+ }
44
+
45
+ const result = await createMcpServerProject({
46
+ projectName: String(projectName).trim(),
47
+ preset,
48
+ });
49
+
50
+ note([
51
+ `Generated ${result.file_count} files`,
52
+ `Manifest: ${result.manifest_path}`,
53
+ `Transport: ${result.transport} ${result.endpoint_path}`,
54
+ '',
55
+ `cd ${String(projectName).trim()}`,
56
+ 'npm install',
57
+ 'npm run dev',
58
+ ].join('\n'), pc.green('MCP server ready'));
59
+
60
+ return result;
61
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Agent Sam capability install planner — Homebrew-style orchestration.
3
+ * Agent Sam owns discover → plan → explain → approve → execute → verify + receipt.
4
+ * Native package managers own the actual install (brew / apt / winget / npm / …).
5
+ */
6
+
7
+ export const SETUP_PLAN_SCHEMA = 'agentsam-setup-plan-v1';
8
+ export const SETUP_RECEIPT_SCHEMA = 'agentsam-setup-receipt-v1';
9
+
10
+ /**
11
+ * @typedef {{
12
+ * id: string,
13
+ * displayName: string,
14
+ * description: string,
15
+ * risk: 'low'|'medium'|'high',
16
+ * requiresApproval: boolean,
17
+ * capabilityProvided: string[],
18
+ * detect: (ctx: object) => Promise<{ ok: boolean, detail?: string, version?: string }>,
19
+ * supportedPlatforms: string[],
20
+ * installPlans: Record<string, { provider: string, packages?: string[], commands?: string[], notes?: string[] }>,
21
+ * dependencies?: string[],
22
+ * mutations?: string[],
23
+ * verify: (ctx: object) => Promise<{ ok: boolean, detail?: string, version?: string }>,
24
+ * uninstallHint?: () => string,
25
+ * }} InstallableCapability
26
+ */