@inneranimalmedia/agentsam-sdk 2.6.2 → 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 (497) 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/AUTORAG.md +58 -0
  17. package/docs/BRAND_INTELLIGENCE.md +30 -0
  18. package/docs/CLI_SHELL.md +4 -2
  19. package/docs/CMS_CONTEXTUAL_COMPOSER.md +38 -0
  20. package/docs/MERKLE.md +4 -0
  21. package/docs/PROJECT_CONFIG.md +3 -0
  22. package/docs/REPOSITORY_KNOWLEDGE.md +2 -0
  23. package/docs/THEME_REFINERY.md +120 -0
  24. package/docs/architecture/PROVIDER-TOOLS-AND-COMPACTION.md +60 -0
  25. package/docs/architecture/STORAGE.md +87 -0
  26. package/docs/cad-project-tools.md +69 -0
  27. package/docs/cms-scaffolding-pattern-reference.md +73 -0
  28. package/docs/plans/AGENTSAM-INTERACTIVE-UI-REQUIREMENTS-codex-tui-20260919.md +113 -0
  29. package/docs/plans/AGENTSAM-INTERACTIVE-UI-REQUIREMENTS.md +85 -0
  30. package/docs/plans/AGENTSAM-MCP-CLIENT-2026-09-19.md +181 -0
  31. package/docs/plans/ASBD-PORTABLE-WORKGRAPH-UI-DEFERRED.md +34 -0
  32. package/docs/plans/ASTRA-BRIEF-2026-09-18.md +258 -0
  33. package/docs/plans/MULTI-AGENT-SPRINTS-2026-09-19.md +373 -0
  34. package/docs/plans/NEXT-AGENT-HANDOFF.md +167 -0
  35. package/docs/plans/RECONCILIATION-2026-09-19.md +178 -0
  36. package/docs/plugins.md +43 -0
  37. package/docs/tools/README.md +57 -0
  38. package/docs/tools/agent-and-orchestration.md +49 -0
  39. package/docs/tools/browser-and-research.md +46 -0
  40. package/docs/tools/cloudflare-platform.md +32 -0
  41. package/docs/tools/cms.md +25 -0
  42. package/docs/tools/communications.md +41 -0
  43. package/docs/tools/database-and-storage.md +62 -0
  44. package/docs/tools/design-and-media.md +64 -0
  45. package/docs/tools/filesystem-and-code.md +55 -0
  46. package/docs/tools/github.md +56 -0
  47. package/docs/tools/integrations-and-misc.md +16 -0
  48. package/docs/tools/memory.md +21 -0
  49. package/docs/tools/terminal-and-execution.md +29 -0
  50. package/docs/tools/tickets-and-platform.md +30 -0
  51. package/migrations/d1/0001_agentsam_plugin_runtime.sql +177 -0
  52. package/migrations/d1/0002_agentsam_ticket_ownership.sql +8 -0
  53. package/migrations/d1/0002_dynamic_model_policies.sql +23 -0
  54. package/migrations/d1/0003_expand_tool_handler_families.sql +18 -0
  55. package/migrations/d1/0004_project_aware_retrieval_lanes.sql +24 -0
  56. package/migrations/d1/0005_portable_knowledge_identity.sql +104 -0
  57. package/migrations/d1/0006_repair_ops_trail_account_scope.sql +14 -0
  58. package/migrations/d1/0007_repair_ops_trail_agent_run_account.sql +13 -0
  59. package/migrations/d1/0008_backfill_knowledge_run_legacy_tenant.sql +14 -0
  60. package/migrations/d1/0009_normalize_cloudflare_plugin_installations.sql +137 -0
  61. package/migrations/runtime/0001_cli_runtime.sql +67 -0
  62. package/migrations/runtime/0002_project_sessions.sql +15 -0
  63. package/migrations/runtime/0003_provider_continuations.sql +8 -0
  64. package/package.json +92 -12
  65. package/packages/agentsam-brand/README.md +21 -0
  66. package/packages/agentsam-brand/package.json +22 -0
  67. package/packages/agentsam-brand/src/contract.js +59 -0
  68. package/packages/agentsam-brand/src/extract.js +126 -0
  69. package/packages/agentsam-brand/src/goap-actions.js +73 -0
  70. package/packages/agentsam-brand/src/index.js +48 -0
  71. package/packages/agentsam-brand/src/plan.js +115 -0
  72. package/packages/agentsam-brand/src/resolve.js +139 -0
  73. package/packages/agentsam-brand/src/scan.js +250 -0
  74. package/packages/agentsam-brand/test/brand-scan.test.mjs +106 -0
  75. package/packages/agentsam-contracts/README.md +23 -0
  76. package/packages/agentsam-contracts/package.json +32 -0
  77. package/packages/agentsam-contracts/src/adapter.ts +25 -0
  78. package/packages/agentsam-contracts/src/agent.ts +35 -0
  79. package/packages/agentsam-contracts/src/artifacts.ts +33 -0
  80. package/packages/agentsam-contracts/src/authority.ts +29 -0
  81. package/packages/agentsam-contracts/src/context.ts +16 -0
  82. package/packages/agentsam-contracts/src/errors.ts +46 -0
  83. package/packages/agentsam-contracts/src/events.ts +47 -0
  84. package/packages/agentsam-contracts/src/execution.ts +50 -0
  85. package/packages/agentsam-contracts/src/hooks.ts +40 -0
  86. package/packages/agentsam-contracts/src/identity.ts +16 -0
  87. package/packages/agentsam-contracts/src/index.ts +14 -0
  88. package/packages/agentsam-contracts/src/models.ts +9 -0
  89. package/packages/agentsam-contracts/src/providers.ts +33 -0
  90. package/packages/agentsam-contracts/src/repository.ts +64 -0
  91. package/packages/agentsam-contracts/src/tools.ts +98 -0
  92. package/packages/agentsam-contracts/test/contracts.test.mjs +16 -0
  93. package/packages/agentsam-contracts/test/errors-catalog.test.mjs +25 -0
  94. package/packages/agentsam-contracts/test/repository.test.mjs +18 -0
  95. package/packages/agentsam-contracts/tsconfig.json +12 -0
  96. package/packages/agentsam-errors/package.json +17 -0
  97. package/packages/agentsam-errors/src/adapters/anthropic.js +15 -0
  98. package/packages/agentsam-errors/src/adapters/cad.js +109 -0
  99. package/packages/agentsam-errors/src/adapters/cloudflare.js +21 -0
  100. package/packages/agentsam-errors/src/adapters/cursor.js +4 -0
  101. package/packages/agentsam-errors/src/adapters/device.js +38 -0
  102. package/packages/agentsam-errors/src/adapters/docker.js +28 -0
  103. package/packages/agentsam-errors/src/adapters/gcp.js +14 -0
  104. package/packages/agentsam-errors/src/adapters/github.js +22 -0
  105. package/packages/agentsam-errors/src/adapters/google.js +17 -0
  106. package/packages/agentsam-errors/src/adapters/index.js +55 -0
  107. package/packages/agentsam-errors/src/adapters/internal.js +40 -0
  108. package/packages/agentsam-errors/src/adapters/oauth.js +24 -0
  109. package/packages/agentsam-errors/src/adapters/openai.js +17 -0
  110. package/packages/agentsam-errors/src/adapters/process.js +35 -0
  111. package/packages/agentsam-errors/src/adapters/provider.js +114 -0
  112. package/packages/agentsam-errors/src/envelope.js +186 -0
  113. package/packages/agentsam-errors/src/error.js +24 -0
  114. package/packages/agentsam-errors/src/fingerprint.js +35 -0
  115. package/packages/agentsam-errors/src/index.js +10 -0
  116. package/packages/agentsam-errors/src/normalize.js +30 -0
  117. package/packages/agentsam-errors/src/redaction.js +52 -0
  118. package/packages/agentsam-errors/src/render.js +16 -0
  119. package/packages/agentsam-errors/src/retry.js +10 -0
  120. package/packages/agentsam-errors/src/transport.js +52 -0
  121. package/packages/agentsam-errors/src/vocabulary.js +320 -0
  122. package/packages/agentsam-errors/test/envelope.test.mjs +70 -0
  123. package/packages/agentsam-errors/test/providers.test.mjs +99 -0
  124. package/packages/agentsam-errors/test/redaction.test.mjs +21 -0
  125. package/packages/agentsam-errors/test/runtime-cad-device.test.mjs +76 -0
  126. package/packages/agentsam-errors/test/transport.test.mjs +46 -0
  127. package/packages/agentsam-knowledge/package.json +15 -0
  128. package/packages/agentsam-knowledge/src/autorag/index.js +64 -0
  129. package/packages/agentsam-knowledge/src/backends/index.js +26 -0
  130. package/packages/agentsam-knowledge/src/index.js +3 -0
  131. package/packages/agentsam-knowledge/src/providers/index.js +95 -0
  132. package/packages/agentsam-knowledge/test/autorag.test.mjs +42 -0
  133. package/packages/agentsam-nav/README.md +40 -0
  134. package/packages/agentsam-nav/dist/Nav.d.ts +43 -0
  135. package/packages/agentsam-nav/dist/NavCollapsible.d.ts +10 -0
  136. package/packages/agentsam-nav/dist/NavContent.d.ts +2 -0
  137. package/packages/agentsam-nav/dist/NavFooter.d.ts +2 -0
  138. package/packages/agentsam-nav/dist/NavGroup.d.ts +3 -0
  139. package/packages/agentsam-nav/dist/NavHeader.d.ts +2 -0
  140. package/packages/agentsam-nav/dist/NavMenu.d.ts +22 -0
  141. package/packages/agentsam-nav/dist/NavProvider.d.ts +35 -0
  142. package/packages/agentsam-nav/dist/NavTrigger.d.ts +2 -0
  143. package/packages/agentsam-nav/dist/Surfaces.d.ts +41 -0
  144. package/packages/agentsam-nav/dist/browser.d.ts +11 -0
  145. package/packages/agentsam-nav/dist/browser.global.js +132 -0
  146. package/packages/agentsam-nav/dist/browser.js +613 -0
  147. package/packages/agentsam-nav/dist/contracts.d.ts +76 -0
  148. package/packages/agentsam-nav/dist/index.d.ts +11 -0
  149. package/packages/agentsam-nav/dist/index.js +614 -0
  150. package/packages/agentsam-nav/dist/legacy.css +83 -0
  151. package/packages/agentsam-nav/dist/shell.css +113 -0
  152. package/packages/agentsam-nav/dist/theme.css +113 -0
  153. package/packages/agentsam-nav/dist/utils.d.ts +1 -0
  154. package/packages/agentsam-nav/package.json +43 -0
  155. package/packages/agentsam-queue-control/README.md +107 -0
  156. package/packages/agentsam-queue-control/package.json +31 -0
  157. package/packages/agentsam-queue-control/schemas/job-envelope.schema.json +56 -0
  158. package/packages/agentsam-queue-control/src/adapters/cloudflare.js +152 -0
  159. package/packages/agentsam-queue-control/src/adapters/memory.js +38 -0
  160. package/packages/agentsam-queue-control/src/contracts.js +130 -0
  161. package/packages/agentsam-queue-control/src/control-plane.js +141 -0
  162. package/packages/agentsam-queue-control/src/dispatch.js +43 -0
  163. package/packages/agentsam-queue-control/src/index.js +7 -0
  164. package/packages/agentsam-queue-control/src/policy.js +88 -0
  165. package/packages/agentsam-queue-control/src/topology.js +66 -0
  166. package/packages/agentsam-queue-control/test/queue-control.test.mjs +100 -0
  167. package/packages/agentsam-repository/src/goap.js +718 -0
  168. package/packages/agentsam-repository/src/goap.js.bak-20260922011251 +670 -0
  169. package/packages/agentsam-repository/src/index.js +5 -0
  170. package/packages/agentsam-repository/src/merkle/cloudflare-persistence.js +2 -2
  171. package/packages/agentsam-repository/src/tickets.js +184 -0
  172. package/packages/agentsam-repository/src/work-tracking.js +199 -0
  173. package/packages/agentsam-repository/src/workspace-state.js +176 -0
  174. package/packages/agentsam-repository/test/goap-tickets-workspace-state.test.mjs +152 -0
  175. package/packages/connectors/cloudflare/src/index.js +297 -15
  176. package/packages/connectors/cloudflare/src/owner.js +43 -40
  177. package/packages/connectors/cloudflare/src/routes.js +167 -26
  178. package/packages/connectors/cloudflare/tests/connector.test.mjs +112 -2
  179. package/packages/heuristic-theme/README.md +11 -0
  180. package/packages/heuristic-theme/package.json +25 -0
  181. package/packages/heuristic-theme/src/index.js +2 -0
  182. package/packages/heuristic-theme/src/registry.js +36 -0
  183. package/packages/heuristic-theme/src/theme.js +41 -0
  184. package/packages/heuristic-theme/test/theme.test.mjs +26 -0
  185. package/packages/identity/.agentsam/features/oauth-login-portal/agentsam.feature.json +64 -0
  186. package/packages/identity/.agentsam/features/oauth-login-portal/providers.json +96 -0
  187. package/packages/identity/.agentsam/features/oauth-login-portal/resources.json +47 -0
  188. package/packages/identity/.agentsam/features/oauth-login-portal/routes.json +74 -0
  189. package/packages/identity/.agentsam/features/oauth-login-portal/ui.json +35 -0
  190. package/packages/identity/package.json +3 -2
  191. package/packages/identity/src/adapters/cloudflare-d1/ids.js +4 -0
  192. package/packages/identity/src/adapters/cloudflare-d1/index.js +39 -1
  193. package/packages/identity/src/contracts/provider.js +3 -2
  194. package/packages/identity/src/frontend/auth-portal/pages/login.html +7 -0
  195. package/packages/identity/src/index.js +2 -0
  196. package/packages/identity/src/oauth/credentials.js +13 -0
  197. package/packages/identity/src/oauth/iam-platform.js +5 -5
  198. package/packages/identity/src/providers/cloudflare/index.js +19 -0
  199. package/packages/identity/src/providers/cloudflare/mapper.js +21 -0
  200. package/packages/identity/src/providers/cloudflare/oauth.js +48 -0
  201. package/packages/identity/src/providers/cloudflare/profile.js +28 -0
  202. package/packages/identity/src/providers/index.js +18 -2
  203. package/packages/identity/src/server/identity-service.js +13 -3
  204. package/packages/identity/src/server/worker-router.js +63 -8
  205. package/packages/identity/tests/identity-service.test.mjs +15 -0
  206. package/packages/providers/completeful/README.md +38 -0
  207. package/packages/providers/completeful/package.json +29 -0
  208. package/packages/providers/completeful/src/client.js +162 -0
  209. package/packages/providers/completeful/src/events.js +49 -0
  210. package/packages/providers/completeful/src/index.js +22 -0
  211. package/packages/providers/completeful/src/tools.js +579 -0
  212. package/packages/providers/completeful/src/webhooks.js +55 -0
  213. package/packages/providers/completeful/test/provider.test.mjs +196 -0
  214. package/packages/theme-church-site/README.md +10 -0
  215. package/packages/theme-church-site/package.json +30 -0
  216. package/packages/theme-church-site/src/harvest.json +14 -0
  217. package/packages/theme-church-site/src/index.js +84 -0
  218. package/packages/theme-church-site/test/theme.test.mjs +19 -0
  219. package/packages/theme-companions-site/README.md +10 -0
  220. package/packages/theme-companions-site/package.json +30 -0
  221. package/packages/theme-companions-site/src/harvest.json +12 -0
  222. package/packages/theme-companions-site/src/index.js +82 -0
  223. package/packages/theme-companions-site/test/theme.test.mjs +19 -0
  224. package/packages/theme-floors-site/README.md +10 -0
  225. package/packages/theme-floors-site/package.json +30 -0
  226. package/packages/theme-floors-site/src/harvest.json +14 -0
  227. package/packages/theme-floors-site/src/index.js +82 -0
  228. package/packages/theme-floors-site/test/theme.test.mjs +19 -0
  229. package/packages/theme-fuelnfree-site/README.md +10 -0
  230. package/packages/theme-fuelnfree-site/package.json +30 -0
  231. package/packages/theme-fuelnfree-site/src/harvest.json +13 -0
  232. package/packages/theme-fuelnfree-site/src/index.js +81 -0
  233. package/packages/theme-fuelnfree-site/test/theme.test.mjs +19 -0
  234. package/packages/theme-handyman-site/README.md +10 -0
  235. package/packages/theme-handyman-site/package.json +30 -0
  236. package/packages/theme-handyman-site/src/harvest.json +10 -0
  237. package/packages/theme-handyman-site/src/index.js +83 -0
  238. package/packages/theme-handyman-site/test/theme.test.mjs +19 -0
  239. package/packages/theme-insurance-site/README.md +10 -0
  240. package/packages/theme-insurance-site/package.json +30 -0
  241. package/packages/theme-insurance-site/src/harvest.json +10 -0
  242. package/packages/theme-insurance-site/src/index.js +83 -0
  243. package/packages/theme-insurance-site/test/theme.test.mjs +19 -0
  244. package/packages/theme-shinshu-site/README.md +10 -0
  245. package/packages/theme-shinshu-site/package.json +30 -0
  246. package/packages/theme-shinshu-site/src/harvest.json +12 -0
  247. package/packages/theme-shinshu-site/src/index.js +83 -0
  248. package/packages/theme-shinshu-site/test/theme.test.mjs +19 -0
  249. package/packages/work-graph/README.md +49 -0
  250. package/packages/work-graph/package.json +19 -0
  251. package/packages/work-graph/prototype/README.md +32 -0
  252. package/packages/work-graph/prototype/data/demo-workgraph.js +47 -0
  253. package/packages/work-graph/prototype/renderers/timeline-model.js +21 -0
  254. package/packages/work-graph/prototype/renderers/workgraph-runtime.js +38 -0
  255. package/packages/work-graph/prototype-gnantt.html +655 -0
  256. package/packages/work-graph/src/adapters/business/projects.js +23 -0
  257. package/packages/work-graph/src/adapters/engineering/git.js +22 -0
  258. package/packages/work-graph/src/adapters/engineering/mcp.js +22 -0
  259. package/packages/work-graph/src/index.js +76 -0
  260. package/packages/work-graph/src/renderers/gantt-model.js +11 -0
  261. package/packages/work-graph/src/renderers/timeline.js +16 -0
  262. package/packages/work-graph/test/work-graph.test.mjs +37 -0
  263. package/protocol/README.md +12 -0
  264. package/protocol/capabilities/cloudflare-cpu-audit-input.schema.json +30 -6
  265. package/protocol/capabilities/cloudflare-cpu-profile-input.schema.json +18 -4
  266. package/protocol/capabilities/cloudflare-wrangler-native-input.schema.json +59 -10
  267. package/protocol/capabilities/knowledge-search-input.schema.json +35 -0
  268. package/protocol/capabilities/manifest.json +163 -1
  269. package/protocol/capabilities/repository-audit-input.schema.json +39 -6
  270. package/protocol/capabilities/repository-snapshot-input.schema.json +15 -3
  271. package/protocol/capabilities/terminal-exec-input.schema.json +55 -0
  272. package/protocol/commerce/catalog.v1.json +50 -0
  273. package/protocol/errors/error-catalog.json +164 -0
  274. package/protocol/errors/error-envelope.schema.json +544 -0
  275. package/protocol/features/README.md +57 -0
  276. package/protocol/features/agentsam.feature.v1.schema.json +290 -0
  277. package/protocol/features/catalog.json +65 -0
  278. package/protocol/features/examples/provider-resend.feature.json +17 -0
  279. package/protocol/go/agentsam-go-runtime.v1.json +17 -0
  280. package/protocol/knowledge/LIFECYCLE.md +140 -0
  281. package/protocol/knowledge/README.md +4 -0
  282. package/protocol/presets/catalog.json +128 -19
  283. package/protocol/rpc/v1/errors.proto +24 -0
  284. package/protocol/theme-refinery/d1-reconciliation.md +48 -0
  285. package/protocol/theme-refinery/product-metadata.schema.json +27 -0
  286. package/protocol/theme-refinery/receipts/products-registry-batch-20260924.json +318 -0
  287. package/protocol/theme-refinery/receipts/theme-harvest-20260924.json +472 -0
  288. package/protocol/theme-refinery/reconciliation-receipt.schema.json +83 -0
  289. package/services/cad/server.py +249 -2
  290. package/src/agent/capability-adapter.js +15 -5
  291. package/src/agent/index.js +2 -1
  292. package/src/agent/model-turn.js +51 -0
  293. package/src/agent/responses-runner.js +304 -38
  294. package/src/capabilities/index.js +1 -0
  295. package/src/capabilities/terminal-exec.js +78 -0
  296. package/src/cli.js +117 -9
  297. package/src/cloudflare/index.js +6 -0
  298. package/src/cloudflare/runtime-status.js +393 -0
  299. package/src/cloudflare/wrangler.js +17 -1
  300. package/src/commands/app.js +106 -0
  301. package/src/commands/autorag.js +77 -0
  302. package/src/commands/brand.js +293 -0
  303. package/src/commands/cad.js +1 -0
  304. package/src/commands/connections.js +126 -29
  305. package/src/commands/context-economics.js +8 -0
  306. package/src/commands/db.js +7 -0
  307. package/src/commands/env.js +5 -4
  308. package/src/commands/eval.js +209 -14
  309. package/src/commands/go.js +365 -0
  310. package/src/commands/goap.js +176 -0
  311. package/src/commands/identity-init.js +27 -3
  312. package/src/commands/identity-protocol.js +195 -0
  313. package/src/commands/knowledge.js +64 -5
  314. package/src/commands/mcp.js +341 -0
  315. package/src/commands/merkle-persist.js +3 -1
  316. package/src/commands/merkle.js +18 -3
  317. package/src/commands/models.js +109 -23
  318. package/src/commands/plugins.js +175 -0
  319. package/src/commands/preferences.js +28 -8
  320. package/src/commands/product.js +53 -10
  321. package/src/commands/providers.js +118 -37
  322. package/src/commands/resume.js +9 -5
  323. package/src/commands/runtime-status.js +154 -0
  324. package/src/commands/shell.js +466 -55
  325. package/src/commands/status.js +82 -7
  326. package/src/commands/tunnel.js +228 -195
  327. package/src/commands/whoami.js +78 -6
  328. package/src/context/budget.js +6 -0
  329. package/src/context/index.js +2 -1
  330. package/src/context/project-card.js +75 -0
  331. package/src/errors/contract.js +34 -211
  332. package/src/errors/diagnostic.js +95 -51
  333. package/src/errors/index.js +6 -13
  334. package/src/eval/index.js +6 -0
  335. package/src/eval/live.js +439 -0
  336. package/src/features/resolve.js +242 -0
  337. package/src/go/build.js +108 -0
  338. package/src/go/cloudflare.js +207 -0
  339. package/src/go/contract.js +139 -0
  340. package/src/go/discover.js +96 -0
  341. package/src/go/index.js +13 -0
  342. package/src/go/receipts.js +77 -0
  343. package/src/go/registry.js +223 -0
  344. package/src/go/verify.js +31 -0
  345. package/src/index.js +100 -1
  346. package/src/knowledge/config.js +13 -5
  347. package/src/knowledge/engine.js +23 -8
  348. package/src/knowledge/index.js +1 -0
  349. package/src/knowledge/lane-registry.js +46 -0
  350. package/src/knowledge/providers/gemini.js +48 -8
  351. package/src/knowledge/service/client.js +13 -1
  352. package/src/knowledge/service/grpc-codec.js +156 -53
  353. package/src/knowledge/service/job-engine.js +133 -11
  354. package/src/knowledge/service/job-worker.js +34 -5
  355. package/src/knowledge/service/server.js +10 -1
  356. package/src/knowledge/store-discovery.js +77 -0
  357. package/src/lib/account-session.js +8 -2
  358. package/src/lib/agent-instructions.js +3 -0
  359. package/src/lib/auth.js +7 -3
  360. package/src/lib/cad/blender.js +42 -3
  361. package/src/lib/cad/d1-project-store.js +43 -0
  362. package/src/lib/cad/discovery.js +616 -0
  363. package/src/lib/cad/docker-executor.js +352 -0
  364. package/src/lib/cad/freecad.js +253 -0
  365. package/src/lib/cad/index.js +40 -0
  366. package/src/lib/cad/openscad.js +198 -0
  367. package/src/lib/cad/project-cli.d.ts +2 -0
  368. package/src/lib/cad/project-cli.js +21 -0
  369. package/src/lib/cad/project-contract.d.ts +3 -0
  370. package/src/lib/cad/project-contract.js +1 -0
  371. package/src/lib/cad/project-recipe.js +30 -0
  372. package/src/lib/cad/project-runtime.d.ts +2 -0
  373. package/src/lib/cad/project-runtime.js +53 -0
  374. package/src/lib/cad/project-store.js +25 -0
  375. package/src/lib/cad/project-workflows.js +31 -0
  376. package/src/lib/cad-docker.js +21 -2
  377. package/src/lib/cli-preferences.js +17 -2
  378. package/src/lib/core-client.js +37 -18
  379. package/src/lib/deploy/local-studio.js +6 -5
  380. package/src/lib/dockerize.js +3 -0
  381. package/src/lib/execution-approvals.js +1 -0
  382. package/src/lib/identity-scaffold.js +4 -1
  383. package/src/lib/knowledge-docker.js +9 -1
  384. package/src/lib/local-sessions.js +124 -34
  385. package/src/lib/local-status.js +35 -14
  386. package/src/lib/project-config.js +9 -0
  387. package/src/lib/provider-credentials.js +73 -11
  388. package/src/lib/scaffold/resolve-cloudflare-account.js +37 -0
  389. package/src/lib/scaffold/wizards/cms.js +2 -8
  390. package/src/lib/scaffold/wizards/worker-api.js +2 -8
  391. package/src/lib/slash-commands.js +9 -2
  392. package/src/local/migrations.js +109 -1
  393. package/src/local/runtime-store.js +31 -5
  394. package/src/local/sqlite.js +36 -1
  395. package/src/mcp/authority.js +348 -0
  396. package/src/mcp/client-adapters.js +431 -0
  397. package/src/mcp/client.js +172 -0
  398. package/src/mcp/index.js +47 -0
  399. package/src/mcp/telemetry.js +103 -0
  400. package/src/models/catalog.js +329 -51
  401. package/src/models/discovery.js +24 -4
  402. package/src/models/index.js +2 -0
  403. package/src/models/inventory-core.js +182 -0
  404. package/src/models/policy.js +20 -0
  405. package/src/plugins/cloudflare.js +103 -0
  406. package/src/plugins/completeful.js +69 -0
  407. package/src/plugins/contracts.js +86 -0
  408. package/src/plugins/index.js +11 -0
  409. package/src/plugins/registry.js +207 -0
  410. package/src/plugins/resource-scope.js +45 -0
  411. package/src/plugins/runtime.js +118 -0
  412. package/src/plugins/vectorize.js +31 -0
  413. package/src/progression/engine.js +171 -0
  414. package/src/progression/index.js +1 -0
  415. package/src/providers/cloudflare-chat.js +1 -1
  416. package/src/providers/gemini-generate-content.js +2 -1
  417. package/src/providers/openai-responses.js +45 -16
  418. package/src/providers/tool-schema.js +85 -0
  419. package/src/repository/index.js +29 -0
  420. package/src/rpc/generated/errors_pb.js +961 -1
  421. package/src/security/local-vault.js +415 -0
  422. package/src/security/process.js +20 -4
  423. package/src/status/actions.js +192 -0
  424. package/src/tools/hydrate.js +5 -1
  425. package/src/tools/index.js +7 -0
  426. package/src/tools/redact.js +64 -0
  427. package/src/tools/registry.js +83 -0
  428. package/src/tools/runtime.js +257 -0
  429. package/src/tools/search.js +21 -8
  430. package/src/ui/ansi.js +117 -3
  431. package/src/ui/cli/activity.js +76 -7
  432. package/src/ui/cli/footer.js +110 -9
  433. package/src/ui/cli/help.js +11 -4
  434. package/src/ui/wireframes.js +166 -0
  435. package/test/account-session.test.mjs +28 -0
  436. package/test/apps-scaffold-contract.test.mjs +16 -1
  437. package/test/capabilities.test.mjs +1 -1
  438. package/test/cli/eval-live.test.mjs +219 -0
  439. package/test/cli/go.test.mjs +71 -0
  440. package/test/cli/local-vault-and-provider-setup.test.mjs +268 -0
  441. package/test/cli/mcp-client.test.mjs +245 -0
  442. package/test/cli/runtime-ui.test.mjs +69 -2
  443. package/test/cli/status-actions.test.mjs +88 -0
  444. package/test/cli/wireframes-go-registry.test.mjs +54 -0
  445. package/test/cloudflare-connector.test.mjs +3 -6
  446. package/test/cloudflare-runtime.test.mjs +8 -1
  447. package/test/context.test.mjs +15 -0
  448. package/test/error-diagnostics.test.mjs +9 -0
  449. package/test/fixtures/cad/courtyard-house.json +208 -0
  450. package/test/go/cloudflare-probe.test.mjs +53 -0
  451. package/test/integration/app-command.test.mjs +55 -0
  452. package/test/integration/cad-discovery.test.mjs +158 -0
  453. package/test/integration/cad-docker-executor.test.mjs +249 -0
  454. package/test/integration/cad-execution.test.mjs +184 -0
  455. package/test/integration/cad-project-app.test.mjs +31 -0
  456. package/test/integration/cad-project-d1.test.mjs +25 -0
  457. package/test/integration/cad-project-native.test.mjs +24 -0
  458. package/test/integration/cad-project-workflow.test.mjs +9 -0
  459. package/test/integration/cad-project.test.mjs +82 -0
  460. package/test/integration/cli-help.test.mjs +4 -0
  461. package/test/integration/cms-site-tenancy-contract.test.mjs +256 -0
  462. package/test/integration/core-client.integration.test.mjs +55 -0
  463. package/test/integration/error-runtime-rpc.test.mjs +71 -0
  464. package/test/integration/features-resolve.test.mjs +128 -0
  465. package/test/integration/install-script.test.mjs +107 -0
  466. package/test/integration/inventory-core.test.mjs +53 -0
  467. package/test/integration/plugins-cloudflare.integration.test.mjs +28 -0
  468. package/test/integration/provider-env-cli.test.mjs +1 -1
  469. package/test/integration/runtime-migrations.test.mjs +6 -1
  470. package/test/integration/runtime-status.integration.test.mjs +211 -0
  471. package/test/integration/scaffold-cloudflare.test.mjs +46 -0
  472. package/test/integration/storage-architecture.test.mjs +154 -0
  473. package/test/integration/store-discovery.test.mjs +44 -0
  474. package/test/integration/terminal-exec.integration.test.mjs +86 -0
  475. package/test/integration/tool-runtime.test.mjs +124 -0
  476. package/test/integration/tool-schema.test.mjs +59 -0
  477. package/test/knowledge-service.test.mjs +4 -0
  478. package/test/local-sessions.test.mjs +11 -2
  479. package/test/local-studio-deploy.test.mjs +1 -1
  480. package/test/model-catalog.test.mjs +28 -1
  481. package/test/models.test.mjs +159 -5
  482. package/test/openai-responses.test.mjs +60 -0
  483. package/test/provider-credentials.test.mjs +15 -5
  484. package/test/responses-runner.test.mjs +321 -6
  485. package/test/shell.test.mjs +149 -4
  486. package/test/smoke.mjs +2 -2
  487. package/test/tools-search.test.mjs +33 -0
  488. package/test/unit/website-assets-bindings.test.mjs +60 -0
  489. package/test/whoami-resume.test.mjs +82 -3
  490. package/examples/gorilla-shell/README.md +0 -15
  491. package/src/lib/gorilla-template.js +0 -54
  492. package/templates/gorilla-shell/App.tsx +0 -639
  493. package/templates/gorilla-shell/README.md +0 -34
  494. package/templates/gorilla-shell/index.html +0 -15
  495. package/templates/gorilla-shell/main.jsx +0 -9
  496. package/templates/gorilla-shell/package.json +0 -19
  497. package/templates/gorilla-shell/vite.config.js +0 -21
@@ -6,6 +6,7 @@ import {
6
6
  multiselect,
7
7
  outro,
8
8
  password,
9
+ select,
9
10
  spinner,
10
11
  text,
11
12
  } from '@clack/prompts';
@@ -13,6 +14,7 @@ import { getJson } from '../lib/core-client.js';
13
14
  import {
14
15
  PROVIDER_CREDENTIALS,
15
16
  describeProviderCredential,
17
+ exportProviderEnvProfile,
16
18
  listProviderCredentialStatus,
17
19
  normalizeProviderId,
18
20
  providerCredentialSpec,
@@ -117,15 +119,69 @@ export function renderProviderStatus(rows = []) {
117
119
  lines.push(` ${String(row.label || row.provider).padEnd(18)} ${state}${verification}`);
118
120
  }
119
121
  lines.push('');
120
- lines.push(' Profiles: ~/.agentsam/env.d/<provider>.env · mode 0600');
121
- lines.push(' Load one or many: source ~/.agentsam/load-agent-env.sh openai gemini cursor');
122
+ lines.push(' Storage: Encrypted local vault (AES-256-GCM / OS keychain) — no plaintext on disk.');
123
+ lines.push(' Optional export for non-AgentSam shells: agentsam providers export <provider>');
122
124
  lines.push('');
123
125
  return lines.join('\n');
124
126
  }
125
127
 
126
- async function promptProviderCredential(provider, options = {}) {
127
- const spec = providerCredentialSpec(provider);
128
- if (!spec) throw new Error(`unsupported_provider:${provider}`);
128
+ export async function validateAndSaveProviderCredential(provider, secret, options = {}) {
129
+ const id = normalizeProviderId(provider);
130
+ const spec = providerCredentialSpec(id);
131
+ if (!spec) throw new Error(`unsupported_provider:${id}`);
132
+ const cleanSecret = clean(secret);
133
+ if (!cleanSecret) return { attempted: false, ok: false, error: 'Credential is required', models: [] };
134
+ if (spec.tokenPrefix && !cleanSecret.startsWith(spec.tokenPrefix)) {
135
+ return { attempted: false, ok: false, error: `Expected ${spec.tokenPrefix}…`, models: [] };
136
+ }
137
+
138
+ const accountId = clean(options.accountId);
139
+ if (id === 'cloudflare' && !accountId) {
140
+ return { attempted: false, ok: false, error: 'Cloudflare account ID is required', models: [] };
141
+ }
142
+
143
+ const tempCredential = {
144
+ provider: id,
145
+ configured: true,
146
+ value: cleanSecret,
147
+ account_id: accountId || null,
148
+ };
149
+
150
+ let verification;
151
+ if (id === 'inneranimalmedia') {
152
+ verification = await verifyInnerAnimalMedia(tempCredential, options);
153
+ } else {
154
+ verification = await discoverProviderModels(id, tempCredential, { fetchImpl: options.fetchImpl || fetch });
155
+ }
156
+
157
+ if (!verification.ok) {
158
+ return {
159
+ attempted: true,
160
+ ok: false,
161
+ error: verification.error || 'Provider verification failed',
162
+ models: [],
163
+ saved: false,
164
+ };
165
+ }
166
+
167
+ // Key is verified! Now persist securely to OS store + AES-256-GCM vault + env profile
168
+ setProviderCredential(id, cleanSecret, { ...options, accountId });
169
+
170
+ return {
171
+ attempted: true,
172
+ ok: true,
173
+ error: null,
174
+ models: verification.models || [],
175
+ model_count: verification.models?.length || 0,
176
+ identity: verification.identity || null,
177
+ saved: true,
178
+ };
179
+ }
180
+
181
+ export async function promptAndConfigureProvider(provider, options = {}) {
182
+ const id = normalizeProviderId(provider);
183
+ const spec = providerCredentialSpec(id);
184
+ if (!spec) throw new Error(`unsupported_provider:${id}`);
129
185
  const promptPassword = options.passwordImpl || password;
130
186
  const promptText = options.textImpl || text;
131
187
  const secret = await promptPassword({
@@ -140,50 +196,60 @@ async function promptProviderCredential(provider, options = {}) {
140
196
  if (isCancel(secret)) return null;
141
197
 
142
198
  let accountId = '';
143
- if (provider === 'cloudflare') {
199
+ if (id === 'cloudflare') {
144
200
  const answer = await promptText({
145
201
  message: 'Cloudflare account ID',
146
202
  placeholder: '32-character account ID',
147
203
  validate(value) {
148
- const id = clean(value);
149
- if (!id) return 'Cloudflare account ID is required';
150
- if (!/^[a-f0-9]{32}$/i.test(id)) return 'Expected a 32-character hexadecimal account ID';
204
+ const val = clean(value);
205
+ if (!val) return 'Cloudflare account ID is required';
206
+ if (!/^[a-f0-9]{32}$/i.test(val)) return 'Expected a 32-character hexadecimal account ID';
151
207
  },
152
208
  });
153
209
  if (isCancel(answer)) return null;
154
210
  accountId = clean(answer);
155
211
  }
156
212
 
157
- setProviderCredential(provider, String(secret), { ...options, accountId });
158
- return verifyProviderCredential(provider, options);
213
+ const spin = options.spinnerImpl ? options.spinnerImpl() : spinner();
214
+ spin.start(`Verifying ${spec.label} API credential`);
215
+
216
+ const result = await validateAndSaveProviderCredential(id, String(secret), { ...options, accountId });
217
+
218
+ if (!result.ok) {
219
+ spin.stop(`Verification failed: ${result.error || 'invalid key'} · Key was NOT saved`, 1);
220
+ return { ...result, saved: false };
221
+ }
222
+
223
+ const count = result.models?.length || 0;
224
+ const suffix = count ? ` · ${count} models visible` : '';
225
+ spin.stop(`Verified${suffix} · saved securely to local vault`);
226
+
227
+ return { ...result, saved: true };
159
228
  }
160
229
 
161
230
  async function runInteractiveProviders(options = {}) {
162
- const promptMultiselect = options.multiselectImpl || multiselect;
163
- const selected = await promptMultiselect({
164
- message: 'Providers to configure',
165
- required: false,
166
- options: providerChoices(options),
167
- });
168
- if (isCancel(selected)) {
169
- cancel('Provider setup cancelled.');
170
- return collectProviderStatus(options);
171
- }
172
- if (!selected.length) return collectProviderStatus(options);
231
+ const promptSelect = options.selectImpl || select;
173
232
 
174
233
  intro('Agent Sam provider setup');
175
- const spin = options.spinnerImpl ? options.spinnerImpl() : spinner();
176
- for (const provider of selected) {
177
- const result = await promptProviderCredential(provider, options);
178
- if (!result) continue;
179
- spin.start(`Verifying ${providerCredentialSpec(provider)?.label || provider}`);
180
- if (result.ok) {
181
- const suffix = result.models?.length ? ` · ${result.models.length} models` : '';
182
- spin.stop(`Verified${suffix}`);
183
- } else {
184
- spin.stop(`Saved · verification failed: ${result.error || 'unknown'}`, 1);
234
+
235
+ while (true) {
236
+ const choices = [
237
+ ...providerChoices(options),
238
+ { value: '__done__', label: 'Done / Return to shell', hint: 'finish provider setup' },
239
+ ];
240
+
241
+ const choice = await promptSelect({
242
+ message: 'Select your preferred provider to continue',
243
+ options: choices,
244
+ });
245
+
246
+ if (isCancel(choice) || choice === '__done__') {
247
+ break;
185
248
  }
249
+
250
+ await promptAndConfigureProvider(choice, options);
186
251
  }
252
+
187
253
  outro('Provider setup complete');
188
254
  return collectProviderStatus(options);
189
255
  }
@@ -192,7 +258,7 @@ function parseArgs(argv = []) {
192
258
  const out = { command: 'interactive', provider: '', json: false, verify: false, yes: false, fromEnv: '' };
193
259
  const args = [...argv];
194
260
  if (args[0] && !args[0].startsWith('-')) out.command = args.shift();
195
- if (['add', 'set', 'remove', 'verify', 'status'].includes(out.command) && args[0] && !args[0].startsWith('-')) {
261
+ if (['add', 'set', 'remove', 'verify', 'status', 'export'].includes(out.command) && args[0] && !args[0].startsWith('-')) {
196
262
  out.provider = normalizeProviderId(args.shift());
197
263
  }
198
264
  while (args.length) {
@@ -216,6 +282,7 @@ export async function runProviders(argv = [], options = {}) {
216
282
  'agentsam providers',
217
283
  'agentsam providers status [provider] [--verify] [--json]',
218
284
  'agentsam providers add <provider> [--from-env NAME]',
285
+ 'agentsam providers export <provider>',
219
286
  'agentsam providers verify [provider] [--json]',
220
287
  'agentsam providers remove <provider> [--yes]',
221
288
  '',
@@ -276,15 +343,29 @@ export async function runProviders(argv = [], options = {}) {
276
343
  if (parsed.fromEnv) {
277
344
  const value = clean((options.env || process.env)[parsed.fromEnv]);
278
345
  if (!value) throw new Error(`environment credential missing: ${parsed.fromEnv}`);
279
- setProviderCredential(parsed.provider, value, options);
280
- return verifyProviderCredential(parsed.provider, options);
346
+ const verified = await validateAndSaveProviderCredential(parsed.provider, value, options);
347
+ if (!verified.ok) {
348
+ throw new Error(`Provider verification failed: ${verified.error}. Credential was not saved.`);
349
+ }
350
+ writeLine(write, ` ${parsed.provider} verified · ${verified.model_count || 0} models`);
351
+ return verified;
281
352
  }
282
353
  if (options.interactive === false || !(options.interactive ?? Boolean(process.stdin.isTTY && process.stdout.isTTY))) {
283
354
  throw new Error('providers add requires an interactive terminal or --from-env NAME');
284
355
  }
285
- const result = await promptProviderCredential(parsed.provider, options);
356
+ const result = await promptAndConfigureProvider(parsed.provider, options);
286
357
  if (!result) return null;
287
- writeLine(write, result.ok ? ` ${parsed.provider} verified` : ` ${parsed.provider} saved · verification failed: ${result.error}`);
358
+ writeLine(write, result.ok ? ` ${parsed.provider} verified` : ` ${parsed.provider} verification failed: ${result.error}`);
359
+ return result;
360
+ }
361
+
362
+ if (parsed.command === 'export') {
363
+ if (!parsed.provider) throw new Error('providers export requires a provider');
364
+ const result = exportProviderEnvProfile(parsed.provider, options);
365
+ writeLine(write, '');
366
+ writeLine(write, ` Exported ${parsed.provider} profile: ${result.file} (mode 0600)`);
367
+ writeLine(write, ` Load into external shell: ${result.source_command}`);
368
+ writeLine(write, '');
288
369
  return result;
289
370
  }
290
371
 
@@ -24,13 +24,17 @@ export async function runResume(argv = [], options = {}) {
24
24
  const write = options.write || ((text) => process.stdout.write(text));
25
25
  const json = argv.includes('--json');
26
26
  const listOnly = argv.includes('--list');
27
- const positional = argv.filter((arg) => !arg.startsWith('-'));
28
- const unknown = argv.filter((arg) => arg.startsWith('-') && !['--json', '--list'].includes(arg));
27
+ const cwdIndex = argv.indexOf('--cwd');
28
+ if (cwdIndex >= 0 && !argv[cwdIndex + 1]) throw new Error('--cwd requires a project path');
29
+ const cwd = cwdIndex >= 0 ? path.resolve(argv[cwdIndex + 1]) : path.resolve(options.cwd || process.cwd());
30
+ const args = argv.filter((_, index) => cwdIndex < 0 || (index !== cwdIndex && index !== cwdIndex + 1));
31
+ const positional = args.filter((arg) => !arg.startsWith('-'));
32
+ const unknown = args.filter((arg) => arg.startsWith('-') && !['--json', '--list'].includes(arg));
29
33
  if (unknown.length) throw new Error(`unknown resume option: ${unknown[0]}`);
30
34
  if (positional.length > 1) throw new Error('agentsam resume accepts at most one session id');
31
35
 
32
36
  if (listOnly || (json && !positional[0])) {
33
- const sessions = listLocalSessions({ home: options.home, limit: 30 });
37
+ const sessions = listLocalSessions({ home: options.home, cwd, limit: 30 });
34
38
  if (json) writeLine(write, JSON.stringify(sessions, null, 2));
35
39
  else write(renderSessionList(sessions));
36
40
  return sessions;
@@ -38,7 +42,7 @@ export async function runResume(argv = [], options = {}) {
38
42
 
39
43
  let sessionId = positional[0] || '';
40
44
  if (!sessionId) {
41
- const sessions = listLocalSessions({ home: options.home, limit: 30 });
45
+ const sessions = listLocalSessions({ home: options.home, cwd, limit: 30 });
42
46
  if (!sessions.length) { write(renderSessionList([])); return null; }
43
47
  const interactive = options.interactive ?? Boolean(process.stdin.isTTY && process.stdout.isTTY);
44
48
  if (!interactive) { write(renderSessionList(sessions)); return null; }
@@ -54,7 +58,7 @@ export async function runResume(argv = [], options = {}) {
54
58
  sessionId = choice;
55
59
  }
56
60
 
57
- const session = loadLocalSession(sessionId, { home: options.home });
61
+ const session = loadLocalSession(sessionId, { home: options.home, cwd });
58
62
  if (!session) throw new Error(`session_not_found:${sessionId}`);
59
63
  if (json) { writeLine(write, JSON.stringify(session, null, 2)); return session; }
60
64
 
@@ -0,0 +1,154 @@
1
+ import path from 'node:path';
2
+ import { collectWhoami } from './whoami.js';
3
+ import { collectModelsStatus } from './models.js';
4
+ import { collectCloudflareDeploymentStatus } from '../cloudflare/index.js';
5
+ import { getJson } from '../lib/core-client.js';
6
+ import { collectLocalStatus } from '../lib/local-status.js';
7
+ import { tryReadProjectConfig } from '../lib/project-config.js';
8
+
9
+ function terminalConnection(row = {}) {
10
+ return {
11
+ id: row.id || row.connection_id || null,
12
+ instance_id: row.instance_id || null,
13
+ name: row.name || row.connection_name || null,
14
+ kind: row.kind || row.target_type || null,
15
+ provider: row.provider || row.compute_provider || null,
16
+ transport: row.transport || null,
17
+ transport_provider: row.transport_provider || null,
18
+ active: row.is_active === true || Number(row.is_active) === 1,
19
+ default: row.is_default === true || Number(row.is_default) === 1,
20
+ health: row.last_health_status || row.health_status || 'unknown',
21
+ last_seen_at: row.last_seen_at || null,
22
+ };
23
+ }
24
+
25
+ function terminalInstance(row = {}) {
26
+ return {
27
+ id: row.id || null,
28
+ name: row.name || null,
29
+ kind: row.kind || null,
30
+ provider: row.provider || row.compute_provider || null,
31
+ status: row.status || null,
32
+ platform: row.platform || null,
33
+ arch: row.arch || null,
34
+ active_connection_count: Number(row.active_connection_count || 0),
35
+ default_connection_id: row.default_connection_id || null,
36
+ last_seen_at: row.last_seen_at || null,
37
+ };
38
+ }
39
+
40
+ export async function collectTerminalAuthorityStatus(options = {}) {
41
+ if (options.offline === true) return { connected: false, offline: true, instances: [], connections: [], error: null };
42
+ const loader = options.getJsonImpl || getJson;
43
+ const requestOptions = {
44
+ env: options.env || process.env,
45
+ home: options.home,
46
+ explicit: options.token || '',
47
+ fetchImpl: options.fetchImpl,
48
+ };
49
+ try {
50
+ const [instances, connections] = await Promise.all([
51
+ loader('/api/terminal/instances', requestOptions),
52
+ loader('/api/terminal/connections', requestOptions),
53
+ ]);
54
+ return {
55
+ connected: true,
56
+ offline: false,
57
+ instances: (instances?.instances || []).map(terminalInstance),
58
+ connections: (connections?.connections || []).map(terminalConnection),
59
+ error: null,
60
+ };
61
+ } catch (error) {
62
+ return { connected: false, offline: false, instances: [], connections: [], error: error?.message || String(error) };
63
+ }
64
+ }
65
+
66
+ export async function collectRuntimeStatus(options = {}) {
67
+ const cwd = options.cwd || process.cwd();
68
+ const localCollector = options.collectLocal || collectLocalStatus;
69
+ const identityCollector = options.collectIdentity || collectWhoami;
70
+ const modelCollector = options.collectModels || collectModelsStatus;
71
+ const cloudflareCollector = options.collectCloudflare || collectCloudflareDeploymentStatus;
72
+ const terminalCollector = options.collectTerminal || collectTerminalAuthorityStatus;
73
+ const offline = options.offline === true;
74
+
75
+ const local = await localCollector(cwd);
76
+ const projectConfig = options.projectConfig || tryReadProjectConfig(local.root);
77
+ const [identity, models, cloudflare] = await Promise.all([
78
+ offline
79
+ ? identityCollector({ ...options, env: options.env || process.env, contextLoader: async () => { throw new Error('offline'); } })
80
+ : identityCollector(options),
81
+ modelCollector({ ...options, discoverRemote: !offline && options.discoverModels !== false }),
82
+ cloudflareCollector({ ...options, root: local.root, projectConfig, offline }),
83
+ ]);
84
+ const terminal = identity.authenticated
85
+ ? identity.terminal?.available === true
86
+ ? {
87
+ connected: true,
88
+ offline: false,
89
+ instances: identity.terminal.instances.map(terminalInstance),
90
+ connections: identity.terminal.connections.map(terminalConnection),
91
+ error: null,
92
+ }
93
+ : await terminalCollector({ ...options, offline })
94
+ : { connected: false, offline, instances: [], connections: [], error: identity.active_auth?.error || 'account_auth_required' };
95
+
96
+ const providerModelCount = Object.values(models.providerModels || {}).reduce((total, rows) => total + (Array.isArray(rows) ? rows.length : 0), 0);
97
+ const activeConnections = terminal.connections.filter((row) => row.active);
98
+ const modelStatus = {
99
+ schemaVersion: models.schemaVersion,
100
+ generatedAt: models.generatedAt,
101
+ authority: models.authority,
102
+ providers: models.providers || [],
103
+ discovery: models.discovery || {},
104
+ local: {
105
+ online: models.local?.online === true,
106
+ endpoint: models.local?.endpoint || null,
107
+ chatModel: models.local?.chatModel || null,
108
+ embedModel: models.local?.embedModel || null,
109
+ models: (models.local?.models || []).map((row) => ({ name: row?.name || null })),
110
+ error: models.local?.error || null,
111
+ },
112
+ };
113
+ const checks = {
114
+ account: identity.authenticated === true,
115
+ models: providerModelCount > 0 || models.local?.online === true,
116
+ terminal: local.pty?.online === true || activeConnections.length > 0,
117
+ cloudflare: cloudflare.configured !== true || (
118
+ cloudflare.connected === true
119
+ && cloudflare.bindings?.match === true
120
+ && cloudflare.health?.ok === true
121
+ ),
122
+ };
123
+
124
+ return {
125
+ schema_version: 'agentsam-runtime-status-v1',
126
+ generated_at: new Date().toISOString(),
127
+ offline,
128
+ ready: Object.values(checks).every(Boolean),
129
+ local_ready: local.db?.ready === true || local.db?.exists === false,
130
+ checks,
131
+ local,
132
+ state_storage: {
133
+ runtime: 'sqlite',
134
+ project_root: local.root,
135
+ path: local.db?.path || path.join(local.root, '.agentsam/data/agentsam.sqlite'),
136
+ migrated: local.db?.ready === true,
137
+ actor_runtime: 'none',
138
+ connected_bindings: (cloudflare.bindings?.live || []).map((row) => ({ name: row.name, type: row.type })),
139
+ },
140
+ identity,
141
+ models: modelStatus,
142
+ model_summary: {
143
+ verified_provider_models: providerModelCount,
144
+ local_models: models.local?.models?.length || 0,
145
+ configured_providers: (models.providers || []).filter((row) => row.configured).map((row) => row.id),
146
+ },
147
+ terminal: {
148
+ ...terminal,
149
+ local_pty: local.pty,
150
+ active_connection_count: activeConnections.length,
151
+ },
152
+ cloudflare,
153
+ };
154
+ }