@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,27 +1,79 @@
1
1
  import { resolveIamOrigin } from '../../packages/identity/src/contracts/auth-config.js';
2
+ import { resolveAccountAuthority } from './auth.js';
2
3
 
3
4
  /**
4
5
  * IAM CORE client — SDK is a delivery mechanism; intelligence lives server-side.
5
6
  *
6
- * IAM_ORIGIN is the canonical platform authority/API origin. During the
7
- * migration window IAM_CORE_URL / AGENTSAM_CORE_URL remain compatibility-only
8
- * fallbacks. Without a CORE backend, consumers get scaffold/local CLI only.
7
+ * IAM_OAUTH_ISSUER is the canonical platform authority/API origin. IAM_ORIGIN,
8
+ * IAM_CORE_URL and AGENTSAM_CORE_URL remain compatibility fallbacks.
9
9
  */
10
-
11
10
  export function coreBaseUrl(env = process.env) {
12
- const explicit = env?.IAM_ORIGIN || env?.IAM_CORE_URL || env?.AGENTSAM_CORE_URL || '';
11
+ const explicit = env?.IAM_OAUTH_ISSUER || env?.IAM_ORIGIN || env?.IAM_CORE_URL || env?.AGENTSAM_CORE_URL || '';
13
12
  return resolveIamOrigin(env, explicit);
14
13
  }
15
14
 
16
- export async function postJson(path, body, token) {
17
- const headers = { 'Content-Type': 'application/json', Accept: 'application/json' };
18
- if (token) headers.Authorization = `Bearer ${token}`;
19
- const res = await fetch(`${coreBaseUrl()}${path}`, {
15
+ function authOptions(options) {
16
+ if (typeof options === 'string') return { bearer: options };
17
+ return options && typeof options === 'object' ? options : {};
18
+ }
19
+
20
+ export async function resolveCoreAuthority(options = {}) {
21
+ const resolvedOptions = authOptions(options);
22
+ const resolver = resolvedOptions.resolveAuthorityImpl || resolveAccountAuthority;
23
+ const authority = await resolver({
24
+ env: resolvedOptions.env || process.env,
25
+ home: resolvedOptions.home,
26
+ explicit: resolvedOptions.explicit || resolvedOptions.token || '',
27
+ fetchImpl: resolvedOptions.fetchImpl,
28
+ issuer: resolvedOptions.issuer,
29
+ signal: resolvedOptions.signal,
30
+ nowMs: resolvedOptions.nowMs,
31
+ skewMs: resolvedOptions.skewMs,
32
+ refreshImpl: resolvedOptions.refreshImpl,
33
+ forceRefresh: resolvedOptions.forceRefresh === true,
34
+ });
35
+ if (authority?.error) throw new Error(authority.error);
36
+ if (!authority?.value) throw new Error('account_auth_required');
37
+ return authority;
38
+ }
39
+
40
+ async function authorizedHeaders(headers, options = {}) {
41
+ if (String(options?.bearer || '').trim()) {
42
+ return { headers: { ...headers, Authorization: `Bearer ${String(options.bearer).trim()}` }, authority: { kind: 'resolved_bearer' } };
43
+ }
44
+ const authority = await resolveCoreAuthority(options);
45
+ return { headers: { ...headers, Authorization: `Bearer ${authority.value}` }, authority };
46
+ }
47
+
48
+ async function authorizedFetch(url, init, options = {}) {
49
+ const baseHeaders = init.headers || {};
50
+ let resolved = await authorizedHeaders(baseHeaders, options);
51
+ let response = await (options.fetchImpl || fetch)(url, { ...init, headers: resolved.headers });
52
+ if (response.status === 401 && resolved.authority?.kind === 'browser_oauth' && options.forceRefresh !== true) {
53
+ resolved = await authorizedHeaders(baseHeaders, { ...options, forceRefresh: true });
54
+ response = await (options.fetchImpl || fetch)(url, { ...init, headers: resolved.headers });
55
+ }
56
+ return response;
57
+ }
58
+
59
+ async function responseJson(res) {
60
+ return res.json().catch(() => ({}));
61
+ }
62
+
63
+ export async function postJson(path, body, options = {}) {
64
+ const resolvedOptions = authOptions(options);
65
+ const fetchImpl = resolvedOptions.fetchImpl || fetch;
66
+ const headers = {
67
+ 'Content-Type': 'application/json',
68
+ Accept: 'application/json',
69
+ };
70
+ const res = await authorizedFetch(`${coreBaseUrl(resolvedOptions.env || process.env)}${path}`, {
20
71
  method: 'POST',
21
72
  headers,
22
73
  body: JSON.stringify(body ?? {}),
23
- });
24
- const data = await res.json().catch(() => ({}));
74
+ signal: resolvedOptions.signal,
75
+ }, { ...resolvedOptions, fetchImpl });
76
+ const data = await responseJson(res);
25
77
  if (!res.ok) {
26
78
  const msg = data?.error || data?.message || `HTTP ${res.status}`;
27
79
  throw new Error(String(msg));
@@ -29,14 +81,25 @@ export async function postJson(path, body, token) {
29
81
  return data;
30
82
  }
31
83
 
32
- export async function getJson(path, token) {
33
- const headers = { Accept: 'application/json' };
34
- if (token) headers.Authorization = `Bearer ${token}`;
35
- const res = await fetch(`${coreBaseUrl()}${path}`, { headers });
36
- const data = await res.json().catch(() => ({}));
84
+ export async function getJson(path, options = {}) {
85
+ const resolvedOptions = authOptions(options);
86
+ const fetchImpl = resolvedOptions.fetchImpl || fetch;
87
+ const res = await authorizedFetch(`${coreBaseUrl(resolvedOptions.env || process.env)}${path}`, {
88
+ headers: { Accept: 'application/json' },
89
+ signal: resolvedOptions.signal,
90
+ }, { ...resolvedOptions, fetchImpl });
91
+ const data = await responseJson(res);
37
92
  if (!res.ok) {
38
93
  const msg = data?.error || data?.message || `HTTP ${res.status}`;
39
- throw new Error(String(msg));
94
+ const error = new Error(String(msg));
95
+ // Previously discarded: status code and which endpoint failed. Both are
96
+ // known here and cost nothing to keep -- callers (whoami, etc.) can now
97
+ // surface "Unauthorized (HTTP 401 from /api/sdk/context)" instead of a
98
+ // bare "Unauthorized" with no way to tell what actually failed.
99
+ error.status = res.status;
100
+ error.endpoint = path;
101
+ error.requestId = res.headers?.get?.('cf-ray') || data?.request_id || null;
102
+ throw error;
40
103
  }
41
104
  return data;
42
105
  }
@@ -44,18 +107,21 @@ export async function getJson(path, token) {
44
107
  /**
45
108
  * Stream NDJSON from POST /api/sdk/scaffold — calls onEvent for each line.
46
109
  */
47
- export async function streamScaffold(body, token, onEvent) {
48
- const res = await fetch(`${coreBaseUrl()}/api/sdk/scaffold`, {
110
+ export async function streamScaffold(body, onEvent, options = {}) {
111
+ const resolvedOptions = authOptions(options);
112
+ const fetchImpl = resolvedOptions.fetchImpl || fetch;
113
+ const headers = {
114
+ 'Content-Type': 'application/json',
115
+ Accept: 'application/x-ndjson',
116
+ };
117
+ const res = await authorizedFetch(`${coreBaseUrl(resolvedOptions.env || process.env)}/api/sdk/scaffold`, {
49
118
  method: 'POST',
50
- headers: {
51
- 'Content-Type': 'application/json',
52
- Accept: 'application/x-ndjson',
53
- Authorization: `Bearer ${token}`,
54
- },
119
+ headers,
55
120
  body: JSON.stringify(body),
56
- });
121
+ signal: resolvedOptions.signal,
122
+ }, { ...resolvedOptions, fetchImpl });
57
123
  if (!res.ok) {
58
- const data = await res.json().catch(() => ({}));
124
+ const data = await responseJson(res);
59
125
  throw new Error(data?.error || `scaffold HTTP ${res.status}`);
60
126
  }
61
127
  if (!res.body) throw new Error('scaffold stream missing');
@@ -71,15 +137,13 @@ export async function streamScaffold(body, token, onEvent) {
71
137
  const lines = buf.split('\n');
72
138
  buf = lines.pop() || '';
73
139
  for (const line of lines) {
74
- const t = line.trim();
75
- if (!t) continue;
76
- let evt;
140
+ const text = line.trim();
141
+ if (!text) continue;
77
142
  try {
78
- evt = JSON.parse(t);
143
+ await onEvent(JSON.parse(text));
79
144
  } catch {
80
- continue;
145
+ /* ignore malformed stream lines */
81
146
  }
82
- await onEvent(evt);
83
147
  }
84
148
  }
85
149
  const tail = buf.trim();
@@ -87,7 +151,7 @@ export async function streamScaffold(body, token, onEvent) {
87
151
  try {
88
152
  await onEvent(JSON.parse(tail));
89
153
  } catch {
90
- /* ignore */
154
+ /* ignore malformed trailing line */
91
155
  }
92
156
  }
93
157
  }
@@ -120,7 +120,7 @@ export function writeDeployReceipt(appRoot, receipt) {
120
120
  export function wranglerDeployCommand(target, { dryRun = false } = {}) {
121
121
  const args = ['wrangler', ...target.wranglerArgs];
122
122
  if (dryRun) args.push('--dry-run');
123
- return { cwd: target.appRoot, args, bin: 'npx' };
123
+ return { cwd: target.appRoot, args, bin: process.platform === 'win32' ? 'npx.cmd' : 'npx' };
124
124
  }
125
125
 
126
126
  export function isLocalStudioCheckout(cwd = process.cwd()) {
@@ -217,16 +217,17 @@ export async function runLocalStudioDeploy({
217
217
  }
218
218
 
219
219
  const env = { ...process.env, ...envFile.vars };
220
- const lock = spawnSync('npm', ['run', 'verify:npm10-lock'], { cwd: target.appRoot, env, encoding: 'utf8' });
220
+ const npmCmd = process.platform === 'win32' ? 'npm.cmd' : 'npm';
221
+ const lock = spawnSync(npmCmd, ['run', 'verify:npm10-lock'], { cwd: target.appRoot, env, encoding: 'utf8', shell: process.platform === 'win32' });
221
222
  if (lock.status !== 0) throw new Error(lock.stderr || lock.stdout || 'verify:npm10-lock failed');
222
223
  if (!skipBuild) {
223
- const build = spawnSync('npm', ['run', 'build'], { cwd: target.appRoot, env, encoding: 'utf8' });
224
+ const build = spawnSync(npmCmd, ['run', 'build'], { cwd: target.appRoot, env, encoding: 'utf8', shell: process.platform === 'win32' });
224
225
  if (build.status !== 0) throw new Error(build.stderr || build.stdout || 'build failed');
225
- const verify = spawnSync('npm', ['run', 'cf:verify-output'], { cwd: target.appRoot, env, encoding: 'utf8' });
226
+ const verify = spawnSync(npmCmd, ['run', 'cf:verify-output'], { cwd: target.appRoot, env, encoding: 'utf8', shell: process.platform === 'win32' });
226
227
  if (verify.status !== 0) throw new Error(verify.stderr || verify.stdout || 'cf:verify-output failed');
227
228
  }
228
229
  const cmd = wranglerDeployCommand(target, { dryRun });
229
- const deployed = spawnSync(cmd.bin, cmd.args, { cwd: cmd.cwd, env, encoding: 'utf8' });
230
+ const deployed = spawnSync(cmd.bin, cmd.args, { cwd: cmd.cwd, env, encoding: 'utf8', shell: process.platform === 'win32' });
230
231
  const wranglerOut = `${deployed.stdout || ''}\n${deployed.stderr || ''}`;
231
232
  const workerVersion = parseWranglerVersionId(wranglerOut);
232
233
  if (deployed.status !== 0) {
@@ -5,7 +5,7 @@
5
5
  import { execFile } from 'child_process';
6
6
  import { promisify } from 'util';
7
7
  import { coreBaseUrl } from './core-client.js';
8
- import { resolveAccountSdkKey } from './account-session.js';
8
+ import { resolveAccountAuth } from './account-session.js';
9
9
 
10
10
  const execFileAsync = promisify(execFile);
11
11
 
@@ -167,11 +167,9 @@ async function detectCloudflare() {
167
167
  };
168
168
  }
169
169
 
170
- async function probeSdkBearer(token) {
170
+ async function probeAccountBearer(token) {
171
171
  const t = String(token || '').trim();
172
- if (!t || !t.startsWith('sdk_')) {
173
- return { valid: false, error: 'not_sdk_bearer' };
174
- }
172
+ if (!t) return { valid: false, error: 'account_auth_required' };
175
173
  try {
176
174
  const res = await fetch(`${coreBaseUrl()}/api/sdk/context`, {
177
175
  headers: { Accept: 'application/json', Authorization: `Bearer ${t}` },
@@ -197,7 +195,7 @@ function envPresent(name) {
197
195
  return v != null && String(v).trim() !== '';
198
196
  }
199
197
 
200
- /** IAM auth for SDK init — only verified sdk_* bearer counts as ready. */
198
+ /** IAM auth for SDK init — accepts a verified account API key or browser session credential. */
201
199
  async function detectIam(explicitToken = '') {
202
200
  const aux = [];
203
201
 
@@ -210,9 +208,9 @@ async function detectIam(explicitToken = '') {
210
208
  });
211
209
  }
212
210
 
213
- const workerKey = envPresent('IAM_API_KEY') || envPresent('AGENTSAM_API_KEY');
211
+ const workerKey = envPresent('IAM_API_KEY');
214
212
  if (workerKey) {
215
- const name = envPresent('IAM_API_KEY') ? 'IAM_API_KEY' : 'AGENTSAM_API_KEY';
213
+ const name = 'IAM_API_KEY';
216
214
  aux.push({
217
215
  var: name,
218
216
  role: 'Worker runtime secret',
@@ -221,22 +219,22 @@ async function detectIam(explicitToken = '') {
221
219
  });
222
220
  }
223
221
 
224
- const sdkToken = resolveAccountSdkKey({ env: process.env, explicit: explicitToken }).value;
225
- if (sdkToken.trim()) {
226
- const probe = await probeSdkBearer(sdkToken);
222
+ const accountAuth = resolveAccountAuth({ env: process.env, explicit: explicitToken });
223
+ if (accountAuth.value) {
224
+ const probe = await probeAccountBearer(accountAuth.value);
227
225
  if (probe.valid) {
228
226
  return {
229
- source: 'sdk-key',
227
+ source: accountAuth.kind || 'account-auth',
230
228
  ready: true,
231
- detail: `AGENTSAM_SDK_KEY · user ${probe.user_id || '?'}`,
229
+ detail: `${accountAuth.kind === 'api_key' ? 'AGENTSAM_API_KEY' : 'browser session'} · user ${probe.user_id || '?'}`,
232
230
  probe,
233
231
  aux,
234
232
  };
235
233
  }
236
234
  return {
237
- source: 'sdk-key',
235
+ source: accountAuth.kind || 'account-auth',
238
236
  ready: false,
239
- detail: `AGENTSAM_SDK_KEY invalid (${probe.error}) → will open browser`,
237
+ detail: `${accountAuth.kind === 'api_key' ? 'AGENTSAM_API_KEY' : 'browser session'} invalid (${probe.error}) → will open browser`,
240
238
  probe,
241
239
  aux,
242
240
  };
@@ -247,7 +245,7 @@ async function detectIam(explicitToken = '') {
247
245
  return {
248
246
  source: 'execos-env',
249
247
  ready: false,
250
- detail: `IAM_PTY_USER_ID set (ExecOS identity — SDK bearer still needed)`,
248
+ detail: `IAM_PTY_USER_ID set (ExecOS identity — account auth still needed)`,
251
249
  aux,
252
250
  };
253
251
  }
@@ -98,6 +98,7 @@ function generateViteReact(opts) {
98
98
  FROM node:20-alpine AS build
99
99
  WORKDIR /app
100
100
  COPY package*.json ./
101
+ RUN apk add --no-cache python3 make g++
101
102
  RUN if [ -f package-lock.json ]; then npm ci; else npm install; fi
102
103
  COPY . .
103
104
  RUN ${buildCmd}
@@ -125,6 +126,7 @@ function generateNodeService(opts) {
125
126
  FROM node:20-alpine
126
127
  WORKDIR /app
127
128
  COPY package*.json ./
129
+ RUN apk add --no-cache python3 make g++
128
130
  RUN if [ -f package-lock.json ]; then npm ci --omit=dev; else npm install --omit=dev; fi
129
131
  COPY . .
130
132
  ENV PORT=${port}
@@ -152,6 +154,7 @@ function generateWranglerDev(opts) {
152
154
  FROM node:20-alpine
153
155
  WORKDIR /app
154
156
  COPY package*.json ./
157
+ RUN apk add --no-cache python3 make g++
155
158
  RUN if [ -f package-lock.json ]; then npm ci; else npm install; fi
156
159
  COPY . .
157
160
  EXPOSE ${port}
@@ -33,6 +33,7 @@ export function toolApprovalKey(capabilityId, input = {}) {
33
33
  const id = clean(capabilityId);
34
34
  const command = clean(input?.command);
35
35
  if (id === 'cloudflare.wrangler.native' && /^[A-Za-z0-9._-]+$/.test(command)) return `${id}:${command}`;
36
+ if (id === 'terminal.exec' && /^[A-Za-z0-9._+-]+$/.test(command)) return `${id}:${command}`;
36
37
  return id;
37
38
  }
38
39
 
@@ -9,7 +9,7 @@ const MIGRATION_FILE = path.join(IDENTITY_PKG, 'src', 'migrations', '0001_identi
9
9
  const BRANDING_SCRIPT = path.join(IDENTITY_PKG, 'src', 'frontend', 'auth-portal', 'shared', 'company-branding.js');
10
10
 
11
11
  /**
12
- * @param {{ projectName: string, brandName?: string, logoUrl?: string, sdkVersion?: string }} config
12
+ * @param {{ projectName: string, brandName?: string, logoUrl?: string, sdkVersion?: string, provider?: string }} config
13
13
  * @returns {Record<string, string>}
14
14
  */
15
15
  export function buildIdentityAppScaffold(config) {
@@ -17,6 +17,7 @@ export function buildIdentityAppScaffold(config) {
17
17
  const brandName = config.brandName || projectName;
18
18
  const logoUrl = config.logoUrl || '/brand/logo.svg';
19
19
  const sdkVersion = config.sdkVersion || 'alpha';
20
+ const provider = config.provider || 'inneranimalmedia';
20
21
 
21
22
  const migrationSql = `${fs.readFileSync(MIGRATION_FILE, 'utf8')}\n${buildCompanySeedSql({ brandName, logoUrl })}\n`;
22
23
  const loginHtml = injectBrandingScript(applyBrandTokens(fs.readFileSync(path.join(AUTH_PAGES_DIR, 'login.html'), 'utf8'), {
@@ -95,6 +96,8 @@ migrations_dir = "migrations"
95
96
 
96
97
  Boring scaffold: **app/frontend** (auth UI) + **backend** (Worker API) + **migrations** (D1).
97
98
 
99
+ Provider template: \`${provider}\` (see \`agentsam identity plan --provider ${provider}\`).
100
+
98
101
  ## Quick start
99
102
 
100
103
  \`\`\`bash
@@ -7,7 +7,13 @@ import { CONFIG_PATH, defaultConfig, readConfig } from '../knowledge/config.js';
7
7
 
8
8
  const sdkRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../..');
9
9
  const runtimeFiles = () => {
10
- const files = ['services/knowledge/package.json', 'services/knowledge/package-lock.json', 'packages/agentsam-repository/src/merkle/hash.js', 'src/errors/contract.js'];
10
+ const files = [
11
+ 'services/knowledge/package.json',
12
+ 'services/knowledge/package-lock.json',
13
+ 'packages/agentsam-repository/src/merkle/hash.js',
14
+ 'packages/agentsam-errors/package.json',
15
+ 'src/errors/contract.js',
16
+ ];
11
17
  const walk = dir => { for (const entry of fs.readdirSync(path.join(sdkRoot, dir), { withFileTypes: true })) {
12
18
  const file = `${dir}/${entry.name}`;
13
19
  if (entry.isDirectory()) walk(file);
@@ -15,6 +21,7 @@ const runtimeFiles = () => {
15
21
  } };
16
22
  walk('src/knowledge');
17
23
  walk('src/rpc/generated');
24
+ walk('packages/agentsam-errors/src');
18
25
  return files.sort();
19
26
  };
20
27
 
@@ -31,6 +38,7 @@ WORKDIR /app
31
38
  COPY package.json package-lock.json ./
32
39
  RUN npm ci --omit=dev --ignore-scripts --no-audit --no-fund
33
40
  COPY src ./src
41
+ COPY packages ./packages
34
42
  ENV NODE_ENV=production PORT=${port} GIT_OPTIONAL_LOCKS=0
35
43
  EXPOSE ${port}
36
44
  HEALTHCHECK --interval=15s --timeout=3s --start-period=10s --retries=3 CMD node -e "fetch('http://127.0.0.1:'+process.env.PORT+'/healthz').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"
@@ -2,6 +2,10 @@ import fs from 'node:fs';
2
2
  import os from 'node:os';
3
3
  import path from 'node:path';
4
4
  import { randomUUID } from 'node:crypto';
5
+ import { findCliProjectRoot } from './cli-preferences.js';
6
+ import { runtimeDatabasePath, SQLITE_RUNTIME_CAPABILITIES } from '../local/runtime-store.js';
7
+ import { createLocalSqliteDatabaseSync } from '../local/sqlite.js';
8
+ import { applyRuntimeMigrationsSync } from '../local/migrations.js';
5
9
 
6
10
  export const LOCAL_SESSION_SCHEMA = 'agentsam-local-session-v1';
7
11
 
@@ -33,13 +37,51 @@ function filenameFor(sessionId, options = {}) {
33
37
  return path.join(localSessionDirectory(options), `${validateSessionId(sessionId)}.json`);
34
38
  }
35
39
 
36
- function ensureDirectory(options = {}) {
37
- const dir = localSessionDirectory(options);
38
- fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
39
- if (process.platform !== 'win32') {
40
- try { fs.chmodSync(dir, 0o700); } catch { /* best effort */ }
40
+ function projectRoot(value = {}, options = {}) {
41
+ return findCliProjectRoot(options.projectRoot || value.project_root || value.cwd || options.cwd || process.cwd());
42
+ }
43
+
44
+ function withSessionDb(root, fn) {
45
+ const db = createLocalSqliteDatabaseSync(runtimeDatabasePath(root));
46
+ try {
47
+ applyRuntimeMigrationsSync(db);
48
+ return fn(db);
49
+ } finally {
50
+ db.close();
41
51
  }
42
- return dir;
52
+ }
53
+
54
+ function safeProviderState(value) {
55
+ if (!value || typeof value !== 'object') return {};
56
+ // Opaque response IDs allow provider-side continuation. Message arrays and
57
+ // compaction input can carry prompts, tool output, or credential values.
58
+ return {
59
+ ...(clean(value.provider) ? { provider: clean(value.provider) } : {}),
60
+ ...(clean(value.previous_response_id) ? { previous_response_id: clean(value.previous_response_id) } : {}),
61
+ ...(value.has_compacted_input === true ? { has_compacted_input: true } : {}),
62
+ };
63
+ }
64
+
65
+ function safeLastError(value) {
66
+ if (!value || typeof value !== 'object') return null;
67
+ return {
68
+ code: clean(value.code) || null,
69
+ kind: clean(value.kind) || null,
70
+ source: clean(value.source) || null,
71
+ };
72
+ }
73
+
74
+ function safeUsageSnapshot(value) {
75
+ if (!value || typeof value !== 'object') return null;
76
+ const inputTokens = Number(value.current_context?.input_tokens);
77
+ const windowTokens = Number(value.current_context?.window_tokens);
78
+ return {
79
+ estimate_kind: value.estimate_kind === 'provider' ? 'provider' : 'local',
80
+ current_context: {
81
+ input_tokens: Number.isFinite(inputTokens) ? Math.max(0, inputTokens) : 0,
82
+ window_tokens: Number.isFinite(windowTokens) ? Math.max(0, windowTokens) : null,
83
+ },
84
+ };
43
85
  }
44
86
 
45
87
  function normalizeUsage(value = {}) {
@@ -72,13 +114,18 @@ export function normalizeLocalSession(value = {}) {
72
114
  const createdAt = clean(value.created_at) || now();
73
115
  const status = clean(value.status) || 'active';
74
116
  const updatedAt = clean(value.updated_at) || createdAt;
117
+ const root = projectRoot(value);
118
+ const dbPath = runtimeDatabasePath(root);
119
+ const relativeDbPath = path.relative(root, dbPath);
75
120
  return {
76
121
  schema_version: LOCAL_SESSION_SCHEMA,
77
122
  id: validateSessionId(value.id || createLocalSessionId()),
78
123
  status,
124
+ project_root: root,
125
+ storage: { runtime: 'sqlite', path: relativeDbPath.startsWith('..') ? dbPath : relativeDbPath, remote: null, capabilities: SQLITE_RUNTIME_CAPABILITIES },
79
126
  cwd: path.resolve(clean(value.cwd) || process.cwd()),
80
- title: clean(value.title) || sessionTitleFromInput(value.last_input),
81
- last_input: clean(value.last_input) || null,
127
+ title: clean(value.title) || 'Agent Sam session',
128
+ last_input: null,
82
129
  created_at: createdAt,
83
130
  updated_at: updatedAt,
84
131
  active_elapsed_ms: Math.max(0, Number(value.active_elapsed_ms || 0)),
@@ -88,26 +135,49 @@ export function normalizeLocalSession(value = {}) {
88
135
  reasoning_effort: clean(value.reasoning_effort) || null,
89
136
  requested_service_tier: clean(value.requested_service_tier) || null,
90
137
  actual_service_tier: clean(value.actual_service_tier) || null,
91
- provider_state: value.provider_state && typeof value.provider_state === 'object' ? { ...value.provider_state } : {},
92
- usage_snapshot: value.usage_snapshot && typeof value.usage_snapshot === 'object' ? structuredClone(value.usage_snapshot) : null,
138
+ provider_state: safeProviderState(value.provider_state),
139
+ latest_compaction: value.latest_compaction ? {
140
+ compaction_id: clean(value.latest_compaction.compaction_id) || null,
141
+ provider: clean(value.latest_compaction.provider) || null,
142
+ model: clean(value.latest_compaction.model) || null,
143
+ created_at: clean(value.latest_compaction.created_at) || null,
144
+ usage: normalizeUsage(value.latest_compaction.usage),
145
+ cost_usd: Number(value.latest_compaction.cost_usd || 0),
146
+ } : null,
147
+ auto_compact: value.auto_compact !== false,
148
+ usage_snapshot: safeUsageSnapshot(value.usage_snapshot),
93
149
  cumulative_usage: normalizeUsage(value.cumulative_usage || {}),
94
150
  total_cost_usd: Number(value.total_cost_usd || 0),
95
151
  cost_breakdown_usd: normalizeCostBreakdown(value.cost_breakdown_usd || {}),
96
152
  approved_projected_call_cost_usd: Number(value.approved_projected_call_cost_usd || 0),
97
- last_error: value.last_error && typeof value.last_error === 'object' ? structuredClone(value.last_error) : null,
153
+ last_error: safeLastError(value.last_error),
98
154
  };
99
155
  }
100
156
 
101
157
  export function saveLocalSession(session, options = {}) {
102
- const normalized = normalizeLocalSession({ ...session, updated_at: now() });
103
- ensureDirectory(options);
104
- const filename = filenameFor(normalized.id, options);
105
- const temp = `${filename}.${process.pid}.tmp`;
106
- fs.writeFileSync(temp, `${JSON.stringify(normalized, null, 2)}\n`, { mode: 0o600 });
107
- if (process.platform !== 'win32') {
108
- try { fs.chmodSync(temp, 0o600); } catch { /* best effort */ }
109
- }
110
- fs.renameSync(temp, filename);
158
+ const normalized = normalizeLocalSession({ ...session, project_root: projectRoot(session, options), updated_at: now() });
159
+ const compactedInput = session.provider_state?.compacted_input;
160
+ const serialized = Array.isArray(compactedInput) ? JSON.stringify(compactedInput) : null;
161
+ if (serialized && Buffer.byteLength(serialized) > 10 * 1024 * 1024) throw new Error('provider_continuation_too_large');
162
+ if (serialized) normalized.provider_state.has_compacted_input = true;
163
+ withSessionDb(normalized.project_root, (db) => {
164
+ db.exec('BEGIN IMMEDIATE');
165
+ try {
166
+ db.prepare(`
167
+ INSERT INTO agentsam_project_sessions (id, project_root, cwd, status, title, state_json, created_at, updated_at)
168
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
169
+ ON CONFLICT(id) DO UPDATE SET
170
+ cwd = excluded.cwd, status = excluded.status, title = excluded.title,
171
+ state_json = excluded.state_json, updated_at = excluded.updated_at
172
+ `).run(normalized.id, normalized.project_root, normalized.cwd, normalized.status,
173
+ normalized.title, JSON.stringify(normalized), normalized.created_at, normalized.updated_at);
174
+ if (serialized) db.prepare(`INSERT INTO agentsam_provider_continuations (session_id, provider, output_json, updated_at)
175
+ VALUES (?, ?, ?, ?) ON CONFLICT(session_id) DO UPDATE SET provider=excluded.provider, output_json=excluded.output_json, updated_at=excluded.updated_at`
176
+ ).run(normalized.id, normalized.provider_state.provider || '', serialized, normalized.updated_at);
177
+ else if (!normalized.provider_state.has_compacted_input) db.prepare('DELETE FROM agentsam_provider_continuations WHERE session_id = ?').run(normalized.id);
178
+ db.exec('COMMIT');
179
+ } catch (error) { db.exec('ROLLBACK'); throw error; }
180
+ });
111
181
  return normalized;
112
182
  }
113
183
 
@@ -116,11 +186,23 @@ export function createLocalSession(value = {}, options = {}) {
116
186
  }
117
187
 
118
188
  export function loadLocalSession(sessionId, options = {}) {
189
+ const root = projectRoot({}, options);
190
+ const dbPath = runtimeDatabasePath(root);
191
+ if (fs.existsSync(dbPath)) {
192
+ const row = withSessionDb(root, (db) => db.prepare(
193
+ 'SELECT state_json FROM agentsam_project_sessions WHERE id = ? AND project_root = ?'
194
+ ).get(validateSessionId(sessionId), root));
195
+ if (row) return normalizeLocalSession(JSON.parse(row.state_json));
196
+ }
197
+ // Read-only compatibility with older ~/.agentsam/sessions/*.json state.
198
+ // Import only when the saved cwd belongs to the selected project; never
199
+ // create new home-level session files or resume a different project's row.
119
200
  const filename = filenameFor(sessionId, options);
120
201
  if (!fs.existsSync(filename)) return null;
121
202
  const parsed = JSON.parse(fs.readFileSync(filename, 'utf8'));
122
203
  if (parsed?.schema_version !== LOCAL_SESSION_SCHEMA) throw new Error(`unsupported_local_session_schema:${parsed?.schema_version || 'missing'}`);
123
- return normalizeLocalSession(parsed);
204
+ if (projectRoot(parsed) !== root) return null;
205
+ return saveLocalSession(parsed, { projectRoot: root });
124
206
  }
125
207
 
126
208
  export function updateLocalSession(sessionId, patch = {}, options = {}) {
@@ -130,19 +212,27 @@ export function updateLocalSession(sessionId, patch = {}, options = {}) {
130
212
  }
131
213
 
132
214
  export function listLocalSessions(options = {}) {
215
+ const root = projectRoot({}, options);
133
216
  const dir = localSessionDirectory(options);
134
- if (!fs.existsSync(dir)) return [];
135
- const cwd = clean(options.cwd) ? path.resolve(options.cwd) : '';
136
- const limit = Number.isInteger(options.limit) && options.limit > 0 ? Math.min(options.limit, 100) : 20;
137
- const rows = [];
138
- for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
139
- if (!entry.isFile() || !entry.name.startsWith('asess_') || !entry.name.endsWith('.json')) continue;
140
- try {
141
- const parsed = JSON.parse(fs.readFileSync(path.join(dir, entry.name), 'utf8'));
142
- if (parsed?.schema_version !== LOCAL_SESSION_SCHEMA) continue;
143
- const session = normalizeLocalSession(parsed);
144
- if (!cwd || session.cwd === cwd) rows.push(session);
145
- } catch { /* skip corrupt session file */ }
217
+ if (fs.existsSync(dir)) {
218
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
219
+ if (!entry.isFile() || !entry.name.startsWith('asess_') || !entry.name.endsWith('.json')) continue;
220
+ try { loadLocalSession(entry.name.slice(0, -5), { ...options, projectRoot: root }); }
221
+ catch { /* legacy corrupt files remain untouched */ }
222
+ }
146
223
  }
147
- return rows.sort((a, b) => String(b.updated_at).localeCompare(String(a.updated_at))).slice(0, limit);
224
+ if (!fs.existsSync(runtimeDatabasePath(root))) return [];
225
+ const limit = Number.isInteger(options.limit) && options.limit > 0 ? Math.min(options.limit, 100) : 20;
226
+ return withSessionDb(root, (db) => db.prepare(
227
+ 'SELECT state_json FROM agentsam_project_sessions WHERE project_root = ? ORDER BY updated_at DESC LIMIT ?'
228
+ ).all(root, limit).map((row) => normalizeLocalSession(JSON.parse(row.state_json))));
229
+ }
230
+
231
+ export function loadSessionContinuation(session) {
232
+ if (!session?.provider_state?.has_compacted_input) return session?.provider_state || null;
233
+ return withSessionDb(projectRoot(session), db => {
234
+ const row = db.prepare('SELECT provider, output_json FROM agentsam_provider_continuations WHERE session_id = ?').get(validateSessionId(session.id));
235
+ if (!row || row.provider !== session.provider_state.provider) throw new Error('provider_continuation_missing');
236
+ return { ...session.provider_state, compacted_input: JSON.parse(row.output_json) };
237
+ });
148
238
  }