@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,192 @@
1
+ /**
2
+ * Init / create pickers — real presets, scaffolds, and apps (not aspirational lanes).
3
+ */
4
+ import fs from 'node:fs';
5
+ import path from 'node:path';
6
+ import { fileURLToPath } from 'node:url';
7
+ import { listPresets } from '../presets/index.js';
8
+ import { listAppManifests } from '../commands/app.js';
9
+
10
+ const SDK_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../..');
11
+ const INSTALLABLE_PRODUCT_CACHE = path.join('registry', 'cms-rust-machine-20260928', 'installable-products.json');
12
+
13
+ export const SCAFFOLD_WIZARDS = Object.freeze([
14
+ {
15
+ value: 'scaffold:cms',
16
+ kind: 'scaffold',
17
+ scaffold: 'cms',
18
+ label: 'CMS Site (Worker + D1 + R2)',
19
+ hint: 'Proven Cloudflare CMS scaffold with pages, nav, and templates',
20
+ },
21
+ {
22
+ value: 'scaffold:worker-api',
23
+ kind: 'scaffold',
24
+ scaffold: 'worker-api',
25
+ label: 'Worker API',
26
+ hint: 'Bare Cloudflare Worker with typed routes and D1',
27
+ },
28
+ ]);
29
+
30
+ export const RUN_TARGET_OPTIONS = Object.freeze([
31
+ {
32
+ value: 'local',
33
+ label: 'This machine',
34
+ hint: 'SQLite + local API; no cloud account required',
35
+ },
36
+ {
37
+ value: 'cloudflare',
38
+ label: 'Cloudflare Workers',
39
+ hint: 'OAuth via Local Studio / agentsam connections — Workers, D1, R2',
40
+ },
41
+ {
42
+ value: 'tauri',
43
+ label: 'Local Studio desktop',
44
+ hint: 'Bundled Tauri app + local SQLite; offline-capable product runtime',
45
+ },
46
+ {
47
+ value: 'gcp',
48
+ label: 'Google Cloud',
49
+ hint: 'agentsam google-cloud OAuth / gcloud — VMs, Cloud Run, Workstations',
50
+ },
51
+ {
52
+ value: 'docker',
53
+ label: 'Docker',
54
+ hint: 'agentsam dockerize — proven compose/build/run on this host',
55
+ },
56
+ ]);
57
+
58
+ function appReady(manifest = {}) {
59
+ const runtime = manifest.runtime || {};
60
+ return (
61
+ runtime.source_scaffold === 'ready'
62
+ || runtime.local_preview === 'ready'
63
+ || runtime.cloudflare === 'ready'
64
+ );
65
+ }
66
+
67
+ export function listInstallableProductCache(root = SDK_ROOT) {
68
+ const file = path.join(root || SDK_ROOT, INSTALLABLE_PRODUCT_CACHE);
69
+ try {
70
+ const parsed = JSON.parse(fs.readFileSync(file, 'utf8'));
71
+ return Array.isArray(parsed?.products) ? parsed.products : [];
72
+ } catch {
73
+ return [];
74
+ }
75
+ }
76
+
77
+ function actionChoice(action = {}) {
78
+ if (action.kind === 'app' && action.id) return `app:${action.id}`;
79
+ if (action.kind === 'scaffold' && action.id) return `scaffold:${action.id}`;
80
+ return null;
81
+ }
82
+
83
+ export function getInstallableProductChoice(id, root = SDK_ROOT) {
84
+ return listInstallableProductCache(root).find((row) => row.slug === id) || null;
85
+ }
86
+
87
+ export function listInitProjectTypeOptions(root) {
88
+ const presets = listPresets().map((preset) => ({
89
+ value: `preset:${preset.id}`,
90
+ kind: 'preset',
91
+ presetId: preset.id,
92
+ lane: preset.lane || preset.id,
93
+ label: preset.id === 'cms' ? 'CMS app (local AgentSam)' : preset.id === 'prototype'
94
+ ? 'Prototype (minimal)'
95
+ : preset.id === 'data'
96
+ ? 'Data app'
97
+ : 'Full Stack app',
98
+ hint: preset.description || preset.id,
99
+ }));
100
+
101
+ const apps = listAppManifests(root)
102
+ .filter((row) => appReady(row.manifest || {}))
103
+ .map((row) => {
104
+ const runtime = row.manifest?.runtime || {};
105
+ const cf = runtime.cloudflare === 'ready' ? ' · Cloudflare ready' : '';
106
+ return {
107
+ value: `app:${row.id}`,
108
+ kind: 'app',
109
+ appId: row.id,
110
+ label: row.name || row.id,
111
+ hint: `agentsam app scaffold ${row.id}${cf}`,
112
+ hasScaffold: Boolean(row.commands?.scaffold || row.manifest?.commands?.scaffold),
113
+ };
114
+ });
115
+
116
+ const represented = new Set([
117
+ ...SCAFFOLD_WIZARDS.map((row) => row.value),
118
+ ...apps.map((row) => row.value),
119
+ ]);
120
+ const products = listInstallableProductCache(root || SDK_ROOT)
121
+ .filter((row) => row?.slug && row?.action)
122
+ .filter((row) => {
123
+ const action = actionChoice(row.action);
124
+ return !action || !represented.has(action);
125
+ })
126
+ .map((row) => ({
127
+ value: `product:${row.slug}`,
128
+ kind: 'product',
129
+ productId: row.slug,
130
+ label: row.label || row.slug,
131
+ hint: row.hint || `${row.kind || 'product'} · ${row.status || 'unknown'}`,
132
+ action: row.action,
133
+ }));
134
+
135
+ return [...presets, ...SCAFFOLD_WIZARDS, ...products, ...apps];
136
+ }
137
+
138
+ export function parseProjectTypeChoice(value) {
139
+ const raw = String(value || '').trim();
140
+ if (raw.startsWith('preset:')) {
141
+ return { kind: 'preset', id: raw.slice('preset:'.length) };
142
+ }
143
+ if (raw.startsWith('scaffold:')) {
144
+ return { kind: 'scaffold', id: raw.slice('scaffold:'.length) };
145
+ }
146
+ if (raw.startsWith('app:')) {
147
+ return { kind: 'app', id: raw.slice('app:'.length) };
148
+ }
149
+ if (raw.startsWith('product:')) {
150
+ return { kind: 'product', id: raw.slice('product:'.length) };
151
+ }
152
+ // Back-compat for --lane fullstack|cms|…
153
+ if (raw) return { kind: 'preset', id: raw };
154
+ return null;
155
+ }
156
+
157
+ /** Concrete next commands after init — not "decide later". */
158
+ export function guidanceForRunTarget(runTarget, { projectName } = {}) {
159
+ const name = projectName || '.';
160
+ if (runTarget === 'cloudflare') {
161
+ return [
162
+ 'agentsam connections setup # Cloudflare OAuth callback + Local Studio connector',
163
+ 'agentsam cloudflare # Workers / bindings capabilities',
164
+ `cd ${name} && npm run deploy # Graduate this project to a Worker when ready`,
165
+ ];
166
+ }
167
+ if (runTarget === 'tauri') {
168
+ return [
169
+ 'agentsam app doctor local-studio # Verify the bundled desktop product contract',
170
+ `cd ${name} && npm install # Install the scaffolded app workspace`,
171
+ 'Open AgentSam Local Studio.app # Desktop authority uses local SQLite when the adapter supports it',
172
+ ];
173
+ }
174
+ if (runTarget === 'gcp') {
175
+ return [
176
+ 'agentsam google-cloud doctor # OAuth + gcloud readiness',
177
+ 'agentsam google-cloud auth # Sign in / refresh Google user OAuth',
178
+ 'agentsam compute # List VMs / Cloud Run / Workstations targets',
179
+ ];
180
+ }
181
+ if (runTarget === 'docker') {
182
+ return [
183
+ `cd ${name} && npx agentsam dockerize # Generate Dockerfile + compose from proven templates`,
184
+ 'docker compose up --build',
185
+ ];
186
+ }
187
+ return [
188
+ 'npm install && npm run smoke && npm run dev',
189
+ 'npx agentsam',
190
+ 'Optional: npm run pty · npm run ollama:setup',
191
+ ];
192
+ }
@@ -1,6 +1,5 @@
1
1
  /**
2
- * Local-first scaffold — no IAM, no Cloudflare, no OAuth.
3
- * Prove the project locally; `agentsam deploy` adds cloud adapters only when requested.
2
+ * Local-first scaffold — prove locally, then graduate with real Cloudflare / GCP / Docker tooling.
4
3
  */
5
4
 
6
5
  import pkg from '../../package.json' with { type: 'json' };
@@ -40,9 +39,11 @@ const RUN_TARGETS = {
40
39
  '1': 'local',
41
40
  '2': 'cloudflare',
42
41
  '3': 'gcp',
42
+ '4': 'docker',
43
43
  local: 'local',
44
44
  cloudflare: 'cloudflare',
45
45
  gcp: 'gcp',
46
+ docker: 'docker',
46
47
  };
47
48
 
48
49
  export { LANE_KEYS, LANE_LABELS, RUN_TARGETS };
@@ -184,10 +185,13 @@ npm run ollama:status # probe local Ollama + models
184
185
 
185
186
  The local SQLite database lives at \`.agentsam/data/agentsam.sqlite\` and is initialized from \`db/schema.sql\`.
186
187
 
187
- When you're intentionally ready to add cloud infrastructure:
188
+ When you're ready to run on Cloudflare, GCP, or Docker (all supported end-to-end):
188
189
 
189
190
  \`\`\`bash
190
- npx agentsam deploy
191
+ npx agentsam connections setup # Cloudflare OAuth (Local Studio)
192
+ npx agentsam google-cloud doctor # GCP OAuth / gcloud
193
+ npx agentsam dockerize # Containerize this project
194
+ npx agentsam deploy # Cloudflare Worker graduation
191
195
  \`\`\`
192
196
  `,
193
197
  },
@@ -416,7 +420,16 @@ No Worker or cloud account is required for local development.
416
420
  npm run deploy
417
421
  \`\`\`
418
422
 
419
- Selected future deploy target: **${runTarget}**. Cloud-specific adapters and credentials belong to deploy time, not local init.
423
+ Selected run target: **${runTarget}**.
424
+
425
+ | Target | Proven path |
426
+ | --- | --- |
427
+ | local | SQLite + local API on this host |
428
+ | cloudflare | Local Studio CF OAuth · \`agentsam connections\` · \`agentsam deploy\` |
429
+ | gcp | \`agentsam google-cloud\` OAuth / gcloud |
430
+ | docker | \`agentsam dockerize\` compose/build/run |
431
+
432
+ Cloud adapters and credentials are configured with those commands — not left as aspirational flags.
420
433
  `,
421
434
  },
422
435
  ];
@@ -432,6 +445,35 @@ export function buildLocalScaffoldMeta(body, sdkVersion = pkg.version) {
432
445
  const laneLabel = LANE_LABELS[laneKey] || 'Full Stack';
433
446
  const agent = AGENT_FOR_LANE[laneKey] || 'orchestrator';
434
447
  const runTarget = normalizeRunTarget(body.runTarget || body.run_target || 'local');
448
+ const nextByTarget = {
449
+ local: [
450
+ 'npm install',
451
+ 'npm run smoke',
452
+ 'npm run status',
453
+ 'npm run dev',
454
+ 'npx agentsam',
455
+ 'Optional: npm run pty · npm run ollama:setup',
456
+ ],
457
+ cloudflare: [
458
+ 'npm install',
459
+ 'npm run smoke',
460
+ 'agentsam connections setup',
461
+ 'agentsam cloudflare',
462
+ 'npm run deploy',
463
+ ],
464
+ gcp: [
465
+ 'npm install',
466
+ 'npm run smoke',
467
+ 'agentsam google-cloud doctor',
468
+ 'agentsam google-cloud auth',
469
+ 'agentsam compute',
470
+ ],
471
+ docker: [
472
+ 'npm install',
473
+ 'npx agentsam dockerize',
474
+ 'docker compose up --build',
475
+ ],
476
+ };
435
477
 
436
478
  return {
437
479
  projectName,
@@ -440,16 +482,6 @@ export function buildLocalScaffoldMeta(body, sdkVersion = pkg.version) {
440
482
  agent,
441
483
  runTarget,
442
484
  files: buildLocalScaffoldFiles({ projectName, laneKey, laneLabel, agent, runTarget, sdkVersion }),
443
- next_steps: [
444
- 'npm install',
445
- 'npm run smoke',
446
- 'npm run status',
447
- 'npm run dev',
448
- 'npx agentsam',
449
- 'npm run db:status',
450
- 'Optional free/local models: npm run ollama:setup',
451
- 'Optional: npm run pty',
452
- 'When ready for cloud: npm run deploy',
453
- ],
485
+ next_steps: nextByTarget[runTarget] || nextByTarget.local,
454
486
  };
455
487
  }
@@ -0,0 +1,308 @@
1
+ /**
2
+ * Deterministic provider-command remediation — no LLM.
3
+ * Turns provider-native failures into next-step cards with copyable commands.
4
+ */
5
+
6
+ function clean(value) {
7
+ return value == null ? '' : String(value).trim();
8
+ }
9
+
10
+ function argvLine(argv = []) {
11
+ return argv.map((part) => (/\s/.test(String(part)) ? JSON.stringify(String(part)) : String(part))).join(' ');
12
+ }
13
+
14
+ /** @typedef {{ id: string, title: string, command?: string, recommended?: boolean, docs_url?: string }} RemediationAction */
15
+
16
+ /**
17
+ * @typedef {object} RemediationCard
18
+ * @property {string} schema_version
19
+ * @property {string} provider
20
+ * @property {string} kind
21
+ * @property {string} title
22
+ * @property {string} summary
23
+ * @property {string[]} ran
24
+ * @property {string[]} [notes]
25
+ * @property {RemediationAction[]} actions
26
+ * @property {{ enter?: string, h?: string, o?: string, c?: string, p?: string, esc?: string }} keys
27
+ */
28
+
29
+ /**
30
+ * Google Distributed Cloud Edge ≠ Compute Engine IAM.
31
+ * Acceptance fixture from the Mac ExecOS failure.
32
+ * @param {{ argv?: string[], projectId?: string, instance?: string, zone?: string }} [ctx]
33
+ * @returns {RemediationCard|null}
34
+ */
35
+ export function remediateGcloudEdgeServiceAccountKey(ctx = {}) {
36
+ const argv = Array.isArray(ctx.argv) ? ctx.argv.map(String) : [];
37
+ const joined = argv.join(' ').toLowerCase();
38
+ const looksLike =
39
+ /edge-cloud/.test(joined) &&
40
+ /service-accounts?/.test(joined) &&
41
+ /\bkeys?\b/.test(joined) &&
42
+ /\bcreate\b/.test(joined);
43
+ if (!looksLike && !ctx.force) return null;
44
+
45
+ const projectId = clean(ctx.projectId) || clean(ctx.env?.CLOUDSDK_CORE_PROJECT) || '$PROJECT_ID';
46
+ const instance = clean(ctx.instance) || 'iam-tunnel';
47
+ const zone = clean(ctx.zone) || 'us-central1-f';
48
+ const saEmail = clean(ctx.serviceAccount) || `agentsam-env-controller@${projectId === '$PROJECT_ID' ? 'PROJECT_ID' : projectId}.iam.gserviceaccount.com`;
49
+
50
+ return Object.freeze({
51
+ schema_version: 'agentsam-remediation-v1',
52
+ provider: 'google_cloud',
53
+ kind: 'command_incomplete_wrong_family',
54
+ title: 'Command incomplete',
55
+ summary:
56
+ 'This command belongs to Google Distributed Cloud Edge. Your current runtime is a Compute Engine VM / standard GCP project.',
57
+ ran: Object.freeze([argvLine(argv.length ? argv : ['gcloud', 'edge-cloud', 'service-accounts', 'keys', 'create'])]),
58
+ notes: Object.freeze([
59
+ 'edge-cloud manages GDCE resources, not project IAM service accounts.',
60
+ 'Prefer OAuth / ADC for Local Studio connections over downloadable JSON keys.',
61
+ ]),
62
+ actions: Object.freeze([
63
+ Object.freeze({
64
+ id: 'inspect_vm_sa',
65
+ title: "Inspect the VM's current service account",
66
+ recommended: true,
67
+ command: `gcloud compute instances describe ${instance} --zone=${zone} --project=${projectId} --format='yaml(serviceAccounts,name,status)'`,
68
+ }),
69
+ Object.freeze({
70
+ id: 'list_iam_sas',
71
+ title: 'List normal Google IAM service accounts',
72
+ command: `gcloud iam service-accounts list --project=${projectId} --format='table(email,displayName,disabled)'`,
73
+ }),
74
+ Object.freeze({
75
+ id: 'create_iam_key',
76
+ title: 'Create a standard service-account key (avoid when ADC works)',
77
+ command: `gcloud iam service-accounts keys create ./sa-key.json --iam-account=${saEmail} --project=${projectId}`,
78
+ }),
79
+ Object.freeze({
80
+ id: 'oauth_connection',
81
+ title: 'Use OAuth instead (recommended for Local Studio)',
82
+ command: 'agentsam connections',
83
+ docs_url: 'https://cloud.google.com/docs/authentication',
84
+ }),
85
+ ]),
86
+ keys: Object.freeze({
87
+ enter: 'recommended',
88
+ h: 'help',
89
+ o: 'open provider docs',
90
+ c: 'copy command',
91
+ esc: 'cancel',
92
+ }),
93
+ });
94
+ }
95
+
96
+ /**
97
+ * @param {{ operation?: string, connection?: string, projectId?: string, permission?: string }} [ctx]
98
+ * @returns {RemediationCard}
99
+ */
100
+ export function remediateGcloudPermissionDenied(ctx = {}) {
101
+ const operation = clean(ctx.operation) || 'compute.instances.list';
102
+ const connection = clean(ctx.connection) || 'Google Cloud';
103
+ const projectId = clean(ctx.projectId) || '$PROJECT_ID';
104
+ const permission = clean(ctx.permission) || operation;
105
+
106
+ return Object.freeze({
107
+ schema_version: 'agentsam-remediation-v1',
108
+ provider: 'google_cloud',
109
+ kind: 'permission_denied',
110
+ title: 'Permission missing',
111
+ summary: `Operation ${operation} was denied for the active Google Cloud connection.`,
112
+ ran: Object.freeze([]),
113
+ notes: Object.freeze([
114
+ `Connection: ${connection}`,
115
+ `Required permission (when known): ${permission}`,
116
+ ]),
117
+ actions: Object.freeze([
118
+ Object.freeze({
119
+ id: 'reauth',
120
+ title: 'Re-authorize Google Cloud',
121
+ recommended: true,
122
+ command: 'gcloud auth login',
123
+ }),
124
+ Object.freeze({
125
+ id: 'show_permission',
126
+ title: 'Show required permission',
127
+ command: `gcloud projects get-iam-policy ${projectId} --flatten='bindings[].members' --filter='bindings.role:roles/' --format='table(bindings.role)'`,
128
+ }),
129
+ Object.freeze({
130
+ id: 'open_iam',
131
+ title: 'Open IAM / consent page',
132
+ docs_url: `https://console.cloud.google.com/iam-admin/iam?project=${encodeURIComponent(projectId)}`,
133
+ command: `open "https://console.cloud.google.com/iam-admin/iam?project=${projectId}"`,
134
+ }),
135
+ Object.freeze({
136
+ id: 'copy_probe',
137
+ title: 'Copy read-only probe command',
138
+ command: `gcloud compute instances list --project=${projectId} --format='table(name,zone,status,machineType)'`,
139
+ }),
140
+ ]),
141
+ keys: Object.freeze({
142
+ enter: 'Re-authorize Google Cloud',
143
+ p: 'Show required permission',
144
+ o: 'Open IAM/consent page',
145
+ c: 'Copy gcloud command',
146
+ esc: 'cancel',
147
+ }),
148
+ });
149
+ }
150
+
151
+ /**
152
+ * GitHub env token shadows healthy keyring OAuth.
153
+ * @param {{ envTokenPresent?: boolean, keyringHealthy?: boolean, scopes?: string[] }} [ctx]
154
+ * @returns {RemediationCard|null}
155
+ */
156
+ export function remediateGithubTokenShadow(ctx = {}) {
157
+ if (!ctx.envTokenPresent || ctx.keyringHealthy !== true) return null;
158
+ return Object.freeze({
159
+ schema_version: 'agentsam-remediation-v1',
160
+ provider: 'github',
161
+ kind: 'credential_shadow',
162
+ title: 'Stale GITHUB_TOKEN shadows working keyring login',
163
+ summary:
164
+ 'macOS keyring OAuth is healthy, but GITHUB_TOKEN / GH_TOKEN in the environment takes precedence and returns HTTP 401.',
165
+ ran: Object.freeze([]),
166
+ notes: Object.freeze([
167
+ ...(Array.isArray(ctx.scopes) && ctx.scopes.length
168
+ ? [`Keyring scopes: ${ctx.scopes.join(', ')}`]
169
+ : []),
170
+ 'Prefer GitHub App installation for customer products; developer Macs may keep gh OAuth.',
171
+ ]),
172
+ actions: Object.freeze([
173
+ Object.freeze({
174
+ id: 'unset',
175
+ title: 'Remove stale shell override for this session',
176
+ recommended: true,
177
+ command: 'unset GITHUB_TOKEN GH_TOKEN',
178
+ }),
179
+ Object.freeze({
180
+ id: 'status',
181
+ title: 'Confirm keyring auth',
182
+ command: 'gh auth status',
183
+ }),
184
+ Object.freeze({
185
+ id: 'whoami',
186
+ title: 'Confirm API identity',
187
+ command: "gh api user --jq '{login: .login, type: .type}'",
188
+ }),
189
+ Object.freeze({
190
+ id: 'find_source',
191
+ title: 'Inspect where the override originates',
192
+ command: "rg -n 'GITHUB_TOKEN|GH_TOKEN' ~/.zshrc ~/.zprofile ~/.profile ~/.agentsam 2>/dev/null",
193
+ }),
194
+ ]),
195
+ keys: Object.freeze({
196
+ enter: 'inspect source',
197
+ c: 'copy command',
198
+ esc: 'cancel',
199
+ }),
200
+ });
201
+ }
202
+
203
+ /**
204
+ * Classify a failed argv / stderr blob into a remediation card when possible.
205
+ * @param {{ argv?: string[], stderr?: string, stdout?: string, env?: NodeJS.ProcessEnv, projectId?: string }} input
206
+ * @returns {RemediationCard|null}
207
+ */
208
+ export function remediateProviderFailure(input = {}) {
209
+ const argv = Array.isArray(input.argv) ? input.argv.map(String) : [];
210
+ const text = `${argv.join(' ')}\n${clean(input.stderr)}\n${clean(input.stdout)}`;
211
+
212
+ const edge = remediateGcloudEdgeServiceAccountKey({
213
+ argv,
214
+ projectId: input.projectId,
215
+ env: input.env,
216
+ force: /edge-cloud/.test(text) && /service-account/.test(text),
217
+ });
218
+ if (edge) return edge;
219
+
220
+ if (/PERMISSION_DENIED|permission.?denied|403 Forbidden/i.test(text)) {
221
+ const opMatch = text.match(/\b([a-z]+(?:\.[a-z]+){1,4})\b/i);
222
+ return remediateGcloudPermissionDenied({
223
+ operation: opMatch?.[1],
224
+ projectId: input.projectId,
225
+ connection: 'Google Cloud',
226
+ });
227
+ }
228
+
229
+ if (/GITHUB_TOKEN|GH_TOKEN/i.test(text) && /401|invalid|Bad credentials/i.test(text)) {
230
+ return remediateGithubTokenShadow({
231
+ envTokenPresent: true,
232
+ keyringHealthy: true,
233
+ });
234
+ }
235
+
236
+ return null;
237
+ }
238
+
239
+ /**
240
+ * Human-readable card (never prints secrets).
241
+ * @param {RemediationCard} card
242
+ * @returns {string}
243
+ */
244
+ export function renderRemediationCard(card) {
245
+ if (!card) return '';
246
+ const lines = [
247
+ '',
248
+ ` Agent Sam · ${providerLabel(card.provider)}`,
249
+ '',
250
+ ` ✕ ${card.title}`,
251
+ '',
252
+ ];
253
+ if (card.ran?.length) {
254
+ lines.push(' You ran:');
255
+ for (const ran of card.ran) lines.push(` ${ran}`);
256
+ lines.push('');
257
+ }
258
+ if (card.summary) {
259
+ lines.push(` ${card.summary}`);
260
+ lines.push('');
261
+ }
262
+ if (card.notes?.length) {
263
+ for (const note of card.notes) lines.push(` ${note}`);
264
+ lines.push('');
265
+ }
266
+ if (card.actions?.length) {
267
+ lines.push(' Likely intent');
268
+ lines.push('');
269
+ card.actions.forEach((action, index) => {
270
+ const mark = action.recommended ? '★' : ' ';
271
+ lines.push(` ${mark} ${index + 1} ${action.title}`);
272
+ if (action.command) lines.push(` ${action.command}`);
273
+ if (action.docs_url) lines.push(` docs: ${action.docs_url}`);
274
+ lines.push('');
275
+ });
276
+ }
277
+ const keys = card.keys || {};
278
+ const keyBits = [];
279
+ if (keys.enter) keyBits.push(`[enter] ${keys.enter}`);
280
+ if (keys.h) keyBits.push(`[h] ${keys.h}`);
281
+ if (keys.p) keyBits.push(`[p] ${keys.p}`);
282
+ if (keys.o) keyBits.push(`[o] ${keys.o}`);
283
+ if (keys.c) keyBits.push(`[c] ${keys.c}`);
284
+ if (keys.esc) keyBits.push(`[esc] ${keys.esc}`);
285
+ if (keyBits.length) {
286
+ lines.push(` ${keyBits.join(' ')}`);
287
+ lines.push('');
288
+ }
289
+ return lines.join('\n');
290
+ }
291
+
292
+ function providerLabel(provider) {
293
+ switch (clean(provider)) {
294
+ case 'google_cloud':
295
+ return 'Google Cloud';
296
+ case 'github':
297
+ return 'GitHub';
298
+ case 'cloudflare':
299
+ return 'Cloudflare';
300
+ default:
301
+ return clean(provider) || 'Provider';
302
+ }
303
+ }
304
+
305
+ export function recommendedCommand(card) {
306
+ const hit = (card?.actions || []).find((row) => row.recommended && row.command);
307
+ return hit?.command || (card?.actions || []).find((row) => row.command)?.command || null;
308
+ }
@@ -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,
@@ -395,6 +396,13 @@ export function renderEnvShellExports(options = {}) {
395
396
  if (!emitted.length) {
396
397
  lines.push('# No AgentSam credentials configured. Run: agentsam api-key create --store keychain --activate');
397
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
+
398
406
  return Object.freeze({
399
407
  profile,
400
408
  providers: emitted,
@@ -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) {