@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
package/src/cli.js CHANGED
@@ -11,6 +11,7 @@ import { printContextSummary } from './lib/detect-context.js';
11
11
  import { runStartLocal } from './commands/start-local.js';
12
12
  import { runOllama } from './commands/ollama.js';
13
13
  import { runModels } from './commands/models.js';
14
+ import { runApp } from './commands/app.js';
14
15
  import { runProviders } from './commands/providers.js';
15
16
  import { runEnv } from './commands/env.js';
16
17
  import { runTunnel } from './commands/tunnel.js';
@@ -23,6 +24,8 @@ import { runDb } from './commands/db.js';
23
24
  import { runStatus } from './commands/status.js';
24
25
  import { runInteractive } from './commands/interactive.js';
25
26
  import { runShell } from './commands/shell.js';
27
+ import { runGoap } from './commands/goap.js';
28
+ import { runBrand, runPlan } from './commands/brand.js';
26
29
  import { runDockerize } from './commands/dockerize.js';
27
30
  import { runMini } from './commands/mini.js';
28
31
  import { runMerkle } from './commands/merkle.js';
@@ -32,10 +35,13 @@ import { runRecon } from './commands/recon.js';
32
35
  import { runCad } from './commands/cad.js';
33
36
  import { runSkills } from './commands/skills.js';
34
37
  import { runEval } from './commands/eval.js';
38
+ import { runMcp } from './commands/mcp.js';
35
39
  import { runCloudflare } from './commands/cloudflare.js';
40
+ import { runGo } from './commands/go.js';
36
41
  import { runWhoami } from './commands/whoami.js';
37
42
  import { runResume } from './commands/resume.js';
38
43
  import { runLogin, runLogout } from './commands/account-auth.js';
44
+ import { runPlugins } from './commands/plugins.js';
39
45
  import { applyPresetSelection, runAdd, runCapabilities, runDev, runInspect } from './commands/product.js';
40
46
  import { listPresets, resolvePreset } from './presets/index.js';
41
47
  import fs from 'node:fs';
@@ -43,6 +49,7 @@ import { repositoryRoot } from './knowledge/config.js';
43
49
  import { resolveAccountAuth } from './lib/account-session.js';
44
50
  import { renderDiagnosticError } from './errors/index.js';
45
51
  import { renderHelpOverview, runHelp } from './ui/cli/help.js';
52
+ import { hydrateSecureCredentials } from './security/local-vault.js';
46
53
 
47
54
  const VERSION = pkg.version;
48
55
 
@@ -65,8 +72,11 @@ function printLegacyHelp() {
65
72
  agentsam Enter the interactive Agent Sam experience
66
73
  agentsam create <name> --preset <fullstack|cms|prototype|data>
67
74
  agentsam add <auth|cms|knowledge|agent|deploy-cloudflare>
75
+ agentsam plugins list|install|connect|status|remove [@agentsam-mcp]
68
76
  agentsam dev Run this project's existing npm dev script
69
77
  agentsam inspect [--json] Bounded repository index by default; use --view full for authority envelope
78
+ agentsam brand [scan|…] Deterministic brand intelligence on repository.snapshot authority
79
+ agentsam plan brand Composable brand normalization plan (--goap optional)
70
80
  agentsam deploy Graduate an AgentSam project intentionally
71
81
 
72
82
  Capability discovery:
@@ -80,12 +90,13 @@ function printLegacyHelp() {
80
90
  agentsam search "query" Retrieve indexed code/text; --semantic enables embeddings
81
91
  agentsam repo snapshot Git composition/churn; --save retains observations
82
92
  agentsam cad blender Programmatic Blender inspect/build/render/export (--help)
93
+ agentsam cad project Editable CAD project tools/workflows (--help)
83
94
  agentsam mini <name> Create and preview a small local gadget (--help for options)
84
95
  agentsam merkle File integrity, snapshots, comparisons, and interactive explorer (--help)
85
96
  agentsam deploy-receipt Merkle deploy/checkpoint capture + promote/failure receipts (--help)
86
97
  agentsam recon Bounded-worker task packets + finding-report validation (--help)
87
98
  agentsam security Dependency scan, log triage, and verified repair (--help)
88
- agentsam status [--json] Live local Git + DB + API + PTY status
99
+ agentsam status [--json] [-i] Honest awareness: account + models + terminal + live Worker
89
100
  agentsam db init|status Manage the project-local SQLite database
90
101
  agentsam models Verify configured providers and selectable hosted/local models
91
102
  agentsam providers Configure, verify, and remove machine provider credentials
@@ -96,14 +107,16 @@ function printLegacyHelp() {
96
107
  agentsam resume [session] Resume a saved Agent Sam session; omit id for picker
97
108
  agentsam eval context Offline context-strategy/economics fixtures (--help)
98
109
  agentsam cloudflare Native Wrangler reads + Worker CPU profile analysis (--help)
110
+ agentsam go Go runtime discovery/build/deploy (Cloudflare worker-container)
99
111
  agentsam start-local Local PTY on ws://127.0.0.1:3099 (no tunnel, no Cloudflare)
100
112
  agentsam ollama Opt-in local Ollama setup/status/model management
101
113
  agentsam shell Interactive Agent Sam slash-command shell
102
- agentsam tunnel Explicitly expose local PTY when remote access is wanted
114
+ agentsam tunnel Choose/list/inspect/run real Cloudflare Tunnels via Wrangler
103
115
  agentsam deploy Graduate to Cloudflare / GCP when ready
104
116
  agentsam dockerize Build/run app, knowledge, or CAD containers (--help)
105
117
  agentsam identity preview Preview the reusable local auth portal (not production login)
106
- agentsam identity init Add reusable identity package surfaces
118
+ agentsam identity init Scaffold identity app (+ optional --provider)
119
+ agentsam identity providers|plan|schema|resolve Protocol-driven identity surfaces
107
120
  agentsam help
108
121
  agentsam --version
109
122
  agentsam --help
@@ -131,11 +144,13 @@ function printLegacyHelp() {
131
144
  Run agentsam from any project to enter the account-aware interactive experience.
132
145
  Account, model-provider, terminal, and deploy permissions are requested only when the related capability needs them.
133
146
 
134
- Tunnel options:
135
- --quick Quick tunnel (default) — trycloudflare.com URL
136
- --named Named CF tunnel (needs --tunnel-name --hostname --zone-id)
137
- --port <n> Local PTY port (default 3099)
138
- --token <aak_…> Use AGENTSAM_API_KEY-compatible account credential
147
+ Tunnel commands:
148
+ agentsam tunnel Guided picker over Wrangler-visible tunnels
149
+ agentsam tunnel list List real Cloudflare Tunnels
150
+ agentsam tunnel info <id> Inspect one tunnel
151
+ agentsam tunnel run <id> Run/start a connector on this machine
152
+ agentsam tunnel create <name>
153
+ agentsam tunnel quick-start [url]
139
154
 
140
155
  Init options:
141
156
  --name <name> Project directory name
@@ -300,6 +315,8 @@ async function initFromArgs(argv) {
300
315
  const command = process.argv[2];
301
316
  const rest = process.argv.slice(3);
302
317
 
318
+ hydrateSecureCredentials(process.env);
319
+
303
320
  if (command === '--version' || command === '-v') {
304
321
  console.log(VERSION);
305
322
  } else if (command === 'help') {
@@ -333,6 +350,12 @@ if (command === '--version' || command === '-v') {
333
350
  } else if (command === 'add') {
334
351
  try { await runAdd(rest); }
335
352
  catch (e) { reportCliError(e); process.exitCode = 1; }
353
+ } else if (command === 'plugins') {
354
+ try { await runPlugins(rest); }
355
+ catch (e) { reportCliError(e); process.exitCode = 1; }
356
+ } else if (command === 'install' && rest[0] === 'plugins') {
357
+ try { await runPlugins(['install', rest[1] || 'agentsam-mcp', ...rest.slice(2)]); }
358
+ catch (e) { reportCliError(e); process.exitCode = 1; }
336
359
  } else if (command === 'dev') {
337
360
  try { await runDev(rest); }
338
361
  catch (e) { reportCliError(e); process.exitCode = 1; }
@@ -370,6 +393,13 @@ if (command === '--version' || command === '-v') {
370
393
  reportCliError(e);
371
394
  process.exit(1);
372
395
  }
396
+ } else if (command === 'app' || command === 'apps') {
397
+ try {
398
+ await runApp(rest);
399
+ } catch (e) {
400
+ reportCliError(e);
401
+ process.exit(1);
402
+ }
373
403
  } else if (command === 'providers') {
374
404
  try {
375
405
  await runProviders(rest);
@@ -391,6 +421,13 @@ if (command === '--version' || command === '-v') {
391
421
  reportCliError(e);
392
422
  process.exit(1);
393
423
  }
424
+ } else if (command === 'mcp') {
425
+ try {
426
+ await runMcp(rest);
427
+ } catch (e) {
428
+ reportCliError(e);
429
+ process.exitCode = 1;
430
+ }
394
431
  } else if (command === 'cloudflare' || command === 'cf') {
395
432
  try {
396
433
  await runCloudflare(rest);
@@ -398,6 +435,13 @@ if (command === '--version' || command === '-v') {
398
435
  if (!e?.reported) reportCliError(e);
399
436
  process.exitCode = 1;
400
437
  }
438
+ } else if (command === 'go') {
439
+ try {
440
+ await runGo(rest);
441
+ } catch (e) {
442
+ if (!e?.reported) reportCliError(e);
443
+ process.exitCode = 1;
444
+ }
401
445
  } else if (command === 'login') {
402
446
  try {
403
447
  await runLogin(rest);
@@ -433,6 +477,30 @@ if (command === '--version' || command === '-v') {
433
477
  reportCliError(e);
434
478
  process.exit(1);
435
479
  }
480
+ } else if (command === 'goap') {
481
+ try {
482
+ await runGoap(rest[0], {
483
+ cwd: process.cwd(),
484
+ json: rest.includes('--json'), args: rest.slice(1),
485
+ });
486
+ } catch (e) {
487
+ reportCliError(e);
488
+ process.exitCode = 1;
489
+ }
490
+ } else if (command === 'brand') {
491
+ try {
492
+ await runBrand(rest);
493
+ } catch (e) {
494
+ reportCliError(e);
495
+ process.exitCode = 1;
496
+ }
497
+ } else if (command === 'plan') {
498
+ try {
499
+ await runPlan(rest);
500
+ } catch (e) {
501
+ reportCliError(e);
502
+ process.exitCode = 1;
503
+ }
436
504
  } else if (command === 'start-local') {
437
505
  await runStartLocal({});
438
506
  } else if (command === 'ollama') {
@@ -499,6 +567,9 @@ if (command === '--version' || command === '-v') {
499
567
  reportCliError(e);
500
568
  process.exitCode = 1;
501
569
  }
570
+ } else if (command === 'autorag') {
571
+ try { await (await import('./commands/autorag.js')).runAutoRag(rest); }
572
+ catch (e) { reportCliError(e); process.exitCode = 1; }
502
573
  } else if (['index', 'search', 'repo'].includes(command)) {
503
574
  try {
504
575
  const commands = await import('./commands/knowledge.js');
@@ -514,6 +585,7 @@ if (command === '--version' || command === '-v') {
514
585
  } catch (e) { reportCliError(e); process.exitCode = 1; }
515
586
  } else if (command === 'identity') {
516
587
  const sub = rest[0];
588
+ const identityProtocol = await import('./commands/identity-protocol.js');
517
589
  if (sub === 'preview') {
518
590
  try {
519
591
  await runIdentityPreview(rest.slice(1));
@@ -528,8 +600,44 @@ if (command === '--version' || command === '-v') {
528
600
  reportCliError(e);
529
601
  process.exit(1);
530
602
  }
603
+ } else if (sub === 'providers') {
604
+ try {
605
+ await identityProtocol.runIdentityProviders(rest.slice(1));
606
+ } catch (e) {
607
+ reportCliError(e);
608
+ process.exit(1);
609
+ }
610
+ } else if (sub === 'plan') {
611
+ try {
612
+ await identityProtocol.runIdentityPlan(rest.slice(1));
613
+ } catch (e) {
614
+ reportCliError(e);
615
+ process.exit(1);
616
+ }
617
+ } else if (sub === 'schema') {
618
+ try {
619
+ await identityProtocol.runIdentitySchema(rest.slice(1));
620
+ } catch (e) {
621
+ reportCliError(e);
622
+ process.exit(1);
623
+ }
624
+ } else if (sub === 'resolve') {
625
+ try {
626
+ await identityProtocol.runIdentityResolve(rest.slice(1));
627
+ } catch (e) {
628
+ reportCliError(e);
629
+ process.exit(1);
630
+ }
531
631
  } else {
532
- console.error('\n Usage:\n agentsam identity preview [--open] [--port 8791]\n agentsam identity init --name <project> [--brand "Name"]\n');
632
+ identityProtocol.printIdentityHelp();
633
+ process.exit(1);
634
+ }
635
+ } else if (command === 'scaffold') {
636
+ try {
637
+ const { runScaffold } = await import('./lib/scaffold/index.js');
638
+ await runScaffold(rest[0] ?? null);
639
+ } catch (e) {
640
+ reportCliError(e);
533
641
  process.exit(1);
534
642
  }
535
643
  } else {
@@ -6,6 +6,12 @@ export {
6
6
  parseWranglerErrorEvidence,
7
7
  runWranglerNative,
8
8
  } from './wrangler.js';
9
+ export {
10
+ readCloudflareDeploymentContract,
11
+ collectCloudflareDeploymentStatus,
12
+ parseWranglerToml,
13
+ resolveProjectD1Database,
14
+ } from './runtime-status.js';
9
15
  export {
10
16
  summarizeCloudflareCpuProfile,
11
17
  summarizeCloudflareCpuProfileFile,
@@ -0,0 +1,393 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { runWranglerNative } from './wrangler.js';
4
+
5
+ function clean(value) { return value == null ? '' : String(value).trim(); }
6
+
7
+ function parseJsonc(source) {
8
+ let output = '';
9
+ let string = false;
10
+ let escaped = false;
11
+ let lineComment = false;
12
+ let blockComment = false;
13
+ for (let index = 0; index < source.length; index += 1) {
14
+ const char = source[index];
15
+ const next = source[index + 1];
16
+ if (lineComment) {
17
+ if (char === '\n') { lineComment = false; output += char; }
18
+ continue;
19
+ }
20
+ if (blockComment) {
21
+ if (char === '*' && next === '/') { blockComment = false; index += 1; }
22
+ continue;
23
+ }
24
+ if (string) {
25
+ output += char;
26
+ if (escaped) escaped = false;
27
+ else if (char === '\\') escaped = true;
28
+ else if (char === '"') string = false;
29
+ continue;
30
+ }
31
+ if (char === '"') { string = true; output += char; continue; }
32
+ if (char === '/' && next === '/') { lineComment = true; index += 1; continue; }
33
+ if (char === '/' && next === '*') { blockComment = true; index += 1; continue; }
34
+ output += char;
35
+ }
36
+ return JSON.parse(output.replace(/,\s*([}\]])/g, '$1'));
37
+ }
38
+
39
+ export function parseWranglerToml(source = '') {
40
+ const result = { vars: {}, d1_databases: [], r2_buckets: [], hyperdrive: [], kv_namespaces: [], services: [] };
41
+ const lines = source.split(/\r?\n/);
42
+ let currentSection = '';
43
+ let currentBlock = null;
44
+
45
+ for (let line of lines) {
46
+ line = line.replace(/#.*$/, '').trim();
47
+ if (!line) continue;
48
+
49
+ const arrMatch = line.match(/^\[\[([a-zA-Z0-9_.]+)\]\]$/);
50
+ if (arrMatch) {
51
+ currentSection = arrMatch[1];
52
+ currentBlock = {};
53
+ if (currentSection === 'd1_databases') result.d1_databases.push(currentBlock);
54
+ else if (currentSection === 'r2_buckets') result.r2_buckets.push(currentBlock);
55
+ else if (currentSection === 'hyperdrive') result.hyperdrive.push(currentBlock);
56
+ else if (currentSection === 'kv_namespaces') result.kv_namespaces.push(currentBlock);
57
+ else if (currentSection === 'services') result.services.push(currentBlock);
58
+ continue;
59
+ }
60
+
61
+ const tableMatch = line.match(/^\[([a-zA-Z0-9_.]+)\]$/);
62
+ if (tableMatch) {
63
+ currentSection = tableMatch[1];
64
+ currentBlock = null;
65
+ if (currentSection === 'ai' && !result.ai) result.ai = {};
66
+ if (currentSection === 'assets' && !result.assets) result.assets = {};
67
+ continue;
68
+ }
69
+
70
+ const kvMatch = line.match(/^([a-zA-Z0-9_.-]+)\s*=\s*(.*)$/);
71
+ if (kvMatch) {
72
+ const key = kvMatch[1].trim();
73
+ let rawVal = kvMatch[2].trim();
74
+ let val = rawVal;
75
+ if ((rawVal.startsWith('"') && rawVal.endsWith('"')) || (rawVal.startsWith("'") && rawVal.endsWith("'"))) {
76
+ val = rawVal.slice(1, -1);
77
+ } else if (rawVal === 'true') {
78
+ val = true;
79
+ } else if (rawVal === 'false') {
80
+ val = false;
81
+ } else if (/^\d+$/.test(rawVal)) {
82
+ val = parseInt(rawVal, 10);
83
+ }
84
+
85
+ if (currentBlock) {
86
+ currentBlock[key] = val;
87
+ } else if (currentSection === 'vars') {
88
+ result.vars[key] = val;
89
+ } else if (currentSection === 'ai') {
90
+ result.ai[key] = val;
91
+ } else if (currentSection === 'assets') {
92
+ result.assets[key] = val;
93
+ } else if (!currentSection) {
94
+ result[key] = val;
95
+ }
96
+ }
97
+ }
98
+ return result;
99
+ }
100
+
101
+ function declaredBindings(config = {}) {
102
+ const rows = [];
103
+ const add = (row = {}) => {
104
+ const name = clean(row.name);
105
+ if (name) rows.push({ ...row, name });
106
+ };
107
+
108
+ for (const [name, value] of Object.entries(config.vars || {})) {
109
+ add({
110
+ name,
111
+ type: typeof value === 'object' && value !== null ? 'json' : 'plain_text',
112
+ value: typeof value === 'object' && value !== null ? JSON.stringify(value) : String(value),
113
+ source: 'wrangler_config',
114
+ });
115
+ }
116
+
117
+ for (const name of config.secrets?.required || []) {
118
+ add({ name, type: 'secret_text', encrypted: true, source: 'wrangler_required_secret' });
119
+ }
120
+
121
+ for (const row of config.d1_databases || []) add({
122
+ name: row?.binding,
123
+ type: 'd1',
124
+ database_name: clean(row?.database_name) || null,
125
+ database_id: clean(row?.database_id) || null,
126
+ source: 'wrangler_config',
127
+ });
128
+ for (const row of config.hyperdrive || []) add({
129
+ name: row?.binding,
130
+ type: 'hyperdrive',
131
+ id: clean(row?.id) || null,
132
+ source: 'wrangler_config',
133
+ });
134
+ for (const row of config.r2_buckets || []) add({
135
+ name: row?.binding,
136
+ type: 'r2_bucket',
137
+ bucket_name: clean(row?.bucket_name) || null,
138
+ source: 'wrangler_config',
139
+ });
140
+ for (const row of config.services || []) add({
141
+ name: row?.binding,
142
+ type: 'service',
143
+ service: clean(row?.service) || null,
144
+ environment: clean(row?.environment) || null,
145
+ entrypoint: clean(row?.entrypoint) || null,
146
+ source: 'wrangler_config',
147
+ });
148
+ for (const row of config.vpc_services || []) add({
149
+ name: row?.binding,
150
+ type: 'vpc_service',
151
+ service_id: clean(row?.service_id) || null,
152
+ source: 'wrangler_config',
153
+ });
154
+ if (config.ai?.binding) add({ name: config.ai.binding, type: 'ai', source: 'wrangler_config' });
155
+ if (config.assets?.binding) add({
156
+ name: config.assets.binding,
157
+ type: 'assets',
158
+ directory: clean(config.assets?.directory) || null,
159
+ source: 'wrangler_config',
160
+ });
161
+ for (const row of config.kv_namespaces || []) add({
162
+ name: row?.binding,
163
+ type: 'kv_namespace',
164
+ id: clean(row?.id) || null,
165
+ source: 'wrangler_config',
166
+ });
167
+ for (const row of config.vectorize || []) add({
168
+ name: row?.binding,
169
+ type: 'vectorize',
170
+ index_name: clean(row?.index_name) || null,
171
+ source: 'wrangler_config',
172
+ });
173
+ const queueProducers = Array.isArray(config.queues?.producers) ? config.queues.producers : [];
174
+ for (const row of queueProducers) add({
175
+ name: row?.binding,
176
+ type: 'queue',
177
+ queue_name: clean(row?.queue) || null,
178
+ source: 'wrangler_config',
179
+ });
180
+
181
+ return rows.sort((left, right) => left.name.localeCompare(right.name));
182
+ }
183
+
184
+ function safeLiveBinding(row = {}) {
185
+ const name = clean(row?.name);
186
+ const type = clean(row?.type);
187
+ if (!name) return null;
188
+
189
+ const output = { name, type: type || 'unknown', source: 'cloudflare_live_version' };
190
+ if (type === 'secret_text' || type === 'secret_key') {
191
+ output.encrypted = true;
192
+ return output;
193
+ }
194
+
195
+ if (type === 'plain_text') {
196
+ const value = row?.text ?? row?.value;
197
+ if (value != null) output.value = String(value);
198
+ } else if (type === 'json') {
199
+ const value = row?.json ?? row?.value;
200
+ if (value != null) output.value = typeof value === 'string' ? value : JSON.stringify(value);
201
+ }
202
+
203
+ for (const key of [
204
+ 'id',
205
+ 'database_id',
206
+ 'database_name',
207
+ 'bucket_name',
208
+ 'service',
209
+ 'environment',
210
+ 'entrypoint',
211
+ 'service_id',
212
+ 'index_name',
213
+ 'namespace',
214
+ 'class_name',
215
+ 'script_name',
216
+ 'store_id',
217
+ 'secret_name',
218
+ ]) {
219
+ const value = row?.[key];
220
+ if (value != null && clean(value)) output[key] = clean(value);
221
+ }
222
+
223
+ return output;
224
+ }
225
+
226
+ function bindingCategory(row = {}) {
227
+ const type = clean(row?.type);
228
+ if (type === 'secret_text' || type === 'secret_key') return 'secret';
229
+ if (type === 'plain_text' || type === 'json') return 'variable';
230
+ return 'resource';
231
+ }
232
+
233
+ export function readCloudflareDeploymentContract(root, projectConfig = {}) {
234
+ const deployment = projectConfig?.deployment?.cloudflare || {};
235
+ let workerName = clean(deployment.worker_name);
236
+ let relativeConfig = clean(deployment.config);
237
+ let configPath = relativeConfig ? path.resolve(root, relativeConfig) : null;
238
+
239
+ // Auto-discover candidate wrangler config when not explicitly specified
240
+ if (!workerName && !configPath) {
241
+ const candidates = [
242
+ 'wrangler.jsonc',
243
+ 'wrangler.json',
244
+ 'wrangler.toml',
245
+ 'backend/wrangler.jsonc',
246
+ 'backend/wrangler.json',
247
+ 'backend/wrangler.toml',
248
+ 'worker/wrangler.jsonc',
249
+ 'worker/wrangler.json',
250
+ 'worker/wrangler.toml',
251
+ 'apps/local-studio/backend/wrangler.jsonc',
252
+ ];
253
+ for (const rel of candidates) {
254
+ const candidatePath = path.resolve(root, rel);
255
+ if (fs.existsSync(candidatePath)) {
256
+ try {
257
+ const raw = fs.readFileSync(candidatePath, 'utf8');
258
+ const parsed = rel.endsWith('.toml') ? parseWranglerToml(raw) : parseJsonc(raw);
259
+ if (clean(parsed?.name)) {
260
+ workerName = clean(parsed.name);
261
+ relativeConfig = rel;
262
+ configPath = candidatePath;
263
+ break;
264
+ }
265
+ } catch {
266
+ // ignore candidate error
267
+ }
268
+ }
269
+ }
270
+ }
271
+
272
+ if (!workerName && !configPath) return { configured: false, worker_name: null, config: null, bindings: [], routes: [], health_url: null };
273
+ if (!workerName || !configPath) throw new Error('cloudflare_deployment_contract_incomplete');
274
+ if (configPath !== path.resolve(root) && !configPath.startsWith(`${path.resolve(root)}${path.sep}`)) throw new Error('cloudflare_deployment_config_outside_project');
275
+ const rawSource = fs.readFileSync(configPath, 'utf8');
276
+ const parsed = configPath.endsWith('.toml') ? parseWranglerToml(rawSource) : parseJsonc(rawSource);
277
+ if (clean(parsed.name) !== workerName) throw new Error(`cloudflare_worker_name_mismatch:${workerName}:${clean(parsed.name) || 'missing'}`);
278
+ const routes = (parsed.routes || []).map((row) => typeof row === 'string' ? row : clean(row?.pattern)).filter(Boolean);
279
+ const customDomain = routes.find((value) => !value.includes('*')) || '';
280
+ return {
281
+ configured: true,
282
+ worker_name: workerName,
283
+ config: relativeConfig,
284
+ config_path: configPath,
285
+ bindings: declaredBindings(parsed),
286
+ routes,
287
+ health_url: clean(deployment.health_url) || (customDomain ? `https://${customDomain}/health` : null),
288
+ };
289
+ }
290
+
291
+ export function resolveProjectD1Database(root = process.cwd()) {
292
+ try {
293
+ const contract = readCloudflareDeploymentContract(root);
294
+ if (contract?.bindings) {
295
+ const dbBinding = contract.bindings.find((b) => b.name === 'DB' && b.type === 'd1')
296
+ || contract.bindings.find((b) => b.type === 'd1');
297
+ if (dbBinding) {
298
+ return clean(dbBinding.database_name) || clean(dbBinding.name) || '';
299
+ }
300
+ }
301
+ } catch {
302
+ // ignore
303
+ }
304
+ return clean(process.env.DB) || '';
305
+ }
306
+
307
+ function newest(rows = [], dateAt) {
308
+ return [...rows].sort((left, right) => Date.parse(dateAt(right) || 0) - Date.parse(dateAt(left) || 0))[0] || null;
309
+ }
310
+
311
+ async function probeHealth(url, fetchImpl) {
312
+ if (!url) return { configured: false, ok: null, status: null, url: null, data: null, error: null };
313
+ try {
314
+ const response = await fetchImpl(url, { headers: { accept: 'application/json' }, signal: AbortSignal.timeout(8_000) });
315
+ const data = await response.json().catch(() => null);
316
+ return { configured: true, ok: response.ok && data?.ok !== false, status: response.status, url, data, error: null };
317
+ } catch (error) {
318
+ return { configured: true, ok: false, status: null, url, data: null, error: error?.message || String(error) };
319
+ }
320
+ }
321
+
322
+ export async function collectCloudflareDeploymentStatus(options = {}) {
323
+ const root = path.resolve(options.root || options.cwd || process.cwd());
324
+ let contract;
325
+ try {
326
+ contract = readCloudflareDeploymentContract(root, options.projectConfig || {});
327
+ } catch (error) {
328
+ return { configured: true, connected: false, contract_error: error?.message || String(error), worker_name: null, bindings: null, health: null, error: 'deployment_contract_invalid' };
329
+ }
330
+ if (!contract.configured) return { ...contract, connected: false, offline: options.offline === true, bindings: null, health: null, error: null };
331
+ if (options.offline === true) return { ...contract, connected: false, offline: true, bindings: null, health: null, error: null };
332
+
333
+ const runner = options.runWrangler || runWranglerNative;
334
+ const base = { cwd: root, config: contract.config, name: contract.worker_name };
335
+ try {
336
+ const [identity, deployments, versions, health] = await Promise.all([
337
+ runner('whoami', base),
338
+ runner('deployments.list', base),
339
+ runner('versions.list', base),
340
+ probeHealth(contract.health_url, options.fetchImpl || fetch),
341
+ ]);
342
+ const deploymentRows = Array.isArray(deployments?.data) ? deployments.data : [];
343
+ const versionRows = Array.isArray(versions?.data) ? versions.data : [];
344
+ const activeDeployment = newest(deploymentRows, row => row?.created_on);
345
+ const activeVersionId = clean(activeDeployment?.versions?.find((row) => Number(row?.percentage) === 100)?.version_id)
346
+ || clean(newest(versionRows, row => row?.metadata?.created_on)?.id);
347
+ const version = activeVersionId ? await runner('versions.view', { ...base, version_id: activeVersionId }) : null;
348
+ const rawLiveBindings = Array.isArray(version?.data?.resources?.bindings)
349
+ ? version.data.resources.bindings
350
+ : Array.isArray(version?.data?.bindings)
351
+ ? version.data.bindings
352
+ : [];
353
+ const liveBindings = rawLiveBindings.map(safeLiveBinding).filter(Boolean);
354
+ const liveByName = new Map(liveBindings.map((row) => [row.name, row]));
355
+ const missing = contract.bindings.filter((row) => !liveByName.has(row.name));
356
+ const typeMismatches = contract.bindings.filter((row) => liveByName.has(row.name) && liveByName.get(row.name).type !== row.type)
357
+ .map((row) => ({ name: row.name, declared: row.type, live: liveByName.get(row.name).type }));
358
+ const runtimeVariables = liveBindings.filter((row) => bindingCategory(row) === 'variable');
359
+ const runtimeSecrets = liveBindings.filter((row) => bindingCategory(row) === 'secret');
360
+ const resourceBindings = liveBindings.filter((row) => bindingCategory(row) === 'resource');
361
+ return {
362
+ ...contract,
363
+ connected: true,
364
+ offline: false,
365
+ identity: identity?.data ? {
366
+ logged_in: identity.data.loggedIn === true,
367
+ auth_type: identity.data.authType || null,
368
+ accounts: (identity.data.accounts || []).map((row) => ({ id: row?.id || null, name: row?.name || null, type: row?.type || null })),
369
+ } : null,
370
+ deployment: activeDeployment,
371
+ version: version?.data ? {
372
+ id: version.data.id || activeVersionId,
373
+ number: version.data.number ?? null,
374
+ created_on: version.data.metadata?.created_on || null,
375
+ source: version.data.metadata?.source || null,
376
+ } : null,
377
+ bindings: {
378
+ declared: contract.bindings,
379
+ live: liveBindings,
380
+ runtime_variables: runtimeVariables,
381
+ runtime_secrets: runtimeSecrets,
382
+ resources: resourceBindings,
383
+ missing,
384
+ type_mismatches: typeMismatches,
385
+ match: missing.length === 0 && typeMismatches.length === 0,
386
+ },
387
+ health,
388
+ error: null,
389
+ };
390
+ } catch (error) {
391
+ return { ...contract, connected: false, offline: false, bindings: null, health: await probeHealth(contract.health_url, options.fetchImpl || fetch), error: error?.message || String(error) };
392
+ }
393
+ }