@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,13 +1,23 @@
1
+ import { compileToolSchema, restoreOptionalArguments } from '../providers/tool-schema.js';
1
2
  import { createHash } from 'node:crypto';
2
3
  import path from 'node:path';
3
- import { assessContextUsage, compileAgentInstructions, createContextBudget, estimateContextTokens, truncateResultText } from '../context/index.js';
4
- import { getModelRecord, calculateModelCost } from '../models/index.js';
4
+ import { assessContextUsage, compileAgentInstructions, createContextBudget, estimateContextTokens, truncateResultText, resolveProjectContext, buildProjectCard } from '../context/index.js';
5
+ import { getModelRecord, calculateModelCost, loadModelPolicy } from '../models/index.js';
5
6
  import { searchToolCards, hydrateToolSchemas } from '../tools/index.js';
6
7
  import { createAgentEvent } from '../telemetry/index.js';
7
8
  import { diagnosticFromError } from '../errors/index.js';
9
+ import { runAgentSamModelTurn } from './model-turn.js';
8
10
 
9
11
  const RUNTIME_OWNED_KEYS = new Set(['account_id', 'user_id', 'tenant_id', 'workspace_id', 'connection_id', 'runtime_lease_id', 'execution_id']);
10
12
 
13
+ // A single integer ceiling ("die after 8 rounds") is not a meaningful safety
14
+ // invariant for genuine engineering work -- it stops runs mid-task for no
15
+ // reason tied to risk, cost, or progress. Replace it with named modes so
16
+ // callers pick a budget that matches the work, while `quick` preserves the
17
+ // exact previous default (8) for any caller that doesn't opt in.
18
+ const RUN_MODE_BUDGETS = Object.freeze({ quick: 8, interactive: 32, agent: 128, long: 512 });
19
+ const DEFAULT_NO_PROGRESS_LIMIT = 4;
20
+
11
21
  function clean(value) { return value == null ? '' : String(value).trim(); }
12
22
  function hash(value) { return `sha256:${createHash('sha256').update(String(value)).digest('hex')}`; }
13
23
  function event(emit, type, payload, runId) { if (typeof emit === 'function') emit(createAgentEvent(type, payload, { runId })); }
@@ -18,14 +28,31 @@ export function capabilityFunctionName(id) {
18
28
  return `as_${source.slice(0, 45)}_${createHash('sha256').update(source).digest('hex').slice(0, 10)}`;
19
29
  }
20
30
 
31
+ // A turn's tool surface is a relevance-scored, maxTools-capped subset of the
32
+ // full capability catalog (see buildAgentToolSurface). Provider conversation
33
+ // state (previousResponseId) can carry a tool name from an earlier turn into
34
+ // a later turn whose narrower surface no longer hydrated that capability, so
35
+ // the model can legitimately call a real, executable capability whose alias
36
+ // simply isn't in *this round's* toolSurface.aliases map. Before treating
37
+ // that as an unrecognized/hallucinated call, check it against the adapter's
38
+ // full executable catalog: if the alias resolves to a real, currently
39
+ // invocable capability, honor it rather than failing a legitimate call.
40
+ export function resolveCapabilityFallback(capabilityAdapter, aliasName) {
41
+ if (!capabilityAdapter?.toolDescriptors) return null;
42
+ const fullCatalog = capabilityAdapter.toolDescriptors({ includeUnavailable: false });
43
+ const descriptor = fullCatalog.find((row) => capabilityFunctionName(row.name) === aliasName);
44
+ if (!descriptor) return null;
45
+ return { capabilityId: descriptor.name, descriptor };
46
+ }
47
+
21
48
  function userMessage(text) {
22
49
  return { role: 'user', content: [{ type: 'input_text', text: String(text) }] };
23
50
  }
24
51
 
25
- function modelBudget(record) {
52
+ function modelBudget(record, policyOverride = null) {
26
53
  const windowTokens = Number(record?.context_window);
27
54
  if (!Number.isFinite(windowTokens) || windowTokens <= 0) return null;
28
- const policy = record.context_policy || {};
55
+ const policy = { ...(record.context_policy || {}), ...(policyOverride || {}) };
29
56
  return createContextBudget({
30
57
  windowTokens,
31
58
  targetInputTokens: policy.target_input_tokens,
@@ -33,10 +60,71 @@ function modelBudget(record) {
33
60
  interveneAtTokens: policy.intervene_at_tokens,
34
61
  maxNormalInputTokens: policy.max_normal_input_tokens,
35
62
  pricingThresholdTokens: policy.pricing_threshold_tokens,
63
+ maxCumulativeInputTokens: policy.max_cumulative_input_tokens,
36
64
  safetyMarginTokens: policy.safety_margin_tokens,
37
65
  });
38
66
  }
39
67
 
68
+ const UNKNOWN_WINDOW_CONTEXT_LIMITS = Object.freeze({
69
+ maxSystemChars: 24_000,
70
+ maxEvidenceChars: 48_000,
71
+ maxItemChars: 16_000,
72
+ });
73
+
74
+ function resolveUnknownWindowContext(cwd, card, contextItems = []) {
75
+ const rules = compileAgentInstructions(cwd, { maxChars: UNKNOWN_WINDOW_CONTEXT_LIMITS.maxSystemChars });
76
+ let remainingEvidenceChars = UNKNOWN_WINDOW_CONTEXT_LIMITS.maxEvidenceChars;
77
+ const included = [{
78
+ kind: 'repo',
79
+ ref: 'project://card',
80
+ priority: 100,
81
+ content: card.content,
82
+ chars: card.content.length,
83
+ }];
84
+ const deferred = [];
85
+
86
+ for (const item of contextItems) {
87
+ const ref = clean(item?.ref) || 'context://anonymous';
88
+ if (remainingEvidenceChars <= 0) {
89
+ deferred.push(ref);
90
+ continue;
91
+ }
92
+ const source = String(item?.content ?? '');
93
+ if (!source) continue;
94
+ const maxChars = Math.max(1, Math.min(UNKNOWN_WINDOW_CONTEXT_LIMITS.maxItemChars, remainingEvidenceChars));
95
+ const bounded = truncateResultText(source, maxChars);
96
+ included.push(Object.freeze({
97
+ ...item,
98
+ ref,
99
+ content: bounded.text,
100
+ chars: bounded.chars,
101
+ ...(bounded.truncated ? { truncated: true, source_chars: bounded.source_chars } : {}),
102
+ }));
103
+ remainingEvidenceChars -= bounded.chars;
104
+ if (bounded.truncated) deferred.push(ref + '#remainder');
105
+ }
106
+
107
+ const evidenceChars = UNKNOWN_WINDOW_CONTEXT_LIMITS.maxEvidenceChars - remainingEvidenceChars;
108
+ return Object.freeze({
109
+ objective_window_known: false,
110
+ rules,
111
+ items: Object.freeze(included),
112
+ receipt: Object.freeze({
113
+ estimate_kind: 'local',
114
+ window_tokens: null,
115
+ utilization_ratio: null,
116
+ pressure: 'unknown',
117
+ system_chars: rules.chars,
118
+ evidence_chars: evidenceChars,
119
+ sources_considered: contextItems.length + 1,
120
+ sources_included: included.length,
121
+ sources_deferred: deferred.length,
122
+ deferred_refs: Object.freeze(deferred),
123
+ fallback_policy: 'bounded_unknown_model_window',
124
+ }),
125
+ });
126
+ }
127
+
40
128
  export function buildAgentToolSurface(capabilityAdapter, objective, options = {}) {
41
129
  if (!capabilityAdapter?.toolDescriptors) throw new TypeError('capabilityAdapter.toolDescriptors is required');
42
130
  const catalog = capabilityAdapter.toolDescriptors({ includeUnavailable: false });
@@ -51,8 +139,10 @@ export function buildAgentToolSurface(capabilityAdapter, objective, options = {}
51
139
  type: 'function',
52
140
  name: alias,
53
141
  description: descriptor.description,
54
- parameters: descriptor.input_schema || { type: 'object', properties: {} },
55
- strict: true,
142
+ parameters: ['openai', 'grok', 'gemini'].includes(options.schemaProvider)
143
+ ? compileToolSchema({ provider: options.schemaProvider, canonicalSchema: descriptor.input_schema, strict: descriptor.strict !== false, name: alias }).providerSchema
144
+ : descriptor.input_schema || { type: 'object', properties: {}, required: [], additionalProperties: false },
145
+ strict: descriptor.strict !== false,
56
146
  });
57
147
  });
58
148
  return Object.freeze({
@@ -64,7 +154,7 @@ export function buildAgentToolSurface(capabilityAdapter, objective, options = {}
64
154
  cards_returned: searched.receipt.returned_items,
65
155
  card_chars: searched.receipt.chars,
66
156
  hydrated_tools: hydrated.receipt.hydrated_tools,
67
- hydrated_schema_chars: hydrated.receipt.schema_chars,
157
+ hydrated_schema_chars: tools.reduce((sum, tool) => sum + JSON.stringify(tool.parameters).length, 0),
68
158
  deferred_tools: Object.freeze(hydrated.receipt.deferred_tools),
69
159
  }),
70
160
  });
@@ -127,21 +217,80 @@ function assertEconomicPreflight(projectedTokens, budget, allowOverride) {
127
217
  if (projectedTokens >= budget.compactAtTokens) throw new Error(`context_preflight_compaction_required:${projectedTokens}>=${budget.compactAtTokens}`);
128
218
  }
129
219
 
130
- export async function runResponsesAgent(options = {}) {
220
+ function cumulativeInputTokens(usage) {
221
+ return Math.max(0, Math.floor(Number(usage?.cumulative?.input_tokens ?? usage?.input_tokens ?? 0)));
222
+ }
223
+
224
+ function toolOutputInput(outputs) {
225
+ return outputs.map((row) => ({
226
+ type: 'function_call_output',
227
+ call_id: row.call_id,
228
+ output: typeof row.output === 'string' ? row.output : JSON.stringify(row.output ?? null),
229
+ }));
230
+ }
231
+
232
+ export async function runAgentSamTurn(options = {}) {
131
233
  const provider = options.provider;
132
234
  if (!provider?.create || !provider?.continueWithToolOutputs) throw new TypeError('Responses provider adapter is required');
133
235
  if (!options.capabilityAdapter) throw new TypeError('capabilityAdapter is required');
236
+ // Keep provider wire-format handling behind the inference-only boundary.
237
+ // This runner owns context, authorization, and the tool loop; the model
238
+ // adapter only returns a normalized turn (the raw provider response is
239
+ // retained below for continuation bookkeeping).
240
+ const modelTurn = async (request) => {
241
+ const turn = await runAgentSamModelTurn(request);
242
+ return turn.raw;
243
+ };
134
244
  const cwd = path.resolve(options.cwd || process.cwd());
135
245
  const objective = clean(options.prompt);
136
246
  if (!objective) throw new TypeError('prompt is required');
137
- const record = options.modelRecord || getModelRecord(options.model);
138
- if (!record) throw new RangeError(`unknown model: ${options.model}`);
247
+ const baseRecord = options.modelRecord || getModelRecord(options.model);
248
+ if (!baseRecord) throw new RangeError(`unknown model: ${options.model}`);
139
249
  const reasoningEffort = clean(options.reasoningEffort || 'auto');
140
250
  const serviceTier = clean(options.serviceTier || 'default');
141
- const budget = modelBudget(record);
142
- const instructionSet = options.instructions == null ? compileAgentInstructions(cwd, { maxChars: budget?.maxSystemChars || 48_000 }) : null;
143
- const instructions = options.instructions == null ? instructionSet.content : String(options.instructions);
144
- const toolSurface = buildAgentToolSurface(options.capabilityAdapter, objective, options);
251
+ const dynamicPolicy = options.modelPolicy || (options.policyDb
252
+ ? await loadModelPolicy(options.policyDb, { provider: baseRecord.provider, modelKey: baseRecord.model_key })
253
+ : null);
254
+ const record = dynamicPolicy
255
+ ? Object.freeze({ ...baseRecord, context_policy: Object.freeze({ ...(baseRecord.context_policy || {}), ...dynamicPolicy }) })
256
+ : baseRecord;
257
+ const budget = modelBudget(record, dynamicPolicy);
258
+ let instructions;
259
+ let resolvedContext = null;
260
+ if (options.instructions == null) {
261
+ const card = buildProjectCard(cwd, {
262
+ activeTaskId: options.activeTaskId || options.taskId,
263
+ lockedBy: options.lockedBy,
264
+ checkpointSha: options.checkpointSha,
265
+ beliefs: options.beliefs || options.workspaceState,
266
+ });
267
+ resolvedContext = budget
268
+ ? resolveProjectContext({
269
+ cwd,
270
+ objective,
271
+ budget,
272
+ items: [
273
+ {
274
+ kind: 'repo',
275
+ ref: 'project://card',
276
+ priority: 100,
277
+ content: card.content,
278
+ },
279
+ ...(options.contextItems || []),
280
+ ],
281
+ })
282
+ : resolveUnknownWindowContext(cwd, card, options.contextItems || []);
283
+ const cardContent = resolvedContext.items.find((i) => i.ref === 'project://card')?.content || card.content;
284
+ const extraContent = resolvedContext.items
285
+ .filter((i) => i.ref !== 'project://card')
286
+ .map((i) => i.content)
287
+ .join('\n\n');
288
+ const ruleContent = resolvedContext.rules?.content || '';
289
+ instructions = [cardContent, extraContent, ruleContent].filter(Boolean).join('\n\n');
290
+ } else {
291
+ instructions = String(options.instructions);
292
+ }
293
+ const toolSurface = buildAgentToolSurface(options.capabilityAdapter, objective, { ...options, schemaProvider: record.provider });
145
294
  const emit = options.emit;
146
295
  const runId = options.runId;
147
296
  event(emit, 'tool.search', toolSurface.receipt, runId);
@@ -152,6 +301,12 @@ export async function runResponsesAgent(options = {}) {
152
301
  : previousResponseId ? { previous_response_id: previousResponseId } : null;
153
302
  let priorActiveTokens = options.previousUsageSnapshot?.current_context?.input_tokens;
154
303
  let input = objective;
304
+ const pendingCompactedInput = providerState?.compacted_input;
305
+ if (!previousResponseId && Array.isArray(providerState?.compacted_input)) {
306
+ input = [...providerState.compacted_input, userMessage(objective)];
307
+ providerState = { ...providerState, compacted_input: undefined, compaction_input: undefined, has_compacted_input: undefined };
308
+ priorActiveTokens = null;
309
+ }
155
310
  let compacted = null;
156
311
  let projected = projectedInputTokens({ instructions, input, toolSurface, priorActiveTokens, budget });
157
312
 
@@ -161,15 +316,19 @@ export async function runResponsesAgent(options = {}) {
161
316
  modelRecord: record,
162
317
  previousResponseId,
163
318
  providerState,
319
+ input: !previousResponseId && pendingCompactedInput ? pendingCompactedInput : undefined,
164
320
  instructions,
165
321
  promptCacheKey: options.promptCacheKey,
166
322
  tokensBefore: Number.isFinite(priorActiveTokens) ? priorActiveTokens : projected,
167
323
  emit,
168
324
  runId,
169
325
  });
170
- if (Array.isArray(compacted.output) && compacted.output.length) input = [...compacted.output, userMessage(objective)];
171
- providerState = compacted.provider_state || null;
172
- previousResponseId = clean(providerState?.previous_response_id) || null;
326
+ if (!Array.isArray(compacted.output) || !compacted.output.length) throw new Error('provider_compaction_output_missing');
327
+ input = [...compacted.output, userMessage(objective)];
328
+ // The returned output is the canonical input; do not prepend it again in the adapter.
329
+ providerState = null;
330
+ previousResponseId = null;
331
+ if (typeof options.onCompaction === 'function') await options.onCompaction(compacted);
173
332
  priorActiveTokens = null;
174
333
  projected = projectedInputTokens({ instructions, input, toolSurface, priorActiveTokens, budget });
175
334
  }
@@ -212,22 +371,42 @@ export async function runResponsesAgent(options = {}) {
212
371
  pressure: pressure?.stage ?? 'unknown',
213
372
  projected_max_call_cost_usd: projectedCost?.total_usd ?? null,
214
373
  tool_surface: toolSurface.receipt,
374
+ resolver_receipt: resolvedContext?.receipt || null,
215
375
  }, runId);
216
376
 
217
377
  let cumulativeUsage = options.cumulativeUsage || null;
378
+ let observedCumulativeInput = Number(cumulativeUsage?.input_tokens || 0);
379
+ const observeCumulativeInput = (snapshot) => {
380
+ const reported = Number(snapshot?.cumulative?.input_tokens);
381
+ if (Number.isFinite(reported) && reported >= 0) observedCumulativeInput = Math.max(observedCumulativeInput, reported);
382
+ else {
383
+ const perCall = Number(snapshot?.input_tokens || 0);
384
+ if (Number.isFinite(perCall) && perCall > 0) observedCumulativeInput += perCall;
385
+ }
386
+ return observedCumulativeInput;
387
+ };
388
+ if (compacted?.usage_delta || compacted?.usage) {
389
+ const delta = compacted.usage_delta || compacted.usage;
390
+ cumulativeUsage = Object.fromEntries(['input_tokens', 'output_tokens', 'cached_input_tokens', 'cache_write_tokens', 'reasoning_tokens'].map(key => [key, Number(cumulativeUsage?.[key] || 0) + Number(delta[key] || 0)]));
391
+ }
218
392
  let totalCostUsd = 0;
219
393
  const costBreakdownUsd = { input: 0, cached_input: 0, cache_write: 0, output: 0 };
394
+ const continuationCompactions = [];
395
+ let continuationGuardTriggered = false;
220
396
  const accumulateCost = (cost) => {
221
397
  totalCostUsd += Number(cost?.total_usd || 0);
222
398
  for (const key of Object.keys(costBreakdownUsd)) costBreakdownUsd[key] += Number(cost?.components_usd?.[key] || 0);
223
399
  };
224
- let response = await provider.create({
400
+ accumulateCost(compacted?.cost);
401
+ let response = await modelTurn({
402
+ provider,
225
403
  model: record.provider_model_id,
226
404
  modelRecord: record,
227
405
  input,
228
406
  instructions,
229
407
  reasoningEffort,
230
408
  serviceTier,
409
+ autoCompact: options.autoCompact,
231
410
  tools: toolSurface.tools,
232
411
  previousResponseId: previousResponseId || undefined,
233
412
  providerState,
@@ -238,23 +417,40 @@ export async function runResponsesAgent(options = {}) {
238
417
  runId,
239
418
  });
240
419
  accumulateCost(response.cost);
420
+ observeCumulativeInput(response.usage_snapshot);
241
421
  providerState = response.provider_state || (response.response_id ? { previous_response_id: response.response_id } : providerState);
242
422
  cumulativeUsage = response.usage_snapshot?.cumulative || cumulativeUsage;
243
423
 
244
424
  const toolReceipts = [];
245
- const maxToolRounds = Number.isInteger(options.maxToolRounds) && options.maxToolRounds > 0 ? options.maxToolRounds : 8;
425
+ const maxToolRounds = Number.isInteger(options.maxToolRounds) && options.maxToolRounds > 0
426
+ ? options.maxToolRounds
427
+ : (RUN_MODE_BUDGETS[options.runMode] ?? RUN_MODE_BUDGETS.quick);
428
+ const maxNoProgressRounds = Number.isInteger(options.maxNoProgressRounds) && options.maxNoProgressRounds > 0
429
+ ? options.maxNoProgressRounds
430
+ : DEFAULT_NO_PROGRESS_LIMIT;
431
+ const runStartedAt = Date.now();
432
+ let toolCallCount = 0;
433
+ let lastRoundSignature = null;
434
+ let repeatedRoundCount = 0;
246
435
  let rounds = 0;
247
436
  while (response.tool_calls?.length) {
248
437
  rounds += 1;
249
438
  if (rounds > maxToolRounds) throw new Error(`tool_round_limit_exceeded:${maxToolRounds}`);
439
+ toolCallCount += response.tool_calls.length;
440
+ const roundSignatureParts = [];
250
441
  const outputs = [];
251
442
  const activeTokens = response.usage_snapshot?.current_context?.input_tokens;
252
443
  const maxToolChars = toolResultCharBudget(activeTokens, budget);
253
444
  for (const call of response.tool_calls) {
254
- const capabilityId = toolSurface.aliases.get(call.name);
445
+ let capabilityId = toolSurface.aliases.get(call.name);
446
+ let descriptor = capabilityId ? toolSurface.descriptors.find((row) => row.name === capabilityId) : null;
447
+ if (!capabilityId) {
448
+ const fallback = resolveCapabilityFallback(options.capabilityAdapter, call.name);
449
+ if (fallback) { capabilityId = fallback.capabilityId; descriptor = fallback.descriptor; }
450
+ }
255
451
  if (!capabilityId) throw new Error(`unrecognized_tool_call:${call.name}`);
256
- const descriptor = toolSurface.descriptors.find((row) => row.name === capabilityId);
257
- const args = sanitizeToolInput(parseArguments(call.arguments), descriptor, cwd);
452
+ const args = sanitizeToolInput(restoreOptionalArguments(parseArguments(call.arguments), descriptor?.input_schema), descriptor, cwd);
453
+ roundSignatureParts.push(`${capabilityId}:${JSON.stringify(args)}`);
258
454
  if (typeof options.beforeTool === 'function') {
259
455
  const approved = await options.beforeTool({
260
456
  call_id: call.call_id,
@@ -294,24 +490,81 @@ export async function runResponsesAgent(options = {}) {
294
490
  outputs.push({ call_id: call.call_id, output: JSON.stringify({ ok: false, error: diagnostic }) });
295
491
  }
296
492
  }
297
- response = await provider.continueWithToolOutputs({
298
- model: record.provider_model_id,
299
- previousResponseId: response.response_id,
300
- providerState: response.provider_state || providerState,
301
- modelRecord: record,
302
- toolOutputs: outputs,
303
- instructions,
304
- reasoningEffort,
305
- serviceTier,
306
- tools: toolSurface.tools,
307
- maxOutputTokens,
308
- promptCacheKey: options.promptCacheKey,
309
- cumulativeUsage,
310
- emit,
311
- runId,
312
- });
493
+ const roundSignature = roundSignatureParts.slice().sort().join('|');
494
+ repeatedRoundCount = (roundSignature && roundSignature === lastRoundSignature) ? repeatedRoundCount + 1 : 0;
495
+ lastRoundSignature = roundSignature;
496
+ if (repeatedRoundCount >= maxNoProgressRounds) {
497
+ throw new Error(`no_progress_detected:${repeatedRoundCount + 1}`);
498
+ }
499
+ const nextCumulativeInput = Math.max(cumulativeInputTokens(response.usage_snapshot), observedCumulativeInput);
500
+ const cumulativeLimit = budget?.maxCumulativeInputTokens ?? null;
501
+ const guardrailCrossed = cumulativeLimit != null && nextCumulativeInput > cumulativeLimit;
502
+ if (guardrailCrossed && !options.allowEconomicOverride && continuationGuardTriggered) {
503
+ throw new Error(`cumulative_input_guardrail_exceeded:${nextCumulativeInput}>${cumulativeLimit}`);
504
+ }
505
+
506
+ if (guardrailCrossed && !options.allowEconomicOverride && !continuationGuardTriggered) {
507
+ if (typeof provider.compact !== 'function') {
508
+ throw new Error(`cumulative_input_compaction_unavailable:${nextCumulativeInput}>${cumulativeLimit}`);
509
+ }
510
+ const midTurnCompaction = await provider.compact({
511
+ model: record.provider_model_id,
512
+ modelRecord: record,
513
+ previousResponseId: response.response_id,
514
+ providerState: response.provider_state || providerState,
515
+ instructions,
516
+ promptCacheKey: options.promptCacheKey,
517
+ tokensBefore: response.usage_snapshot?.current_context?.input_tokens || nextCumulativeInput,
518
+ emit,
519
+ runId,
520
+ });
521
+ if (!Array.isArray(midTurnCompaction.output) || !midTurnCompaction.output.length) throw new Error('provider_compaction_output_missing');
522
+ continuationCompactions.push(midTurnCompaction);
523
+ accumulateCost(midTurnCompaction.cost);
524
+ const delta = midTurnCompaction.usage_delta || midTurnCompaction.usage;
525
+ if (delta) {
526
+ cumulativeUsage = Object.fromEntries(['input_tokens', 'output_tokens', 'cached_input_tokens', 'cache_write_tokens', 'reasoning_tokens'].map(key => [key, Number(cumulativeUsage?.[key] || 0) + Number(delta[key] || 0)]));
527
+ }
528
+ continuationGuardTriggered = true;
529
+ response = await modelTurn({
530
+ provider,
531
+ model: record.provider_model_id,
532
+ modelRecord: record,
533
+ input: [...midTurnCompaction.output, ...toolOutputInput(outputs)],
534
+ instructions,
535
+ reasoningEffort,
536
+ serviceTier,
537
+ autoCompact: options.autoCompact,
538
+ tools: toolSurface.tools,
539
+ maxOutputTokens,
540
+ promptCacheKey: options.promptCacheKey,
541
+ cumulativeUsage,
542
+ emit,
543
+ runId,
544
+ });
545
+ } else {
546
+ response = await modelTurn({
547
+ provider,
548
+ model: record.provider_model_id,
549
+ previousResponseId: response.response_id,
550
+ providerState: response.provider_state || providerState,
551
+ modelRecord: record,
552
+ toolOutputs: outputs,
553
+ instructions,
554
+ reasoningEffort,
555
+ serviceTier,
556
+ autoCompact: options.autoCompact,
557
+ tools: toolSurface.tools,
558
+ maxOutputTokens,
559
+ promptCacheKey: options.promptCacheKey,
560
+ cumulativeUsage,
561
+ emit,
562
+ runId,
563
+ });
564
+ }
313
565
  accumulateCost(response.cost);
314
566
  providerState = response.provider_state || (response.response_id ? { previous_response_id: response.response_id } : providerState);
567
+ observeCumulativeInput(response.usage_snapshot);
315
568
  cumulativeUsage = response.usage_snapshot?.cumulative || cumulativeUsage;
316
569
  }
317
570
 
@@ -341,6 +594,16 @@ export async function runResponsesAgent(options = {}) {
341
594
  cost_breakdown_usd: Object.freeze({ ...costBreakdownUsd }),
342
595
  tool_surface: toolSurface.receipt,
343
596
  tool_receipts: Object.freeze(toolReceipts),
597
+ run_budget: Object.freeze({
598
+ run_mode: options.runMode || 'quick',
599
+ max_tool_rounds: maxToolRounds,
600
+ tool_rounds: rounds,
601
+ tool_calls: toolCallCount,
602
+ elapsed_ms: Date.now() - runStartedAt,
603
+ max_no_progress_rounds: maxNoProgressRounds,
604
+ }),
605
+ compaction: compacted ? { compaction_id: compacted.compaction_id, provider: record.provider, model: record.provider_model_id, created_at: new Date().toISOString(), usage: compacted.usage_delta || compacted.usage || {}, cost_usd: compacted.cost?.total_usd || 0 } : null,
606
+ continuation_compactions: Object.freeze(continuationCompactions.map((row) => ({ compaction_id: row.compaction_id, provider: record.provider, model: record.provider_model_id, usage: row.usage_delta || row.usage || {}, cost_usd: row.cost?.total_usd || 0 }))),
344
607
  compacted_before_turn: Boolean(compacted),
345
608
  provider_state: providerState,
346
609
  continuation: Object.freeze({
@@ -351,3 +614,6 @@ export async function runResponsesAgent(options = {}) {
351
614
  }),
352
615
  });
353
616
  }
617
+
618
+ /** @deprecated Use runAgentSamTurn(). */
619
+ export const runResponsesAgent = runAgentSamTurn;
@@ -5,6 +5,7 @@ export {
5
5
  listCapabilities,
6
6
  } from './manifest.js';
7
7
  export { repositorySnapshot } from './repository-snapshot.js';
8
+ export { terminalExec } from './terminal-exec.js';
8
9
  export {
9
10
  REPOSITORY_SNAPSHOT_VIEWS,
10
11
  buildRepositorySnapshotFacets,
@@ -0,0 +1,78 @@
1
+ import path from 'node:path';
2
+ import os from 'node:os';
3
+ import { runProcess } from '../security/process.js';
4
+ import { redactDiagnosticValue } from '../errors/index.js';
5
+
6
+ const COMMAND_RE = /^[A-Za-z0-9][A-Za-z0-9._+-]*$/;
7
+ const DEFAULT_TIMEOUT_MS = 120_000;
8
+ const MAX_TIMEOUT_MS = 900_000;
9
+ const DEFAULT_OUTPUT_BYTES = 512 * 1024;
10
+ const MAX_OUTPUT_BYTES = 2 * 1024 * 1024;
11
+
12
+ function clean(value) { return value == null ? '' : String(value).trim(); }
13
+
14
+ // spawn() never invokes a shell for non-Windows commands (see security/process.js),
15
+ // so a leading `~` in a cwd override or an argv entry (e.g. `git -C ~/repo`) is never
16
+ // expanded by the OS. Expand it ourselves, matching standard shell semantics: only a
17
+ // leading `~` or `~/...` is special, never `~` mid-string.
18
+ function expandHome(value) {
19
+ const str = clean(value);
20
+ if (str !== '~' && !str.startsWith('~/')) return str;
21
+ const home = os.homedir();
22
+ if (!home) return str;
23
+ return str === '~' ? home : path.join(home, str.slice(2));
24
+ }
25
+ function boundedInteger(value, fallback, max) {
26
+ const number = Number(value);
27
+ if (!Number.isInteger(number) || number < 1) return fallback;
28
+ return Math.min(number, max);
29
+ }
30
+ function projectDirectory(root, relativeCwd = '') {
31
+ const projectRoot = path.resolve(root || process.cwd());
32
+ const directory = path.resolve(projectRoot, clean(relativeCwd) || '.');
33
+ if (directory !== projectRoot && !directory.startsWith(`${projectRoot}${path.sep}`)) {
34
+ throw new Error('terminal_relative_cwd_outside_project');
35
+ }
36
+ return { projectRoot, directory };
37
+ }
38
+
39
+ function subprocessEnvironment(env = process.env) {
40
+ const blocked = /(?:^|_)(?:TOKEN|SECRET|PASSWORD|PASSCODE|API_KEY|PRIVATE_KEY|AUTHORIZATION|COOKIE|CREDENTIAL)(?:_|$)/i;
41
+ return Object.fromEntries(Object.entries(env || {}).filter(([key]) => !blocked.test(key)));
42
+ }
43
+
44
+ /**
45
+ * Run one argv-safe process for the interactive agent.
46
+ *
47
+ * The runtime owns the project root. The model may select only a relative
48
+ * working directory inside that root, and never receives credential-bearing
49
+ * environment variables through this capability.
50
+ */
51
+ export async function terminalExec(input = {}, options = {}) {
52
+ const command = clean(input.command);
53
+ if (!COMMAND_RE.test(command)) throw new Error('terminal_command_must_be_pathless_executable');
54
+ const args = Array.isArray(input.args) ? input.args.map((value) => expandHome(value)) : [];
55
+ if (args.length > 128) throw new Error('terminal_argument_limit_exceeded');
56
+ const { projectRoot, directory } = projectDirectory(expandHome(input.cwd) || options.cwd, input.relative_cwd);
57
+ const timeoutMs = boundedInteger(input.timeout_ms, DEFAULT_TIMEOUT_MS, MAX_TIMEOUT_MS);
58
+ const maxBytes = boundedInteger(input.max_output_bytes, DEFAULT_OUTPUT_BYTES, MAX_OUTPUT_BYTES);
59
+ const runner = options.run || runProcess;
60
+ const result = await runner(command, args, {
61
+ cwd: directory,
62
+ timeoutMs,
63
+ maxBytes,
64
+ signal: options.signal,
65
+ env: subprocessEnvironment(options.env || process.env),
66
+ });
67
+ return Object.freeze({
68
+ ok: result.code === 0,
69
+ command,
70
+ args,
71
+ project_root: projectRoot,
72
+ cwd: directory,
73
+ exit_code: result.code,
74
+ signal: result.signal || null,
75
+ stdout: redactDiagnosticValue(String(result.stdout || ''), { maxChars: maxBytes }),
76
+ stderr: redactDiagnosticValue(String(result.stderr || ''), { maxChars: maxBytes }),
77
+ });
78
+ }