@inneranimalmedia/agentsam-sdk 2.6.3 → 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 (608) hide show
  1. package/AGENTSAM.md +17 -0
  2. package/README.md +31 -10
  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 +16 -1
  57. package/bin/agentsam-rapid-rust +36 -0
  58. package/docs/AUTH_IDENTITY_CONTRACT.md +2 -0
  59. package/docs/BRAND_INTELLIGENCE.md +1 -1
  60. package/docs/MACHINE_INTELLIGENCE.md +120 -0
  61. package/docs/WINDOWS_RUNTIME_INSTALL.md +30 -0
  62. package/docs/architecture/AGENTSAM_APPLICATION_CONTRACT.md +188 -0
  63. package/docs/architecture/AGENTSAM_DISTRIBUTION_OWNERSHIP.md +176 -0
  64. package/docs/architecture/AGENTSAM_GO_RUNTIME.md +282 -0
  65. package/docs/architecture/AGENTSAM_RUNTIME_PROTOCOL.md +151 -0
  66. package/docs/architecture/CODEBASEINDEX_GUIDED_PATH.md +202 -0
  67. package/docs/architecture/FS_E2E_CLOSURE_RECEIPT.md +59 -0
  68. package/docs/architecture/LOCAL_FS_AUTHORITY.md +38 -0
  69. package/docs/architecture/LOCAL_STUDIO_CLOUDFLARE_OAUTH.md +36 -0
  70. package/docs/architecture/PLAN_CLI_AND_LOCAL_STUDIO_DESKTOP.md +96 -0
  71. package/docs/architecture/R2_SLUG_NAMESPACE.md +20 -0
  72. package/docs/architecture/SAM_ACTIVITY_RECOVERY_RECEIPT.md +39 -0
  73. package/docs/architecture/SAM_DECISION_WORK_RECEIPT.md +54 -0
  74. package/docs/architecture/SAM_KERNEL.md +181 -0
  75. package/docs/architecture/SAM_MACHINE_NORMALIZATION_PRECOMMIT_REPORT.md +208 -0
  76. package/docs/architecture/SLASH_SKILLS_PORTABLE.md +116 -0
  77. package/docs/architecture/WORK_PRODUCT_EXTRACTION.md +97 -0
  78. package/docs/architecture/fs-e2e-receipt.latest.json +42 -0
  79. package/docs/architecture/previews/codebaseindex-guided-path/CODEBASEINDEX_GUIDED_PATH.md +202 -0
  80. package/docs/architecture/previews/codebaseindex-guided-path/index.html +321 -0
  81. package/docs/brand/AGENT_SAM_ICON_GRAMMAR.md +70 -0
  82. package/docs/content-studio/HOST_MOUNT_CHECKLIST.md +71 -0
  83. package/docs/content-studio/REVISION_GATE_2026-09-27.md +501 -0
  84. package/docs/contracts/capability-install-planner.md +67 -0
  85. package/docs/contracts/environment-vocabulary.md +195 -0
  86. package/docs/contracts/google-cloud-oauth-setup.md +199 -0
  87. package/docs/local-studio/WORKMODE_DONOR_NOTES.md +1 -1
  88. package/docs/plans/LOCAL-STUDIO-GRADUATION-2026-09-26.md +290 -0
  89. package/docs/plans/LOCAL-STUDIO-REAL-APP-CONTRACT-ADDENDUM-2026-09-27.md +394 -0
  90. package/docs/plans/MACHINE-FIRST-APPS-TUI-2026-09-24.md +227 -0
  91. package/docs/plans/TOMORROW-EXTENSIVE-TODO-2026-09-26.md +221 -0
  92. package/docs/plans/TOMORROW-MACHINE-FIRST-BRIEFING.md +145 -0
  93. package/docs/plans/UNIVERSAL-INGEST-MACHINE-FIRST-2026-09-24.md +215 -0
  94. package/docs/plugins.md +2 -2
  95. package/docs/product/AGENTSAM_PRODUCT_EXPERIENCE_STANDARD.md +280 -0
  96. package/docs/product/LOCAL_STUDIO_DESKTOP_EXPERIENCE.md +139 -0
  97. package/docs/product/README.md +8 -0
  98. package/docs/rapid-rust-wasm.md +35 -0
  99. package/migrations/d1/0010_portable_tickets_memory.sql +140 -0
  100. package/migrations/d1/0011_agentsam_skill_v2.sql +185 -0
  101. package/migrations/d1/0011b_agentsam_skill_v2_cutover.sql +22 -0
  102. package/migrations/d1/0011c_agentsam_skill_v2_backfill.sql +76 -0
  103. package/migrations/d1/0011d_agentsam_skill_v2_retrieval_revisions.sql +50 -0
  104. package/migrations/d1/0012_agentsam_tools_required_seed.sql +67 -0
  105. package/migrations/d1/0013_identity_oauth_states.sql +15 -0
  106. package/migrations/d1/0014_auth_event_log.sql +20 -0
  107. package/migrations/d1/0015_identity_oauth_state_app_id.sql +3 -0
  108. package/migrations/d1/0016_cloudflare_oauth_user_oauth_tokens_ssot.sql +14 -0
  109. package/migrations/d1/README_PORTABLE_CONTROL_PLANE.md +16 -0
  110. package/migrations/sqlite/agentsam_skill_retrieval.portable.sql +42 -0
  111. package/package.json +88 -14
  112. package/packages/agentsam-brand/README.md +106 -11
  113. package/packages/agentsam-brand/bin/agentsam-brand.mjs +9 -0
  114. package/packages/agentsam-brand/package.json +39 -7
  115. package/packages/agentsam-brand/src/adapters/cloudflare-images.js +453 -0
  116. package/packages/agentsam-brand/src/adapters/cloudflare-r2.js +74 -0
  117. package/packages/agentsam-brand/src/adapters/d1-registry.js +26 -0
  118. package/packages/agentsam-brand/src/adapters/filesystem.js +59 -0
  119. package/packages/agentsam-brand/src/adapters/memory.js +31 -0
  120. package/packages/agentsam-brand/src/cli/controller.js +503 -0
  121. package/packages/agentsam-brand/src/cli/wizard.js +526 -0
  122. package/packages/agentsam-brand/src/core/capabilities.js +201 -0
  123. package/packages/agentsam-brand/src/core/derivatives.js +211 -0
  124. package/packages/agentsam-brand/src/core/errors.js +12 -0
  125. package/packages/agentsam-brand/src/core/ingest.js +195 -0
  126. package/packages/agentsam-brand/src/core/inspect.js +109 -0
  127. package/packages/agentsam-brand/src/core/keys.js +83 -0
  128. package/packages/agentsam-brand/src/core/naming.js +142 -0
  129. package/packages/agentsam-brand/src/core/optimize.js +316 -0
  130. package/packages/agentsam-brand/src/core/pack.js +305 -0
  131. package/packages/agentsam-brand/src/core/plan.js +276 -0
  132. package/packages/agentsam-brand/src/core/preview.js +159 -0
  133. package/packages/agentsam-brand/src/core/processors/cloudflare.js +68 -0
  134. package/packages/agentsam-brand/src/core/processors/contract.js +203 -0
  135. package/packages/agentsam-brand/src/core/processors/index.js +148 -0
  136. package/packages/agentsam-brand/src/core/processors/native.js +82 -0
  137. package/packages/agentsam-brand/src/core/processors/sharp.js +113 -0
  138. package/packages/agentsam-brand/src/core/processors/squoosh-binary.js +195 -0
  139. package/packages/agentsam-brand/src/core/promote.js +288 -0
  140. package/packages/agentsam-brand/src/core/receipts.js +155 -0
  141. package/packages/agentsam-brand/src/core/v2/compile.js +280 -0
  142. package/packages/agentsam-brand/src/core/v2/derivatives-semantic.js +207 -0
  143. package/packages/agentsam-brand/src/core/v2/ingest-graph.js +387 -0
  144. package/packages/agentsam-brand/src/core/v2/roles.js +180 -0
  145. package/packages/agentsam-brand/src/core/v2/schema.js +209 -0
  146. package/packages/agentsam-brand/src/core/v2/templates.js +114 -0
  147. package/packages/agentsam-brand/src/index.js +193 -36
  148. package/packages/agentsam-brand/src/presets/app-icon.json +16 -0
  149. package/packages/agentsam-brand/src/presets/favicon.json +17 -0
  150. package/packages/agentsam-brand/src/presets/hero.json +12 -0
  151. package/packages/agentsam-brand/src/presets/index.js +40 -0
  152. package/packages/agentsam-brand/src/presets/logo.json +12 -0
  153. package/packages/agentsam-brand/src/presets/model.json +8 -0
  154. package/packages/agentsam-brand/src/presets/og-image.json +10 -0
  155. package/packages/agentsam-brand/src/presets/product-shot.json +11 -0
  156. package/packages/agentsam-brand/src/presets/social-image.json +10 -0
  157. package/packages/agentsam-brand/src/presets/web-image.json +10 -0
  158. package/packages/agentsam-contracts/src/artifacts.ts +41 -0
  159. package/packages/agentsam-contracts/src/errors.ts +16 -0
  160. package/packages/agentsam-errors/src/envelope.js +53 -0
  161. package/packages/agentsam-errors/src/index.js +1 -0
  162. package/packages/agentsam-errors/src/recovery.js +301 -0
  163. package/packages/agentsam-knowledge/src/autorag/index.js +1 -1
  164. package/packages/agentsam-knowledge/src/providers/index.js +20 -6
  165. package/packages/agentsam-knowledge/src/providers/ollama-endpoint.js +31 -0
  166. package/packages/agentsam-knowledge/test/autorag.test.mjs +22 -1
  167. package/packages/agentsam-nav/package.json +2 -2
  168. package/packages/agentsam-rapid-rust/Cargo.lock +344 -0
  169. package/packages/agentsam-rapid-rust/Cargo.toml +18 -0
  170. package/packages/agentsam-rapid-rust/README.md +5 -0
  171. package/packages/agentsam-rapid-rust/src/main.rs +718 -0
  172. package/packages/agentsam-rapid-rust/templates/api/Cargo.toml.tmpl +18 -0
  173. package/packages/agentsam-rapid-rust/templates/api/src/lib.rs.tmpl +17 -0
  174. package/packages/agentsam-rapid-rust/templates/common/README.md.tmpl +22 -0
  175. package/packages/agentsam-rapid-rust/templates/common/package.json.tmpl +12 -0
  176. package/packages/agentsam-rapid-rust/templates/common/wrangler.toml.tmpl +6 -0
  177. package/packages/agentsam-rapid-rust/templates/crypto-auth/Cargo.toml.tmpl +21 -0
  178. package/packages/agentsam-rapid-rust/templates/crypto-auth/src/lib.rs.tmpl +32 -0
  179. package/packages/agentsam-rapid-rust/templates/data-processor/Cargo.toml.tmpl +18 -0
  180. package/packages/agentsam-rapid-rust/templates/data-processor/src/lib.rs.tmpl +41 -0
  181. package/packages/agentsam-rapid-rust/templates/shared-core/Cargo.toml.tmpl +9 -0
  182. package/packages/agentsam-rapid-rust/templates/shared-core/core/Cargo.toml.tmpl +7 -0
  183. package/packages/agentsam-rapid-rust/templates/shared-core/core/src/lib.rs.tmpl +23 -0
  184. package/packages/agentsam-rapid-rust/templates/shared-core/worker/Cargo.toml.tmpl +12 -0
  185. package/packages/agentsam-rapid-rust/templates/shared-core/worker/src/lib.rs.tmpl +16 -0
  186. package/packages/agentsam-rapid-rust/templates/shared-core/wrangler.toml.tmpl +6 -0
  187. package/packages/agentsam-repository/src/index.js +1 -0
  188. package/packages/agentsam-repository/src/merkle/semantic.js +3 -10
  189. package/packages/agentsam-repository/src/source-types.js +85 -0
  190. package/packages/agentsam-vault/README.md +96 -0
  191. package/packages/agentsam-vault/package.json +32 -0
  192. package/packages/agentsam-vault/src/contracts/credential.d.ts +78 -0
  193. package/packages/agentsam-vault/src/contracts/credential.js +132 -0
  194. package/packages/agentsam-vault/src/crypto/aes-gcm.d.ts +30 -0
  195. package/packages/agentsam-vault/src/crypto/aes-gcm.js +107 -0
  196. package/packages/agentsam-vault/src/crypto/oauth-envelope.js +150 -0
  197. package/packages/agentsam-vault/src/index.d.ts +9 -0
  198. package/packages/agentsam-vault/src/index.js +27 -0
  199. package/packages/agentsam-vault/src/providers/registry.js +90 -0
  200. package/packages/agentsam-vault/src/runtime/resolver.js +77 -0
  201. package/packages/agentsam-workbench/README.md +24 -0
  202. package/packages/agentsam-workbench/package.json +38 -0
  203. package/packages/agentsam-workbench/src/agent/AgentPanel.tsx +41 -0
  204. package/packages/agentsam-workbench/src/agent/ArtifactCard.tsx +9 -0
  205. package/packages/agentsam-workbench/src/agent/Composer.tsx +102 -0
  206. package/packages/agentsam-workbench/src/agent/ConnectedAgentPanel.tsx +194 -0
  207. package/packages/agentsam-workbench/src/agent/ContextualComposer.tsx +788 -0
  208. package/packages/agentsam-workbench/src/agent/GoalStatusStrip.tsx +38 -0
  209. package/packages/agentsam-workbench/src/agent/MiniAgentSam.tsx +86 -0
  210. package/packages/agentsam-workbench/src/agent/ModelSelect.tsx +19 -0
  211. package/packages/agentsam-workbench/src/agent/Thread.tsx +56 -0
  212. package/packages/agentsam-workbench/src/agent/ToolReceipt.tsx +11 -0
  213. package/packages/agentsam-workbench/src/agent/contextual-composer.css +611 -0
  214. package/packages/agentsam-workbench/src/agent/index.ts +10 -0
  215. package/packages/agentsam-workbench/src/agent/mini-agentsam.css +12 -0
  216. package/packages/agentsam-workbench/src/browser/BrowserFrame.tsx +37 -0
  217. package/packages/agentsam-workbench/src/browser/index.ts +1 -0
  218. package/packages/agentsam-workbench/src/index.ts +6 -0
  219. package/packages/agentsam-workbench/src/project-control.css +160 -0
  220. package/packages/agentsam-workbench/src/projects/ProjectsSurface.tsx +131 -0
  221. package/packages/agentsam-workbench/src/projects/index.ts +1 -0
  222. package/packages/agentsam-workbench/src/shell/Breadcrumb.tsx +35 -0
  223. package/packages/agentsam-workbench/src/shell/ResizableStage.tsx +99 -0
  224. package/packages/agentsam-workbench/src/shell/SidePanel.tsx +5 -0
  225. package/packages/agentsam-workbench/src/shell/index.ts +4 -0
  226. package/packages/agentsam-workbench/src/shell/surfaceRegistry.ts +29 -0
  227. package/packages/agentsam-workbench/src/terminal/TerminalSurface.tsx +5 -0
  228. package/packages/agentsam-workbench/src/terminal/index.ts +1 -0
  229. package/packages/agentsam-workbench/src/timeline/GanttBoard.tsx +258 -0
  230. package/packages/agentsam-workbench/src/timeline/index.ts +1 -0
  231. package/packages/agentsam-workbench/tsconfig.json +13 -0
  232. package/packages/connectors/cloudflare/OAUTH_STORAGE_AUDIT.md +53 -0
  233. package/packages/connectors/cloudflare/package.json +3 -1
  234. package/packages/connectors/cloudflare/src/api-client.js +279 -0
  235. package/packages/connectors/cloudflare/src/capabilities.js +585 -0
  236. package/packages/connectors/cloudflare/src/credential.js +318 -0
  237. package/packages/connectors/cloudflare/src/families/brand-protection.js +123 -0
  238. package/packages/connectors/cloudflare/src/families/keyless.js +114 -0
  239. package/packages/connectors/cloudflare/src/families/pages.js +151 -0
  240. package/packages/connectors/cloudflare/src/families/scanner.js +123 -0
  241. package/packages/connectors/cloudflare/src/families/snippets.js +207 -0
  242. package/packages/connectors/cloudflare/src/families/tag-gateway.js +46 -0
  243. package/packages/connectors/cloudflare/src/families/tags.js +124 -0
  244. package/packages/connectors/cloudflare/src/families/token-validation.js +95 -0
  245. package/packages/connectors/cloudflare/src/families/workflows.js +156 -0
  246. package/packages/connectors/cloudflare/src/index.js +102 -265
  247. package/packages/connectors/cloudflare/src/oauth-persist.js +336 -0
  248. package/packages/connectors/cloudflare/src/owner.js +42 -12
  249. package/packages/connectors/cloudflare/src/permission-options.js +1064 -0
  250. package/packages/connectors/cloudflare/src/routes.js +318 -144
  251. package/packages/connectors/cloudflare/src/scope-catalog.js +345 -0
  252. package/packages/connectors/cloudflare/src/vault.js +2 -2
  253. package/packages/connectors/cloudflare/tests/capabilities.test.mjs +276 -0
  254. package/packages/connectors/cloudflare/tests/connector.test.mjs +51 -30
  255. package/packages/connectors/cloudflare/tests/oauth-persist.test.mjs +125 -0
  256. package/packages/identity/.agentsam/features/oauth-login-portal/agentsam.feature.json +1 -1
  257. package/packages/identity/.agentsam/features/oauth-login-portal/providers.json +22 -2
  258. package/packages/identity/.agentsam/features/oauth-login-portal/resources.json +10 -4
  259. package/packages/identity/.agentsam/features/oauth-login-portal/routes.json +31 -2
  260. package/packages/identity/README.md +1 -1
  261. package/packages/identity/backend/README.md +1 -1
  262. package/packages/identity/docs/PORTABLE_IDENTITY_ARCHITECTURE.md +50 -0
  263. package/packages/identity/migrations/D1_SCHEMA_MAPPING.md +32 -0
  264. package/packages/identity/migrations/sqlite/001_identity_core.sql +99 -0
  265. package/packages/identity/migrations/sqlite/002_identity_oauth_client.sql +38 -0
  266. package/packages/identity/migrations/sqlite/003_identity_oauth_server.sql +64 -0
  267. package/packages/identity/migrations/sqlite/004_identity_oauth_consent_catalog.sql +48 -0
  268. package/packages/identity/package.json +3 -2
  269. package/packages/identity/scripts/local-identity-bridge.mjs +184 -0
  270. package/packages/identity/scripts/preview-auth-portal.mjs +7 -7
  271. package/packages/identity/src/adapters/cloudflare-d1/index.js +153 -24
  272. package/packages/identity/src/adapters/sqlite/index.js +322 -0
  273. package/packages/identity/src/app/verify-app.js +95 -0
  274. package/packages/identity/src/contracts/auth-config.js +28 -8
  275. package/packages/identity/src/contracts/external-identity.js +1 -1
  276. package/packages/identity/src/contracts/identity-store.js +115 -0
  277. package/packages/identity/src/contracts/provider.js +1 -0
  278. package/packages/identity/src/contracts/route-ids.js +30 -0
  279. package/packages/identity/src/contracts/route-projection.js +218 -0
  280. package/packages/identity/src/contracts/routes.js +11 -0
  281. package/packages/identity/src/core/browser-paths.js +4 -5
  282. package/packages/identity/src/core/constants.js +13 -8
  283. package/packages/identity/src/core/session-policy.js +32 -0
  284. package/packages/identity/src/frontend/auth-portal/README.md +2 -1
  285. package/packages/identity/src/frontend/auth-portal/pages/login.html +16 -15
  286. package/packages/identity/src/frontend/auth-portal/pages/reset.html +9 -8
  287. package/packages/identity/src/frontend/auth-portal/pages/signup.html +9 -8
  288. package/packages/identity/src/frontend/auth-portal/preview/dashboard-stub.html +1 -1
  289. package/packages/identity/src/frontend/auth-portal/shared/company-branding.js +1 -1
  290. package/packages/identity/src/frontend/auth-portal/shared/desktop-identity-bridge.js +207 -0
  291. package/packages/identity/src/index.js +41 -0
  292. package/packages/identity/src/migrations/0001_identity_core.sql +19 -2
  293. package/packages/identity/src/migrations/0003_accounts_ssot.sql +20 -0
  294. package/packages/identity/src/migrations/README.md +5 -2
  295. package/packages/identity/src/oauth/README.md +19 -8
  296. package/packages/identity/src/oauth/consent-view.js +388 -0
  297. package/packages/identity/src/oauth/credentials.js +46 -19
  298. package/packages/identity/src/oauth/finalize-inbound.js +1 -1
  299. package/packages/identity/src/oauth/google-desktop-exchange.js +173 -0
  300. package/packages/identity/src/oauth/iam-platform.js +8 -7
  301. package/packages/identity/src/oauth/redirect-paths.js +27 -36
  302. package/packages/identity/src/providers/cloudflare/oauth.js +3 -4
  303. package/packages/identity/src/providers/cloudflare/profile.js +49 -14
  304. package/packages/identity/src/providers/iam/index.js +27 -5
  305. package/packages/identity/src/server/identity-service.js +61 -15
  306. package/packages/identity/src/server/mount-policy.js +30 -0
  307. package/packages/identity/src/server/post-auth.js +79 -0
  308. package/packages/identity/src/server/worker-router.js +208 -146
  309. package/packages/identity/tests/auth-config.test.mjs +3 -2
  310. package/packages/identity/tests/finalize-inbound-oauth.test.mjs +6 -6
  311. package/packages/identity/tests/iam-provider.test.mjs +1 -1
  312. package/packages/identity/tests/identity-init-scaffold.test.mjs +3 -0
  313. package/packages/identity/tests/identity-service.test.mjs +52 -5
  314. package/packages/identity/tests/native-session-worker.test.mjs +64 -0
  315. package/packages/identity/tests/oauth-consent-view.test.mjs +106 -0
  316. package/packages/identity/tests/oauth-credentials.test.mjs +20 -5
  317. package/packages/identity/tests/oauth-presets-accounts-ssot.test.mjs +58 -0
  318. package/packages/identity/tests/portable-identity-architecture.test.mjs +157 -0
  319. package/packages/identity/tests/preview-auth-portal.test.mjs +3 -3
  320. package/packages/identity/tests/session-routes-policy.test.mjs +21 -0
  321. package/packages/runtime-protocol/src/index.js +154 -0
  322. package/packages/theme-church-site/package.json +2 -1
  323. package/packages/theme-church-site/src/index.js +1 -0
  324. package/packages/theme-companions-site/package.json +2 -1
  325. package/packages/theme-companions-site/src/index.js +1 -0
  326. package/packages/theme-floors-site/package.json +2 -1
  327. package/packages/theme-floors-site/src/index.js +1 -0
  328. package/packages/theme-fuelnfree-site/package.json +2 -1
  329. package/packages/theme-fuelnfree-site/src/index.js +1 -0
  330. package/packages/theme-handyman-site/package.json +2 -1
  331. package/packages/theme-handyman-site/src/index.js +1 -0
  332. package/packages/theme-insurance-site/package.json +2 -1
  333. package/packages/theme-insurance-site/src/index.js +1 -0
  334. package/packages/theme-scenes/README.md +164 -0
  335. package/packages/theme-scenes/package.json +53 -0
  336. package/packages/theme-scenes/src/blocks/index.js +30 -0
  337. package/packages/theme-scenes/src/contracts/index.js +286 -0
  338. package/packages/theme-scenes/src/demos/index.js +65 -0
  339. package/packages/theme-scenes/src/index.js +75 -0
  340. package/packages/theme-scenes/src/presets/index.js +263 -0
  341. package/packages/theme-scenes/src/runtime/compile.js +119 -0
  342. package/packages/theme-scenes/src/scenes/index.js +146 -0
  343. package/packages/theme-scenes/src/shell/index.js +47 -0
  344. package/packages/theme-scenes/src/themes/index.js +129 -0
  345. package/packages/theme-scenes/src/visuals/index.js +41 -0
  346. package/packages/theme-scenes/test/theme-scenes.test.mjs +179 -0
  347. package/packages/theme-shinshu-site/package.json +2 -1
  348. package/packages/theme-shinshu-site/src/index.js +1 -0
  349. package/packages/work-graph/src/index.js +34 -1
  350. package/packages/work-graph/src/renderers/gantt-model.js +24 -0
  351. package/packages/work-graph/test/work-graph.test.mjs +27 -7
  352. package/protocol/README.md +15 -7
  353. package/protocol/apps/agentsam.app.v1.schema.json +133 -0
  354. package/protocol/apps/agentsam.host-install.v1.schema.json +36 -0
  355. package/protocol/assets/README.md +9 -0
  356. package/protocol/assets/asset-record.v1.schema.json +64 -0
  357. package/protocol/brand/brandpack.v1.schema.json +43 -0
  358. package/protocol/credentials/issue.v1.schema.json +38 -0
  359. package/protocol/database/connection.v1.schema.json +41 -0
  360. package/protocol/embeddings/embedding-profile.v1.schema.json +20 -0
  361. package/protocol/errors/error-envelope.schema.json +135 -1
  362. package/protocol/errors/recovery.v1.schema.json +50 -0
  363. package/protocol/runtime/agentsam.runtime.v1.schema.json +75 -0
  364. package/protocol/runtime/workspace-fs.v1.schema.json +71 -0
  365. package/protocol/sam/activity.v1.schema.json +48 -0
  366. package/protocol/sam/answer.v1.schema.json +35 -0
  367. package/protocol/sam/calibration.v1.schema.json +21 -0
  368. package/protocol/sam/decision-receipt.v1.schema.json +29 -0
  369. package/protocol/sam/evaluation.v1.schema.json +19 -0
  370. package/protocol/sam/operation.schema.json +66 -0
  371. package/protocol/sam/outcome.v1.schema.json +36 -0
  372. package/protocol/sam/question.v1.schema.json +26 -0
  373. package/protocol/sam/registry.seed.json +153 -0
  374. package/protocol/sam/result.schema.json +53 -0
  375. package/protocol/sam/state.v1.schema.json +23 -0
  376. package/protocol/scoring/README.md +10 -0
  377. package/protocol/scoring/scorecard.v1.schema.json +65 -0
  378. package/protocol/skills/agentsam.interaction.v1.schema.json +50 -0
  379. package/protocol/skills/agentsam.skill.v1.schema.json +57 -0
  380. package/protocol/ui/icon-registry.mjs +227 -0
  381. package/protocol/ui/icon.v1.schema.json +51 -0
  382. package/registry/cms-rust-machine-20260928/installable-products.json +31 -0
  383. package/registry/cms-rust-machine-20260928/manifest.json +22 -0
  384. package/registry/cms-rust-machine-20260928/migration.sql +237 -0
  385. package/registry/cms-rust-machine-20260928/receipt.json +21 -0
  386. package/registry/cms-rust-machine-20260928/receipt.sql +27 -0
  387. package/scripts/build_rapid_rust_cli.py +83 -0
  388. package/skills/README.md +22 -9
  389. package/skills/agentsam-codebaseindex/SKILL.md +225 -0
  390. package/skills/catalog.json +14 -0
  391. package/src/attachments/index.js +6 -0
  392. package/src/attachments/intake.js +235 -0
  393. package/src/capabilities/repository-snapshot.js +19 -2
  394. package/src/cli/command-catalog.js +138 -0
  395. package/src/cli/dispatch.js +48 -0
  396. package/src/cli.js +225 -27
  397. package/src/commands/account-auth.js +94 -8
  398. package/src/commands/api-key.js +244 -0
  399. package/src/commands/app.js +365 -29
  400. package/src/commands/billing.js +127 -0
  401. package/src/commands/brand.js +86 -74
  402. package/src/commands/cheat-sheet.js +154 -0
  403. package/src/commands/cloudflare-login.js +222 -0
  404. package/src/commands/cloudflare.js +453 -23
  405. package/src/commands/codebaseindex.js +693 -0
  406. package/src/commands/compute.js +4 -0
  407. package/src/commands/connections.js +11 -5
  408. package/src/commands/credentials.js +116 -0
  409. package/src/commands/env.js +152 -25
  410. package/src/commands/gcloud-auth.js +427 -0
  411. package/src/commands/go.js +366 -53
  412. package/src/commands/google-cloud.js +375 -0
  413. package/src/commands/identity-init.js +2 -2
  414. package/src/commands/interaction-clack.js +115 -0
  415. package/src/commands/mcp.js +226 -33
  416. package/src/commands/models.js +1 -1
  417. package/src/commands/ollama.js +3 -2
  418. package/src/commands/plugins.js +7 -2
  419. package/src/commands/product.js +36 -0
  420. package/src/commands/providers.js +62 -14
  421. package/src/commands/runtime-status.js +28 -9
  422. package/src/commands/runtime.js +313 -0
  423. package/src/commands/rust.js +24 -0
  424. package/src/commands/setup.js +279 -0
  425. package/src/commands/shell.js +59 -5
  426. package/src/commands/skill.js +248 -0
  427. package/src/commands/skills.js +1 -1
  428. package/src/commands/start-local.js +6 -2
  429. package/src/commands/terminal.js +171 -0
  430. package/src/commands/update.js +140 -0
  431. package/src/commands/whoami.js +392 -56
  432. package/src/features/resolve.js +1 -0
  433. package/src/go/build.js +229 -39
  434. package/src/go/cloudflare.js +506 -105
  435. package/src/go/container.js +120 -0
  436. package/src/go/contract.js +9 -4
  437. package/src/go/discover.js +149 -33
  438. package/src/go/index.js +15 -3
  439. package/src/go/native-probe-runner.mjs +119 -0
  440. package/src/go/{registry.js → official-registry.js} +64 -7
  441. package/src/go/official-release.js +10 -0
  442. package/src/go/receipts.js +77 -10
  443. package/src/go/verify.js +9 -2
  444. package/src/index.js +31 -0
  445. package/src/indexing/ingest/discover-models.js +298 -0
  446. package/src/indexing/ingest/inventory.js +478 -0
  447. package/src/indexing/ingest/job-graph.js +181 -0
  448. package/src/indexing/ingest/materials.js +204 -0
  449. package/src/indexing/ingest/style-evidence.js +181 -0
  450. package/src/knowledge/source.js +3 -3
  451. package/src/lib/account-session.js +11 -4
  452. package/src/lib/app-authority.js +172 -0
  453. package/src/lib/auth.js +94 -21
  454. package/src/lib/core-client.js +5 -6
  455. package/src/lib/credentials-audit.js +451 -0
  456. package/src/lib/deploy/health.js +24 -6
  457. package/src/lib/detect-context.js +7 -1
  458. package/src/lib/google-cloud-connection.js +270 -0
  459. package/src/lib/google-cloud-inventory.js +385 -0
  460. package/src/lib/google-desktop-oauth.js +372 -0
  461. package/src/lib/google-studio-brokered-oauth.js +158 -0
  462. package/src/lib/identity-scaffold.js +24 -6
  463. package/src/lib/init-options.js +192 -0
  464. package/src/lib/local-scaffold.js +48 -16
  465. package/src/lib/provider-command-remediation.js +308 -0
  466. package/src/lib/provider-credentials.js +71 -21
  467. package/src/lib/scaffold/index.js +8 -2
  468. package/src/lib/scaffold/mcp-server.js +43 -0
  469. package/src/lib/scaffold/templates/mcp-server/index.js +397 -0
  470. package/src/lib/scaffold/templates/mcp-server/presets.js +39 -0
  471. package/src/lib/scaffold/wizards/cms.js +93 -0
  472. package/src/lib/scaffold/wizards/mcp-server.js +61 -0
  473. package/src/lib/setup/contract.js +26 -0
  474. package/src/lib/setup/discover.js +116 -0
  475. package/src/lib/setup/execute.js +205 -0
  476. package/src/lib/setup/planner.js +134 -0
  477. package/src/lib/setup/recipes.js +235 -0
  478. package/src/lib/setup/runtime-persist.js +197 -0
  479. package/src/lib/setup/runtime.js +394 -0
  480. package/src/lib/slash-commands.js +3 -0
  481. package/src/lib/terminal/machine-identity.js +95 -0
  482. package/src/lib/terminal-local.js +164 -0
  483. package/src/lib/terminal-scopes.js +52 -0
  484. package/src/lib/whoami-capabilities.js +184 -0
  485. package/src/local-fs/capability.js +121 -0
  486. package/src/local-fs/freshness.js +75 -0
  487. package/src/local-fs/index.js +385 -0
  488. package/src/local-fs/paths.js +100 -0
  489. package/src/local-pty/server.js +326 -21
  490. package/src/mcp/authority.js +58 -108
  491. package/src/mcp/client-adapters.js +68 -144
  492. package/src/mcp/client.js +142 -122
  493. package/src/mcp/cloudflare-bundles.js +225 -0
  494. package/src/mcp/index.js +12 -0
  495. package/src/models/ai-access-onboarding.js +112 -0
  496. package/src/models/discovery.js +10 -2
  497. package/src/models/inventory-core.js +9 -1
  498. package/src/plugins/cloudflare.js +1 -1
  499. package/src/providers/ollama-chat.js +2 -1
  500. package/src/sam/activity/index.js +183 -0
  501. package/src/sam/client.js +252 -0
  502. package/src/sam/decision/calibration.js +109 -0
  503. package/src/sam/decision/confidence.js +126 -0
  504. package/src/sam/decision/evaluate.js +157 -0
  505. package/src/sam/decision/evaluators/deterministic.js +341 -0
  506. package/src/sam/decision/evaluators/heuristic.js +61 -0
  507. package/src/sam/decision/evaluators/select.js +50 -0
  508. package/src/sam/decision/evaluators/semantic.js +149 -0
  509. package/src/sam/decision/hierarchical.js +61 -0
  510. package/src/sam/decision/index.js +53 -0
  511. package/src/sam/decision/policy.js +86 -0
  512. package/src/sam/decision/questions.js +120 -0
  513. package/src/sam/decision/receipt.js +148 -0
  514. package/src/sam/decision/state.js +117 -0
  515. package/src/sam/decision/types.js +22 -0
  516. package/src/sam/decision/validate.js +200 -0
  517. package/src/sam/define.js +51 -0
  518. package/src/sam/index.js +65 -0
  519. package/src/sam/operations/brand-scan.js +62 -0
  520. package/src/sam/operations/cad-blender-inspect.js +36 -0
  521. package/src/sam/operations/codebaseindex-ingest.js +49 -0
  522. package/src/sam/operations/decision-evaluate.js +59 -0
  523. package/src/sam/operations/planning-astar.js +77 -0
  524. package/src/sam/operations/planning-goap.js +60 -0
  525. package/src/sam/operations/repository-inspect.js +72 -0
  526. package/src/sam/operations/security-scan.js +33 -0
  527. package/src/sam/operations/terminal-exec.js +29 -0
  528. package/src/sam/planning/astar.js +311 -0
  529. package/src/sam/planning/goap.js +177 -0
  530. package/src/sam/planning/index.js +21 -0
  531. package/src/sam/planning/state.js +84 -0
  532. package/src/sam/registry.js +48 -0
  533. package/src/sam/result.js +77 -0
  534. package/src/sam/seed.js +44 -0
  535. package/src/sam/types.js +116 -0
  536. package/src/security/inventory.js +12 -2
  537. package/src/security/local-vault.js +2 -0
  538. package/src/security/scan.js +1 -1
  539. package/src/skills/catalog.js +64 -0
  540. package/src/skills/content-resolver.js +124 -0
  541. package/src/skills/hosted-store.js +37 -0
  542. package/src/skills/index.js +29 -64
  543. package/src/skills/interaction.js +102 -0
  544. package/src/skills/local-store.js +228 -0
  545. package/src/skills/manifest.js +104 -0
  546. package/src/skills/metrics.js +31 -0
  547. package/src/skills/registry.js +184 -0
  548. package/src/skills/runtime.js +287 -0
  549. package/src/skills/slash.js +44 -0
  550. package/src/ui/cli/help.js +94 -101
  551. package/test/account-session.test.mjs +3 -3
  552. package/test/app-authority-context.test.mjs +32 -0
  553. package/test/cli/api-key-env-whoami.test.mjs +129 -0
  554. package/test/cli/codebaseindex-plan-ux.test.mjs +37 -0
  555. package/test/cli/go.test.mjs +62 -5
  556. package/test/cli/mcp-client.test.mjs +21 -10
  557. package/test/cli/runtime-persist.test.mjs +56 -0
  558. package/test/cli/rust-command.test.mjs +21 -0
  559. package/test/cli/skill-npm-and-env.test.mjs +52 -0
  560. package/test/cli/wireframes-go-registry.test.mjs +87 -2
  561. package/test/credentials-audit.test.mjs +113 -0
  562. package/test/deploy-health-scan.test.mjs +29 -1
  563. package/test/gcloud-auth.test.mjs +111 -0
  564. package/test/go/build-source-identity.test.mjs +31 -0
  565. package/test/go/cloudflare-probe.test.mjs +274 -10
  566. package/test/go/distribution.test.mjs +28 -0
  567. package/test/google-cloud-connection.test.mjs +83 -0
  568. package/test/google-cloud-inventory.test.mjs +64 -0
  569. package/test/init-options.test.mjs +35 -0
  570. package/test/integration/ai-access-onboarding.test.mjs +47 -0
  571. package/test/integration/app-command.test.mjs +30 -0
  572. package/test/integration/cad-project.test.mjs +4 -1
  573. package/test/integration/cli-help.test.mjs +1 -1
  574. package/test/integration/cms-app-scaffold.test.mjs +71 -0
  575. package/test/integration/cms-site-tenancy-contract.test.mjs +9 -8
  576. package/test/integration/codebaseindex-ingest.test.mjs +214 -0
  577. package/test/integration/features-resolve.test.mjs +30 -11
  578. package/test/integration/icon-registry.test.mjs +67 -0
  579. package/test/integration/ingest-discover-models.test.mjs +30 -0
  580. package/test/integration/inspect-path-cli.test.mjs +46 -0
  581. package/test/integration/install-script.test.mjs +12 -9
  582. package/test/integration/inventory-evidence.test.mjs +125 -0
  583. package/test/integration/local-fs.test.mjs +113 -0
  584. package/test/integration/provider-env-cli.test.mjs +2 -1
  585. package/test/integration/runtime-status.integration.test.mjs +2 -1
  586. package/test/integration/sam-activity-recovery.test.mjs +147 -0
  587. package/test/integration/sam-decision.test.mjs +584 -0
  588. package/test/integration/sam-kernel.test.mjs +99 -0
  589. package/test/integration/sam-planning-astar.test.mjs +279 -0
  590. package/test/integration/skill-runtime.test.mjs +240 -0
  591. package/test/integration/studio-fs-pty-e2e.test.mjs +294 -0
  592. package/test/knowledge.test.mjs +35 -1
  593. package/test/loopback-oauth.test.mjs +53 -0
  594. package/test/models.test.mjs +14 -7
  595. package/test/ollama.test.mjs +22 -0
  596. package/test/security.test.mjs +23 -0
  597. package/test/setup-planner.test.mjs +74 -0
  598. package/test/setup-runtime.test.mjs +51 -0
  599. package/test/shell.test.mjs +4 -4
  600. package/test/terminal/local-pty.mock.test.mjs +3 -1
  601. package/test/terminal-machine-identity.test.mjs +88 -0
  602. package/test/whoami-resume.test.mjs +27 -6
  603. package/packages/agentsam-brand/test/brand-scan.test.mjs +0 -106
  604. package/packages/work-graph/prototype/README.md +0 -32
  605. package/packages/work-graph/prototype/data/demo-workgraph.js +0 -47
  606. package/packages/work-graph/prototype/renderers/timeline-model.js +0 -21
  607. package/packages/work-graph/prototype/renderers/workgraph-runtime.js +0 -38
  608. package/packages/work-graph/prototype-gnantt.html +0 -655
@@ -1,6 +1,7 @@
1
1
  import fs from 'node:fs';
2
2
  import os from 'node:os';
3
3
  import path from 'node:path';
4
+ import { PLATFORM_ACCOUNT_ISSUER } from '../../packages/identity/src/contracts/auth-config.js';
4
5
  import {
5
6
  getSecureProviderKey,
6
7
  setSecureProviderKey,
@@ -129,28 +130,17 @@ export function agentEnvLoaderPath(options = {}) {
129
130
 
130
131
  export function ensureAgentEnvLoader(options = {}) {
131
132
  const filename = agentEnvLoaderPath(options);
132
- const supported = Object.keys(PROVIDER_CREDENTIALS).join('|');
133
- const source = `# AgentSam provider environment loader. Source this file; do not execute it.
134
- if [ "$#" -eq 0 ]; then
135
- echo "usage: source ~/.agentsam/load-agent-env.sh <profile> [profile ...]" >&2
136
- return 2 2>/dev/null || exit 2
133
+ const source = `# AgentSam environment loader. Source this file; do not execute it.
134
+ # Credentials resolve from the OS keychain / local vault via \`agentsam env shell\`.
135
+ # Do not put plaintext secrets in this file.
136
+ if command -v agentsam >/dev/null 2>&1; then
137
+ eval "$(agentsam env shell --profile default)"
138
+ elif command -v agentsam-env >/dev/null 2>&1; then
139
+ eval "$(agentsam-env shell --profile default)"
140
+ else
141
+ echo "agentsam CLI not found on PATH; cannot load AgentSam credentials" >&2
142
+ return 1 2>/dev/null || exit 1
137
143
  fi
138
- for _agentsam_profile in "$@"; do
139
- case "$_agentsam_profile" in
140
- grok) _agentsam_profile="xai" ;;
141
- ${supported}) ;;
142
- *) echo "unknown AgentSam provider profile: $_agentsam_profile" >&2; return 2 2>/dev/null || exit 2 ;;
143
- esac
144
- _agentsam_file="\${HOME}/.agentsam/env.d/\${_agentsam_profile}.env"
145
- if [ ! -f "$_agentsam_file" ]; then
146
- echo "AgentSam provider profile not found: $_agentsam_file" >&2
147
- return 1 2>/dev/null || exit 1
148
- fi
149
- set -a
150
- . "$_agentsam_file"
151
- set +a
152
- done
153
- unset _agentsam_file _agentsam_profile
154
144
  `;
155
145
  atomicWrite(filename, source, 0o700);
156
146
  return filename;
@@ -359,3 +349,63 @@ export function describeProviderCredential(provider, options = {}) {
359
349
  export function listProviderCredentialStatus(options = {}) {
360
350
  return Object.freeze(Object.keys(PROVIDER_CREDENTIALS).map((provider) => describeProviderCredential(provider, options)));
361
351
  }
352
+
353
+ /**
354
+ * Emit shell `export` lines for configured credentials from vault/keychain/env.
355
+ * Bootstrap-safe: does not require AGENTSAM_API_KEY already present to resolve it.
356
+ * Prefer vault/OS store over ambient env when `preferVault` is true (default for shell).
357
+ */
358
+ export function renderEnvShellExports(options = {}) {
359
+ const profile = clean(options.profile || 'default').toLowerCase();
360
+ const wanted = Array.isArray(options.providers) && options.providers.length
361
+ ? options.providers.map(normalizeProviderId).filter(Boolean)
362
+ : profile === 'default'
363
+ ? Object.keys(PROVIDER_CREDENTIALS)
364
+ : profile.split(/[,\s]+/).map(normalizeProviderId).filter(Boolean);
365
+
366
+ const lines = ['# AgentSam env shell — evaluated by: eval "$(agentsam env shell)"'];
367
+ const emitted = [];
368
+
369
+ for (const provider of wanted) {
370
+ const spec = providerCredentialSpec(provider);
371
+ if (!spec) continue;
372
+
373
+ let resolved;
374
+ if (options.preferVault !== false) {
375
+ // Skip ambient process.env so a stale empty shell does not block keychain.
376
+ const vaultOnly = { ...options, env: { ...(options.env || {}), [spec.env]: undefined } };
377
+ if (spec.accountEnv) {
378
+ for (const name of spec.accountEnv) vaultOnly.env[name] = undefined;
379
+ }
380
+ resolved = resolveProviderCredential(spec.provider, vaultOnly);
381
+ if (!resolved.configured) {
382
+ resolved = resolveProviderCredential(spec.provider, options);
383
+ }
384
+ } else {
385
+ resolved = resolveProviderCredential(spec.provider, options);
386
+ }
387
+
388
+ if (!resolved.configured || !resolved.value) continue;
389
+ lines.push(`export ${spec.env}=${envLiteral(resolved.value)}`);
390
+ if (spec.provider === 'cloudflare' && resolved.account_id) {
391
+ lines.push(`export CLOUDFLARE_ACCOUNT_ID=${envLiteral(resolved.account_id)}`);
392
+ }
393
+ emitted.push(spec.provider);
394
+ }
395
+
396
+ if (!emitted.length) {
397
+ lines.push('# No AgentSam credentials configured. Run: agentsam api-key create --store keychain --activate');
398
+ }
399
+
400
+ // PLATFORM namespace — always emit so whoami/core client work after `source load-agent-env.sh`.
401
+ // Not an APP host alias; Local Studio hosts live in agentsam.app.json hosts[].
402
+ const issuer = clean(options.env?.IAM_OAUTH_ISSUER || process.env.IAM_OAUTH_ISSUER)
403
+ || PLATFORM_ACCOUNT_ISSUER;
404
+ lines.push(`export IAM_OAUTH_ISSUER=${envLiteral(issuer)}`);
405
+
406
+ return Object.freeze({
407
+ profile,
408
+ providers: emitted,
409
+ script: `${lines.join('\n')}\n`,
410
+ });
411
+ }
@@ -11,12 +11,13 @@
11
11
  import { intro, outro, select, cancel, isCancel, note } from '@clack/prompts';
12
12
  import { runCmsWizard } from './wizards/cms.js';
13
13
  import { runWorkerApiWizard } from './wizards/worker-api.js';
14
+ import { runMcpServerWizard } from './wizards/mcp-server.js';
14
15
  import pc from 'picocolors';
15
16
 
16
17
  const SCAFFOLDS = {
17
18
  cms: {
18
- label: 'CMS Site',
19
- description: 'Cloudflare Worker + D1 + R2 with nav, pages, and reusable templates',
19
+ label: 'CMS',
20
+ description: 'Choose a Cloudflare CMS site or the reusable CMS Editor app',
20
21
  run: runCmsWizard,
21
22
  },
22
23
  'worker-api': {
@@ -24,6 +25,11 @@ const SCAFFOLDS = {
24
25
  description: 'Bare Cloudflare Worker with typed route handlers and D1 binding',
25
26
  run: runWorkerApiWizard,
26
27
  },
28
+ 'mcp-server': {
29
+ label: 'MCP Server',
30
+ description: 'Cloudflare Worker MCP server with OAuth resource metadata and portable identity branding',
31
+ run: runMcpServerWizard,
32
+ },
27
33
  };
28
34
 
29
35
  export async function runScaffold(type) {
@@ -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
+ }