@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
@@ -14,12 +14,15 @@ export const CLI_COMMAND_CATALOG = Object.freeze([
14
14
  { id: 'dev', summary: 'Run this project’s npm dev script', topic: 'work', skill: 'agentsam-app-fundamentals' },
15
15
  { id: 'inspect', summary: 'Bounded repository inspect / authority view', topic: 'work', skill: 'agentsam-app-fundamentals', operation: 'repository.inspect', common: true },
16
16
  { id: 'capabilities', summary: 'Inspect capability contracts', topic: 'create', skill: 'agentsam-app-fundamentals' },
17
+ { id: 'setup', summary: 'Discover → plan → approve → install capabilities (Homebrew-style)', topic: 'start', skill: 'agentsam-app-fundamentals', common: true },
17
18
  { id: 'skills', aliases: ['skill'], summary: 'List or load portable skill instructions', topic: 'create', skill: 'agentsam-app-fundamentals', common: true },
18
19
  { id: 'context', summary: 'Git + bridge context from any repo', topic: 'work', skill: 'agentsam-app-fundamentals' },
19
20
  { id: 'status', summary: 'Account, models, terminal, and live deploy awareness', topic: 'runtime', skill: 'agentsam-progression-guard', common: true },
20
21
  { id: 'db', summary: 'Project-local SQLite status/init', topic: 'runtime', skill: 'agentsam-app-fundamentals' },
21
22
  { id: 'models', summary: 'Probe hosted/local model availability', topic: 'start', skill: 'agentsam-app-fundamentals', common: true },
22
23
  { id: 'providers', summary: 'Configure machine provider credentials', topic: 'start', skill: 'agentsam-app-fundamentals' },
24
+ { id: 'credentials', aliases: ['credential'], summary: 'Audit credentials, drift, and failure remediation (never prints secrets)', topic: 'start', skill: 'agentsam-app-fundamentals', common: true },
25
+ { id: 'cheat-sheet', aliases: ['cheatsheet'], summary: 'Organized command groups (gcloud-like)', topic: 'start', skill: 'agentsam-app-fundamentals', common: true },
23
26
  { id: 'env', summary: 'Provider profile / shell loader helpers', topic: 'start', skill: 'agentsam-app-fundamentals' },
24
27
  { id: 'api-key', aliases: ['apikey', 'api-keys'], summary: 'Create/list/rotate AgentSam API keys (aak_*)', topic: 'start', skill: 'agentsam-app-fundamentals', common: true },
25
28
  { id: 'login', summary: 'Sign in and persist machine-local session', topic: 'start', skill: 'agentsam-app-fundamentals' },
@@ -31,10 +34,15 @@ export const CLI_COMMAND_CATALOG = Object.freeze([
31
34
  { id: 'ollama', summary: 'Local Ollama setup/status/models', topic: 'runtime', skill: 'agentsam-app-fundamentals' },
32
35
  { id: 'tunnel', summary: 'Cloudflare Tunnel via Wrangler', topic: 'runtime', skill: 'agentsam-cloudflare-workers' },
33
36
  { id: 'connections', aliases: ['connection'], summary: 'Inspect execution connections', topic: 'runtime', skill: 'agentsam-cloudflare-workers' },
37
+ { id: 'compute', summary: 'Alias for google-cloud compute/iam helpers', topic: 'runtime', skill: 'agentsam-app-fundamentals' },
38
+ { id: 'google-cloud', aliases: ['gcp', 'gcloud'], summary: 'Google Cloud auth, projects, compute, IAM SAs, billing, doctor', topic: 'runtime', skill: 'agentsam-app-fundamentals', common: true },
39
+ { id: 'billing', aliases: ['costs'], summary: 'Billing account relationships (not --billing-project)', topic: 'runtime', skill: 'agentsam-app-fundamentals' },
40
+ { id: 'update', summary: 'Component update preview (gcloud-like)', topic: 'runtime', skill: 'agentsam-app-fundamentals' },
34
41
  { id: 'deploy', summary: 'Graduate intentionally to cloud', topic: 'runtime', skill: 'agentsam-progression-guard', common: true },
35
42
  { id: 'deploy-receipt', summary: 'Merkle deploy/checkpoint receipts', topic: 'runtime', skill: 'agentsam-progression-guard' },
36
43
  { id: 'cloudflare', aliases: ['cf'], summary: 'Wrangler reads + Worker CPU profiles', topic: 'runtime', skill: 'agentsam-cloudflare-workers' },
37
44
  { id: 'go', summary: 'Go product discover/build/deploy', topic: 'runtime', skill: 'agentsam-cloudflare-workers' },
45
+ { id: 'rust', aliases: ['wasm', 'rapid-rust'], summary: 'Rust/Wasm scaffold, doctor, check, build, dev, explicit deploy', topic: 'runtime', skill: 'agentsam-cloudflare-workers' },
38
46
  { id: 'mcp', summary: 'MCP server catalog and client adapters', topic: 'runtime', skill: 'agentsam-cloudflare-workers' },
39
47
  { id: 'eval', summary: 'Context fixtures and live eval telemetry', topic: 'runtime', skill: 'agentsam-app-fundamentals' },
40
48
  { id: 'index', summary: 'Plan/run incremental AST (+ optional embeddings)', topic: 'work', skill: 'agentsam-codebaseindex', operation: 'codebaseindex.ingest' },
package/src/cli.js CHANGED
@@ -39,16 +39,33 @@ import { runEval } from './commands/eval.js';
39
39
  import { runMcp } from './commands/mcp.js';
40
40
  import { runCloudflare } from './commands/cloudflare.js';
41
41
  import { runGo } from './commands/go.js';
42
+ import { runRust } from './commands/rust.js';
42
43
  import { runWhoami } from './commands/whoami.js';
44
+ import { runTerminal } from './commands/terminal.js';
43
45
  import { runApiKey } from './commands/api-key.js';
44
46
  import { runResume } from './commands/resume.js';
45
47
  import { runLogin, runLogout } from './commands/account-auth.js';
46
48
  import { runPlugins } from './commands/plugins.js';
49
+ import { runCredentials } from './commands/credentials.js';
50
+ import { runCheatSheet } from './commands/cheat-sheet.js';
51
+ import { runCompute } from './commands/compute.js';
52
+ import { runGoogleCloud } from './commands/google-cloud.js';
53
+ import { runBilling } from './commands/billing.js';
54
+ import { runUpdate } from './commands/update.js';
55
+ import { runSetup } from './commands/setup.js';
56
+ import { runRuntime } from './commands/runtime.js';
47
57
  import { applyPresetSelection, runAdd, runCapabilities, runDev, runInspect } from './commands/product.js';
48
58
  import { listPresets, resolvePreset } from './presets/index.js';
59
+ import {
60
+ getInstallableProductChoice,
61
+ guidanceForRunTarget,
62
+ listInitProjectTypeOptions,
63
+ parseProjectTypeChoice,
64
+ RUN_TARGET_OPTIONS,
65
+ } from './lib/init-options.js';
66
+ import { resolveAccountAuth } from './lib/account-session.js';
49
67
  import fs from 'node:fs';
50
68
  import { repositoryRoot } from './knowledge/config.js';
51
- import { resolveAccountAuth } from './lib/account-session.js';
52
69
  import { renderDiagnosticError } from './errors/index.js';
53
70
  import { renderHelpOverview, runHelp } from './ui/cli/help.js';
54
71
  import { hydrateSecureCredentials } from './security/local-vault.js';
@@ -83,6 +100,7 @@ function printLegacyHelp() {
83
100
  agentsam deploy Graduate an AgentSam project intentionally
84
101
 
85
102
  Capability discovery:
103
+ agentsam setup Discover → plan → approve → install (Homebrew-style)
86
104
  agentsam capabilities [capability-id] [--json]
87
105
  agentsam skill list|create|inspect|install|alias|remove|invoke
88
106
  agentsam skills [skill-id-or-alias] [--references] [--json]
@@ -109,10 +127,15 @@ function printLegacyHelp() {
109
127
  agentsam login Sign in to Inner Animal Media and persist a secure machine-local session
110
128
  agentsam logout Sign out locally; provider credentials stay untouched
111
129
  agentsam whoami [--json] Authenticated account identity + safe credential status
130
+ agentsam terminal identity [--json] This machine's hostname, platform, arch, and model
131
+ agentsam terminal enroll --instance <id> [--pair] [--json]
132
+ Needs AGENTSAM_API_KEY; --pair writes AGENTSAM_BRIDGE_KEY
133
+ (one terminal_connection in ~/.execos/profiles/)
112
134
  agentsam resume [session] Resume a saved Agent Sam session; omit id for picker
113
135
  agentsam eval context Offline context-strategy/economics fixtures (--help)
114
- agentsam cloudflare Native Wrangler reads + Worker CPU profile analysis (--help)
136
+ agentsam cloudflare Capabilities + CF OAuth packs (agentsam cloudflare login --pack agentsam)
115
137
  agentsam go Go runtime discovery/build/deploy (Cloudflare worker-container)
138
+ agentsam rust Rust/Wasm scaffold/doctor/check/build/dev/deploy (explicit deploy)
116
139
  agentsam start-local Local PTY on ws://127.0.0.1:3099 (no tunnel, no Cloudflare)
117
140
  agentsam ollama Opt-in local Ollama setup/status/model management
118
141
  agentsam shell Interactive Agent Sam slash-command shell
@@ -241,6 +264,7 @@ async function runLocalInit(config) {
241
264
  ✓ SQLite ${db.dbPath} (${db.tables.length} tables)
242
265
  ✓ Local API Node · http://127.0.0.1:8787
243
266
  ✓ Agent Sam interactive CLI ready
267
+ ✓ Run target ${meta.runTarget}
244
268
 
245
269
  Next:`);
246
270
  console.log(` cd ${meta.projectName}`);
@@ -248,10 +272,19 @@ async function runLocalInit(config) {
248
272
  console.log(` ${step}`);
249
273
  }
250
274
 
251
-
252
- console.log(`
253
- Local means local: no Worker, tunnel, IAM login, or cloud database is required.
275
+ if (meta.runTarget === 'local') {
276
+ console.log(`
277
+ Local is ready on this host. Cloudflare OAuth, GCP OAuth, and Docker are available when you want them:
278
+ agentsam connections setup · agentsam google-cloud doctor · agentsam dockerize
254
279
  `);
280
+ } else {
281
+ console.log(`
282
+ Guided path for ${meta.runTarget}:`);
283
+ for (const step of guidanceForRunTarget(meta.runTarget, { projectName: meta.projectName })) {
284
+ console.log(` ${step}`);
285
+ }
286
+ console.log('');
287
+ }
255
288
  return { dir, meta };
256
289
  }
257
290
 
@@ -274,38 +307,83 @@ async function initInteractive(partial = {}) {
274
307
  },
275
308
  }));
276
309
 
277
- const laneKey = partial.lane || pick(await select({
278
- message: 'Project type',
279
- initialValue: 'fullstack',
280
- options: [
281
- { value: 'fullstack', label: 'Full Stack' },
282
- { value: 'cms', label: 'CMS' },
283
- { value: 'data', label: 'Data Solutions' },
284
- { value: 'crm', label: 'Customer Management' },
285
- { value: 'creative', label: 'Creative & Design' },
286
- ],
310
+ const typeOptions = listInitProjectTypeOptions();
311
+ const typeChoice = partial.projectType || pick(await select({
312
+ message: 'What do you want to build?',
313
+ initialValue: typeOptions[0]?.value || 'preset:fullstack',
314
+ options: typeOptions.map((row) => ({
315
+ value: row.value,
316
+ label: row.label,
317
+ hint: row.hint,
318
+ })),
287
319
  }));
320
+ const parsed = parseProjectTypeChoice(typeChoice) || { kind: 'preset', id: 'fullstack' };
321
+
322
+ if (parsed.kind === 'scaffold') {
323
+ const { runScaffold } = await import('./lib/scaffold/index.js');
324
+ await runScaffold(parsed.id);
325
+ outro(`Scaffold ${parsed.id} ready`);
326
+ return;
327
+ }
328
+
329
+ if (parsed.kind === 'product') {
330
+ const product = getInstallableProductChoice(parsed.id);
331
+ if (!product?.action) throw new Error(`installable product action unavailable: ${parsed.id}`);
332
+ if (product.action.kind === 'app') {
333
+ const targetDir = path.resolve(process.cwd(), projectName);
334
+ await runApp(['scaffold', product.action.id, targetDir]);
335
+ outro(`Product ${parsed.id} scaffolded at ${projectName}`);
336
+ return;
337
+ }
338
+ if (product.action.kind === 'scaffold') {
339
+ const { runScaffold } = await import('./lib/scaffold/index.js');
340
+ await runScaffold(product.action.id);
341
+ outro(`Product ${parsed.id} scaffold ready`);
342
+ return;
343
+ }
344
+ if (product.action.kind === 'rust-template') {
345
+ await runRust(['new', projectName, '--template', product.action.template || 'shared-core']);
346
+ outro(`Product ${parsed.id} scaffolded at ${projectName}`);
347
+ return;
348
+ }
349
+ throw new Error(`unsupported installable product action: ${product.action.kind}`);
350
+ }
351
+
352
+ if (parsed.kind === 'app') {
353
+ const targetDir = path.resolve(process.cwd(), projectName);
354
+ console.log(`\n Scaffolding app ${parsed.id} → ${targetDir}\n`);
355
+ await runApp(['scaffold', parsed.id, targetDir]);
356
+ outro(`App ${parsed.id} scaffolded at ${projectName}`);
357
+ return;
358
+ }
359
+
360
+ const preset = resolvePreset(parsed.id);
361
+ const laneKey = preset.lane || preset.id;
288
362
 
289
363
  const runTarget = partial.runTarget || pick(await select({
290
- message: 'Future deploy target',
364
+ message: 'Where will this run?',
291
365
  initialValue: 'local',
292
- options: [
293
- { value: 'local', label: 'Local only / decide later' },
294
- { value: 'cloudflare', label: 'Cloudflare later' },
295
- { value: 'gcp', label: 'GCP later' },
296
- ],
366
+ options: RUN_TARGET_OPTIONS.map((row) => ({
367
+ value: row.value,
368
+ label: row.label,
369
+ hint: row.hint,
370
+ })),
297
371
  }));
298
372
 
299
373
  if (runTarget !== 'local') {
300
374
  const { detectContext, missingForInit } = await import('./lib/detect-context.js');
301
375
  const ctx = await detectContext();
302
- if (missingForInit(ctx, resolveAccountAuth({ env: process.env }).value, { runTarget }).length) {
303
- printContextSummary(ctx);
376
+ const missing = missingForInit(ctx, resolveAccountAuth({ env: process.env }).value, { runTarget });
377
+ printContextSummary(ctx);
378
+ if (missing.length) {
379
+ console.log(` Missing for ${runTarget}: ${missing.join(', ')}`);
380
+ console.log(' Use the guided commands printed after scaffold — the tooling is already shipped.\n');
304
381
  }
305
382
  }
306
383
 
307
- await runLocalInit({ projectName, lane: laneKey, runTarget, prompt: null });
308
- outro(`Created ${projectName}`);
384
+ const created = await runLocalInit({ projectName, lane: laneKey, runTarget, prompt: null });
385
+ applyPresetSelection(created.dir, preset);
386
+ outro(`Created ${projectName} (${preset.id} · ${runTarget})`);
309
387
  }
310
388
 
311
389
  async function initFromArgs(argv) {
@@ -349,7 +427,7 @@ if (command === '--version' || command === '-v') {
349
427
  try {
350
428
  const opts = parseCreateArgs(rest);
351
429
  if (opts.help || !opts.projectName) {
352
- console.log(`agentsam create <name> --preset <${listPresets().map((row) => row.id).join('|')}> [--target local|cloudflare|gcp]`);
430
+ console.log(`agentsam create <name> --preset <${listPresets().map((row) => row.id).join('|')}> [--target local|cloudflare|gcp|docker]`);
353
431
  } else {
354
432
  const preset = resolvePreset(opts.preset);
355
433
  const created = await runLocalInit({ projectName: opts.projectName, lane: preset.lane, runTarget: opts.runTarget, prompt: null });
@@ -417,6 +495,69 @@ if (command === '--version' || command === '-v') {
417
495
  reportCliError(e);
418
496
  process.exit(1);
419
497
  }
498
+ } else if (command === 'credentials' || command === 'credential') {
499
+ try {
500
+ const code = await runCredentials(rest);
501
+ if (code) process.exitCode = code;
502
+ } catch (e) {
503
+ reportCliError(e);
504
+ process.exitCode = 1;
505
+ }
506
+ } else if (command === 'cheat-sheet' || command === 'cheatsheet') {
507
+ try {
508
+ process.exitCode = runCheatSheet(rest, { version: VERSION }) || 0;
509
+ } catch (e) {
510
+ reportCliError(e);
511
+ process.exitCode = 1;
512
+ }
513
+ } else if (command === 'setup') {
514
+ try {
515
+ const code = await runSetup(rest);
516
+ if (code) process.exitCode = code;
517
+ } catch (e) {
518
+ reportCliError(e);
519
+ process.exitCode = 1;
520
+ }
521
+ } else if (command === 'runtime' || command === 'agentsamd') {
522
+ try {
523
+ const code = await runRuntime(rest);
524
+ if (code) process.exitCode = code;
525
+ } catch (e) {
526
+ reportCliError(e);
527
+ process.exitCode = 1;
528
+ }
529
+ } else if (command === 'compute') {
530
+ try {
531
+ const code = await runCompute(rest);
532
+ if (code) process.exitCode = code;
533
+ } catch (e) {
534
+ reportCliError(e);
535
+ process.exitCode = 1;
536
+ }
537
+ } else if (command === 'google-cloud' || command === 'gcp' || command === 'gcloud') {
538
+ try {
539
+ const code = await runGoogleCloud(rest);
540
+ if (code) process.exitCode = code;
541
+ } catch (e) {
542
+ reportCliError(e);
543
+ process.exitCode = 1;
544
+ }
545
+ } else if (command === 'billing' || command === 'costs') {
546
+ try {
547
+ const code = await runBilling(rest);
548
+ if (code) process.exitCode = code;
549
+ } catch (e) {
550
+ reportCliError(e);
551
+ process.exitCode = 1;
552
+ }
553
+ } else if (command === 'update') {
554
+ try {
555
+ const code = await runUpdate(rest);
556
+ if (code) process.exitCode = code;
557
+ } catch (e) {
558
+ reportCliError(e);
559
+ process.exitCode = 1;
560
+ }
420
561
  } else if (command === 'env') {
421
562
  try {
422
563
  await runEnv(rest);
@@ -452,6 +593,13 @@ if (command === '--version' || command === '-v') {
452
593
  if (!e?.reported) reportCliError(e);
453
594
  process.exitCode = 1;
454
595
  }
596
+ } else if (command === 'rust' || command === 'wasm' || command === 'rapid-rust') {
597
+ try {
598
+ await runRust(rest);
599
+ } catch (e) {
600
+ if (!e?.reported) reportCliError(e);
601
+ process.exitCode = Number(e?.exitCode || 1);
602
+ }
455
603
  } else if (command === 'login') {
456
604
  try {
457
605
  await runLogin(rest);
@@ -473,6 +621,14 @@ if (command === '--version' || command === '-v') {
473
621
  reportCliError(e);
474
622
  process.exitCode = 1;
475
623
  }
624
+ } else if (command === 'terminal') {
625
+ try {
626
+ const result = await runTerminal(rest);
627
+ if (result?.ok === false) process.exitCode = 1;
628
+ } catch (e) {
629
+ reportCliError(e);
630
+ process.exitCode = 1;
631
+ }
476
632
  } else if (command === 'api-key' || command === 'apikey' || command === 'api-keys') {
477
633
  try {
478
634
  await runApiKey(rest);
@@ -1,24 +1,110 @@
1
1
  import { authenticateViaBrowser } from '../lib/auth.js';
2
2
  import { clearAccountSession, readAccountSession, saveAccountSession } from '../lib/account-session.js';
3
- import { collectWhoami, renderWhoami } from './whoami.js';
3
+ import { collectWhoami, renderLoginResult, renderWhoami } from './whoami.js';
4
+ import readline from 'node:readline';
4
5
 
5
6
  function writeLine(write, value = '') { write(`${value}\n`); }
6
7
 
8
+ /**
9
+ * Interactive provider picker for `agentsam login`.
10
+ * @returns {Promise<'inneranimalmedia'|'google'|'cloudflare'>}
11
+ */
12
+ export async function promptLoginProvider(options = {}) {
13
+ const input = options.input || process.stdin;
14
+ const output = options.output || process.stdout;
15
+ const write = options.write || ((text) => output.write(text));
16
+
17
+ if (options.provider) {
18
+ const p = String(options.provider).trim().toLowerCase();
19
+ if (p === 'iam' || p === 'inneranimalmedia' || p === '1') return 'inneranimalmedia';
20
+ if (p === 'google' || p === '2') return 'google';
21
+ if (p === 'cloudflare' || p === 'cf' || p === '3') return 'cloudflare';
22
+ }
23
+
24
+ // Non-interactive / CI: default to Inner Animal Media AS (CLI OAuth).
25
+ if (!input?.isTTY || !output?.isTTY || options.skipPrompt === true) {
26
+ return 'inneranimalmedia';
27
+ }
28
+
29
+ writeLine(write, '');
30
+ writeLine(write, ' How do you want to sign in?');
31
+ writeLine(write, ' [1] Inner Animal Media (IAM_CLIENT_ID + IAM_OAUTH_ISSUER)');
32
+ writeLine(write, ' [2] Google OAuth (GOOGLE_CLIENT_ID or GOOGLE_DESKTOP_CLIENT_ID)');
33
+ writeLine(write, ' [3] Cloudflare OAuth (CLOUDFLARE_OAUTH_CLIENT_ID)');
34
+ writeLine(write, '');
35
+
36
+ const rl = readline.createInterface({ input, output });
37
+ try {
38
+ const answer = await new Promise((resolve) => {
39
+ rl.question(' Choose [1/2/3] (default 1): ', resolve);
40
+ });
41
+ const raw = String(answer || '').trim().toLowerCase();
42
+ if (!raw || raw === '1' || raw === 'iam' || raw === 'inneranimalmedia') return 'inneranimalmedia';
43
+ if (raw === '2' || raw === 'google') return 'google';
44
+ if (raw === '3' || raw === 'cloudflare' || raw === 'cf') return 'cloudflare';
45
+ writeLine(write, ` Unknown choice "${raw}" — using Inner Animal Media.`);
46
+ return 'inneranimalmedia';
47
+ } finally {
48
+ rl.close();
49
+ }
50
+ }
51
+
7
52
  export async function runLogin(argv = [], options = {}) {
8
- const allowed = new Set(['--json']);
9
- const unknown = argv.filter((arg) => !allowed.has(arg));
53
+ const allowed = new Set(['--json', '--provider', '--iam', '--google', '--cloudflare']);
54
+ const unknown = argv.filter((arg) => {
55
+ if (allowed.has(arg)) return false;
56
+ if (arg.startsWith('--provider=')) return false;
57
+ return true;
58
+ });
10
59
  if (unknown.length) throw new Error(`unknown login option: ${unknown[0]}`);
11
60
  const write = options.write || ((text) => process.stdout.write(text));
12
61
  const authenticate = options.authenticateImpl || authenticateViaBrowser;
13
- const session = await authenticate();
62
+
63
+ let providerFlag = null;
64
+ for (const arg of argv) {
65
+ if (arg === '--iam') providerFlag = 'inneranimalmedia';
66
+ if (arg === '--google') providerFlag = 'google';
67
+ if (arg === '--cloudflare') providerFlag = 'cloudflare';
68
+ if (arg.startsWith('--provider=')) providerFlag = arg.slice('--provider='.length);
69
+ }
70
+
71
+ const provider = await promptLoginProvider({
72
+ ...options,
73
+ provider: providerFlag || options.provider,
74
+ write,
75
+ input: options.input,
76
+ output: options.output,
77
+ skipPrompt: argv.includes('--json') || options.skipPrompt === true,
78
+ });
79
+
80
+ const session = await authenticate({
81
+ home: options.home,
82
+ env: options.env || process.env,
83
+ input: options.input,
84
+ output: options.output,
85
+ loginProvider: provider,
86
+ });
14
87
  if (!String(session?.access_token || '').trim()) throw new Error('Agent Sam login did not return a browser session credential');
15
88
  // authenticateViaBrowser persists by default. Keep injected transports/test flows equivalent.
16
89
  if (!readAccountSession({ home: options.home })) saveAccountSession(session, { home: options.home });
17
90
  const status = await collectWhoami({ home: options.home, env: options.env || process.env, contextLoader: options.contextLoader });
18
- if (argv.includes('--json')) writeLine(write, JSON.stringify(status, null, 2));
19
- else {
20
- writeLine(write, '');
21
- writeLine(write, ' Agent Sam login complete.');
91
+ if (argv.includes('--json')) {
92
+ writeLine(write, JSON.stringify({
93
+ ...status,
94
+ login: {
95
+ browser_oauth_saved: true,
96
+ provider,
97
+ authoritative: status.active_auth?.kind || null,
98
+ oauth_authoritative:
99
+ status.active_auth?.kind === 'agentsam_browser_oauth'
100
+ || status.active_auth?.kind === 'browser_oauth',
101
+ api_key_shadows_oauth:
102
+ Boolean(status.browser_session?.configured)
103
+ && (status.active_auth?.kind === 'agentsam_api_key' || status.active_auth?.kind === 'api_key'),
104
+ },
105
+ }, null, 2));
106
+ } else {
107
+ write(renderLoginResult(status));
22
108
  write(renderWhoami(status));
23
109
  }
24
110
  return status;