@inneranimalmedia/agentsam-sdk 2.6.1 → 2.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (507) hide show
  1. package/AGENTSAM.md +45 -1
  2. package/README.md +80 -0
  3. package/apps/README.md +34 -0
  4. package/apps/cad-creator/README.md +728 -0
  5. package/apps/cad-creator/shared/cad/package.json +19 -0
  6. package/apps/cad-creator/shared/cad/src/domain/operations.ts +7 -0
  7. package/apps/cad-creator/shared/cad/src/domain/project-contract.d.ts +3 -0
  8. package/apps/cad-creator/shared/cad/src/domain/project-contract.js +75 -0
  9. package/apps/cad-creator/shared/cad/src/domain/project-tools.d.ts +1 -0
  10. package/apps/cad-creator/shared/cad/src/domain/project-tools.js +24 -0
  11. package/apps/cad-creator/shared/cad/src/domain/validation.ts +191 -0
  12. package/apps/cad-creator/shared/cad/src/index.ts +4 -0
  13. package/apps/cad-creator/shared/cad/src/robotics/types.ts +232 -0
  14. package/apps/cad-creator/shared/cad/src/types.ts +507 -0
  15. package/apps/cad-creator/shared/cad/tsconfig.json +14 -0
  16. package/docs/AUTH_IDENTITY_CONTRACT.md +25 -27
  17. package/docs/AUTORAG.md +58 -0
  18. package/docs/BRAND_INTELLIGENCE.md +30 -0
  19. package/docs/CLI_SHELL.md +4 -2
  20. package/docs/CMS_CONTEXTUAL_COMPOSER.md +38 -0
  21. package/docs/MERKLE.md +4 -0
  22. package/docs/PROJECT_CONFIG.md +3 -0
  23. package/docs/REPOSITORY_KNOWLEDGE.md +2 -0
  24. package/docs/SDK_WORKER.md +4 -3
  25. package/docs/THEME_REFINERY.md +120 -0
  26. package/docs/architecture/PROVIDER-TOOLS-AND-COMPACTION.md +60 -0
  27. package/docs/architecture/STORAGE.md +87 -0
  28. package/docs/cad-project-tools.md +69 -0
  29. package/docs/cms-scaffolding-pattern-reference.md +73 -0
  30. package/docs/plans/AGENTSAM-INTERACTIVE-UI-REQUIREMENTS-codex-tui-20260919.md +113 -0
  31. package/docs/plans/AGENTSAM-INTERACTIVE-UI-REQUIREMENTS.md +85 -0
  32. package/docs/plans/AGENTSAM-MCP-CLIENT-2026-09-19.md +181 -0
  33. package/docs/plans/ASBD-PORTABLE-WORKGRAPH-UI-DEFERRED.md +34 -0
  34. package/docs/plans/ASTRA-BRIEF-2026-09-18.md +258 -0
  35. package/docs/plans/MULTI-AGENT-SPRINTS-2026-09-19.md +373 -0
  36. package/docs/plans/NEXT-AGENT-HANDOFF.md +167 -0
  37. package/docs/plans/RECONCILIATION-2026-09-19.md +178 -0
  38. package/docs/plugins.md +43 -0
  39. package/docs/tools/README.md +57 -0
  40. package/docs/tools/agent-and-orchestration.md +49 -0
  41. package/docs/tools/browser-and-research.md +46 -0
  42. package/docs/tools/cloudflare-platform.md +32 -0
  43. package/docs/tools/cms.md +25 -0
  44. package/docs/tools/communications.md +41 -0
  45. package/docs/tools/database-and-storage.md +62 -0
  46. package/docs/tools/design-and-media.md +64 -0
  47. package/docs/tools/filesystem-and-code.md +55 -0
  48. package/docs/tools/github.md +56 -0
  49. package/docs/tools/integrations-and-misc.md +16 -0
  50. package/docs/tools/memory.md +21 -0
  51. package/docs/tools/terminal-and-execution.md +29 -0
  52. package/docs/tools/tickets-and-platform.md +30 -0
  53. package/migrations/d1/0001_agentsam_plugin_runtime.sql +177 -0
  54. package/migrations/d1/0002_agentsam_ticket_ownership.sql +8 -0
  55. package/migrations/d1/0002_dynamic_model_policies.sql +23 -0
  56. package/migrations/d1/0003_expand_tool_handler_families.sql +18 -0
  57. package/migrations/d1/0004_project_aware_retrieval_lanes.sql +24 -0
  58. package/migrations/d1/0005_portable_knowledge_identity.sql +104 -0
  59. package/migrations/d1/0006_repair_ops_trail_account_scope.sql +14 -0
  60. package/migrations/d1/0007_repair_ops_trail_agent_run_account.sql +13 -0
  61. package/migrations/d1/0008_backfill_knowledge_run_legacy_tenant.sql +14 -0
  62. package/migrations/d1/0009_normalize_cloudflare_plugin_installations.sql +137 -0
  63. package/migrations/runtime/0001_cli_runtime.sql +67 -0
  64. package/migrations/runtime/0002_project_sessions.sql +15 -0
  65. package/migrations/runtime/0003_provider_continuations.sql +8 -0
  66. package/package.json +92 -12
  67. package/packages/agentsam-brand/README.md +21 -0
  68. package/packages/agentsam-brand/package.json +22 -0
  69. package/packages/agentsam-brand/src/contract.js +59 -0
  70. package/packages/agentsam-brand/src/extract.js +126 -0
  71. package/packages/agentsam-brand/src/goap-actions.js +73 -0
  72. package/packages/agentsam-brand/src/index.js +48 -0
  73. package/packages/agentsam-brand/src/plan.js +115 -0
  74. package/packages/agentsam-brand/src/resolve.js +139 -0
  75. package/packages/agentsam-brand/src/scan.js +250 -0
  76. package/packages/agentsam-brand/test/brand-scan.test.mjs +106 -0
  77. package/packages/agentsam-contracts/README.md +23 -0
  78. package/packages/agentsam-contracts/package.json +32 -0
  79. package/packages/agentsam-contracts/src/adapter.ts +25 -0
  80. package/packages/agentsam-contracts/src/agent.ts +35 -0
  81. package/packages/agentsam-contracts/src/artifacts.ts +33 -0
  82. package/packages/agentsam-contracts/src/authority.ts +29 -0
  83. package/packages/agentsam-contracts/src/context.ts +16 -0
  84. package/packages/agentsam-contracts/src/errors.ts +46 -0
  85. package/packages/agentsam-contracts/src/events.ts +47 -0
  86. package/packages/agentsam-contracts/src/execution.ts +50 -0
  87. package/packages/agentsam-contracts/src/hooks.ts +40 -0
  88. package/packages/agentsam-contracts/src/identity.ts +16 -0
  89. package/packages/agentsam-contracts/src/index.ts +14 -0
  90. package/packages/agentsam-contracts/src/models.ts +9 -0
  91. package/packages/agentsam-contracts/src/providers.ts +33 -0
  92. package/packages/agentsam-contracts/src/repository.ts +64 -0
  93. package/packages/agentsam-contracts/src/tools.ts +98 -0
  94. package/packages/agentsam-contracts/test/contracts.test.mjs +16 -0
  95. package/packages/agentsam-contracts/test/errors-catalog.test.mjs +25 -0
  96. package/packages/agentsam-contracts/test/repository.test.mjs +18 -0
  97. package/packages/agentsam-contracts/tsconfig.json +12 -0
  98. package/packages/agentsam-errors/package.json +17 -0
  99. package/packages/agentsam-errors/src/adapters/anthropic.js +15 -0
  100. package/packages/agentsam-errors/src/adapters/cad.js +109 -0
  101. package/packages/agentsam-errors/src/adapters/cloudflare.js +21 -0
  102. package/packages/agentsam-errors/src/adapters/cursor.js +4 -0
  103. package/packages/agentsam-errors/src/adapters/device.js +38 -0
  104. package/packages/agentsam-errors/src/adapters/docker.js +28 -0
  105. package/packages/agentsam-errors/src/adapters/gcp.js +14 -0
  106. package/packages/agentsam-errors/src/adapters/github.js +22 -0
  107. package/packages/agentsam-errors/src/adapters/google.js +17 -0
  108. package/packages/agentsam-errors/src/adapters/index.js +55 -0
  109. package/packages/agentsam-errors/src/adapters/internal.js +40 -0
  110. package/packages/agentsam-errors/src/adapters/oauth.js +24 -0
  111. package/packages/agentsam-errors/src/adapters/openai.js +17 -0
  112. package/packages/agentsam-errors/src/adapters/process.js +35 -0
  113. package/packages/agentsam-errors/src/adapters/provider.js +114 -0
  114. package/packages/agentsam-errors/src/envelope.js +186 -0
  115. package/packages/agentsam-errors/src/error.js +24 -0
  116. package/packages/agentsam-errors/src/fingerprint.js +35 -0
  117. package/packages/agentsam-errors/src/index.js +10 -0
  118. package/packages/agentsam-errors/src/normalize.js +30 -0
  119. package/packages/agentsam-errors/src/redaction.js +52 -0
  120. package/packages/agentsam-errors/src/render.js +16 -0
  121. package/packages/agentsam-errors/src/retry.js +10 -0
  122. package/packages/agentsam-errors/src/transport.js +52 -0
  123. package/packages/agentsam-errors/src/vocabulary.js +320 -0
  124. package/packages/agentsam-errors/test/envelope.test.mjs +70 -0
  125. package/packages/agentsam-errors/test/providers.test.mjs +99 -0
  126. package/packages/agentsam-errors/test/redaction.test.mjs +21 -0
  127. package/packages/agentsam-errors/test/runtime-cad-device.test.mjs +76 -0
  128. package/packages/agentsam-errors/test/transport.test.mjs +46 -0
  129. package/packages/agentsam-knowledge/package.json +15 -0
  130. package/packages/agentsam-knowledge/src/autorag/index.js +64 -0
  131. package/packages/agentsam-knowledge/src/backends/index.js +26 -0
  132. package/packages/agentsam-knowledge/src/index.js +3 -0
  133. package/packages/agentsam-knowledge/src/providers/index.js +95 -0
  134. package/packages/agentsam-knowledge/test/autorag.test.mjs +42 -0
  135. package/packages/agentsam-nav/README.md +40 -0
  136. package/packages/agentsam-nav/dist/Nav.d.ts +43 -0
  137. package/packages/agentsam-nav/dist/NavCollapsible.d.ts +10 -0
  138. package/packages/agentsam-nav/dist/NavContent.d.ts +2 -0
  139. package/packages/agentsam-nav/dist/NavFooter.d.ts +2 -0
  140. package/packages/agentsam-nav/dist/NavGroup.d.ts +3 -0
  141. package/packages/agentsam-nav/dist/NavHeader.d.ts +2 -0
  142. package/packages/agentsam-nav/dist/NavMenu.d.ts +22 -0
  143. package/packages/agentsam-nav/dist/NavProvider.d.ts +35 -0
  144. package/packages/agentsam-nav/dist/NavTrigger.d.ts +2 -0
  145. package/packages/agentsam-nav/dist/Surfaces.d.ts +41 -0
  146. package/packages/agentsam-nav/dist/browser.d.ts +11 -0
  147. package/packages/agentsam-nav/dist/browser.global.js +132 -0
  148. package/packages/agentsam-nav/dist/browser.js +613 -0
  149. package/packages/agentsam-nav/dist/contracts.d.ts +76 -0
  150. package/packages/agentsam-nav/dist/index.d.ts +11 -0
  151. package/packages/agentsam-nav/dist/index.js +614 -0
  152. package/packages/agentsam-nav/dist/legacy.css +83 -0
  153. package/packages/agentsam-nav/dist/shell.css +113 -0
  154. package/packages/agentsam-nav/dist/theme.css +113 -0
  155. package/packages/agentsam-nav/dist/utils.d.ts +1 -0
  156. package/packages/agentsam-nav/package.json +43 -0
  157. package/packages/agentsam-queue-control/README.md +107 -0
  158. package/packages/agentsam-queue-control/package.json +31 -0
  159. package/packages/agentsam-queue-control/schemas/job-envelope.schema.json +56 -0
  160. package/packages/agentsam-queue-control/src/adapters/cloudflare.js +152 -0
  161. package/packages/agentsam-queue-control/src/adapters/memory.js +38 -0
  162. package/packages/agentsam-queue-control/src/contracts.js +130 -0
  163. package/packages/agentsam-queue-control/src/control-plane.js +141 -0
  164. package/packages/agentsam-queue-control/src/dispatch.js +43 -0
  165. package/packages/agentsam-queue-control/src/index.js +7 -0
  166. package/packages/agentsam-queue-control/src/policy.js +88 -0
  167. package/packages/agentsam-queue-control/src/topology.js +66 -0
  168. package/packages/agentsam-queue-control/test/queue-control.test.mjs +100 -0
  169. package/packages/agentsam-repository/src/goap.js +718 -0
  170. package/packages/agentsam-repository/src/goap.js.bak-20260922011251 +670 -0
  171. package/packages/agentsam-repository/src/index.js +5 -0
  172. package/packages/agentsam-repository/src/merkle/cloudflare-persistence.js +2 -2
  173. package/packages/agentsam-repository/src/tickets.js +184 -0
  174. package/packages/agentsam-repository/src/work-tracking.js +199 -0
  175. package/packages/agentsam-repository/src/workspace-state.js +176 -0
  176. package/packages/agentsam-repository/test/goap-tickets-workspace-state.test.mjs +152 -0
  177. package/packages/connectors/cloudflare/src/index.js +297 -15
  178. package/packages/connectors/cloudflare/src/owner.js +43 -40
  179. package/packages/connectors/cloudflare/src/routes.js +167 -26
  180. package/packages/connectors/cloudflare/tests/connector.test.mjs +112 -2
  181. package/packages/heuristic-theme/README.md +11 -0
  182. package/packages/heuristic-theme/package.json +25 -0
  183. package/packages/heuristic-theme/src/index.js +2 -0
  184. package/packages/heuristic-theme/src/registry.js +36 -0
  185. package/packages/heuristic-theme/src/theme.js +41 -0
  186. package/packages/heuristic-theme/test/theme.test.mjs +26 -0
  187. package/packages/identity/.agentsam/features/oauth-login-portal/agentsam.feature.json +64 -0
  188. package/packages/identity/.agentsam/features/oauth-login-portal/providers.json +96 -0
  189. package/packages/identity/.agentsam/features/oauth-login-portal/resources.json +47 -0
  190. package/packages/identity/.agentsam/features/oauth-login-portal/routes.json +74 -0
  191. package/packages/identity/.agentsam/features/oauth-login-portal/ui.json +35 -0
  192. package/packages/identity/package.json +4 -3
  193. package/packages/identity/src/adapters/cloudflare-d1/ids.js +4 -0
  194. package/packages/identity/src/adapters/cloudflare-d1/index.js +39 -1
  195. package/packages/identity/src/contracts/auth-config.js +23 -40
  196. package/packages/identity/src/contracts/provider.js +3 -2
  197. package/packages/identity/src/frontend/auth-portal/pages/login.html +7 -0
  198. package/packages/identity/src/index.js +2 -0
  199. package/packages/identity/src/oauth/credentials.js +13 -0
  200. package/packages/identity/src/oauth/iam-platform.js +5 -5
  201. package/packages/identity/src/providers/cloudflare/index.js +19 -0
  202. package/packages/identity/src/providers/cloudflare/mapper.js +21 -0
  203. package/packages/identity/src/providers/cloudflare/oauth.js +48 -0
  204. package/packages/identity/src/providers/cloudflare/profile.js +28 -0
  205. package/packages/identity/src/providers/index.js +18 -2
  206. package/packages/identity/src/server/identity-service.js +13 -3
  207. package/packages/identity/src/server/worker-router.js +63 -8
  208. package/packages/identity/tests/auth-config.test.mjs +14 -23
  209. package/packages/identity/tests/identity-service.test.mjs +15 -0
  210. package/packages/providers/completeful/README.md +38 -0
  211. package/packages/providers/completeful/package.json +29 -0
  212. package/packages/providers/completeful/src/client.js +162 -0
  213. package/packages/providers/completeful/src/events.js +49 -0
  214. package/packages/providers/completeful/src/index.js +22 -0
  215. package/packages/providers/completeful/src/tools.js +579 -0
  216. package/packages/providers/completeful/src/webhooks.js +55 -0
  217. package/packages/providers/completeful/test/provider.test.mjs +196 -0
  218. package/packages/theme-church-site/README.md +10 -0
  219. package/packages/theme-church-site/package.json +30 -0
  220. package/packages/theme-church-site/src/harvest.json +14 -0
  221. package/packages/theme-church-site/src/index.js +84 -0
  222. package/packages/theme-church-site/test/theme.test.mjs +19 -0
  223. package/packages/theme-companions-site/README.md +10 -0
  224. package/packages/theme-companions-site/package.json +30 -0
  225. package/packages/theme-companions-site/src/harvest.json +12 -0
  226. package/packages/theme-companions-site/src/index.js +82 -0
  227. package/packages/theme-companions-site/test/theme.test.mjs +19 -0
  228. package/packages/theme-floors-site/README.md +10 -0
  229. package/packages/theme-floors-site/package.json +30 -0
  230. package/packages/theme-floors-site/src/harvest.json +14 -0
  231. package/packages/theme-floors-site/src/index.js +82 -0
  232. package/packages/theme-floors-site/test/theme.test.mjs +19 -0
  233. package/packages/theme-fuelnfree-site/README.md +10 -0
  234. package/packages/theme-fuelnfree-site/package.json +30 -0
  235. package/packages/theme-fuelnfree-site/src/harvest.json +13 -0
  236. package/packages/theme-fuelnfree-site/src/index.js +81 -0
  237. package/packages/theme-fuelnfree-site/test/theme.test.mjs +19 -0
  238. package/packages/theme-handyman-site/README.md +10 -0
  239. package/packages/theme-handyman-site/package.json +30 -0
  240. package/packages/theme-handyman-site/src/harvest.json +10 -0
  241. package/packages/theme-handyman-site/src/index.js +83 -0
  242. package/packages/theme-handyman-site/test/theme.test.mjs +19 -0
  243. package/packages/theme-insurance-site/README.md +10 -0
  244. package/packages/theme-insurance-site/package.json +30 -0
  245. package/packages/theme-insurance-site/src/harvest.json +10 -0
  246. package/packages/theme-insurance-site/src/index.js +83 -0
  247. package/packages/theme-insurance-site/test/theme.test.mjs +19 -0
  248. package/packages/theme-shinshu-site/README.md +10 -0
  249. package/packages/theme-shinshu-site/package.json +30 -0
  250. package/packages/theme-shinshu-site/src/harvest.json +12 -0
  251. package/packages/theme-shinshu-site/src/index.js +83 -0
  252. package/packages/theme-shinshu-site/test/theme.test.mjs +19 -0
  253. package/packages/work-graph/README.md +49 -0
  254. package/packages/work-graph/package.json +19 -0
  255. package/packages/work-graph/prototype/README.md +32 -0
  256. package/packages/work-graph/prototype/data/demo-workgraph.js +47 -0
  257. package/packages/work-graph/prototype/renderers/timeline-model.js +21 -0
  258. package/packages/work-graph/prototype/renderers/workgraph-runtime.js +38 -0
  259. package/packages/work-graph/prototype-gnantt.html +655 -0
  260. package/packages/work-graph/src/adapters/business/projects.js +23 -0
  261. package/packages/work-graph/src/adapters/engineering/git.js +22 -0
  262. package/packages/work-graph/src/adapters/engineering/mcp.js +22 -0
  263. package/packages/work-graph/src/index.js +76 -0
  264. package/packages/work-graph/src/renderers/gantt-model.js +11 -0
  265. package/packages/work-graph/src/renderers/timeline.js +16 -0
  266. package/packages/work-graph/test/work-graph.test.mjs +37 -0
  267. package/protocol/README.md +12 -0
  268. package/protocol/capabilities/cloudflare-cpu-audit-input.schema.json +30 -6
  269. package/protocol/capabilities/cloudflare-cpu-profile-input.schema.json +18 -4
  270. package/protocol/capabilities/cloudflare-wrangler-native-input.schema.json +59 -10
  271. package/protocol/capabilities/knowledge-search-input.schema.json +35 -0
  272. package/protocol/capabilities/manifest.json +163 -1
  273. package/protocol/capabilities/repository-audit-input.schema.json +39 -6
  274. package/protocol/capabilities/repository-snapshot-input.schema.json +15 -3
  275. package/protocol/capabilities/terminal-exec-input.schema.json +55 -0
  276. package/protocol/commerce/catalog.v1.json +50 -0
  277. package/protocol/errors/error-catalog.json +164 -0
  278. package/protocol/errors/error-envelope.schema.json +544 -0
  279. package/protocol/features/README.md +57 -0
  280. package/protocol/features/agentsam.feature.v1.schema.json +290 -0
  281. package/protocol/features/catalog.json +65 -0
  282. package/protocol/features/examples/provider-resend.feature.json +17 -0
  283. package/protocol/go/agentsam-go-runtime.v1.json +17 -0
  284. package/protocol/knowledge/LIFECYCLE.md +140 -0
  285. package/protocol/knowledge/README.md +4 -0
  286. package/protocol/presets/catalog.json +128 -19
  287. package/protocol/rpc/v1/errors.proto +24 -0
  288. package/protocol/theme-refinery/d1-reconciliation.md +48 -0
  289. package/protocol/theme-refinery/product-metadata.schema.json +27 -0
  290. package/protocol/theme-refinery/receipts/products-registry-batch-20260924.json +318 -0
  291. package/protocol/theme-refinery/receipts/theme-harvest-20260924.json +472 -0
  292. package/protocol/theme-refinery/reconciliation-receipt.schema.json +83 -0
  293. package/services/cad/server.py +249 -2
  294. package/src/agent/capability-adapter.js +15 -5
  295. package/src/agent/index.js +2 -1
  296. package/src/agent/model-turn.js +51 -0
  297. package/src/agent/responses-runner.js +304 -38
  298. package/src/capabilities/index.js +1 -0
  299. package/src/capabilities/terminal-exec.js +78 -0
  300. package/src/cli.js +129 -31
  301. package/src/cloudflare/index.js +6 -0
  302. package/src/cloudflare/runtime-status.js +393 -0
  303. package/src/cloudflare/wrangler.js +17 -1
  304. package/src/commands/account-auth.js +1 -1
  305. package/src/commands/app.js +106 -0
  306. package/src/commands/autorag.js +77 -0
  307. package/src/commands/brand.js +293 -0
  308. package/src/commands/cad.js +1 -0
  309. package/src/commands/connections.js +126 -29
  310. package/src/commands/context-economics.js +8 -0
  311. package/src/commands/db.js +7 -0
  312. package/src/commands/deploy.js +2 -2
  313. package/src/commands/env.js +5 -4
  314. package/src/commands/eval.js +209 -14
  315. package/src/commands/go.js +365 -0
  316. package/src/commands/goap.js +176 -0
  317. package/src/commands/identity-init.js +27 -3
  318. package/src/commands/identity-protocol.js +195 -0
  319. package/src/commands/knowledge.js +64 -5
  320. package/src/commands/mcp.js +341 -0
  321. package/src/commands/merkle-persist.js +3 -1
  322. package/src/commands/merkle.js +18 -3
  323. package/src/commands/models.js +109 -23
  324. package/src/commands/plugins.js +175 -0
  325. package/src/commands/preferences.js +28 -8
  326. package/src/commands/product.js +53 -10
  327. package/src/commands/providers.js +389 -0
  328. package/src/commands/resume.js +9 -5
  329. package/src/commands/runtime-status.js +154 -0
  330. package/src/commands/shell.js +469 -54
  331. package/src/commands/status.js +82 -7
  332. package/src/commands/tunnel.js +228 -195
  333. package/src/commands/whoami.js +115 -22
  334. package/src/context/budget.js +6 -0
  335. package/src/context/index.js +2 -1
  336. package/src/context/project-card.js +75 -0
  337. package/src/errors/contract.js +34 -211
  338. package/src/errors/diagnostic.js +95 -50
  339. package/src/errors/index.js +6 -13
  340. package/src/eval/index.js +6 -0
  341. package/src/eval/live.js +439 -0
  342. package/src/features/resolve.js +242 -0
  343. package/src/go/build.js +108 -0
  344. package/src/go/cloudflare.js +207 -0
  345. package/src/go/contract.js +139 -0
  346. package/src/go/discover.js +96 -0
  347. package/src/go/index.js +13 -0
  348. package/src/go/receipts.js +77 -0
  349. package/src/go/registry.js +223 -0
  350. package/src/go/verify.js +31 -0
  351. package/src/index.js +100 -1
  352. package/src/knowledge/config.js +13 -5
  353. package/src/knowledge/engine.js +23 -8
  354. package/src/knowledge/index.js +1 -0
  355. package/src/knowledge/lane-registry.js +46 -0
  356. package/src/knowledge/providers/gemini.js +48 -8
  357. package/src/knowledge/service/client.js +13 -1
  358. package/src/knowledge/service/grpc-codec.js +156 -53
  359. package/src/knowledge/service/job-engine.js +133 -11
  360. package/src/knowledge/service/job-worker.js +34 -5
  361. package/src/knowledge/service/server.js +10 -1
  362. package/src/knowledge/store-discovery.js +77 -0
  363. package/src/lib/account-session.js +100 -25
  364. package/src/lib/agent-instructions.js +3 -0
  365. package/src/lib/auth.js +318 -51
  366. package/src/lib/cad/blender.js +42 -3
  367. package/src/lib/cad/d1-project-store.js +43 -0
  368. package/src/lib/cad/discovery.js +616 -0
  369. package/src/lib/cad/docker-executor.js +352 -0
  370. package/src/lib/cad/freecad.js +253 -0
  371. package/src/lib/cad/index.js +40 -0
  372. package/src/lib/cad/openscad.js +198 -0
  373. package/src/lib/cad/project-cli.d.ts +2 -0
  374. package/src/lib/cad/project-cli.js +21 -0
  375. package/src/lib/cad/project-contract.d.ts +3 -0
  376. package/src/lib/cad/project-contract.js +1 -0
  377. package/src/lib/cad/project-recipe.js +30 -0
  378. package/src/lib/cad/project-runtime.d.ts +2 -0
  379. package/src/lib/cad/project-runtime.js +53 -0
  380. package/src/lib/cad/project-store.js +25 -0
  381. package/src/lib/cad/project-workflows.js +31 -0
  382. package/src/lib/cad-docker.js +21 -2
  383. package/src/lib/cli-preferences.js +17 -2
  384. package/src/lib/core-client.js +97 -33
  385. package/src/lib/deploy/local-studio.js +6 -5
  386. package/src/lib/detect-context.js +14 -16
  387. package/src/lib/dockerize.js +3 -0
  388. package/src/lib/execution-approvals.js +1 -0
  389. package/src/lib/identity-scaffold.js +4 -1
  390. package/src/lib/knowledge-docker.js +9 -1
  391. package/src/lib/local-sessions.js +124 -34
  392. package/src/lib/local-status.js +35 -14
  393. package/src/lib/project-config.js +9 -0
  394. package/src/lib/provider-credentials.js +233 -55
  395. package/src/lib/scaffold/resolve-cloudflare-account.js +37 -0
  396. package/src/lib/scaffold/wizards/cms.js +2 -8
  397. package/src/lib/scaffold/wizards/worker-api.js +2 -8
  398. package/src/lib/slash-commands.js +10 -2
  399. package/src/local/migrations.js +109 -1
  400. package/src/local/runtime-store.js +31 -5
  401. package/src/local/sqlite.js +36 -1
  402. package/src/mcp/authority.js +348 -0
  403. package/src/mcp/client-adapters.js +431 -0
  404. package/src/mcp/client.js +172 -0
  405. package/src/mcp/index.js +47 -0
  406. package/src/mcp/telemetry.js +103 -0
  407. package/src/models/catalog.js +329 -51
  408. package/src/models/discovery.js +59 -4
  409. package/src/models/index.js +2 -0
  410. package/src/models/inventory-core.js +182 -0
  411. package/src/models/policy.js +20 -0
  412. package/src/plugins/cloudflare.js +103 -0
  413. package/src/plugins/completeful.js +69 -0
  414. package/src/plugins/contracts.js +86 -0
  415. package/src/plugins/index.js +11 -0
  416. package/src/plugins/registry.js +207 -0
  417. package/src/plugins/resource-scope.js +45 -0
  418. package/src/plugins/runtime.js +118 -0
  419. package/src/plugins/vectorize.js +31 -0
  420. package/src/progression/engine.js +171 -0
  421. package/src/progression/index.js +1 -0
  422. package/src/providers/cloudflare-chat.js +1 -1
  423. package/src/providers/gemini-generate-content.js +2 -1
  424. package/src/providers/openai-responses.js +45 -16
  425. package/src/providers/tool-schema.js +85 -0
  426. package/src/repository/index.js +29 -0
  427. package/src/rpc/generated/errors_pb.js +961 -1
  428. package/src/security/local-vault.js +415 -0
  429. package/src/security/process.js +20 -4
  430. package/src/status/actions.js +192 -0
  431. package/src/tools/hydrate.js +5 -1
  432. package/src/tools/index.js +7 -0
  433. package/src/tools/redact.js +64 -0
  434. package/src/tools/registry.js +83 -0
  435. package/src/tools/runtime.js +257 -0
  436. package/src/tools/search.js +21 -8
  437. package/src/ui/ansi.js +117 -3
  438. package/src/ui/cli/activity.js +76 -7
  439. package/src/ui/cli/footer.js +110 -9
  440. package/src/ui/cli/help.js +14 -5
  441. package/src/ui/wireframes.js +166 -0
  442. package/test/account-session.test.mjs +76 -11
  443. package/test/apps-scaffold-contract.test.mjs +58 -0
  444. package/test/capabilities.test.mjs +1 -1
  445. package/test/cli/eval-live.test.mjs +219 -0
  446. package/test/cli/go.test.mjs +71 -0
  447. package/test/cli/local-vault-and-provider-setup.test.mjs +268 -0
  448. package/test/cli/mcp-client.test.mjs +245 -0
  449. package/test/cli/runtime-ui.test.mjs +69 -2
  450. package/test/cli/status-actions.test.mjs +88 -0
  451. package/test/cli/wireframes-go-registry.test.mjs +54 -0
  452. package/test/cloudflare-connector.test.mjs +3 -6
  453. package/test/cloudflare-runtime.test.mjs +8 -1
  454. package/test/context.test.mjs +15 -0
  455. package/test/error-diagnostics.test.mjs +9 -0
  456. package/test/fixtures/cad/courtyard-house.json +208 -0
  457. package/test/go/cloudflare-probe.test.mjs +53 -0
  458. package/test/integration/app-command.test.mjs +55 -0
  459. package/test/integration/cad-discovery.test.mjs +158 -0
  460. package/test/integration/cad-docker-executor.test.mjs +249 -0
  461. package/test/integration/cad-execution.test.mjs +184 -0
  462. package/test/integration/cad-project-app.test.mjs +31 -0
  463. package/test/integration/cad-project-d1.test.mjs +25 -0
  464. package/test/integration/cad-project-native.test.mjs +24 -0
  465. package/test/integration/cad-project-workflow.test.mjs +9 -0
  466. package/test/integration/cad-project.test.mjs +82 -0
  467. package/test/integration/cli-help.test.mjs +4 -0
  468. package/test/integration/cms-site-tenancy-contract.test.mjs +256 -0
  469. package/test/integration/core-client.integration.test.mjs +55 -0
  470. package/test/integration/error-runtime-rpc.test.mjs +71 -0
  471. package/test/integration/features-resolve.test.mjs +128 -0
  472. package/test/integration/install-script.test.mjs +107 -0
  473. package/test/integration/inventory-core.test.mjs +53 -0
  474. package/test/integration/plugins-cloudflare.integration.test.mjs +28 -0
  475. package/test/integration/provider-env-cli.test.mjs +1 -1
  476. package/test/integration/runtime-migrations.test.mjs +6 -1
  477. package/test/integration/runtime-status.integration.test.mjs +211 -0
  478. package/test/integration/scaffold-cloudflare.test.mjs +46 -0
  479. package/test/integration/storage-architecture.test.mjs +154 -0
  480. package/test/integration/store-discovery.test.mjs +44 -0
  481. package/test/integration/terminal-exec.integration.test.mjs +86 -0
  482. package/test/integration/tool-runtime.test.mjs +124 -0
  483. package/test/integration/tool-schema.test.mjs +59 -0
  484. package/test/knowledge-service.test.mjs +4 -0
  485. package/test/local-sessions.test.mjs +11 -2
  486. package/test/local-studio-deploy.test.mjs +1 -1
  487. package/test/model-catalog.test.mjs +28 -1
  488. package/test/models.test.mjs +159 -5
  489. package/test/openai-responses.test.mjs +60 -0
  490. package/test/provider-credentials.test.mjs +15 -5
  491. package/test/responses-runner.test.mjs +321 -6
  492. package/test/sdk-worker-contract.test.mjs +5 -1
  493. package/test/shell.test.mjs +149 -4
  494. package/test/smoke.mjs +4 -3
  495. package/test/tools-search.test.mjs +33 -0
  496. package/test/unit/website-assets-bindings.test.mjs +60 -0
  497. package/test/whoami-resume.test.mjs +87 -7
  498. package/examples/gorilla-shell/README.md +0 -15
  499. package/src/lib/gorilla-template.js +0 -54
  500. package/src/lib/prompt-byok.js +0 -57
  501. package/src/lib/save-sdk-token.js +0 -19
  502. package/templates/gorilla-shell/App.tsx +0 -639
  503. package/templates/gorilla-shell/README.md +0 -34
  504. package/templates/gorilla-shell/index.html +0 -15
  505. package/templates/gorilla-shell/main.jsx +0 -9
  506. package/templates/gorilla-shell/package.json +0 -19
  507. package/templates/gorilla-shell/vite.config.js +0 -21
@@ -1,29 +1,37 @@
1
- import fs from 'node:fs';
2
1
  import path from 'node:path';
3
2
  import { tryResolveGitContext } from '../../packages/agentsam-repository/src/git-context.js';
4
3
  import { inspectLocalSqlite } from '../local/sqlite.js';
5
- import { getCreatedWithVersion, getDefaultProfile, getDeployTarget, getLocalDatabasePath, getProjectName, getProjectPreset, getRepositoryId, tryReadProjectConfig } from './project-config.js';
4
+ import {
5
+ getCreatedWithVersion,
6
+ getDefaultProfile,
7
+ getDeployTarget,
8
+ getLocalDatabasePath,
9
+ getProjectName,
10
+ getProjectPreset,
11
+ getRepositoryId,
12
+ tryReadProjectConfig,
13
+ } from './project-config.js';
14
+ import { findCliProjectRoot } from './cli-preferences.js';
6
15
 
7
16
  export function findAgentSamProjectRoot(startDir = process.cwd()) {
8
- let dir = path.resolve(startDir);
9
- for (let i = 0; i < 16; i += 1) {
10
- if (fs.existsSync(path.join(dir, '.agentsam', 'config.json'))) return dir;
11
- const parent = path.dirname(dir);
12
- if (parent === dir) break;
13
- dir = parent;
14
- }
15
- return path.resolve(startDir);
17
+ return findCliProjectRoot(startDir);
16
18
  }
17
19
 
18
20
  async function probe(url) {
19
21
  try {
20
- const response = await fetch(url, { signal: AbortSignal.timeout(500) });
22
+ const response = await fetch(url, { signal: AbortSignal.timeout(1500) });
21
23
  return { online: response.ok, status: response.status, url };
22
24
  } catch {
23
25
  return { online: false, status: null, url };
24
26
  }
25
27
  }
26
28
 
29
+ function resolveLiveHealthUrl(config) {
30
+ const fromDeploy = config?.deployment?.cloudflare?.health_url;
31
+ if (fromDeploy != null && String(fromDeploy).trim()) return String(fromDeploy).trim();
32
+ return null;
33
+ }
34
+
27
35
  export async function collectLocalStatus(cwd = process.cwd()) {
28
36
  const root = findAgentSamProjectRoot(cwd);
29
37
  const config = tryReadProjectConfig(root);
@@ -36,10 +44,16 @@ export async function collectLocalStatus(cwd = process.cwd()) {
36
44
 
37
45
  const devPort = config?.dev_port ?? 8787;
38
46
  const ptyPort = config?.pty_port ?? 3099;
39
- const [api, pty] = await Promise.all([
47
+ const liveUrl = resolveLiveHealthUrl(config);
48
+ const probes = [
40
49
  probe(`http://127.0.0.1:${devPort}/api/health`),
41
50
  probe(`http://127.0.0.1:${ptyPort}/health`),
42
- ]);
51
+ ];
52
+ if (liveUrl) probes.push(probe(liveUrl));
53
+ const results = await Promise.all(probes);
54
+ const api = results[0];
55
+ const pty = results[1];
56
+ const live = liveUrl ? results[2] : null;
43
57
 
44
58
  return {
45
59
  schemaVersion: 'agentsam-local-status-v1',
@@ -60,12 +74,19 @@ export async function collectLocalStatus(cwd = process.cwd()) {
60
74
  }
61
75
  : null,
62
76
  db: {
63
- ready: Boolean(db.exists),
77
+ ready: Boolean(
78
+ db.exists &&
79
+ db.tables?.includes('agentsam_schema_migrations') &&
80
+ db.tables?.includes('agentsam_project_sessions'),
81
+ ),
64
82
  path: db.dbPath || path.join(root, '.agentsam/data/agentsam.sqlite'),
65
83
  tables: db.tables || [],
66
84
  sizeBytes: db.sizeBytes || 0,
67
85
  },
68
86
  api,
69
87
  pty,
88
+ live: liveUrl
89
+ ? live || { online: false, status: null, url: liveUrl }
90
+ : { online: false, status: null, url: null },
70
91
  };
71
92
  }
@@ -76,6 +76,9 @@ export function createProjectManifest({
76
76
  knowledge: {
77
77
  config: '.agentsam/knowledge.json',
78
78
  },
79
+ // Project-owned plugin/resource declarations. Bindings, indexes, models,
80
+ // and dimensions belong here rather than in a global SDK default.
81
+ plugins: {},
79
82
  local: {
80
83
  database: '.agentsam/data/agentsam.sqlite',
81
84
  schema: 'db/schema.sql',
@@ -151,6 +154,12 @@ export function getKnowledgeConfigPath(config) {
151
154
  return clean(config?.knowledge?.config) || '.agentsam/knowledge.json';
152
155
  }
153
156
 
157
+ export function getProjectPluginConfig(config, pluginKey) {
158
+ const key = clean(pluginKey).replace(/^@/, '');
159
+ const plugins = config?.plugins || config?.integrations || {};
160
+ return plugins[key] || plugins[`@${key}`] || null;
161
+ }
162
+
154
163
  export function getLocalDatabasePath(config) {
155
164
  return clean(config?.local?.database || config?.db_path) || '.agentsam/data/agentsam.sqlite';
156
165
  }
@@ -1,16 +1,50 @@
1
1
  import fs from 'node:fs';
2
2
  import os from 'node:os';
3
3
  import path from 'node:path';
4
+ import {
5
+ getSecureProviderKey,
6
+ setSecureProviderKey,
7
+ deleteSecureProviderKey,
8
+ hydrateSecureCredentials,
9
+ } from '../security/local-vault.js';
4
10
 
5
- const PROVIDER_CREDENTIALS = Object.freeze({
6
- openai: Object.freeze({ env: 'OPENAI_API_KEY', files: ['openai.env'] }),
7
- gemini: Object.freeze({ env: 'GEMINI_API_KEY', files: ['gemini.env'] }),
8
- anthropic: Object.freeze({ env: 'ANTHROPIC_API_KEY', files: ['anthropic.env'] }),
9
- grok: Object.freeze({ env: 'XAI_API_KEY', files: ['grok.env', 'xai.env'] }),
10
- cloudflare: Object.freeze({ env: 'CLOUDFLARE_API_TOKEN', files: ['cloudflare.env'], accountEnv: ['ACCOUNT_ID', 'CLOUDFLARE_ACCOUNT_ID'] }),
11
+ export { hydrateSecureCredentials };
12
+
13
+ export const PROVIDER_CREDENTIALS = Object.freeze({
14
+ openai: Object.freeze({ label: 'OpenAI', env: 'OPENAI_API_KEY', files: ['openai.env'], modelProvider: 'openai' }),
15
+ anthropic: Object.freeze({ label: 'Anthropic', env: 'ANTHROPIC_API_KEY', files: ['anthropic.env'], modelProvider: 'anthropic' }),
16
+ gemini: Object.freeze({ label: 'Gemini', env: 'GEMINI_API_KEY', files: ['gemini.env'], modelProvider: 'gemini' }),
17
+ cursor: Object.freeze({ label: 'Cursor', env: 'CURSOR_API_KEY', files: ['cursor.env'], modelProvider: 'cursor' }),
18
+ xai: Object.freeze({ label: 'xAI', env: 'XAI_API_KEY', files: ['xai.env', 'grok.env'], modelProvider: 'xai' }),
19
+ cloudflare: Object.freeze({
20
+ label: 'Cloudflare',
21
+ env: 'CLOUDFLARE_API_TOKEN',
22
+ files: ['cloudflare.env'],
23
+ modelProvider: 'cloudflare',
24
+ accountEnv: ['CLOUDFLARE_ACCOUNT_ID'],
25
+ }),
26
+ inneranimalmedia: Object.freeze({
27
+ label: 'InnerAnimalMedia',
28
+ env: 'AGENTSAM_API_KEY',
29
+ files: ['inneranimalmedia.env'],
30
+ tokenPrefix: 'aak_',
31
+ platformCredential: true,
32
+ }),
33
+ });
34
+
35
+ const PROVIDER_ALIASES = Object.freeze({
36
+ grok: 'xai',
37
+ iam: 'inneranimalmedia',
38
+ inneranimal: 'inneranimalmedia',
11
39
  });
12
40
 
13
41
  function clean(value) { return value == null ? '' : String(value).trim(); }
42
+
43
+ export function normalizeProviderId(provider) {
44
+ const id = clean(provider).toLowerCase();
45
+ return PROVIDER_ALIASES[id] || id;
46
+ }
47
+
14
48
  function normalizeCloudflareAccountId(value) {
15
49
  const id = clean(value);
16
50
  if (!id) return '';
@@ -18,6 +52,16 @@ function normalizeCloudflareAccountId(value) {
18
52
  return id;
19
53
  }
20
54
 
55
+ function validateCredentialValue(spec, value) {
56
+ const secret = clean(value);
57
+ if (!secret) throw new Error('credential_required');
58
+ if (/[\r\n\0]/.test(secret)) throw new Error('credential_must_be_single_line');
59
+ if (spec.tokenPrefix && !secret.startsWith(spec.tokenPrefix)) {
60
+ throw new Error(`credential_prefix_required:${spec.tokenPrefix}`);
61
+ }
62
+ return secret;
63
+ }
64
+
21
65
  function homeDirectory(options = {}) {
22
66
  return path.resolve(clean(options.home) || clean(options.env?.HOME) || clean(options.env?.USERPROFILE) || os.homedir());
23
67
  }
@@ -58,6 +102,23 @@ function firstRuntimeValue(env, names = []) {
58
102
  return '';
59
103
  }
60
104
 
105
+ function atomicWrite(filename, source, mode = 0o600) {
106
+ const dir = path.dirname(filename);
107
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
108
+ if (process.platform !== 'win32') fs.chmodSync(dir, 0o700);
109
+ const temp = `${filename}.${process.pid}.${Date.now()}.tmp`;
110
+ fs.writeFileSync(temp, source, { mode });
111
+ if (process.platform !== 'win32') fs.chmodSync(temp, mode);
112
+ fs.renameSync(temp, filename);
113
+ if (process.platform !== 'win32') fs.chmodSync(filename, mode);
114
+ }
115
+
116
+ function envLiteral(value) {
117
+ const text = String(value ?? '');
118
+ if (/['"\r\n\0]/.test(text)) throw new Error('credential_contains_unsupported_profile_character');
119
+ return `"${text}"`;
120
+ }
121
+
61
122
  export function agentEnvDirectory(options = {}) {
62
123
  return path.join(homeDirectory(options), '.agentsam', 'env.d');
63
124
  }
@@ -68,83 +129,197 @@ export function agentEnvLoaderPath(options = {}) {
68
129
 
69
130
  export function ensureAgentEnvLoader(options = {}) {
70
131
  const filename = agentEnvLoaderPath(options);
71
- fs.mkdirSync(path.dirname(filename), { recursive: true, mode: 0o700 });
132
+ const supported = Object.keys(PROVIDER_CREDENTIALS).join('|');
72
133
  const source = `# AgentSam provider environment loader. Source this file; do not execute it.
73
- _agentsam_profile=\"\${1:-}\"
74
- case \"\$_agentsam_profile\" in
75
- openai|anthropic|gemini|grok|cloudflare) ;;
76
- *) echo \"usage: source ~/.agentsam/load-agent-env.sh <openai|anthropic|gemini|grok|cloudflare>\" >&2; return 2 2>/dev/null || exit 2 ;;
77
- esac
78
- _agentsam_file=\"\${HOME}/.agentsam/env.d/\${_agentsam_profile}.env\"
79
- if [ ! -f \"\$_agentsam_file\" ]; then
80
- echo \"AgentSam provider profile not found: \$_agentsam_file\" >&2
81
- return 1 2>/dev/null || exit 1
82
- fi
83
- set -a
84
- . \"\$_agentsam_file\"
85
- set +a
86
- if [ \"\$_agentsam_profile\" = cloudflare ]; then
87
- if [ -z \"\${ACCOUNT_ID:-}\" ] && [ -n \"\${CLOUDFLARE_ACCOUNT_ID:-}\" ]; then export ACCOUNT_ID=\"\$CLOUDFLARE_ACCOUNT_ID\"; fi
88
- if [ -z \"\${CLOUDFLARE_ACCOUNT_ID:-}\" ] && [ -n \"\${ACCOUNT_ID:-}\" ]; then export CLOUDFLARE_ACCOUNT_ID=\"\$ACCOUNT_ID\"; fi
134
+ if [ "$#" -eq 0 ]; then
135
+ echo "usage: source ~/.agentsam/load-agent-env.sh <profile> [profile ...]" >&2
136
+ return 2 2>/dev/null || exit 2
89
137
  fi
138
+ for _agentsam_profile in "$@"; do
139
+ case "$_agentsam_profile" in
140
+ grok) _agentsam_profile="xai" ;;
141
+ ${supported}) ;;
142
+ *) echo "unknown AgentSam provider profile: $_agentsam_profile" >&2; return 2 2>/dev/null || exit 2 ;;
143
+ esac
144
+ _agentsam_file="\${HOME}/.agentsam/env.d/\${_agentsam_profile}.env"
145
+ if [ ! -f "$_agentsam_file" ]; then
146
+ echo "AgentSam provider profile not found: $_agentsam_file" >&2
147
+ return 1 2>/dev/null || exit 1
148
+ fi
149
+ set -a
150
+ . "$_agentsam_file"
151
+ set +a
152
+ done
90
153
  unset _agentsam_file _agentsam_profile
91
154
  `;
92
- fs.writeFileSync(filename, source, { mode: 0o700 });
93
- if (process.platform !== 'win32') fs.chmodSync(filename, 0o700);
155
+ atomicWrite(filename, source, 0o700);
94
156
  return filename;
95
157
  }
96
158
 
97
- function profileTemplate(provider, options = {}) {
98
- if (provider === 'cloudflare') {
99
- const accountId = normalizeCloudflareAccountId(options.accountId);
100
- return `# AgentSam Cloudflare profile\n# ACCOUNT_ID is your Cloudflare account identifier; it is not a secret.\nexport ACCOUNT_ID=\"${accountId}\"\nexport CLOUDFLARE_API_TOKEN=\"\"\n`;
159
+ function profileSource(provider, credential = '', options = {}) {
160
+ const spec = providerCredentialSpec(provider);
161
+ if (!spec) throw new Error(`unsupported_provider:${normalizeProviderId(provider)}`);
162
+ const lines = [`# AgentSam ${spec.label} provider profile`];
163
+ if (spec.provider === 'cloudflare') {
164
+ lines.push('# CLOUDFLARE_ACCOUNT_ID is your Cloudflare account identifier; it is not a secret.');
165
+ lines.push(`export CLOUDFLARE_ACCOUNT_ID=${envLiteral(normalizeCloudflareAccountId(options.accountId))}`);
101
166
  }
102
- const spec = PROVIDER_CREDENTIALS[provider];
103
- if (!spec) throw new Error(`unsupported_provider:${provider}`);
104
- return `# AgentSam ${provider} provider profile\nexport ${spec.env}=\"\"\n`;
167
+ lines.push(`export ${spec.env}=${envLiteral(credential)}`);
168
+ return `${lines.join('\n')}\n`;
169
+ }
170
+
171
+ export function providerCredentialSpec(provider) {
172
+ const id = normalizeProviderId(provider);
173
+ const spec = PROVIDER_CREDENTIALS[id];
174
+ return spec ? Object.freeze({ provider: id, ...spec }) : null;
105
175
  }
106
176
 
107
177
  export function ensureProviderEnvProfile(provider, options = {}) {
108
178
  const spec = providerCredentialSpec(provider);
109
- if (!spec) throw new Error(`unsupported_provider:${clean(provider).toLowerCase()}`);
179
+ if (!spec) throw new Error(`unsupported_provider:${normalizeProviderId(provider)}`);
110
180
  const dir = agentEnvDirectory(options);
111
181
  fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
112
182
  if (process.platform !== 'win32') fs.chmodSync(dir, 0o700);
113
183
  const filename = path.join(dir, spec.files[0]);
114
184
  let created = false;
115
185
  if (!fs.existsSync(filename)) {
116
- fs.writeFileSync(filename, profileTemplate(spec.provider, options), { mode: 0o600 });
186
+ atomicWrite(filename, profileSource(spec.provider, '', options), 0o600);
117
187
  created = true;
118
- } else if (spec.provider === 'cloudflare' && clean(options.accountId)) {
119
- const source = fs.readFileSync(filename, 'utf8');
120
- const current = firstEnvValue(source, spec.accountEnv || []);
121
- if (!current) {
122
- const accountId = normalizeCloudflareAccountId(options.accountId);
123
- const line = `export ACCOUNT_ID=\"${accountId}\"`;
124
- const next = /^(?:export\s+)?ACCOUNT_ID=.*$/m.test(source)
125
- ? source.replace(/^(?:export\s+)?ACCOUNT_ID=.*$/m, line)
126
- : `${line}\n${source}`;
127
- fs.writeFileSync(filename, next, { mode: 0o600 });
188
+ } else {
189
+ const safety = secureFile(filename);
190
+ if (!safety.ok) throw new Error(safety.error);
191
+ if (process.platform !== 'win32') fs.chmodSync(filename, 0o600);
192
+ if (spec.provider === 'cloudflare' && clean(options.accountId)) {
193
+ const source = fs.readFileSync(filename, 'utf8');
194
+ const current = firstEnvValue(source, spec.accountEnv || []);
195
+ if (!current) {
196
+ const accountId = normalizeCloudflareAccountId(options.accountId);
197
+ const line = `export CLOUDFLARE_ACCOUNT_ID=${envLiteral(accountId)}`;
198
+ const next = /^(?:export\s+)?CLOUDFLARE_ACCOUNT_ID=.*$/m.test(source)
199
+ ? source.replace(/^(?:export\s+)?CLOUDFLARE_ACCOUNT_ID=.*$/m, line)
200
+ : `${line}\n${source}`;
201
+ atomicWrite(filename, next, 0o600);
202
+ }
128
203
  }
129
204
  }
130
- if (process.platform !== 'win32') fs.chmodSync(filename, 0o600);
131
205
  const loader = ensureAgentEnvLoader(options);
132
- return Object.freeze({ provider: spec.provider, file: filename, loader, created, source_command: `source ~/.agentsam/load-agent-env.sh ${spec.provider}` });
206
+ return Object.freeze({
207
+ provider: spec.provider,
208
+ file: filename,
209
+ loader,
210
+ created,
211
+ source_command: `source ~/.agentsam/load-agent-env.sh ${spec.provider}`,
212
+ });
133
213
  }
134
214
 
135
- export function providerCredentialSpec(provider) {
136
- const id = clean(provider).toLowerCase();
137
- const spec = PROVIDER_CREDENTIALS[id];
138
- return spec ? Object.freeze({ provider: id, ...spec }) : null;
215
+ export function setProviderCredential(provider, credential, options = {}) {
216
+ const spec = providerCredentialSpec(provider);
217
+ if (!spec) throw new Error(`unsupported_provider:${normalizeProviderId(provider)}`);
218
+ const value = validateCredentialValue(spec, credential);
219
+ setSecureProviderKey(spec.provider, { value, accountId: options.accountId }, options);
220
+ if (typeof process !== 'undefined' && process.env) {
221
+ process.env[spec.env] = value;
222
+ if (spec.provider === 'cloudflare' && options.accountId) {
223
+ process.env.CLOUDFLARE_ACCOUNT_ID = options.accountId;
224
+ }
225
+ }
226
+ let file = null;
227
+ let loader = null;
228
+ let sourceCommand = null;
229
+ if (options.exportProfile === true || options.writeEnvProfile === true) {
230
+ const filename = path.join(agentEnvDirectory(options), spec.files[0]);
231
+ atomicWrite(filename, profileSource(spec.provider, value, options), 0o600);
232
+ loader = ensureAgentEnvLoader(options);
233
+ file = filename;
234
+ sourceCommand = `source ~/.agentsam/load-agent-env.sh ${spec.provider}`;
235
+ }
236
+ return Object.freeze({
237
+ provider: spec.provider,
238
+ file,
239
+ loader,
240
+ source_command: sourceCommand,
241
+ });
242
+ }
243
+
244
+ /**
245
+ * Exports a configured provider credential from the secure vault to a plaintext .env file.
246
+ * This is an explicit opt-in action for operators who need to source credentials into external shells.
247
+ * The standard AgentSam setup flows (interactive picker, models --setup, providers add)
248
+ * intentionally do NOT invoke this, keeping the credential strictly inside the encrypted vault.
249
+ */
250
+ export function exportProviderEnvProfile(provider, options = {}) {
251
+ const spec = providerCredentialSpec(provider);
252
+ if (!spec) throw new Error(`unsupported_provider:${normalizeProviderId(provider)}`);
253
+ const resolved = resolveProviderCredential(spec.provider, options);
254
+ if (!resolved.configured || !resolved.value) {
255
+ throw new Error(`provider_not_configured:${spec.provider}`);
256
+ }
257
+ const filename = path.join(agentEnvDirectory(options), spec.files[0]);
258
+ atomicWrite(filename, profileSource(spec.provider, resolved.value, { ...options, accountId: resolved.account_id }), 0o600);
259
+ const loader = ensureAgentEnvLoader(options);
260
+ return Object.freeze({
261
+ provider: spec.provider,
262
+ file: filename,
263
+ loader,
264
+ source_command: `source ~/.agentsam/load-agent-env.sh ${spec.provider}`,
265
+ });
266
+ }
267
+
268
+ export function removeProviderCredential(provider, options = {}) {
269
+ const spec = providerCredentialSpec(provider);
270
+ if (!spec) throw new Error(`unsupported_provider:${normalizeProviderId(provider)}`);
271
+ deleteSecureProviderKey(spec.provider, options);
272
+ const dir = agentEnvDirectory(options);
273
+ let removed = false;
274
+ for (const basename of spec.files) {
275
+ const filename = path.join(dir, basename);
276
+ if (!fs.existsSync(filename)) continue;
277
+ const safety = secureFile(filename);
278
+ if (!safety.ok) throw new Error(safety.error);
279
+ fs.rmSync(filename, { force: true });
280
+ removed = true;
281
+ }
282
+ if (typeof process !== 'undefined' && process.env) {
283
+ delete process.env[spec.env];
284
+ }
285
+ return Object.freeze({ provider: spec.provider, removed });
139
286
  }
140
287
 
141
288
  export function resolveProviderCredential(provider, options = {}) {
142
289
  const spec = providerCredentialSpec(provider);
143
- if (!spec) return Object.freeze({ provider: clean(provider).toLowerCase(), configured: false, source: null, error: 'unsupported_provider', value: '' });
290
+ if (!spec) return Object.freeze({ provider: normalizeProviderId(provider), configured: false, source: null, error: 'unsupported_provider', value: '' });
144
291
  const env = options.env || process.env;
145
292
  const accountIdFromEnv = firstRuntimeValue(env, spec.accountEnv || []);
146
293
  const fromEnv = clean(env?.[spec.env]);
147
- if (fromEnv) return Object.freeze({ provider: spec.provider, configured: true, source: 'environment', env: spec.env, file: null, error: null, value: fromEnv, account_id: accountIdFromEnv || null });
294
+ if (fromEnv) {
295
+ const prefixError = spec.tokenPrefix && !fromEnv.startsWith(spec.tokenPrefix) ? `credential_prefix_required:${spec.tokenPrefix}` : null;
296
+ return Object.freeze({
297
+ provider: spec.provider,
298
+ configured: !prefixError,
299
+ source: 'environment',
300
+ env: spec.env,
301
+ file: null,
302
+ error: prefixError,
303
+ value: prefixError ? '' : fromEnv,
304
+ account_id: accountIdFromEnv || null,
305
+ });
306
+ }
307
+
308
+ const secure = getSecureProviderKey(spec.provider, options);
309
+ if (secure && clean(secure.value)) {
310
+ const val = clean(secure.value);
311
+ const prefixError = spec.tokenPrefix && !val.startsWith(spec.tokenPrefix) ? `credential_prefix_required:${spec.tokenPrefix}` : null;
312
+ return Object.freeze({
313
+ provider: spec.provider,
314
+ configured: !prefixError,
315
+ source: secure.source || 'local_vault',
316
+ env: spec.env,
317
+ file: null,
318
+ error: prefixError,
319
+ value: prefixError ? '' : val,
320
+ account_id: accountIdFromEnv || secure.accountId || null,
321
+ });
322
+ }
148
323
 
149
324
  const dir = agentEnvDirectory({ ...options, env });
150
325
  for (const basename of spec.files) {
@@ -156,19 +331,22 @@ export function resolveProviderCredential(provider, options = {}) {
156
331
  const source = fs.readFileSync(filename, 'utf8');
157
332
  const value = clean(parseEnvValue(source, spec.env));
158
333
  const accountId = accountIdFromEnv || firstEnvValue(source, spec.accountEnv || []);
159
- if (value) return Object.freeze({ provider: spec.provider, configured: true, source: 'agentsam_env_file', env: spec.env, file: filename, error: null, value, account_id: accountId || null });
160
- return Object.freeze({ provider: spec.provider, configured: false, source: 'agentsam_env_file', env: spec.env, file: filename, error: 'credential_variable_missing', value: '' });
334
+ const prefixError = spec.tokenPrefix && value && !value.startsWith(spec.tokenPrefix) ? `credential_prefix_required:${spec.tokenPrefix}` : null;
335
+ if (value && !prefixError) return Object.freeze({ provider: spec.provider, configured: true, source: 'agentsam_env_file', env: spec.env, file: filename, error: null, value, account_id: accountId || null });
336
+ return Object.freeze({ provider: spec.provider, configured: false, source: 'agentsam_env_file', env: spec.env, file: filename, error: prefixError || 'credential_variable_missing', value: '' });
161
337
  } catch (error) {
162
338
  return Object.freeze({ provider: spec.provider, configured: false, source: 'agentsam_env_file', env: spec.env, file: filename, error: error?.message || String(error), value: '' });
163
339
  }
164
340
  }
165
- return Object.freeze({ provider: spec.provider, configured: false, source: null, env: spec.env, file: null, error: null, value: '' });
341
+ return Object.freeze({ provider: spec.provider, configured: false, source: null, env: spec.env, file: null, error: null, value: '', account_id: accountIdFromEnv || null });
166
342
  }
167
343
 
168
344
  export function describeProviderCredential(provider, options = {}) {
169
345
  const resolved = resolveProviderCredential(provider, options);
346
+ const spec = providerCredentialSpec(provider);
170
347
  return Object.freeze({
171
348
  provider: resolved.provider,
349
+ label: spec?.label || resolved.provider,
172
350
  configured: resolved.configured,
173
351
  source: resolved.source,
174
352
  env: resolved.env || null,
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Shared Cloudflare account resolution for scaffold wizards.
3
+ * Reuses the same detection the CLI's `agentsam env init cloudflare` flow
4
+ * already relies on — never ask the user to hand-paste an account ID that
5
+ * `wrangler whoami` (or an existing env override) can already answer.
6
+ */
7
+ import { detectCloudflareAccounts } from '../../commands/env.js';
8
+
9
+ export async function resolveCloudflareAccountId({ text, select, isCancel, cancel, note, pc, detectAccounts = detectCloudflareAccounts }) {
10
+ const detected = detectAccounts();
11
+
12
+ if (detected.accounts.length === 1) {
13
+ const acct = detected.accounts[0];
14
+ note(`Detected Cloudflare account: ${pc.cyan(acct.name || acct.id)}`, 'Cloudflare account');
15
+ return acct.id;
16
+ }
17
+
18
+ if (detected.accounts.length > 1) {
19
+ const choice = await select({
20
+ message: 'Which Cloudflare account?',
21
+ options: detected.accounts.map((a) => ({ value: a.id, label: a.name || a.id, hint: a.id })),
22
+ });
23
+ if (isCancel(choice)) { cancel('Cancelled.'); process.exit(0); }
24
+ return choice;
25
+ }
26
+
27
+ note('Could not auto-detect a Cloudflare account (run `agentsam cloudflare` to check login status).', 'Cloudflare account');
28
+ const cfAccountId = await text({
29
+ message: 'Cloudflare account ID? (from dash.cloudflare.com → right sidebar)',
30
+ placeholder: 'abc123...',
31
+ validate(val) {
32
+ if (!val || val.trim().length === 0) return 'Required.';
33
+ },
34
+ });
35
+ if (isCancel(cfAccountId)) { cancel('Cancelled.'); process.exit(0); }
36
+ return cfAccountId.trim();
37
+ }
@@ -22,6 +22,7 @@ import {
22
22
  import pc from 'picocolors';
23
23
  import { writeFileTree } from '../writer.js';
24
24
  import { cmsTemplates } from '../templates/cms/index.js';
25
+ import { resolveCloudflareAccountId } from '../resolve-cloudflare-account.js';
25
26
 
26
27
  export async function runCmsWizard() {
27
28
  note('A Cloudflare Worker + D1 + R2 CMS site with reusable page templates.', 'CMS Site');
@@ -111,14 +112,7 @@ export async function runCmsWizard() {
111
112
  }
112
113
 
113
114
  // ── Step 7: Cloudflare account details ────────────────────────────────────
114
- const cfAccountId = await text({
115
- message: 'Cloudflare account ID? (from dash.cloudflare.com → right sidebar)',
116
- placeholder: 'abc123...',
117
- validate(val) {
118
- if (!val || val.trim().length === 0) return 'Required for wrangler.toml.';
119
- },
120
- });
121
- if (isCancel(cfAccountId)) { cancel('Cancelled.'); process.exit(0); }
115
+ const cfAccountId = await resolveCloudflareAccountId({ text, select, isCancel, cancel, note, pc });
122
116
 
123
117
  // ── Step 8: Confirm before writing ───────────────────────────────────────
124
118
  const summary = [
@@ -16,6 +16,7 @@ import {
16
16
  import pc from 'picocolors';
17
17
  import { writeFileTree } from '../writer.js';
18
18
  import { workerApiTemplates } from '../templates/worker-api/index.js';
19
+ import { resolveCloudflareAccountId } from '../resolve-cloudflare-account.js';
19
20
 
20
21
  export async function runWorkerApiWizard() {
21
22
  note('A typed Cloudflare Worker with route handlers, D1 binding, and CORS ready.', 'Worker API');
@@ -52,14 +53,7 @@ export async function runWorkerApiWizard() {
52
53
  });
53
54
  if (isCancel(dbKind)) { cancel('Cancelled.'); process.exit(0); }
54
55
 
55
- const cfAccountId = await text({
56
- message: 'Cloudflare account ID?',
57
- placeholder: 'abc123...',
58
- validate(val) {
59
- if (!val || val.trim().length === 0) return 'Required.';
60
- },
61
- });
62
- if (isCancel(cfAccountId)) { cancel('Cancelled.'); process.exit(0); }
56
+ const cfAccountId = await resolveCloudflareAccountId({ text, select, isCancel, cancel, note, pc });
63
57
 
64
58
  const confirmed = await confirm({ message: `Write files to ./${projectName.trim()}/?` });
65
59
  if (isCancel(confirmed) || !confirmed) { cancel('Cancelled.'); process.exit(0); }
@@ -8,22 +8,30 @@ export const SLASH_COMMANDS = [
8
8
  { cmd: '/fast', description: 'Use provider Fast processing when the selected model supports it', lane: 'model' },
9
9
  { cmd: '/flex', description: 'Use provider Flex processing when the selected model supports it', lane: 'model' },
10
10
  { cmd: '/standard', description: 'Return to Standard provider processing', lane: 'model' },
11
+ { cmd: '/compact', description: 'Compact active provider context; status shows support, threshold, and receipt', lane: 'context' },
11
12
  { cmd: '/context', description: 'Show model context economics; add repo for Git bridge context', lane: 'context' },
12
- { cmd: '/status', description: 'Local project, DB, Git, and PTY health', lane: 'local' },
13
+ { cmd: '/status', description: 'Honest project awareness: account, models, terminal, live deploy', lane: 'local' },
13
14
  { cmd: '/models', description: 'Probe providers and provider-verified known models', lane: 'model' },
15
+ { cmd: '/providers', description: 'Configure and verify machine provider credentials', lane: 'model' },
14
16
  { cmd: '/login', description: 'Sign in to Inner Animal Media and save the machine-local Agent Sam session', lane: 'identity' },
15
17
  { cmd: '/logout', description: 'Sign out locally without deleting provider credentials', lane: 'identity' },
16
18
  { cmd: '/whoami', description: 'Show authenticated account identity and safe credential status', lane: 'identity' },
17
19
  { cmd: '/session', description: 'Show current session usage, cost, and resume receipt', lane: 'observability' },
18
20
  { cmd: '/usage', description: 'Show token usage, spend breakdown, and resume command', lane: 'observability' },
19
21
  { cmd: '/cf', description: 'Cloudflare native reads, Wrangler status, and CPU profile analysis', lane: 'cloudflare' },
22
+ { cmd: '/connections', description: 'Inspect live account, terminal, Worker, and Cloudflare connection evidence', lane: 'cloudflare' },
23
+ { cmd: '/tunnel', description: 'Choose and run a real Cloudflare Tunnel through Wrangler', lane: 'cloudflare' },
20
24
  { cmd: '/settings', description: 'Choose project, runtime, terminal, and model policy' },
21
25
  { cmd: '/pwd', description: 'Print working directory', lane: 'terminal' },
22
26
  { cmd: '/cd', description: 'Change working directory', lane: 'terminal' },
23
27
  { cmd: '/git', description: 'Run an explicit Git subcommand', lane: 'git' },
24
28
  { cmd: '/diff', description: 'Show the current Git diff', lane: 'git' },
25
- { cmd: '/db', description: 'Local SQLite status and query helpers', lane: 'data' },
29
+ { cmd: '/db', description: 'SQLite status; sources discovers stores; select knowledge sqlite|postgres [ENV]', lane: 'data' },
26
30
  { cmd: '/agent', description: 'Send a goal to the configured local Agent Sam runtime', lane: 'agent' },
31
+ { cmd: '/goap', description: 'Inspect and manage GOAP blackboard: /goap [status|goal|why|plan|list|new|switch|close]', lane: 'agent' },
32
+ { cmd: '/brand', description: 'Brand intelligence: /brand [scan|resolve|plan|inspect]', lane: 'product' },
33
+ { cmd: '/plan', description: 'Composable plans: /plan brand', lane: 'product' },
34
+ { cmd: '/next', description: 'Suggested next actions from session progression', lane: 'product' },
27
35
  { cmd: '/logs', description: 'Show local Agent Sam execution events', lane: 'observability' },
28
36
  { cmd: '/deploy', description: 'Add a cloud adapter and deploy intentionally', lane: 'deploy' },
29
37
  { cmd: '/clear', description: 'Clear the terminal display', lane: 'terminal' },