@inneranimalmedia/agentsam-sdk 2.6.1 → 2.6.3

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 (507) hide show
  1. package/AGENTSAM.md +45 -1
  2. package/README.md +80 -0
  3. package/apps/README.md +34 -0
  4. package/apps/cad-creator/README.md +728 -0
  5. package/apps/cad-creator/shared/cad/package.json +19 -0
  6. package/apps/cad-creator/shared/cad/src/domain/operations.ts +7 -0
  7. package/apps/cad-creator/shared/cad/src/domain/project-contract.d.ts +3 -0
  8. package/apps/cad-creator/shared/cad/src/domain/project-contract.js +75 -0
  9. package/apps/cad-creator/shared/cad/src/domain/project-tools.d.ts +1 -0
  10. package/apps/cad-creator/shared/cad/src/domain/project-tools.js +24 -0
  11. package/apps/cad-creator/shared/cad/src/domain/validation.ts +191 -0
  12. package/apps/cad-creator/shared/cad/src/index.ts +4 -0
  13. package/apps/cad-creator/shared/cad/src/robotics/types.ts +232 -0
  14. package/apps/cad-creator/shared/cad/src/types.ts +507 -0
  15. package/apps/cad-creator/shared/cad/tsconfig.json +14 -0
  16. package/docs/AUTH_IDENTITY_CONTRACT.md +25 -27
  17. package/docs/AUTORAG.md +58 -0
  18. package/docs/BRAND_INTELLIGENCE.md +30 -0
  19. package/docs/CLI_SHELL.md +4 -2
  20. package/docs/CMS_CONTEXTUAL_COMPOSER.md +38 -0
  21. package/docs/MERKLE.md +4 -0
  22. package/docs/PROJECT_CONFIG.md +3 -0
  23. package/docs/REPOSITORY_KNOWLEDGE.md +2 -0
  24. package/docs/SDK_WORKER.md +4 -3
  25. package/docs/THEME_REFINERY.md +120 -0
  26. package/docs/architecture/PROVIDER-TOOLS-AND-COMPACTION.md +60 -0
  27. package/docs/architecture/STORAGE.md +87 -0
  28. package/docs/cad-project-tools.md +69 -0
  29. package/docs/cms-scaffolding-pattern-reference.md +73 -0
  30. package/docs/plans/AGENTSAM-INTERACTIVE-UI-REQUIREMENTS-codex-tui-20260919.md +113 -0
  31. package/docs/plans/AGENTSAM-INTERACTIVE-UI-REQUIREMENTS.md +85 -0
  32. package/docs/plans/AGENTSAM-MCP-CLIENT-2026-09-19.md +181 -0
  33. package/docs/plans/ASBD-PORTABLE-WORKGRAPH-UI-DEFERRED.md +34 -0
  34. package/docs/plans/ASTRA-BRIEF-2026-09-18.md +258 -0
  35. package/docs/plans/MULTI-AGENT-SPRINTS-2026-09-19.md +373 -0
  36. package/docs/plans/NEXT-AGENT-HANDOFF.md +167 -0
  37. package/docs/plans/RECONCILIATION-2026-09-19.md +178 -0
  38. package/docs/plugins.md +43 -0
  39. package/docs/tools/README.md +57 -0
  40. package/docs/tools/agent-and-orchestration.md +49 -0
  41. package/docs/tools/browser-and-research.md +46 -0
  42. package/docs/tools/cloudflare-platform.md +32 -0
  43. package/docs/tools/cms.md +25 -0
  44. package/docs/tools/communications.md +41 -0
  45. package/docs/tools/database-and-storage.md +62 -0
  46. package/docs/tools/design-and-media.md +64 -0
  47. package/docs/tools/filesystem-and-code.md +55 -0
  48. package/docs/tools/github.md +56 -0
  49. package/docs/tools/integrations-and-misc.md +16 -0
  50. package/docs/tools/memory.md +21 -0
  51. package/docs/tools/terminal-and-execution.md +29 -0
  52. package/docs/tools/tickets-and-platform.md +30 -0
  53. package/migrations/d1/0001_agentsam_plugin_runtime.sql +177 -0
  54. package/migrations/d1/0002_agentsam_ticket_ownership.sql +8 -0
  55. package/migrations/d1/0002_dynamic_model_policies.sql +23 -0
  56. package/migrations/d1/0003_expand_tool_handler_families.sql +18 -0
  57. package/migrations/d1/0004_project_aware_retrieval_lanes.sql +24 -0
  58. package/migrations/d1/0005_portable_knowledge_identity.sql +104 -0
  59. package/migrations/d1/0006_repair_ops_trail_account_scope.sql +14 -0
  60. package/migrations/d1/0007_repair_ops_trail_agent_run_account.sql +13 -0
  61. package/migrations/d1/0008_backfill_knowledge_run_legacy_tenant.sql +14 -0
  62. package/migrations/d1/0009_normalize_cloudflare_plugin_installations.sql +137 -0
  63. package/migrations/runtime/0001_cli_runtime.sql +67 -0
  64. package/migrations/runtime/0002_project_sessions.sql +15 -0
  65. package/migrations/runtime/0003_provider_continuations.sql +8 -0
  66. package/package.json +92 -12
  67. package/packages/agentsam-brand/README.md +21 -0
  68. package/packages/agentsam-brand/package.json +22 -0
  69. package/packages/agentsam-brand/src/contract.js +59 -0
  70. package/packages/agentsam-brand/src/extract.js +126 -0
  71. package/packages/agentsam-brand/src/goap-actions.js +73 -0
  72. package/packages/agentsam-brand/src/index.js +48 -0
  73. package/packages/agentsam-brand/src/plan.js +115 -0
  74. package/packages/agentsam-brand/src/resolve.js +139 -0
  75. package/packages/agentsam-brand/src/scan.js +250 -0
  76. package/packages/agentsam-brand/test/brand-scan.test.mjs +106 -0
  77. package/packages/agentsam-contracts/README.md +23 -0
  78. package/packages/agentsam-contracts/package.json +32 -0
  79. package/packages/agentsam-contracts/src/adapter.ts +25 -0
  80. package/packages/agentsam-contracts/src/agent.ts +35 -0
  81. package/packages/agentsam-contracts/src/artifacts.ts +33 -0
  82. package/packages/agentsam-contracts/src/authority.ts +29 -0
  83. package/packages/agentsam-contracts/src/context.ts +16 -0
  84. package/packages/agentsam-contracts/src/errors.ts +46 -0
  85. package/packages/agentsam-contracts/src/events.ts +47 -0
  86. package/packages/agentsam-contracts/src/execution.ts +50 -0
  87. package/packages/agentsam-contracts/src/hooks.ts +40 -0
  88. package/packages/agentsam-contracts/src/identity.ts +16 -0
  89. package/packages/agentsam-contracts/src/index.ts +14 -0
  90. package/packages/agentsam-contracts/src/models.ts +9 -0
  91. package/packages/agentsam-contracts/src/providers.ts +33 -0
  92. package/packages/agentsam-contracts/src/repository.ts +64 -0
  93. package/packages/agentsam-contracts/src/tools.ts +98 -0
  94. package/packages/agentsam-contracts/test/contracts.test.mjs +16 -0
  95. package/packages/agentsam-contracts/test/errors-catalog.test.mjs +25 -0
  96. package/packages/agentsam-contracts/test/repository.test.mjs +18 -0
  97. package/packages/agentsam-contracts/tsconfig.json +12 -0
  98. package/packages/agentsam-errors/package.json +17 -0
  99. package/packages/agentsam-errors/src/adapters/anthropic.js +15 -0
  100. package/packages/agentsam-errors/src/adapters/cad.js +109 -0
  101. package/packages/agentsam-errors/src/adapters/cloudflare.js +21 -0
  102. package/packages/agentsam-errors/src/adapters/cursor.js +4 -0
  103. package/packages/agentsam-errors/src/adapters/device.js +38 -0
  104. package/packages/agentsam-errors/src/adapters/docker.js +28 -0
  105. package/packages/agentsam-errors/src/adapters/gcp.js +14 -0
  106. package/packages/agentsam-errors/src/adapters/github.js +22 -0
  107. package/packages/agentsam-errors/src/adapters/google.js +17 -0
  108. package/packages/agentsam-errors/src/adapters/index.js +55 -0
  109. package/packages/agentsam-errors/src/adapters/internal.js +40 -0
  110. package/packages/agentsam-errors/src/adapters/oauth.js +24 -0
  111. package/packages/agentsam-errors/src/adapters/openai.js +17 -0
  112. package/packages/agentsam-errors/src/adapters/process.js +35 -0
  113. package/packages/agentsam-errors/src/adapters/provider.js +114 -0
  114. package/packages/agentsam-errors/src/envelope.js +186 -0
  115. package/packages/agentsam-errors/src/error.js +24 -0
  116. package/packages/agentsam-errors/src/fingerprint.js +35 -0
  117. package/packages/agentsam-errors/src/index.js +10 -0
  118. package/packages/agentsam-errors/src/normalize.js +30 -0
  119. package/packages/agentsam-errors/src/redaction.js +52 -0
  120. package/packages/agentsam-errors/src/render.js +16 -0
  121. package/packages/agentsam-errors/src/retry.js +10 -0
  122. package/packages/agentsam-errors/src/transport.js +52 -0
  123. package/packages/agentsam-errors/src/vocabulary.js +320 -0
  124. package/packages/agentsam-errors/test/envelope.test.mjs +70 -0
  125. package/packages/agentsam-errors/test/providers.test.mjs +99 -0
  126. package/packages/agentsam-errors/test/redaction.test.mjs +21 -0
  127. package/packages/agentsam-errors/test/runtime-cad-device.test.mjs +76 -0
  128. package/packages/agentsam-errors/test/transport.test.mjs +46 -0
  129. package/packages/agentsam-knowledge/package.json +15 -0
  130. package/packages/agentsam-knowledge/src/autorag/index.js +64 -0
  131. package/packages/agentsam-knowledge/src/backends/index.js +26 -0
  132. package/packages/agentsam-knowledge/src/index.js +3 -0
  133. package/packages/agentsam-knowledge/src/providers/index.js +95 -0
  134. package/packages/agentsam-knowledge/test/autorag.test.mjs +42 -0
  135. package/packages/agentsam-nav/README.md +40 -0
  136. package/packages/agentsam-nav/dist/Nav.d.ts +43 -0
  137. package/packages/agentsam-nav/dist/NavCollapsible.d.ts +10 -0
  138. package/packages/agentsam-nav/dist/NavContent.d.ts +2 -0
  139. package/packages/agentsam-nav/dist/NavFooter.d.ts +2 -0
  140. package/packages/agentsam-nav/dist/NavGroup.d.ts +3 -0
  141. package/packages/agentsam-nav/dist/NavHeader.d.ts +2 -0
  142. package/packages/agentsam-nav/dist/NavMenu.d.ts +22 -0
  143. package/packages/agentsam-nav/dist/NavProvider.d.ts +35 -0
  144. package/packages/agentsam-nav/dist/NavTrigger.d.ts +2 -0
  145. package/packages/agentsam-nav/dist/Surfaces.d.ts +41 -0
  146. package/packages/agentsam-nav/dist/browser.d.ts +11 -0
  147. package/packages/agentsam-nav/dist/browser.global.js +132 -0
  148. package/packages/agentsam-nav/dist/browser.js +613 -0
  149. package/packages/agentsam-nav/dist/contracts.d.ts +76 -0
  150. package/packages/agentsam-nav/dist/index.d.ts +11 -0
  151. package/packages/agentsam-nav/dist/index.js +614 -0
  152. package/packages/agentsam-nav/dist/legacy.css +83 -0
  153. package/packages/agentsam-nav/dist/shell.css +113 -0
  154. package/packages/agentsam-nav/dist/theme.css +113 -0
  155. package/packages/agentsam-nav/dist/utils.d.ts +1 -0
  156. package/packages/agentsam-nav/package.json +43 -0
  157. package/packages/agentsam-queue-control/README.md +107 -0
  158. package/packages/agentsam-queue-control/package.json +31 -0
  159. package/packages/agentsam-queue-control/schemas/job-envelope.schema.json +56 -0
  160. package/packages/agentsam-queue-control/src/adapters/cloudflare.js +152 -0
  161. package/packages/agentsam-queue-control/src/adapters/memory.js +38 -0
  162. package/packages/agentsam-queue-control/src/contracts.js +130 -0
  163. package/packages/agentsam-queue-control/src/control-plane.js +141 -0
  164. package/packages/agentsam-queue-control/src/dispatch.js +43 -0
  165. package/packages/agentsam-queue-control/src/index.js +7 -0
  166. package/packages/agentsam-queue-control/src/policy.js +88 -0
  167. package/packages/agentsam-queue-control/src/topology.js +66 -0
  168. package/packages/agentsam-queue-control/test/queue-control.test.mjs +100 -0
  169. package/packages/agentsam-repository/src/goap.js +718 -0
  170. package/packages/agentsam-repository/src/goap.js.bak-20260922011251 +670 -0
  171. package/packages/agentsam-repository/src/index.js +5 -0
  172. package/packages/agentsam-repository/src/merkle/cloudflare-persistence.js +2 -2
  173. package/packages/agentsam-repository/src/tickets.js +184 -0
  174. package/packages/agentsam-repository/src/work-tracking.js +199 -0
  175. package/packages/agentsam-repository/src/workspace-state.js +176 -0
  176. package/packages/agentsam-repository/test/goap-tickets-workspace-state.test.mjs +152 -0
  177. package/packages/connectors/cloudflare/src/index.js +297 -15
  178. package/packages/connectors/cloudflare/src/owner.js +43 -40
  179. package/packages/connectors/cloudflare/src/routes.js +167 -26
  180. package/packages/connectors/cloudflare/tests/connector.test.mjs +112 -2
  181. package/packages/heuristic-theme/README.md +11 -0
  182. package/packages/heuristic-theme/package.json +25 -0
  183. package/packages/heuristic-theme/src/index.js +2 -0
  184. package/packages/heuristic-theme/src/registry.js +36 -0
  185. package/packages/heuristic-theme/src/theme.js +41 -0
  186. package/packages/heuristic-theme/test/theme.test.mjs +26 -0
  187. package/packages/identity/.agentsam/features/oauth-login-portal/agentsam.feature.json +64 -0
  188. package/packages/identity/.agentsam/features/oauth-login-portal/providers.json +96 -0
  189. package/packages/identity/.agentsam/features/oauth-login-portal/resources.json +47 -0
  190. package/packages/identity/.agentsam/features/oauth-login-portal/routes.json +74 -0
  191. package/packages/identity/.agentsam/features/oauth-login-portal/ui.json +35 -0
  192. package/packages/identity/package.json +4 -3
  193. package/packages/identity/src/adapters/cloudflare-d1/ids.js +4 -0
  194. package/packages/identity/src/adapters/cloudflare-d1/index.js +39 -1
  195. package/packages/identity/src/contracts/auth-config.js +23 -40
  196. package/packages/identity/src/contracts/provider.js +3 -2
  197. package/packages/identity/src/frontend/auth-portal/pages/login.html +7 -0
  198. package/packages/identity/src/index.js +2 -0
  199. package/packages/identity/src/oauth/credentials.js +13 -0
  200. package/packages/identity/src/oauth/iam-platform.js +5 -5
  201. package/packages/identity/src/providers/cloudflare/index.js +19 -0
  202. package/packages/identity/src/providers/cloudflare/mapper.js +21 -0
  203. package/packages/identity/src/providers/cloudflare/oauth.js +48 -0
  204. package/packages/identity/src/providers/cloudflare/profile.js +28 -0
  205. package/packages/identity/src/providers/index.js +18 -2
  206. package/packages/identity/src/server/identity-service.js +13 -3
  207. package/packages/identity/src/server/worker-router.js +63 -8
  208. package/packages/identity/tests/auth-config.test.mjs +14 -23
  209. package/packages/identity/tests/identity-service.test.mjs +15 -0
  210. package/packages/providers/completeful/README.md +38 -0
  211. package/packages/providers/completeful/package.json +29 -0
  212. package/packages/providers/completeful/src/client.js +162 -0
  213. package/packages/providers/completeful/src/events.js +49 -0
  214. package/packages/providers/completeful/src/index.js +22 -0
  215. package/packages/providers/completeful/src/tools.js +579 -0
  216. package/packages/providers/completeful/src/webhooks.js +55 -0
  217. package/packages/providers/completeful/test/provider.test.mjs +196 -0
  218. package/packages/theme-church-site/README.md +10 -0
  219. package/packages/theme-church-site/package.json +30 -0
  220. package/packages/theme-church-site/src/harvest.json +14 -0
  221. package/packages/theme-church-site/src/index.js +84 -0
  222. package/packages/theme-church-site/test/theme.test.mjs +19 -0
  223. package/packages/theme-companions-site/README.md +10 -0
  224. package/packages/theme-companions-site/package.json +30 -0
  225. package/packages/theme-companions-site/src/harvest.json +12 -0
  226. package/packages/theme-companions-site/src/index.js +82 -0
  227. package/packages/theme-companions-site/test/theme.test.mjs +19 -0
  228. package/packages/theme-floors-site/README.md +10 -0
  229. package/packages/theme-floors-site/package.json +30 -0
  230. package/packages/theme-floors-site/src/harvest.json +14 -0
  231. package/packages/theme-floors-site/src/index.js +82 -0
  232. package/packages/theme-floors-site/test/theme.test.mjs +19 -0
  233. package/packages/theme-fuelnfree-site/README.md +10 -0
  234. package/packages/theme-fuelnfree-site/package.json +30 -0
  235. package/packages/theme-fuelnfree-site/src/harvest.json +13 -0
  236. package/packages/theme-fuelnfree-site/src/index.js +81 -0
  237. package/packages/theme-fuelnfree-site/test/theme.test.mjs +19 -0
  238. package/packages/theme-handyman-site/README.md +10 -0
  239. package/packages/theme-handyman-site/package.json +30 -0
  240. package/packages/theme-handyman-site/src/harvest.json +10 -0
  241. package/packages/theme-handyman-site/src/index.js +83 -0
  242. package/packages/theme-handyman-site/test/theme.test.mjs +19 -0
  243. package/packages/theme-insurance-site/README.md +10 -0
  244. package/packages/theme-insurance-site/package.json +30 -0
  245. package/packages/theme-insurance-site/src/harvest.json +10 -0
  246. package/packages/theme-insurance-site/src/index.js +83 -0
  247. package/packages/theme-insurance-site/test/theme.test.mjs +19 -0
  248. package/packages/theme-shinshu-site/README.md +10 -0
  249. package/packages/theme-shinshu-site/package.json +30 -0
  250. package/packages/theme-shinshu-site/src/harvest.json +12 -0
  251. package/packages/theme-shinshu-site/src/index.js +83 -0
  252. package/packages/theme-shinshu-site/test/theme.test.mjs +19 -0
  253. package/packages/work-graph/README.md +49 -0
  254. package/packages/work-graph/package.json +19 -0
  255. package/packages/work-graph/prototype/README.md +32 -0
  256. package/packages/work-graph/prototype/data/demo-workgraph.js +47 -0
  257. package/packages/work-graph/prototype/renderers/timeline-model.js +21 -0
  258. package/packages/work-graph/prototype/renderers/workgraph-runtime.js +38 -0
  259. package/packages/work-graph/prototype-gnantt.html +655 -0
  260. package/packages/work-graph/src/adapters/business/projects.js +23 -0
  261. package/packages/work-graph/src/adapters/engineering/git.js +22 -0
  262. package/packages/work-graph/src/adapters/engineering/mcp.js +22 -0
  263. package/packages/work-graph/src/index.js +76 -0
  264. package/packages/work-graph/src/renderers/gantt-model.js +11 -0
  265. package/packages/work-graph/src/renderers/timeline.js +16 -0
  266. package/packages/work-graph/test/work-graph.test.mjs +37 -0
  267. package/protocol/README.md +12 -0
  268. package/protocol/capabilities/cloudflare-cpu-audit-input.schema.json +30 -6
  269. package/protocol/capabilities/cloudflare-cpu-profile-input.schema.json +18 -4
  270. package/protocol/capabilities/cloudflare-wrangler-native-input.schema.json +59 -10
  271. package/protocol/capabilities/knowledge-search-input.schema.json +35 -0
  272. package/protocol/capabilities/manifest.json +163 -1
  273. package/protocol/capabilities/repository-audit-input.schema.json +39 -6
  274. package/protocol/capabilities/repository-snapshot-input.schema.json +15 -3
  275. package/protocol/capabilities/terminal-exec-input.schema.json +55 -0
  276. package/protocol/commerce/catalog.v1.json +50 -0
  277. package/protocol/errors/error-catalog.json +164 -0
  278. package/protocol/errors/error-envelope.schema.json +544 -0
  279. package/protocol/features/README.md +57 -0
  280. package/protocol/features/agentsam.feature.v1.schema.json +290 -0
  281. package/protocol/features/catalog.json +65 -0
  282. package/protocol/features/examples/provider-resend.feature.json +17 -0
  283. package/protocol/go/agentsam-go-runtime.v1.json +17 -0
  284. package/protocol/knowledge/LIFECYCLE.md +140 -0
  285. package/protocol/knowledge/README.md +4 -0
  286. package/protocol/presets/catalog.json +128 -19
  287. package/protocol/rpc/v1/errors.proto +24 -0
  288. package/protocol/theme-refinery/d1-reconciliation.md +48 -0
  289. package/protocol/theme-refinery/product-metadata.schema.json +27 -0
  290. package/protocol/theme-refinery/receipts/products-registry-batch-20260924.json +318 -0
  291. package/protocol/theme-refinery/receipts/theme-harvest-20260924.json +472 -0
  292. package/protocol/theme-refinery/reconciliation-receipt.schema.json +83 -0
  293. package/services/cad/server.py +249 -2
  294. package/src/agent/capability-adapter.js +15 -5
  295. package/src/agent/index.js +2 -1
  296. package/src/agent/model-turn.js +51 -0
  297. package/src/agent/responses-runner.js +304 -38
  298. package/src/capabilities/index.js +1 -0
  299. package/src/capabilities/terminal-exec.js +78 -0
  300. package/src/cli.js +129 -31
  301. package/src/cloudflare/index.js +6 -0
  302. package/src/cloudflare/runtime-status.js +393 -0
  303. package/src/cloudflare/wrangler.js +17 -1
  304. package/src/commands/account-auth.js +1 -1
  305. package/src/commands/app.js +106 -0
  306. package/src/commands/autorag.js +77 -0
  307. package/src/commands/brand.js +293 -0
  308. package/src/commands/cad.js +1 -0
  309. package/src/commands/connections.js +126 -29
  310. package/src/commands/context-economics.js +8 -0
  311. package/src/commands/db.js +7 -0
  312. package/src/commands/deploy.js +2 -2
  313. package/src/commands/env.js +5 -4
  314. package/src/commands/eval.js +209 -14
  315. package/src/commands/go.js +365 -0
  316. package/src/commands/goap.js +176 -0
  317. package/src/commands/identity-init.js +27 -3
  318. package/src/commands/identity-protocol.js +195 -0
  319. package/src/commands/knowledge.js +64 -5
  320. package/src/commands/mcp.js +341 -0
  321. package/src/commands/merkle-persist.js +3 -1
  322. package/src/commands/merkle.js +18 -3
  323. package/src/commands/models.js +109 -23
  324. package/src/commands/plugins.js +175 -0
  325. package/src/commands/preferences.js +28 -8
  326. package/src/commands/product.js +53 -10
  327. package/src/commands/providers.js +389 -0
  328. package/src/commands/resume.js +9 -5
  329. package/src/commands/runtime-status.js +154 -0
  330. package/src/commands/shell.js +469 -54
  331. package/src/commands/status.js +82 -7
  332. package/src/commands/tunnel.js +228 -195
  333. package/src/commands/whoami.js +115 -22
  334. package/src/context/budget.js +6 -0
  335. package/src/context/index.js +2 -1
  336. package/src/context/project-card.js +75 -0
  337. package/src/errors/contract.js +34 -211
  338. package/src/errors/diagnostic.js +95 -50
  339. package/src/errors/index.js +6 -13
  340. package/src/eval/index.js +6 -0
  341. package/src/eval/live.js +439 -0
  342. package/src/features/resolve.js +242 -0
  343. package/src/go/build.js +108 -0
  344. package/src/go/cloudflare.js +207 -0
  345. package/src/go/contract.js +139 -0
  346. package/src/go/discover.js +96 -0
  347. package/src/go/index.js +13 -0
  348. package/src/go/receipts.js +77 -0
  349. package/src/go/registry.js +223 -0
  350. package/src/go/verify.js +31 -0
  351. package/src/index.js +100 -1
  352. package/src/knowledge/config.js +13 -5
  353. package/src/knowledge/engine.js +23 -8
  354. package/src/knowledge/index.js +1 -0
  355. package/src/knowledge/lane-registry.js +46 -0
  356. package/src/knowledge/providers/gemini.js +48 -8
  357. package/src/knowledge/service/client.js +13 -1
  358. package/src/knowledge/service/grpc-codec.js +156 -53
  359. package/src/knowledge/service/job-engine.js +133 -11
  360. package/src/knowledge/service/job-worker.js +34 -5
  361. package/src/knowledge/service/server.js +10 -1
  362. package/src/knowledge/store-discovery.js +77 -0
  363. package/src/lib/account-session.js +100 -25
  364. package/src/lib/agent-instructions.js +3 -0
  365. package/src/lib/auth.js +318 -51
  366. package/src/lib/cad/blender.js +42 -3
  367. package/src/lib/cad/d1-project-store.js +43 -0
  368. package/src/lib/cad/discovery.js +616 -0
  369. package/src/lib/cad/docker-executor.js +352 -0
  370. package/src/lib/cad/freecad.js +253 -0
  371. package/src/lib/cad/index.js +40 -0
  372. package/src/lib/cad/openscad.js +198 -0
  373. package/src/lib/cad/project-cli.d.ts +2 -0
  374. package/src/lib/cad/project-cli.js +21 -0
  375. package/src/lib/cad/project-contract.d.ts +3 -0
  376. package/src/lib/cad/project-contract.js +1 -0
  377. package/src/lib/cad/project-recipe.js +30 -0
  378. package/src/lib/cad/project-runtime.d.ts +2 -0
  379. package/src/lib/cad/project-runtime.js +53 -0
  380. package/src/lib/cad/project-store.js +25 -0
  381. package/src/lib/cad/project-workflows.js +31 -0
  382. package/src/lib/cad-docker.js +21 -2
  383. package/src/lib/cli-preferences.js +17 -2
  384. package/src/lib/core-client.js +97 -33
  385. package/src/lib/deploy/local-studio.js +6 -5
  386. package/src/lib/detect-context.js +14 -16
  387. package/src/lib/dockerize.js +3 -0
  388. package/src/lib/execution-approvals.js +1 -0
  389. package/src/lib/identity-scaffold.js +4 -1
  390. package/src/lib/knowledge-docker.js +9 -1
  391. package/src/lib/local-sessions.js +124 -34
  392. package/src/lib/local-status.js +35 -14
  393. package/src/lib/project-config.js +9 -0
  394. package/src/lib/provider-credentials.js +233 -55
  395. package/src/lib/scaffold/resolve-cloudflare-account.js +37 -0
  396. package/src/lib/scaffold/wizards/cms.js +2 -8
  397. package/src/lib/scaffold/wizards/worker-api.js +2 -8
  398. package/src/lib/slash-commands.js +10 -2
  399. package/src/local/migrations.js +109 -1
  400. package/src/local/runtime-store.js +31 -5
  401. package/src/local/sqlite.js +36 -1
  402. package/src/mcp/authority.js +348 -0
  403. package/src/mcp/client-adapters.js +431 -0
  404. package/src/mcp/client.js +172 -0
  405. package/src/mcp/index.js +47 -0
  406. package/src/mcp/telemetry.js +103 -0
  407. package/src/models/catalog.js +329 -51
  408. package/src/models/discovery.js +59 -4
  409. package/src/models/index.js +2 -0
  410. package/src/models/inventory-core.js +182 -0
  411. package/src/models/policy.js +20 -0
  412. package/src/plugins/cloudflare.js +103 -0
  413. package/src/plugins/completeful.js +69 -0
  414. package/src/plugins/contracts.js +86 -0
  415. package/src/plugins/index.js +11 -0
  416. package/src/plugins/registry.js +207 -0
  417. package/src/plugins/resource-scope.js +45 -0
  418. package/src/plugins/runtime.js +118 -0
  419. package/src/plugins/vectorize.js +31 -0
  420. package/src/progression/engine.js +171 -0
  421. package/src/progression/index.js +1 -0
  422. package/src/providers/cloudflare-chat.js +1 -1
  423. package/src/providers/gemini-generate-content.js +2 -1
  424. package/src/providers/openai-responses.js +45 -16
  425. package/src/providers/tool-schema.js +85 -0
  426. package/src/repository/index.js +29 -0
  427. package/src/rpc/generated/errors_pb.js +961 -1
  428. package/src/security/local-vault.js +415 -0
  429. package/src/security/process.js +20 -4
  430. package/src/status/actions.js +192 -0
  431. package/src/tools/hydrate.js +5 -1
  432. package/src/tools/index.js +7 -0
  433. package/src/tools/redact.js +64 -0
  434. package/src/tools/registry.js +83 -0
  435. package/src/tools/runtime.js +257 -0
  436. package/src/tools/search.js +21 -8
  437. package/src/ui/ansi.js +117 -3
  438. package/src/ui/cli/activity.js +76 -7
  439. package/src/ui/cli/footer.js +110 -9
  440. package/src/ui/cli/help.js +14 -5
  441. package/src/ui/wireframes.js +166 -0
  442. package/test/account-session.test.mjs +76 -11
  443. package/test/apps-scaffold-contract.test.mjs +58 -0
  444. package/test/capabilities.test.mjs +1 -1
  445. package/test/cli/eval-live.test.mjs +219 -0
  446. package/test/cli/go.test.mjs +71 -0
  447. package/test/cli/local-vault-and-provider-setup.test.mjs +268 -0
  448. package/test/cli/mcp-client.test.mjs +245 -0
  449. package/test/cli/runtime-ui.test.mjs +69 -2
  450. package/test/cli/status-actions.test.mjs +88 -0
  451. package/test/cli/wireframes-go-registry.test.mjs +54 -0
  452. package/test/cloudflare-connector.test.mjs +3 -6
  453. package/test/cloudflare-runtime.test.mjs +8 -1
  454. package/test/context.test.mjs +15 -0
  455. package/test/error-diagnostics.test.mjs +9 -0
  456. package/test/fixtures/cad/courtyard-house.json +208 -0
  457. package/test/go/cloudflare-probe.test.mjs +53 -0
  458. package/test/integration/app-command.test.mjs +55 -0
  459. package/test/integration/cad-discovery.test.mjs +158 -0
  460. package/test/integration/cad-docker-executor.test.mjs +249 -0
  461. package/test/integration/cad-execution.test.mjs +184 -0
  462. package/test/integration/cad-project-app.test.mjs +31 -0
  463. package/test/integration/cad-project-d1.test.mjs +25 -0
  464. package/test/integration/cad-project-native.test.mjs +24 -0
  465. package/test/integration/cad-project-workflow.test.mjs +9 -0
  466. package/test/integration/cad-project.test.mjs +82 -0
  467. package/test/integration/cli-help.test.mjs +4 -0
  468. package/test/integration/cms-site-tenancy-contract.test.mjs +256 -0
  469. package/test/integration/core-client.integration.test.mjs +55 -0
  470. package/test/integration/error-runtime-rpc.test.mjs +71 -0
  471. package/test/integration/features-resolve.test.mjs +128 -0
  472. package/test/integration/install-script.test.mjs +107 -0
  473. package/test/integration/inventory-core.test.mjs +53 -0
  474. package/test/integration/plugins-cloudflare.integration.test.mjs +28 -0
  475. package/test/integration/provider-env-cli.test.mjs +1 -1
  476. package/test/integration/runtime-migrations.test.mjs +6 -1
  477. package/test/integration/runtime-status.integration.test.mjs +211 -0
  478. package/test/integration/scaffold-cloudflare.test.mjs +46 -0
  479. package/test/integration/storage-architecture.test.mjs +154 -0
  480. package/test/integration/store-discovery.test.mjs +44 -0
  481. package/test/integration/terminal-exec.integration.test.mjs +86 -0
  482. package/test/integration/tool-runtime.test.mjs +124 -0
  483. package/test/integration/tool-schema.test.mjs +59 -0
  484. package/test/knowledge-service.test.mjs +4 -0
  485. package/test/local-sessions.test.mjs +11 -2
  486. package/test/local-studio-deploy.test.mjs +1 -1
  487. package/test/model-catalog.test.mjs +28 -1
  488. package/test/models.test.mjs +159 -5
  489. package/test/openai-responses.test.mjs +60 -0
  490. package/test/provider-credentials.test.mjs +15 -5
  491. package/test/responses-runner.test.mjs +321 -6
  492. package/test/sdk-worker-contract.test.mjs +5 -1
  493. package/test/shell.test.mjs +149 -4
  494. package/test/smoke.mjs +4 -3
  495. package/test/tools-search.test.mjs +33 -0
  496. package/test/unit/website-assets-bindings.test.mjs +60 -0
  497. package/test/whoami-resume.test.mjs +87 -7
  498. package/examples/gorilla-shell/README.md +0 -15
  499. package/src/lib/gorilla-template.js +0 -54
  500. package/src/lib/prompt-byok.js +0 -57
  501. package/src/lib/save-sdk-token.js +0 -19
  502. package/templates/gorilla-shell/App.tsx +0 -639
  503. package/templates/gorilla-shell/README.md +0 -34
  504. package/templates/gorilla-shell/index.html +0 -15
  505. package/templates/gorilla-shell/main.jsx +0 -9
  506. package/templates/gorilla-shell/package.json +0 -19
  507. package/templates/gorilla-shell/vite.config.js +0 -21
@@ -0,0 +1,341 @@
1
+ import {
2
+ deleteMcpServer,
3
+ detectInstalledClients,
4
+ inspectClientAdapter,
5
+ isClientRegistered,
6
+ listKnownServers,
7
+ listMcpServers,
8
+ listMcpTools,
9
+ listRegisteredClients,
10
+ pingMcpServer,
11
+ readMcpServer,
12
+ removeServerFromClient,
13
+ resolveServerPreset,
14
+ syncServerToClient,
15
+ writeMcpServer,
16
+ } from '../mcp/index.js';
17
+
18
+ function clean(value) {
19
+ return value == null ? '' : String(value).trim();
20
+ }
21
+
22
+ export function parseMcpArgs(argv = []) {
23
+ let subcommand = clean(argv[0]);
24
+ let help = false;
25
+ if (subcommand === '--help' || subcommand === '-h') {
26
+ help = true;
27
+ subcommand = '';
28
+ }
29
+ const target = clean(argv[1]);
30
+ let client = '';
31
+ let url = '';
32
+ let token = '';
33
+ let json = false;
34
+ let catalog = false;
35
+
36
+ for (let i = 1; i < argv.length; i += 1) {
37
+ const arg = argv[i];
38
+ if (arg === '--client') client = argv[++i] || '';
39
+ else if (arg === '--url') url = argv[++i] || '';
40
+ else if (arg === '--token') token = argv[++i] || '';
41
+ else if (arg === '--json') json = true;
42
+ else if (arg === '--catalog' || arg === '--all') catalog = true;
43
+ else if (arg === '--help' || arg === '-h') help = true;
44
+ }
45
+
46
+ return {
47
+ subcommand,
48
+ target: target.startsWith('--') ? '' : target,
49
+ client: client.toLowerCase(),
50
+ url,
51
+ token,
52
+ json,
53
+ catalog,
54
+ help,
55
+ };
56
+ }
57
+
58
+ function renderHelp(options = {}) {
59
+ const clients = listRegisteredClients(options);
60
+ const servers = listKnownServers(options);
61
+
62
+ const presetRows = servers.map((s) => {
63
+ const key = (s.name || s.server_key || '').padEnd(24);
64
+ const desc = s.description || s.display_name || s.health_status || '';
65
+ return ` ${key} ${s.url} (${desc})`;
66
+ }).join('\n');
67
+
68
+ const clientRows = clients.map((c) => {
69
+ const key = c.client_key.padEnd(24);
70
+ const note = c.notes || c.display_name;
71
+ return ` ${key} ${c.display_name} (${note})`;
72
+ }).join('\n');
73
+
74
+ return `
75
+ AgentSam · MCP Client Management
76
+
77
+ Usage:
78
+ agentsam mcp add <name> [--client <client>|all] [--url <url>] [--token <token>]
79
+ agentsam mcp list [--catalog|--all] [--json]
80
+ agentsam mcp status [<name>] [--json]
81
+ agentsam mcp doctor [<name>] [--json]
82
+ agentsam mcp remove <name> [--client <client>|all]
83
+
84
+ Known server presets:
85
+ ${presetRows}
86
+
87
+ Recognized client adapters:
88
+ ${clientRows}
89
+ `;
90
+ }
91
+
92
+ export async function runMcp(argv = [], options = {}) {
93
+ const args = parseMcpArgs(argv);
94
+ const write = options.write || ((text) => process.stdout.write(text));
95
+
96
+ if (args.help || !args.subcommand) {
97
+ write(renderHelp(options));
98
+ return null;
99
+ }
100
+
101
+ const { subcommand, target } = args;
102
+
103
+ if (subcommand === 'list') {
104
+ if (args.catalog) {
105
+ const catalog = listKnownServers(options);
106
+ if (args.json) {
107
+ write(JSON.stringify({ catalog }, null, 2) + '\n');
108
+ return catalog;
109
+ }
110
+ write('\n Known MCP Server Catalog (Registry: agentsam_mcp_servers)\n\n');
111
+ for (const s of catalog) {
112
+ write(` • ${s.name || s.server_key} (${s.display_name || s.name})\n`);
113
+ write(` url: ${s.url}\n`);
114
+ write(` auth_type: ${s.auth_type || 'none'}\n`);
115
+ write(` health: ${s.health_status || 'unknown'}${s.avg_latency_ms != null ? ` · ${s.avg_latency_ms}ms` : ''}\n\n`);
116
+ }
117
+ return catalog;
118
+ }
119
+
120
+ const servers = listMcpServers(options);
121
+ if (args.json) {
122
+ write(JSON.stringify({ servers }, null, 2) + '\n');
123
+ return servers;
124
+ }
125
+ if (servers.length === 0) {
126
+ write(' No MCP servers configured yet. Add one with: agentsam mcp add inneranimalmedia\n');
127
+ return servers;
128
+ }
129
+ write('\n Configured MCP Servers (Authority: ~/.agentsam/mcp/)\n\n');
130
+ for (const s of servers) {
131
+ write(` • ${s.name}\n`);
132
+ write(` url: ${s.url}\n`);
133
+ write(` clients: ${(s.clients || []).join(', ') || 'none'}\n`);
134
+ write(` auth: ${s.auth?.token ? 'bearer token configured' : 'none'}\n`);
135
+ write(` updated: ${s.updated_at || s.created_at || 'unknown'}\n\n`);
136
+ }
137
+ return servers;
138
+ }
139
+
140
+ if (subcommand === 'add') {
141
+ const name = target || 'inneranimalmedia';
142
+ const preset = resolveServerPreset(name, options);
143
+ const url = args.url || preset?.url;
144
+
145
+ if (!url) {
146
+ throw new Error(`missing_url: specify --url for custom MCP server "${name}"`);
147
+ }
148
+
149
+ let requestedClients = ['cursor'];
150
+ if (args.client) {
151
+ if (args.client === 'all') {
152
+ const detected = detectInstalledClients(options);
153
+ requestedClients = detected.length > 0 ? detected : ['cursor', 'claude'];
154
+ } else {
155
+ requestedClients = [args.client];
156
+ }
157
+ } else if (preset?.defaultClients?.length) {
158
+ requestedClients = preset.defaultClients;
159
+ }
160
+
161
+ const serverConfig = {
162
+ name,
163
+ url,
164
+ protocol: preset?.protocol || 'sse',
165
+ auth: args.token ? { type: preset?.auth_type || 'bearer', token: args.token } : null,
166
+ clients: requestedClients,
167
+ metadata: preset ? { preset: name, description: preset.description, health_status: preset.health_status } : {},
168
+ };
169
+
170
+ // Store in AgentSam authority
171
+ const written = writeMcpServer(name, serverConfig, options);
172
+
173
+ // Materialize client adapters
174
+ const syncedAdapters = [];
175
+ for (const c of requestedClients) {
176
+ const res = syncServerToClient(c, name, serverConfig, options);
177
+ syncedAdapters.push(res);
178
+ }
179
+
180
+ // Ping to verify connectivity
181
+ const ping = await pingMcpServer(serverConfig, options);
182
+
183
+ if (args.json) {
184
+ const payload = { ok: true, server: written, syncedAdapters, ping };
185
+ write(JSON.stringify(payload, null, 2) + '\n');
186
+ return payload;
187
+ }
188
+
189
+ write(`\n ✓ Configured MCP server: ${name}\n`);
190
+ write(` Authority: ~/.agentsam/mcp/${name}.json\n`);
191
+ write(` URL: ${url}\n`);
192
+ for (const a of syncedAdapters) {
193
+ write(` Adapter: ${a.client} -> ${a.configPath}\n`);
194
+ }
195
+ if (ping.ok) {
196
+ write(` Ping: ✓ Connected (${ping.latencyMs}ms)\n`);
197
+ } else {
198
+ write(` Ping: ⚠ Warning (${ping.error || 'unreachable'})\n`);
199
+ }
200
+ write('\n');
201
+ return { server: written, syncedAdapters, ping };
202
+ }
203
+
204
+ if (subcommand === 'status') {
205
+ const name = target || 'inneranimalmedia';
206
+ const server = readMcpServer(name, options);
207
+ if (!server) {
208
+ if (args.json) {
209
+ write(JSON.stringify({ ok: false, error: 'server_not_configured', name }) + '\n');
210
+ return null;
211
+ }
212
+ write(` MCP server "${name}" is not configured. Run: agentsam mcp add ${name}\n`);
213
+ return null;
214
+ }
215
+
216
+ const ping = await pingMcpServer(server, options);
217
+ const clientStatuses = (server.clients || ['cursor']).map((c) =>
218
+ inspectClientAdapter(c, name, options),
219
+ );
220
+
221
+ const report = {
222
+ name,
223
+ url: server.url,
224
+ ping,
225
+ clients: clientStatuses,
226
+ hasAuth: Boolean(server.auth?.token),
227
+ };
228
+
229
+ if (args.json) {
230
+ write(JSON.stringify(report, null, 2) + '\n');
231
+ return report;
232
+ }
233
+
234
+ write(`\n MCP Server Status: ${name}\n`);
235
+ write(` URL: ${server.url}\n`);
236
+ write(` Ping: ${ping.ok ? `✓ Active (${ping.latencyMs}ms)` : `✗ Error: ${ping.error}`}\n`);
237
+ write(` Auth: ${report.hasAuth ? '✓ Bearer token present' : '○ No auth token'}\n`);
238
+ for (const c of clientStatuses) {
239
+ write(` ${c.client}: ${c.configured ? '✓ Configured' : '○ Not configured'} (${c.path})\n`);
240
+ }
241
+ write('\n');
242
+ return report;
243
+ }
244
+
245
+ if (subcommand === 'doctor') {
246
+ const name = target || 'inneranimalmedia';
247
+ const server = readMcpServer(name, options);
248
+
249
+ if (!server) {
250
+ const errPayload = { ok: false, error: 'server_not_configured', name };
251
+ if (args.json) write(JSON.stringify(errPayload, null, 2) + '\n');
252
+ else write(` MCP server "${name}" is not configured.\n`);
253
+ return errPayload;
254
+ }
255
+
256
+ const preset = resolveServerPreset(name, options);
257
+ const ping = await pingMcpServer(server, options);
258
+ const clientStatuses = (server.clients || ['cursor']).map((c) =>
259
+ inspectClientAdapter(c, name, options),
260
+ );
261
+ const toolsProbe = ping.ok ? await listMcpTools(server, options) : { count: 0, tools: [] };
262
+
263
+ const detectedClients = detectInstalledClients(options);
264
+ const diagnostics = {
265
+ name,
266
+ authorityPath: `~/.agentsam/mcp/${name}.json`,
267
+ url: server.url,
268
+ connectivity: ping.ok ? 'pass' : 'fail',
269
+ latencyMs: ping.latencyMs,
270
+ authConfigured: Boolean(server.auth?.token),
271
+ discoveredTools: toolsProbe.count,
272
+ clients: clientStatuses,
273
+ detectedHostClients: detectedClients,
274
+ catalogHealth: preset ? {
275
+ health_status: preset.health_status,
276
+ avg_latency_ms: preset.avg_latency_ms,
277
+ error_rate: preset.error_rate,
278
+ } : null,
279
+ };
280
+
281
+ if (args.json) {
282
+ write(JSON.stringify(diagnostics, null, 2) + '\n');
283
+ return diagnostics;
284
+ }
285
+
286
+ write(`\n AgentSam MCP Doctor · ${name}\n\n`);
287
+ write(` [1] Authority state: ✓ Valid (~/.agentsam/mcp/${name}.json)\n`);
288
+ write(` [2] Endpoint ping: ${ping.ok ? `✓ Reachable (${ping.latencyMs}ms)` : `✗ Unreachable (${ping.error})`}\n`);
289
+ if (preset?.health_status) {
290
+ write(` [3] Live health data: ${preset.health_status} (avg latency: ${preset.avg_latency_ms ?? 0}ms, error rate: ${preset.error_rate ?? 0}%)\n`);
291
+ }
292
+ write(` [4] Auth credential: ${diagnostics.authConfigured ? '✓ Token configured' : '○ Unauthenticated / public'}\n`);
293
+ write(` [5] Tool discovery: ${toolsProbe.count > 0 ? `✓ Found ${toolsProbe.count} tools` : '○ 0 tools discovered'}\n`);
294
+ write(` [6] Client adapters:\n`);
295
+ for (const c of clientStatuses) {
296
+ write(` • ${c.client}: ${c.configured ? '✓ Synced' : '✗ Desynced'} (${c.path})\n`);
297
+ }
298
+ write('\n');
299
+ return diagnostics;
300
+ }
301
+
302
+ if (subcommand === 'remove') {
303
+ const name = target;
304
+ if (!name) throw new Error('mcp_server_name_required');
305
+
306
+ const server = readMcpServer(name, options);
307
+ const targetClients = args.client
308
+ ? (args.client === 'all' ? (server?.clients || ['cursor', 'claude']) : [args.client])
309
+ : (server?.clients || ['cursor', 'claude']);
310
+
311
+ const removedAdapters = [];
312
+ for (const c of targetClients) {
313
+ const res = removeServerFromClient(c, name, options);
314
+ removedAdapters.push(res);
315
+ }
316
+
317
+ let deletedAuthority = false;
318
+ if (!args.client || args.client === 'all') {
319
+ deletedAuthority = deleteMcpServer(name, options);
320
+ }
321
+
322
+ const result = { name, removedAdapters, deletedAuthority };
323
+ if (args.json) {
324
+ write(JSON.stringify(result, null, 2) + '\n');
325
+ return result;
326
+ }
327
+
328
+ write(`\n ✓ Removed MCP server: ${name}\n`);
329
+ for (const r of removedAdapters) {
330
+ if (r.removed) write(` Removed from client adapter: ${r.client} (${r.configPath})\n`);
331
+ }
332
+ if (deletedAuthority) {
333
+ write(` Deleted authority: ~/.agentsam/mcp/${name}.json\n`);
334
+ }
335
+ write('\n');
336
+ return result;
337
+ }
338
+
339
+ write(` Unknown mcp subcommand: "${subcommand}". Use "agentsam mcp --help" for guidance.\n`);
340
+ return null;
341
+ }
@@ -74,7 +74,9 @@ function parse(args) {
74
74
  }
75
75
 
76
76
  export function resolveMerklePersistenceIdentity(root, options = {}) {
77
- const session = options.session ?? readAccountSession(options.sessionOptions || {});
77
+ const session = Object.hasOwn(options, 'session')
78
+ ? options.session
79
+ : readAccountSession(options.sessionOptions || {});
78
80
  const accountId = String(session?.account_id || '').trim();
79
81
  if (!accountId) throw new Error('agentsam_login_required_for_merkle_persistence');
80
82
 
@@ -51,11 +51,15 @@ function parse(argv) {
51
51
  if (arg === '--' && !positionalOnly) { positionalOnly = true; continue; }
52
52
  if (positionalOnly || !arg.startsWith('-')) opts.paths.push(arg);
53
53
  else if (arg === '--interactive' || arg === '--tui') opts.tui = true;
54
- else if (['--json', '--force', '--semantic'].includes(arg)) opts[arg.slice(2)] = true;
55
- else if (['--out', '--root', '--include', '--exclude'].includes(arg)) {
54
+ else if (['--json', '--force', '--semantic', '--persist'].includes(arg)) opts[arg.slice(2)] = true;
55
+ else if (['--out', '--root', '--include', '--exclude', '--connection-id', '--runtime-lease-id', '--capture-kind', '--wrangler-config'].includes(arg)) {
56
56
  const value = args[++i];
57
57
  if (!value || value.startsWith('--')) throw new Error(`Missing value for ${arg}`);
58
58
  if (['--include', '--exclude'].includes(arg)) opts[arg.slice(2)].push(value);
59
+ else if (arg === '--connection-id') opts.connectionId = value;
60
+ else if (arg === '--runtime-lease-id') opts.runtimeLeaseId = value;
61
+ else if (arg === '--capture-kind') opts.captureKind = value;
62
+ else if (arg === '--wrangler-config') opts.wranglerConfig = value;
59
63
  else opts[arg.slice(2)] = value;
60
64
  } else throw new Error(`Unknown option: ${arg}`);
61
65
  }
@@ -106,7 +110,18 @@ export async function runMerkle(argv = []) {
106
110
  if (opts.command === 'diff') return comparison(opts, progress);
107
111
  if (opts.command === 'snapshot') {
108
112
  const { snapshot: tree, output } = await saveSnapshot(target, { ...progress, policy: opts.policy, out: opts.out, force: opts.force, semantic: opts.semantic });
109
- return { title: 'Merkle snapshot', tree, output };
113
+ let persisted = null;
114
+ if (opts.persist || opts.connectionId || opts.runtimeLeaseId) {
115
+ const persistArgs = [output];
116
+ if (opts.wranglerConfig) persistArgs.push('--wrangler-config', opts.wranglerConfig);
117
+ if (opts.captureKind) persistArgs.push('--capture-kind', opts.captureKind);
118
+ else if (opts.connectionId || opts.runtimeLeaseId) persistArgs.push('--capture-kind', 'agent');
119
+ if (opts.connectionId) persistArgs.push('--connection-id', opts.connectionId);
120
+ if (opts.runtimeLeaseId) persistArgs.push('--runtime-lease-id', opts.runtimeLeaseId);
121
+ if (opts.json) persistArgs.push('--json');
122
+ persisted = await runMerklePersist(persistArgs);
123
+ }
124
+ return { title: 'Merkle snapshot', tree, output, persisted };
110
125
  }
111
126
  const isSnapshot = ['inspect', 'explore'].includes(opts.command) && !(await fs.stat(target)).isDirectory();
112
127
  if (isSnapshot && (opts.include.length || opts.exclude.length)) throw new Error('Snapshot inspection uses saved ignore rules.');
@@ -1,14 +1,24 @@
1
1
  import pc from 'picocolors';
2
+ import { isCancel, select } from '@clack/prompts';
2
3
  import { probeOllama, resolveOllamaConfig } from './ollama.js';
3
4
  import { listModelCatalog } from '../models/index.js';
4
5
  import { discoverProviderModels } from '../models/discovery.js';
5
6
  import { resolveProviderCredential } from '../lib/provider-credentials.js';
7
+ import { providerChoices, promptAndConfigureProvider } from './providers.js';
8
+ import {
9
+ WORKERS_AI_CURATED_MODEL_IDS,
10
+ filterWorkersAiCurated,
11
+ sanitizeInventoryForClient,
12
+ } from '../models/inventory-core.js';
13
+
14
+ export { WORKERS_AI_CURATED_MODEL_IDS, filterWorkersAiCurated, sanitizeInventoryForClient };
6
15
 
7
16
  export const API_PROVIDERS = Object.freeze([
8
17
  { id: 'openai', label: 'OpenAI', credential: 'OPENAI_API_KEY' },
9
18
  { id: 'anthropic', label: 'Anthropic', credential: 'ANTHROPIC_API_KEY' },
10
19
  { id: 'gemini', label: 'Gemini', credential: 'GEMINI_API_KEY' },
11
20
  { id: 'grok', label: 'Grok / xAI', credential: 'XAI_API_KEY' },
21
+ { id: 'cursor', label: 'Cursor', credential: 'CURSOR_API_KEY' },
12
22
  { id: 'cloudflare', label: 'Cloudflare', credential: 'CLOUDFLARE_API_TOKEN' },
13
23
  ]);
14
24
 
@@ -55,18 +65,34 @@ function mergeStaticFallbacks(discovered = []) {
55
65
  return out;
56
66
  }
57
67
 
68
+ /**
69
+ * Build credential-scoped model inventory.
70
+ *
71
+ * @param {object} [options]
72
+ * @param {Record<string, string>} [options.env]
73
+ * @param {string} [options.home]
74
+ * @param {boolean} [options.discoverRemote]
75
+ * @param {'machine'|'studio_vault'|'mixed'} [options.credentialPlane]
76
+ * @param {(providerId: string) => Promise<object|null>|object|null} [options.resolveCredential]
77
+ * Injected resolver (Studio vault). When omitted, uses machine env.d / process env.
78
+ * @param {boolean} [options.curateWorkersAi] default true — intersect Cloudflare models with curated allowlist
79
+ * @param {boolean} [options.includeLocal] default true — probe Ollama (machine plane only by default)
80
+ */
58
81
  export async function collectModelsStatus(options = {}) {
59
82
  const env = options.env || process.env;
60
83
  const ollamaFetchImpl = options.fetchImpl || fetch;
61
84
  const providerFetchImpl = options.providerFetchImpl || fetch;
62
- const ollamaConfig = resolveOllamaConfig({}, env);
63
- const ollama = await probeOllama(ollamaConfig, ollamaFetchImpl);
64
- const credentials = new Map(
65
- API_PROVIDERS.map((provider) => [
66
- provider.id,
67
- resolveProviderCredential(provider.id, { env, home: options.home }),
68
- ]),
69
- );
85
+ const credentialPlane = options.credentialPlane || (options.resolveCredential ? 'studio_vault' : 'machine');
86
+ const includeLocal = options.includeLocal ?? credentialPlane === 'machine';
87
+ const curateWorkersAi = options.curateWorkersAi !== false;
88
+
89
+ const resolveCredential = options.resolveCredential
90
+ || ((providerId) => resolveProviderCredential(providerId, { env, home: options.home }));
91
+
92
+ const credentials = new Map();
93
+ for (const provider of API_PROVIDERS) {
94
+ credentials.set(provider.id, await resolveCredential(provider.id));
95
+ }
70
96
 
71
97
  const providers = API_PROVIDERS.map((provider) => {
72
98
  const credential = credentials.get(provider.id);
@@ -84,10 +110,20 @@ export async function collectModelsStatus(options = {}) {
84
110
 
85
111
  await Promise.all(API_PROVIDERS.map(async (provider) => {
86
112
  const credential = credentials.get(provider.id);
87
- const result = shouldDiscover && credential?.configured
113
+ let result = shouldDiscover && credential?.configured
88
114
  ? await discoverProviderModels(provider.id, credential, { fetchImpl: providerFetchImpl })
89
115
  : emptyDiscovery();
116
+ if (provider.id === 'cloudflare' && result.ok && curateWorkersAi) {
117
+ const curated = filterWorkersAiCurated(result.models || [], { curated: true });
118
+ result = {
119
+ ...result,
120
+ models: curated,
121
+ returnedModelCount: curated.length,
122
+ curation: 'agentsam_workers_ai_allowlist',
123
+ };
124
+ }
90
125
  discovery[provider.id] = providerSummary(result);
126
+ if (result.curation) discovery[provider.id].curation = result.curation;
91
127
  providerModels[provider.id] = result.models || [];
92
128
  }));
93
129
 
@@ -95,25 +131,42 @@ export async function collectModelsStatus(options = {}) {
95
131
  const exactAvailable = discovered.filter((row) => row.availability === 'available');
96
132
  const catalogModels = mergeStaticFallbacks(discovered);
97
133
 
134
+ let local = {
135
+ provider: 'ollama',
136
+ configured: false,
137
+ online: false,
138
+ endpoint: null,
139
+ chatModel: null,
140
+ embedModel: null,
141
+ models: [],
142
+ error: null,
143
+ };
144
+ if (includeLocal) {
145
+ const ollamaConfig = resolveOllamaConfig({}, env);
146
+ const ollama = await probeOllama(ollamaConfig, ollamaFetchImpl);
147
+ local = {
148
+ provider: 'ollama',
149
+ configured: ollama.online,
150
+ online: ollama.online,
151
+ endpoint: ollama.endpoint,
152
+ chatModel: ollamaConfig.model,
153
+ embedModel: ollamaConfig.embedModel,
154
+ models: ollama.models || [],
155
+ error: ollama.error || null,
156
+ };
157
+ }
158
+
98
159
  return {
99
160
  schemaVersion: 'agentsam-model-inventory-v3',
100
161
  generatedAt: new Date().toISOString(),
101
162
  authority: 'per_credential_provider_discovery',
163
+ credential_plane: credentialPlane,
102
164
  providers,
103
165
  discovery,
104
166
  providerModels,
105
167
  catalogModels,
106
168
  availableModels: exactAvailable,
107
- local: {
108
- provider: 'ollama',
109
- configured: ollama.online,
110
- online: ollama.online,
111
- endpoint: ollama.endpoint,
112
- chatModel: ollamaConfig.model,
113
- embedModel: ollamaConfig.embedModel,
114
- models: ollama.models || [],
115
- error: ollama.error || null,
116
- },
169
+ local,
117
170
  };
118
171
  }
119
172
 
@@ -176,6 +229,10 @@ export function renderModelsStatus(status) {
176
229
  if (names.length > 30) lines.push(` ${pc.dim(`… ${names.length - 30} more`)}`);
177
230
  }
178
231
 
232
+ const unconfiguredCount = status.providers.filter((p) => !p.configured).length;
233
+ if (unconfiguredCount > 0) {
234
+ lines.push(` ${pc.yellow('Tip:')} Select your preferred provider to continue, or run 'agentsam providers'.`);
235
+ }
179
236
  lines.push('');
180
237
  lines.push(` ${pc.dim('Use /model inside Agent Sam. The picker is built from the models visible to your own connected provider credentials.')}`);
181
238
  lines.push('');
@@ -185,7 +242,7 @@ export function renderModelsStatus(status) {
185
242
  export async function runModels(argv = [], options = {}) {
186
243
  if (argv.some((arg) => arg === '--help' || arg === '-h')) {
187
244
  const text = [
188
- 'agentsam models [--json] [--no-discover]',
245
+ 'agentsam models [--json] [--no-discover] [--setup]',
189
246
  '',
190
247
  'Probe the provider accounts configured on this machine and list the models visible to those exact credentials.',
191
248
  'Context/output limits are taken from provider metadata when available; otherwise Agent Sam reports unknown or a clearly-labeled SDK reference.',
@@ -195,7 +252,7 @@ export async function runModels(argv = [], options = {}) {
195
252
  return;
196
253
  }
197
254
 
198
- const allowed = new Set(['--json', '--no-discover']);
255
+ const allowed = new Set(['--json', '--no-discover', '--setup']);
199
256
  const unknown = argv.filter((arg) => !allowed.has(arg));
200
257
  if (unknown.length) throw new Error(`unknown models option: ${unknown[0]}`);
201
258
 
@@ -204,7 +261,36 @@ export async function runModels(argv = [], options = {}) {
204
261
  discoverRemote: !argv.includes('--no-discover'),
205
262
  });
206
263
  const write = options.write || ((text) => process.stdout.write(text));
207
- if (argv.includes('--json')) writeLine(write, JSON.stringify(status, null, 2));
208
- else write(renderModelsStatus(status));
264
+ if (argv.includes('--json')) {
265
+ writeLine(write, JSON.stringify(status, null, 2));
266
+ return status;
267
+ }
268
+ write(renderModelsStatus(status));
269
+
270
+ const allUnconfigured = status.providers.every((p) => !p.configured);
271
+ const interactive = options.interactive ?? Boolean(process.stdin.isTTY && process.stdout.isTTY);
272
+ if (interactive && (argv.includes('--setup') || allUnconfigured)) {
273
+ const promptSelect = options.selectImpl || select;
274
+ const choices = [
275
+ ...providerChoices(options),
276
+ { value: '__skip__', label: 'Skip / Continue', hint: 'set up provider credentials later' },
277
+ ];
278
+ const choice = await promptSelect({
279
+ message: 'Tip: Select your preferred provider to continue',
280
+ options: choices,
281
+ });
282
+ if (!isCancel(choice) && choice !== '__skip__') {
283
+ const result = await promptAndConfigureProvider(choice, options);
284
+ if (result?.saved) {
285
+ const updated = await collectModelsStatus({
286
+ ...options,
287
+ discoverRemote: !argv.includes('--no-discover'),
288
+ });
289
+ write(renderModelsStatus(updated));
290
+ return updated;
291
+ }
292
+ }
293
+ }
294
+
209
295
  return status;
210
296
  }