@inneranimalmedia/agentsam-sdk 2.6.2 → 2.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (497) hide show
  1. package/AGENTSAM.md +45 -1
  2. package/README.md +80 -0
  3. package/apps/README.md +34 -0
  4. package/apps/cad-creator/README.md +728 -0
  5. package/apps/cad-creator/shared/cad/package.json +19 -0
  6. package/apps/cad-creator/shared/cad/src/domain/operations.ts +7 -0
  7. package/apps/cad-creator/shared/cad/src/domain/project-contract.d.ts +3 -0
  8. package/apps/cad-creator/shared/cad/src/domain/project-contract.js +75 -0
  9. package/apps/cad-creator/shared/cad/src/domain/project-tools.d.ts +1 -0
  10. package/apps/cad-creator/shared/cad/src/domain/project-tools.js +24 -0
  11. package/apps/cad-creator/shared/cad/src/domain/validation.ts +191 -0
  12. package/apps/cad-creator/shared/cad/src/index.ts +4 -0
  13. package/apps/cad-creator/shared/cad/src/robotics/types.ts +232 -0
  14. package/apps/cad-creator/shared/cad/src/types.ts +507 -0
  15. package/apps/cad-creator/shared/cad/tsconfig.json +14 -0
  16. package/docs/AUTORAG.md +58 -0
  17. package/docs/BRAND_INTELLIGENCE.md +30 -0
  18. package/docs/CLI_SHELL.md +4 -2
  19. package/docs/CMS_CONTEXTUAL_COMPOSER.md +38 -0
  20. package/docs/MERKLE.md +4 -0
  21. package/docs/PROJECT_CONFIG.md +3 -0
  22. package/docs/REPOSITORY_KNOWLEDGE.md +2 -0
  23. package/docs/THEME_REFINERY.md +120 -0
  24. package/docs/architecture/PROVIDER-TOOLS-AND-COMPACTION.md +60 -0
  25. package/docs/architecture/STORAGE.md +87 -0
  26. package/docs/cad-project-tools.md +69 -0
  27. package/docs/cms-scaffolding-pattern-reference.md +73 -0
  28. package/docs/plans/AGENTSAM-INTERACTIVE-UI-REQUIREMENTS-codex-tui-20260919.md +113 -0
  29. package/docs/plans/AGENTSAM-INTERACTIVE-UI-REQUIREMENTS.md +85 -0
  30. package/docs/plans/AGENTSAM-MCP-CLIENT-2026-09-19.md +181 -0
  31. package/docs/plans/ASBD-PORTABLE-WORKGRAPH-UI-DEFERRED.md +34 -0
  32. package/docs/plans/ASTRA-BRIEF-2026-09-18.md +258 -0
  33. package/docs/plans/MULTI-AGENT-SPRINTS-2026-09-19.md +373 -0
  34. package/docs/plans/NEXT-AGENT-HANDOFF.md +167 -0
  35. package/docs/plans/RECONCILIATION-2026-09-19.md +178 -0
  36. package/docs/plugins.md +43 -0
  37. package/docs/tools/README.md +57 -0
  38. package/docs/tools/agent-and-orchestration.md +49 -0
  39. package/docs/tools/browser-and-research.md +46 -0
  40. package/docs/tools/cloudflare-platform.md +32 -0
  41. package/docs/tools/cms.md +25 -0
  42. package/docs/tools/communications.md +41 -0
  43. package/docs/tools/database-and-storage.md +62 -0
  44. package/docs/tools/design-and-media.md +64 -0
  45. package/docs/tools/filesystem-and-code.md +55 -0
  46. package/docs/tools/github.md +56 -0
  47. package/docs/tools/integrations-and-misc.md +16 -0
  48. package/docs/tools/memory.md +21 -0
  49. package/docs/tools/terminal-and-execution.md +29 -0
  50. package/docs/tools/tickets-and-platform.md +30 -0
  51. package/migrations/d1/0001_agentsam_plugin_runtime.sql +177 -0
  52. package/migrations/d1/0002_agentsam_ticket_ownership.sql +8 -0
  53. package/migrations/d1/0002_dynamic_model_policies.sql +23 -0
  54. package/migrations/d1/0003_expand_tool_handler_families.sql +18 -0
  55. package/migrations/d1/0004_project_aware_retrieval_lanes.sql +24 -0
  56. package/migrations/d1/0005_portable_knowledge_identity.sql +104 -0
  57. package/migrations/d1/0006_repair_ops_trail_account_scope.sql +14 -0
  58. package/migrations/d1/0007_repair_ops_trail_agent_run_account.sql +13 -0
  59. package/migrations/d1/0008_backfill_knowledge_run_legacy_tenant.sql +14 -0
  60. package/migrations/d1/0009_normalize_cloudflare_plugin_installations.sql +137 -0
  61. package/migrations/runtime/0001_cli_runtime.sql +67 -0
  62. package/migrations/runtime/0002_project_sessions.sql +15 -0
  63. package/migrations/runtime/0003_provider_continuations.sql +8 -0
  64. package/package.json +92 -12
  65. package/packages/agentsam-brand/README.md +21 -0
  66. package/packages/agentsam-brand/package.json +22 -0
  67. package/packages/agentsam-brand/src/contract.js +59 -0
  68. package/packages/agentsam-brand/src/extract.js +126 -0
  69. package/packages/agentsam-brand/src/goap-actions.js +73 -0
  70. package/packages/agentsam-brand/src/index.js +48 -0
  71. package/packages/agentsam-brand/src/plan.js +115 -0
  72. package/packages/agentsam-brand/src/resolve.js +139 -0
  73. package/packages/agentsam-brand/src/scan.js +250 -0
  74. package/packages/agentsam-brand/test/brand-scan.test.mjs +106 -0
  75. package/packages/agentsam-contracts/README.md +23 -0
  76. package/packages/agentsam-contracts/package.json +32 -0
  77. package/packages/agentsam-contracts/src/adapter.ts +25 -0
  78. package/packages/agentsam-contracts/src/agent.ts +35 -0
  79. package/packages/agentsam-contracts/src/artifacts.ts +33 -0
  80. package/packages/agentsam-contracts/src/authority.ts +29 -0
  81. package/packages/agentsam-contracts/src/context.ts +16 -0
  82. package/packages/agentsam-contracts/src/errors.ts +46 -0
  83. package/packages/agentsam-contracts/src/events.ts +47 -0
  84. package/packages/agentsam-contracts/src/execution.ts +50 -0
  85. package/packages/agentsam-contracts/src/hooks.ts +40 -0
  86. package/packages/agentsam-contracts/src/identity.ts +16 -0
  87. package/packages/agentsam-contracts/src/index.ts +14 -0
  88. package/packages/agentsam-contracts/src/models.ts +9 -0
  89. package/packages/agentsam-contracts/src/providers.ts +33 -0
  90. package/packages/agentsam-contracts/src/repository.ts +64 -0
  91. package/packages/agentsam-contracts/src/tools.ts +98 -0
  92. package/packages/agentsam-contracts/test/contracts.test.mjs +16 -0
  93. package/packages/agentsam-contracts/test/errors-catalog.test.mjs +25 -0
  94. package/packages/agentsam-contracts/test/repository.test.mjs +18 -0
  95. package/packages/agentsam-contracts/tsconfig.json +12 -0
  96. package/packages/agentsam-errors/package.json +17 -0
  97. package/packages/agentsam-errors/src/adapters/anthropic.js +15 -0
  98. package/packages/agentsam-errors/src/adapters/cad.js +109 -0
  99. package/packages/agentsam-errors/src/adapters/cloudflare.js +21 -0
  100. package/packages/agentsam-errors/src/adapters/cursor.js +4 -0
  101. package/packages/agentsam-errors/src/adapters/device.js +38 -0
  102. package/packages/agentsam-errors/src/adapters/docker.js +28 -0
  103. package/packages/agentsam-errors/src/adapters/gcp.js +14 -0
  104. package/packages/agentsam-errors/src/adapters/github.js +22 -0
  105. package/packages/agentsam-errors/src/adapters/google.js +17 -0
  106. package/packages/agentsam-errors/src/adapters/index.js +55 -0
  107. package/packages/agentsam-errors/src/adapters/internal.js +40 -0
  108. package/packages/agentsam-errors/src/adapters/oauth.js +24 -0
  109. package/packages/agentsam-errors/src/adapters/openai.js +17 -0
  110. package/packages/agentsam-errors/src/adapters/process.js +35 -0
  111. package/packages/agentsam-errors/src/adapters/provider.js +114 -0
  112. package/packages/agentsam-errors/src/envelope.js +186 -0
  113. package/packages/agentsam-errors/src/error.js +24 -0
  114. package/packages/agentsam-errors/src/fingerprint.js +35 -0
  115. package/packages/agentsam-errors/src/index.js +10 -0
  116. package/packages/agentsam-errors/src/normalize.js +30 -0
  117. package/packages/agentsam-errors/src/redaction.js +52 -0
  118. package/packages/agentsam-errors/src/render.js +16 -0
  119. package/packages/agentsam-errors/src/retry.js +10 -0
  120. package/packages/agentsam-errors/src/transport.js +52 -0
  121. package/packages/agentsam-errors/src/vocabulary.js +320 -0
  122. package/packages/agentsam-errors/test/envelope.test.mjs +70 -0
  123. package/packages/agentsam-errors/test/providers.test.mjs +99 -0
  124. package/packages/agentsam-errors/test/redaction.test.mjs +21 -0
  125. package/packages/agentsam-errors/test/runtime-cad-device.test.mjs +76 -0
  126. package/packages/agentsam-errors/test/transport.test.mjs +46 -0
  127. package/packages/agentsam-knowledge/package.json +15 -0
  128. package/packages/agentsam-knowledge/src/autorag/index.js +64 -0
  129. package/packages/agentsam-knowledge/src/backends/index.js +26 -0
  130. package/packages/agentsam-knowledge/src/index.js +3 -0
  131. package/packages/agentsam-knowledge/src/providers/index.js +95 -0
  132. package/packages/agentsam-knowledge/test/autorag.test.mjs +42 -0
  133. package/packages/agentsam-nav/README.md +40 -0
  134. package/packages/agentsam-nav/dist/Nav.d.ts +43 -0
  135. package/packages/agentsam-nav/dist/NavCollapsible.d.ts +10 -0
  136. package/packages/agentsam-nav/dist/NavContent.d.ts +2 -0
  137. package/packages/agentsam-nav/dist/NavFooter.d.ts +2 -0
  138. package/packages/agentsam-nav/dist/NavGroup.d.ts +3 -0
  139. package/packages/agentsam-nav/dist/NavHeader.d.ts +2 -0
  140. package/packages/agentsam-nav/dist/NavMenu.d.ts +22 -0
  141. package/packages/agentsam-nav/dist/NavProvider.d.ts +35 -0
  142. package/packages/agentsam-nav/dist/NavTrigger.d.ts +2 -0
  143. package/packages/agentsam-nav/dist/Surfaces.d.ts +41 -0
  144. package/packages/agentsam-nav/dist/browser.d.ts +11 -0
  145. package/packages/agentsam-nav/dist/browser.global.js +132 -0
  146. package/packages/agentsam-nav/dist/browser.js +613 -0
  147. package/packages/agentsam-nav/dist/contracts.d.ts +76 -0
  148. package/packages/agentsam-nav/dist/index.d.ts +11 -0
  149. package/packages/agentsam-nav/dist/index.js +614 -0
  150. package/packages/agentsam-nav/dist/legacy.css +83 -0
  151. package/packages/agentsam-nav/dist/shell.css +113 -0
  152. package/packages/agentsam-nav/dist/theme.css +113 -0
  153. package/packages/agentsam-nav/dist/utils.d.ts +1 -0
  154. package/packages/agentsam-nav/package.json +43 -0
  155. package/packages/agentsam-queue-control/README.md +107 -0
  156. package/packages/agentsam-queue-control/package.json +31 -0
  157. package/packages/agentsam-queue-control/schemas/job-envelope.schema.json +56 -0
  158. package/packages/agentsam-queue-control/src/adapters/cloudflare.js +152 -0
  159. package/packages/agentsam-queue-control/src/adapters/memory.js +38 -0
  160. package/packages/agentsam-queue-control/src/contracts.js +130 -0
  161. package/packages/agentsam-queue-control/src/control-plane.js +141 -0
  162. package/packages/agentsam-queue-control/src/dispatch.js +43 -0
  163. package/packages/agentsam-queue-control/src/index.js +7 -0
  164. package/packages/agentsam-queue-control/src/policy.js +88 -0
  165. package/packages/agentsam-queue-control/src/topology.js +66 -0
  166. package/packages/agentsam-queue-control/test/queue-control.test.mjs +100 -0
  167. package/packages/agentsam-repository/src/goap.js +718 -0
  168. package/packages/agentsam-repository/src/goap.js.bak-20260922011251 +670 -0
  169. package/packages/agentsam-repository/src/index.js +5 -0
  170. package/packages/agentsam-repository/src/merkle/cloudflare-persistence.js +2 -2
  171. package/packages/agentsam-repository/src/tickets.js +184 -0
  172. package/packages/agentsam-repository/src/work-tracking.js +199 -0
  173. package/packages/agentsam-repository/src/workspace-state.js +176 -0
  174. package/packages/agentsam-repository/test/goap-tickets-workspace-state.test.mjs +152 -0
  175. package/packages/connectors/cloudflare/src/index.js +297 -15
  176. package/packages/connectors/cloudflare/src/owner.js +43 -40
  177. package/packages/connectors/cloudflare/src/routes.js +167 -26
  178. package/packages/connectors/cloudflare/tests/connector.test.mjs +112 -2
  179. package/packages/heuristic-theme/README.md +11 -0
  180. package/packages/heuristic-theme/package.json +25 -0
  181. package/packages/heuristic-theme/src/index.js +2 -0
  182. package/packages/heuristic-theme/src/registry.js +36 -0
  183. package/packages/heuristic-theme/src/theme.js +41 -0
  184. package/packages/heuristic-theme/test/theme.test.mjs +26 -0
  185. package/packages/identity/.agentsam/features/oauth-login-portal/agentsam.feature.json +64 -0
  186. package/packages/identity/.agentsam/features/oauth-login-portal/providers.json +96 -0
  187. package/packages/identity/.agentsam/features/oauth-login-portal/resources.json +47 -0
  188. package/packages/identity/.agentsam/features/oauth-login-portal/routes.json +74 -0
  189. package/packages/identity/.agentsam/features/oauth-login-portal/ui.json +35 -0
  190. package/packages/identity/package.json +3 -2
  191. package/packages/identity/src/adapters/cloudflare-d1/ids.js +4 -0
  192. package/packages/identity/src/adapters/cloudflare-d1/index.js +39 -1
  193. package/packages/identity/src/contracts/provider.js +3 -2
  194. package/packages/identity/src/frontend/auth-portal/pages/login.html +7 -0
  195. package/packages/identity/src/index.js +2 -0
  196. package/packages/identity/src/oauth/credentials.js +13 -0
  197. package/packages/identity/src/oauth/iam-platform.js +5 -5
  198. package/packages/identity/src/providers/cloudflare/index.js +19 -0
  199. package/packages/identity/src/providers/cloudflare/mapper.js +21 -0
  200. package/packages/identity/src/providers/cloudflare/oauth.js +48 -0
  201. package/packages/identity/src/providers/cloudflare/profile.js +28 -0
  202. package/packages/identity/src/providers/index.js +18 -2
  203. package/packages/identity/src/server/identity-service.js +13 -3
  204. package/packages/identity/src/server/worker-router.js +63 -8
  205. package/packages/identity/tests/identity-service.test.mjs +15 -0
  206. package/packages/providers/completeful/README.md +38 -0
  207. package/packages/providers/completeful/package.json +29 -0
  208. package/packages/providers/completeful/src/client.js +162 -0
  209. package/packages/providers/completeful/src/events.js +49 -0
  210. package/packages/providers/completeful/src/index.js +22 -0
  211. package/packages/providers/completeful/src/tools.js +579 -0
  212. package/packages/providers/completeful/src/webhooks.js +55 -0
  213. package/packages/providers/completeful/test/provider.test.mjs +196 -0
  214. package/packages/theme-church-site/README.md +10 -0
  215. package/packages/theme-church-site/package.json +30 -0
  216. package/packages/theme-church-site/src/harvest.json +14 -0
  217. package/packages/theme-church-site/src/index.js +84 -0
  218. package/packages/theme-church-site/test/theme.test.mjs +19 -0
  219. package/packages/theme-companions-site/README.md +10 -0
  220. package/packages/theme-companions-site/package.json +30 -0
  221. package/packages/theme-companions-site/src/harvest.json +12 -0
  222. package/packages/theme-companions-site/src/index.js +82 -0
  223. package/packages/theme-companions-site/test/theme.test.mjs +19 -0
  224. package/packages/theme-floors-site/README.md +10 -0
  225. package/packages/theme-floors-site/package.json +30 -0
  226. package/packages/theme-floors-site/src/harvest.json +14 -0
  227. package/packages/theme-floors-site/src/index.js +82 -0
  228. package/packages/theme-floors-site/test/theme.test.mjs +19 -0
  229. package/packages/theme-fuelnfree-site/README.md +10 -0
  230. package/packages/theme-fuelnfree-site/package.json +30 -0
  231. package/packages/theme-fuelnfree-site/src/harvest.json +13 -0
  232. package/packages/theme-fuelnfree-site/src/index.js +81 -0
  233. package/packages/theme-fuelnfree-site/test/theme.test.mjs +19 -0
  234. package/packages/theme-handyman-site/README.md +10 -0
  235. package/packages/theme-handyman-site/package.json +30 -0
  236. package/packages/theme-handyman-site/src/harvest.json +10 -0
  237. package/packages/theme-handyman-site/src/index.js +83 -0
  238. package/packages/theme-handyman-site/test/theme.test.mjs +19 -0
  239. package/packages/theme-insurance-site/README.md +10 -0
  240. package/packages/theme-insurance-site/package.json +30 -0
  241. package/packages/theme-insurance-site/src/harvest.json +10 -0
  242. package/packages/theme-insurance-site/src/index.js +83 -0
  243. package/packages/theme-insurance-site/test/theme.test.mjs +19 -0
  244. package/packages/theme-shinshu-site/README.md +10 -0
  245. package/packages/theme-shinshu-site/package.json +30 -0
  246. package/packages/theme-shinshu-site/src/harvest.json +12 -0
  247. package/packages/theme-shinshu-site/src/index.js +83 -0
  248. package/packages/theme-shinshu-site/test/theme.test.mjs +19 -0
  249. package/packages/work-graph/README.md +49 -0
  250. package/packages/work-graph/package.json +19 -0
  251. package/packages/work-graph/prototype/README.md +32 -0
  252. package/packages/work-graph/prototype/data/demo-workgraph.js +47 -0
  253. package/packages/work-graph/prototype/renderers/timeline-model.js +21 -0
  254. package/packages/work-graph/prototype/renderers/workgraph-runtime.js +38 -0
  255. package/packages/work-graph/prototype-gnantt.html +655 -0
  256. package/packages/work-graph/src/adapters/business/projects.js +23 -0
  257. package/packages/work-graph/src/adapters/engineering/git.js +22 -0
  258. package/packages/work-graph/src/adapters/engineering/mcp.js +22 -0
  259. package/packages/work-graph/src/index.js +76 -0
  260. package/packages/work-graph/src/renderers/gantt-model.js +11 -0
  261. package/packages/work-graph/src/renderers/timeline.js +16 -0
  262. package/packages/work-graph/test/work-graph.test.mjs +37 -0
  263. package/protocol/README.md +12 -0
  264. package/protocol/capabilities/cloudflare-cpu-audit-input.schema.json +30 -6
  265. package/protocol/capabilities/cloudflare-cpu-profile-input.schema.json +18 -4
  266. package/protocol/capabilities/cloudflare-wrangler-native-input.schema.json +59 -10
  267. package/protocol/capabilities/knowledge-search-input.schema.json +35 -0
  268. package/protocol/capabilities/manifest.json +163 -1
  269. package/protocol/capabilities/repository-audit-input.schema.json +39 -6
  270. package/protocol/capabilities/repository-snapshot-input.schema.json +15 -3
  271. package/protocol/capabilities/terminal-exec-input.schema.json +55 -0
  272. package/protocol/commerce/catalog.v1.json +50 -0
  273. package/protocol/errors/error-catalog.json +164 -0
  274. package/protocol/errors/error-envelope.schema.json +544 -0
  275. package/protocol/features/README.md +57 -0
  276. package/protocol/features/agentsam.feature.v1.schema.json +290 -0
  277. package/protocol/features/catalog.json +65 -0
  278. package/protocol/features/examples/provider-resend.feature.json +17 -0
  279. package/protocol/go/agentsam-go-runtime.v1.json +17 -0
  280. package/protocol/knowledge/LIFECYCLE.md +140 -0
  281. package/protocol/knowledge/README.md +4 -0
  282. package/protocol/presets/catalog.json +128 -19
  283. package/protocol/rpc/v1/errors.proto +24 -0
  284. package/protocol/theme-refinery/d1-reconciliation.md +48 -0
  285. package/protocol/theme-refinery/product-metadata.schema.json +27 -0
  286. package/protocol/theme-refinery/receipts/products-registry-batch-20260924.json +318 -0
  287. package/protocol/theme-refinery/receipts/theme-harvest-20260924.json +472 -0
  288. package/protocol/theme-refinery/reconciliation-receipt.schema.json +83 -0
  289. package/services/cad/server.py +249 -2
  290. package/src/agent/capability-adapter.js +15 -5
  291. package/src/agent/index.js +2 -1
  292. package/src/agent/model-turn.js +51 -0
  293. package/src/agent/responses-runner.js +304 -38
  294. package/src/capabilities/index.js +1 -0
  295. package/src/capabilities/terminal-exec.js +78 -0
  296. package/src/cli.js +117 -9
  297. package/src/cloudflare/index.js +6 -0
  298. package/src/cloudflare/runtime-status.js +393 -0
  299. package/src/cloudflare/wrangler.js +17 -1
  300. package/src/commands/app.js +106 -0
  301. package/src/commands/autorag.js +77 -0
  302. package/src/commands/brand.js +293 -0
  303. package/src/commands/cad.js +1 -0
  304. package/src/commands/connections.js +126 -29
  305. package/src/commands/context-economics.js +8 -0
  306. package/src/commands/db.js +7 -0
  307. package/src/commands/env.js +5 -4
  308. package/src/commands/eval.js +209 -14
  309. package/src/commands/go.js +365 -0
  310. package/src/commands/goap.js +176 -0
  311. package/src/commands/identity-init.js +27 -3
  312. package/src/commands/identity-protocol.js +195 -0
  313. package/src/commands/knowledge.js +64 -5
  314. package/src/commands/mcp.js +341 -0
  315. package/src/commands/merkle-persist.js +3 -1
  316. package/src/commands/merkle.js +18 -3
  317. package/src/commands/models.js +109 -23
  318. package/src/commands/plugins.js +175 -0
  319. package/src/commands/preferences.js +28 -8
  320. package/src/commands/product.js +53 -10
  321. package/src/commands/providers.js +118 -37
  322. package/src/commands/resume.js +9 -5
  323. package/src/commands/runtime-status.js +154 -0
  324. package/src/commands/shell.js +466 -55
  325. package/src/commands/status.js +82 -7
  326. package/src/commands/tunnel.js +228 -195
  327. package/src/commands/whoami.js +78 -6
  328. package/src/context/budget.js +6 -0
  329. package/src/context/index.js +2 -1
  330. package/src/context/project-card.js +75 -0
  331. package/src/errors/contract.js +34 -211
  332. package/src/errors/diagnostic.js +95 -51
  333. package/src/errors/index.js +6 -13
  334. package/src/eval/index.js +6 -0
  335. package/src/eval/live.js +439 -0
  336. package/src/features/resolve.js +242 -0
  337. package/src/go/build.js +108 -0
  338. package/src/go/cloudflare.js +207 -0
  339. package/src/go/contract.js +139 -0
  340. package/src/go/discover.js +96 -0
  341. package/src/go/index.js +13 -0
  342. package/src/go/receipts.js +77 -0
  343. package/src/go/registry.js +223 -0
  344. package/src/go/verify.js +31 -0
  345. package/src/index.js +100 -1
  346. package/src/knowledge/config.js +13 -5
  347. package/src/knowledge/engine.js +23 -8
  348. package/src/knowledge/index.js +1 -0
  349. package/src/knowledge/lane-registry.js +46 -0
  350. package/src/knowledge/providers/gemini.js +48 -8
  351. package/src/knowledge/service/client.js +13 -1
  352. package/src/knowledge/service/grpc-codec.js +156 -53
  353. package/src/knowledge/service/job-engine.js +133 -11
  354. package/src/knowledge/service/job-worker.js +34 -5
  355. package/src/knowledge/service/server.js +10 -1
  356. package/src/knowledge/store-discovery.js +77 -0
  357. package/src/lib/account-session.js +8 -2
  358. package/src/lib/agent-instructions.js +3 -0
  359. package/src/lib/auth.js +7 -3
  360. package/src/lib/cad/blender.js +42 -3
  361. package/src/lib/cad/d1-project-store.js +43 -0
  362. package/src/lib/cad/discovery.js +616 -0
  363. package/src/lib/cad/docker-executor.js +352 -0
  364. package/src/lib/cad/freecad.js +253 -0
  365. package/src/lib/cad/index.js +40 -0
  366. package/src/lib/cad/openscad.js +198 -0
  367. package/src/lib/cad/project-cli.d.ts +2 -0
  368. package/src/lib/cad/project-cli.js +21 -0
  369. package/src/lib/cad/project-contract.d.ts +3 -0
  370. package/src/lib/cad/project-contract.js +1 -0
  371. package/src/lib/cad/project-recipe.js +30 -0
  372. package/src/lib/cad/project-runtime.d.ts +2 -0
  373. package/src/lib/cad/project-runtime.js +53 -0
  374. package/src/lib/cad/project-store.js +25 -0
  375. package/src/lib/cad/project-workflows.js +31 -0
  376. package/src/lib/cad-docker.js +21 -2
  377. package/src/lib/cli-preferences.js +17 -2
  378. package/src/lib/core-client.js +37 -18
  379. package/src/lib/deploy/local-studio.js +6 -5
  380. package/src/lib/dockerize.js +3 -0
  381. package/src/lib/execution-approvals.js +1 -0
  382. package/src/lib/identity-scaffold.js +4 -1
  383. package/src/lib/knowledge-docker.js +9 -1
  384. package/src/lib/local-sessions.js +124 -34
  385. package/src/lib/local-status.js +35 -14
  386. package/src/lib/project-config.js +9 -0
  387. package/src/lib/provider-credentials.js +73 -11
  388. package/src/lib/scaffold/resolve-cloudflare-account.js +37 -0
  389. package/src/lib/scaffold/wizards/cms.js +2 -8
  390. package/src/lib/scaffold/wizards/worker-api.js +2 -8
  391. package/src/lib/slash-commands.js +9 -2
  392. package/src/local/migrations.js +109 -1
  393. package/src/local/runtime-store.js +31 -5
  394. package/src/local/sqlite.js +36 -1
  395. package/src/mcp/authority.js +348 -0
  396. package/src/mcp/client-adapters.js +431 -0
  397. package/src/mcp/client.js +172 -0
  398. package/src/mcp/index.js +47 -0
  399. package/src/mcp/telemetry.js +103 -0
  400. package/src/models/catalog.js +329 -51
  401. package/src/models/discovery.js +24 -4
  402. package/src/models/index.js +2 -0
  403. package/src/models/inventory-core.js +182 -0
  404. package/src/models/policy.js +20 -0
  405. package/src/plugins/cloudflare.js +103 -0
  406. package/src/plugins/completeful.js +69 -0
  407. package/src/plugins/contracts.js +86 -0
  408. package/src/plugins/index.js +11 -0
  409. package/src/plugins/registry.js +207 -0
  410. package/src/plugins/resource-scope.js +45 -0
  411. package/src/plugins/runtime.js +118 -0
  412. package/src/plugins/vectorize.js +31 -0
  413. package/src/progression/engine.js +171 -0
  414. package/src/progression/index.js +1 -0
  415. package/src/providers/cloudflare-chat.js +1 -1
  416. package/src/providers/gemini-generate-content.js +2 -1
  417. package/src/providers/openai-responses.js +45 -16
  418. package/src/providers/tool-schema.js +85 -0
  419. package/src/repository/index.js +29 -0
  420. package/src/rpc/generated/errors_pb.js +961 -1
  421. package/src/security/local-vault.js +415 -0
  422. package/src/security/process.js +20 -4
  423. package/src/status/actions.js +192 -0
  424. package/src/tools/hydrate.js +5 -1
  425. package/src/tools/index.js +7 -0
  426. package/src/tools/redact.js +64 -0
  427. package/src/tools/registry.js +83 -0
  428. package/src/tools/runtime.js +257 -0
  429. package/src/tools/search.js +21 -8
  430. package/src/ui/ansi.js +117 -3
  431. package/src/ui/cli/activity.js +76 -7
  432. package/src/ui/cli/footer.js +110 -9
  433. package/src/ui/cli/help.js +11 -4
  434. package/src/ui/wireframes.js +166 -0
  435. package/test/account-session.test.mjs +28 -0
  436. package/test/apps-scaffold-contract.test.mjs +16 -1
  437. package/test/capabilities.test.mjs +1 -1
  438. package/test/cli/eval-live.test.mjs +219 -0
  439. package/test/cli/go.test.mjs +71 -0
  440. package/test/cli/local-vault-and-provider-setup.test.mjs +268 -0
  441. package/test/cli/mcp-client.test.mjs +245 -0
  442. package/test/cli/runtime-ui.test.mjs +69 -2
  443. package/test/cli/status-actions.test.mjs +88 -0
  444. package/test/cli/wireframes-go-registry.test.mjs +54 -0
  445. package/test/cloudflare-connector.test.mjs +3 -6
  446. package/test/cloudflare-runtime.test.mjs +8 -1
  447. package/test/context.test.mjs +15 -0
  448. package/test/error-diagnostics.test.mjs +9 -0
  449. package/test/fixtures/cad/courtyard-house.json +208 -0
  450. package/test/go/cloudflare-probe.test.mjs +53 -0
  451. package/test/integration/app-command.test.mjs +55 -0
  452. package/test/integration/cad-discovery.test.mjs +158 -0
  453. package/test/integration/cad-docker-executor.test.mjs +249 -0
  454. package/test/integration/cad-execution.test.mjs +184 -0
  455. package/test/integration/cad-project-app.test.mjs +31 -0
  456. package/test/integration/cad-project-d1.test.mjs +25 -0
  457. package/test/integration/cad-project-native.test.mjs +24 -0
  458. package/test/integration/cad-project-workflow.test.mjs +9 -0
  459. package/test/integration/cad-project.test.mjs +82 -0
  460. package/test/integration/cli-help.test.mjs +4 -0
  461. package/test/integration/cms-site-tenancy-contract.test.mjs +256 -0
  462. package/test/integration/core-client.integration.test.mjs +55 -0
  463. package/test/integration/error-runtime-rpc.test.mjs +71 -0
  464. package/test/integration/features-resolve.test.mjs +128 -0
  465. package/test/integration/install-script.test.mjs +107 -0
  466. package/test/integration/inventory-core.test.mjs +53 -0
  467. package/test/integration/plugins-cloudflare.integration.test.mjs +28 -0
  468. package/test/integration/provider-env-cli.test.mjs +1 -1
  469. package/test/integration/runtime-migrations.test.mjs +6 -1
  470. package/test/integration/runtime-status.integration.test.mjs +211 -0
  471. package/test/integration/scaffold-cloudflare.test.mjs +46 -0
  472. package/test/integration/storage-architecture.test.mjs +154 -0
  473. package/test/integration/store-discovery.test.mjs +44 -0
  474. package/test/integration/terminal-exec.integration.test.mjs +86 -0
  475. package/test/integration/tool-runtime.test.mjs +124 -0
  476. package/test/integration/tool-schema.test.mjs +59 -0
  477. package/test/knowledge-service.test.mjs +4 -0
  478. package/test/local-sessions.test.mjs +11 -2
  479. package/test/local-studio-deploy.test.mjs +1 -1
  480. package/test/model-catalog.test.mjs +28 -1
  481. package/test/models.test.mjs +159 -5
  482. package/test/openai-responses.test.mjs +60 -0
  483. package/test/provider-credentials.test.mjs +15 -5
  484. package/test/responses-runner.test.mjs +321 -6
  485. package/test/shell.test.mjs +149 -4
  486. package/test/smoke.mjs +2 -2
  487. package/test/tools-search.test.mjs +33 -0
  488. package/test/unit/website-assets-bindings.test.mjs +60 -0
  489. package/test/whoami-resume.test.mjs +82 -3
  490. package/examples/gorilla-shell/README.md +0 -15
  491. package/src/lib/gorilla-template.js +0 -54
  492. package/templates/gorilla-shell/App.tsx +0 -639
  493. package/templates/gorilla-shell/README.md +0 -34
  494. package/templates/gorilla-shell/index.html +0 -15
  495. package/templates/gorilla-shell/main.jsx +0 -9
  496. package/templates/gorilla-shell/package.json +0 -19
  497. package/templates/gorilla-shell/vite.config.js +0 -21
@@ -1,43 +1,15 @@
1
- const DEFAULT_MAX_DETAIL_CHARS = 12_000;
2
- const SECRET_KEY = /(?:authorization|api[-_]?key|access[-_]?token|refresh[-_]?token|password|secret|cookie|credential)/i;
3
- const SECRET_VALUE_PATTERNS = [
4
- /\bBearer\s+[A-Za-z0-9._~+\/-]+=*/gi,
5
- /\bsk-[A-Za-z0-9_-]{12,}\b/g,
6
- /\baak_[A-Za-z0-9_-]{8,}\b/g,
7
- /\bsdk_[A-Za-z0-9_-]{8,}\b/g,
8
- /\bgh[pousr]_[A-Za-z0-9]{20,}\b/g,
9
- ];
1
+ // Backward-compatible diagnostic facade over the canonical AgentSam error runtime.
2
+ import {
3
+ AgentSamError,
4
+ classifyOpenAIFailure,
5
+ classifyProcessFailure,
6
+ normalizeError,
7
+ redactErrorValue,
8
+ redactString,
9
+ } from '../../packages/agentsam-errors/src/index.js';
10
10
 
11
+ const DEFAULT_MAX_DETAIL_CHARS = 12_000;
11
12
  function clean(value) { return value == null ? '' : String(value).trim(); }
12
- function bounded(value, maxChars = DEFAULT_MAX_DETAIL_CHARS) {
13
- const text = String(value ?? '');
14
- if (text.length <= maxChars) return text;
15
- return `${text.slice(0, Math.max(0, maxChars - 1))}…`;
16
- }
17
-
18
- function redactString(value, maxChars) {
19
- let text = bounded(value, maxChars);
20
- for (const pattern of SECRET_VALUE_PATTERNS) text = text.replace(pattern, '[REDACTED]');
21
- return text;
22
- }
23
-
24
- export function redactDiagnosticValue(value, options = {}, depth = 0, key = '') {
25
- const maxChars = Number.isInteger(options.maxChars) && options.maxChars > 0 ? options.maxChars : DEFAULT_MAX_DETAIL_CHARS;
26
- if (SECRET_KEY.test(key)) return '[REDACTED]';
27
- if (depth > 6) return '[TRUNCATED_DEPTH]';
28
- if (value == null || typeof value === 'number' || typeof value === 'boolean') return value;
29
- if (typeof value === 'string') return redactString(value, maxChars);
30
- if (Array.isArray(value)) return value.slice(0, 50).map((item) => redactDiagnosticValue(item, options, depth + 1));
31
- if (typeof value === 'object') {
32
- const result = {};
33
- for (const [childKey, childValue] of Object.entries(value).slice(0, 80)) {
34
- result[childKey] = redactDiagnosticValue(childValue, options, depth + 1, childKey);
35
- }
36
- return result;
37
- }
38
- return redactString(String(value), maxChars);
39
- }
40
-
41
13
  function header(headers, name) {
42
14
  if (!headers) return '';
43
15
  if (typeof headers.get === 'function') return clean(headers.get(name));
@@ -45,7 +17,6 @@ function header(headers, name) {
45
17
  for (const [key, value] of Object.entries(headers)) if (String(key).toLowerCase() === wanted) return clean(value);
46
18
  return '';
47
19
  }
48
-
49
20
  function retryAfterMs(headers) {
50
21
  const value = header(headers, 'retry-after');
51
22
  if (!value) return null;
@@ -61,6 +32,8 @@ const OPENAI_NON_RETRY_CODES = new Set([
61
32
  'organization_usage_limit_exceeded',
62
33
  ]);
63
34
 
35
+ export const redactDiagnosticValue = redactErrorValue;
36
+
64
37
  export function classifyOpenAIError({ status, type, code, message, param } = {}) {
65
38
  const httpStatus = Number(status || 0);
66
39
  const normalizedType = clean(type).toLowerCase();
@@ -80,13 +53,58 @@ export function classifyOpenAIError({ status, type, code, message, param } = {})
80
53
  return { category: 'provider_error', retriable: false, retry_strategy: 'inspect_error' };
81
54
  }
82
55
 
83
- export class AgentSamDiagnosticError extends Error {
84
- constructor(diagnostic, options = {}) {
85
- super(clean(diagnostic?.message) || clean(options.message) || 'AgentSam operation failed', options.cause ? { cause: options.cause } : undefined);
56
+ function legacyDiagnosticFromEnvelope(envelope, fallback = {}) {
57
+ const nativeCode = clean(envelope?.provider_code || envelope?.native?.code || fallback.code);
58
+ const source = fallback.source || envelope?.provider || envelope?.source?.name || 'agentsam';
59
+ return Object.freeze({
60
+ schema_version: 1,
61
+ source,
62
+ kind: fallback.kind || 'runtime_error',
63
+ code: nativeCode || envelope?.reason || envelope?.code || 'runtime_error',
64
+ canonical_code: envelope?.code || null,
65
+ reason: envelope?.reason || null,
66
+ severity: envelope?.severity || null,
67
+ resolution_owner: envelope?.resolution_owner || null,
68
+ message: redactString(envelope?.message || fallback.message || 'Unknown error', 4_000),
69
+ http_status: envelope?.http_status ?? null,
70
+ retriable: Boolean(envelope?.retryable),
71
+ retry_strategy: fallback.retry_strategy || (envelope?.retryable
72
+ ? (envelope?.retry_after_ms != null ? 'retry_after_backoff' : 'retry_backoff')
73
+ : 'inspect_error'),
74
+ retry_after_ms: envelope?.retry_after_ms ?? null,
75
+ request_id: envelope?.request_id || null,
76
+ trace_id: envelope?.trace_id || null,
77
+ fingerprint: envelope?.fingerprint || null,
78
+ details: redactErrorValue(envelope?.details ?? null, { maxChars: DEFAULT_MAX_DETAIL_CHARS }),
79
+ });
80
+ }
81
+
82
+ export class AgentSamDiagnosticError extends AgentSamError {
83
+ constructor(diagnostic = {}, options = {}) {
84
+ const message = clean(diagnostic?.message) || clean(options.message) || 'AgentSam operation failed';
85
+ const native = new Error(message);
86
+ native.code = clean(diagnostic?.code) || null;
87
+ native.status = diagnostic?.http_status ?? diagnostic?.status ?? null;
88
+ const envelope = options.envelope || normalizeError(native, {
89
+ message,
90
+ http_status: native.status,
91
+ source: { kind: diagnostic?.source === 'openai' || diagnostic?.source === 'cloudflare' ? 'provider' : 'runtime', name: clean(diagnostic?.source) || 'agentsam-sdk' },
92
+ provider: ['openai', 'cloudflare'].includes(clean(diagnostic?.source)) ? clean(diagnostic?.source) : null,
93
+ native: {
94
+ code: clean(diagnostic?.code) || null,
95
+ exit_code: Number.isInteger(diagnostic?.exit_code) ? diagnostic.exit_code : null,
96
+ signal: clean(diagnostic?.signal) || null,
97
+ stderr: diagnostic?.stderr || null,
98
+ stdout: diagnostic?.stdout || null,
99
+ },
100
+ details: diagnostic?.details ?? null,
101
+ });
102
+ super(envelope, options.cause ? { cause: options.cause } : undefined);
86
103
  this.name = 'AgentSamDiagnosticError';
87
- this.diagnostic = Object.freeze({ schema_version: 1, ...diagnostic });
88
- this.code = diagnostic?.code || diagnostic?.kind || 'agentsam_error';
89
- this.status = diagnostic?.http_status ?? diagnostic?.status ?? null;
104
+ this.diagnostic = Object.freeze({ schema_version: 1, ...redactErrorValue(diagnostic, { maxChars: DEFAULT_MAX_DETAIL_CHARS }) });
105
+ // Preserve the historical native/provider code on this compatibility class.
106
+ this.code = diagnostic?.code || diagnostic?.kind || envelope.code || 'agentsam_error';
107
+ this.status = diagnostic?.http_status ?? diagnostic?.status ?? envelope.http_status ?? null;
90
108
  }
91
109
  }
92
110
 
@@ -97,46 +115,72 @@ export function createOpenAIHttpError({ status, body, headers, requestedServiceT
97
115
  const code = clean(providerError.code) || null;
98
116
  const message = clean(providerError.message || payload.message || rawText) || `OpenAI API returned HTTP ${status}`;
99
117
  const classification = classifyOpenAIError({ status, type, code, message, param: providerError.param });
118
+ const envelope = classifyOpenAIFailure({
119
+ status,
120
+ type,
121
+ code,
122
+ message,
123
+ headers,
124
+ body: payload,
125
+ details: { ...payload, requested_service_tier: requestedServiceTier || null },
126
+ });
100
127
  const diagnostic = {
101
128
  source: 'openai',
102
129
  kind: 'provider_http_error',
103
130
  http_status: Number(status || 0) || null,
104
131
  type,
105
132
  code,
133
+ canonical_code: envelope.code,
134
+ reason: envelope.reason,
106
135
  param: clean(providerError.param) || null,
107
136
  message: redactString(message, 4_000),
108
137
  category: classification.category,
109
138
  retriable: classification.retriable,
110
139
  retry_strategy: classification.retry_strategy,
111
140
  retry_after_ms: retryAfterMs(headers),
112
- request_id: header(headers, 'x-request-id') || header(headers, 'openai-request-id') || header(headers, 'request-id') || null,
141
+ request_id: header(headers, 'x-request-id') || header(headers, 'openai-request-id') || header(headers, 'request-id') || envelope.request_id || null,
113
142
  ray_id: header(headers, 'cf-ray') || null,
114
143
  requested_service_tier: clean(requestedServiceTier) || null,
115
- details: redactDiagnosticValue(payload, { maxChars: DEFAULT_MAX_DETAIL_CHARS }),
144
+ details: redactErrorValue(payload, { maxChars: DEFAULT_MAX_DETAIL_CHARS }),
116
145
  };
117
- return new AgentSamDiagnosticError(diagnostic);
146
+ return new AgentSamDiagnosticError(diagnostic, { envelope });
118
147
  }
119
148
 
120
149
  export function createProcessDiagnosticError({ code, message, command, args, cwd, exitCode, signal, stderr, stdout, cause, retriable = false } = {}) {
121
- return new AgentSamDiagnosticError({
150
+ const envelope = classifyProcessFailure({
151
+ code,
152
+ message,
153
+ exit_code: exitCode,
154
+ signal,
155
+ stderr,
156
+ stdout,
157
+ stack: cause?.stack,
158
+ details: { command: command || null, args: Array.isArray(args) ? args : [], cwd: cwd || null },
159
+ }, { retryable: Boolean(retriable), message, source: { kind: 'runtime', name: 'process' } });
160
+ const diagnostic = {
122
161
  source: 'process',
123
162
  kind: 'process_error',
124
163
  code: clean(code) || 'process_failed',
164
+ canonical_code: envelope.code,
165
+ reason: envelope.reason,
125
166
  message: clean(message) || 'Process failed',
126
167
  retriable: Boolean(retriable),
127
168
  retry_strategy: retriable ? 'retry_after_inspection' : 'inspect_error',
128
169
  command: clean(command) || null,
129
- args: Array.isArray(args) ? args.slice(0, 64).map((value) => redactString(value, 1_000)) : [],
170
+ args: Array.isArray(args) ? args.slice(0, 64).map(value => redactString(value, 1_000)) : [],
130
171
  cwd: clean(cwd) || null,
131
172
  exit_code: Number.isInteger(exitCode) ? exitCode : null,
132
173
  signal: clean(signal) || null,
133
174
  stderr: redactString(stderr || '', 12_000) || null,
134
175
  stdout: redactString(stdout || '', 4_000) || null,
135
- }, { cause });
176
+ };
177
+ return new AgentSamDiagnosticError(diagnostic, { envelope, cause });
136
178
  }
137
179
 
138
180
  export function diagnosticFromError(error, fallback = {}) {
139
181
  if (error?.diagnostic) return error.diagnostic;
182
+ const envelope = error?.envelope || (error?.ok === false && error?.schema_version ? error : null);
183
+ if (envelope) return legacyDiagnosticFromEnvelope(envelope, fallback);
140
184
  return Object.freeze({
141
185
  schema_version: 1,
142
186
  source: fallback.source || 'agentsam',
@@ -1,16 +1,4 @@
1
- export {
2
- ERROR_SCHEMA_VERSION,
3
- ERROR_CODE,
4
- ERROR_REASON,
5
- GRPC_STATUS,
6
- canonicalCodeFromHttpStatus,
7
- canonicalCodeFromGrpcStatus,
8
- defaultHttpStatusForCode,
9
- grpcStatusForCode,
10
- classifyCloudflareFailure,
11
- classifyOAuthFailure,
12
- createErrorEnvelope,
13
- } from './contract.js';
1
+ export * from '../../packages/agentsam-errors/src/index.js';
14
2
 
15
3
  export {
16
4
  AgentSamDiagnosticError,
@@ -21,3 +9,8 @@ export {
21
9
  redactDiagnosticValue,
22
10
  renderDiagnosticError,
23
11
  } from './diagnostic.js';
12
+
13
+ export {
14
+ classifyCloudflareFailure,
15
+ classifyOAuthFailure,
16
+ } from './contract.js';
package/src/eval/index.js CHANGED
@@ -1 +1,7 @@
1
1
  export { listContextEvalFixtures, evaluateContextFixture } from './context.js';
2
+ export {
3
+ startLiveEvalRun,
4
+ getLiveEvalStatus,
5
+ finishLiveEvalRun,
6
+ getEvalStatePath,
7
+ } from './live.js';
@@ -0,0 +1,439 @@
1
+ import fs from 'node:fs';
2
+ import os from 'node:os';
3
+ import path from 'node:path';
4
+ import crypto from 'node:crypto';
5
+ import { execSync } from 'node:child_process';
6
+ import { getSessionToolReceipts, clearSessionToolReceipts, summarizeToolReceipts } from '../mcp/telemetry.js';
7
+ import { readMcpServer } from '../mcp/authority.js';
8
+ import { resolveProjectD1Database } from '../cloudflare/index.js';
9
+
10
+ export const DEFAULT_EVAL_RECORD_ENDPOINT = 'https://mcp.inneranimalmedia.com/api/eval/record';
11
+ export const DEFAULT_D1_DATABASE = '';
12
+ export const DEFAULT_TENANT_ID = 'default';
13
+ export const DEFAULT_WORKSPACE_ID = 'default';
14
+ export const DEFAULT_USER_ID = 'default';
15
+
16
+ function clean(value) {
17
+ return value == null ? '' : String(value).trim();
18
+ }
19
+
20
+ function resolveEvalBearerToken(options = {}) {
21
+ const explicit = clean(options.token);
22
+ if (explicit) return explicit;
23
+ const serverName = clean(options.mcpServer) || 'inneranimalmedia';
24
+ return clean(readMcpServer(serverName, options)?.auth?.token);
25
+ }
26
+
27
+ export function homeDirectory(options = {}) {
28
+ return path.resolve(clean(options.home) || clean(options.env?.HOME) || clean(options.env?.USERPROFILE) || os.homedir());
29
+ }
30
+
31
+ export function getEvalStatePath(options = {}) {
32
+ if (options.cwd) {
33
+ return path.join(options.cwd, '.agentsam', 'eval', 'active-run.json');
34
+ }
35
+ return path.join(homeDirectory(options), '.agentsam', 'eval', 'active-run.json');
36
+ }
37
+
38
+ function safeGit(cmd, cwd = process.cwd()) {
39
+ try {
40
+ return execSync(cmd, { cwd, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim();
41
+ } catch {
42
+ return '';
43
+ }
44
+ }
45
+
46
+ function escapeSqlString(str) {
47
+ if (str == null) return 'NULL';
48
+ return `'${String(str).replace(/'/g, "''")}'`;
49
+ }
50
+
51
+ export function startLiveEvalRun(config = {}, options = {}) {
52
+ const filePath = getEvalStatePath(options);
53
+ if (fs.existsSync(filePath)) {
54
+ const existing = JSON.parse(fs.readFileSync(filePath, 'utf8'));
55
+ if (existing?.status === 'running') {
56
+ throw new Error(`live_eval_run_already_active:${existing.run_id}`);
57
+ }
58
+ }
59
+
60
+ const runId = `evr_${Date.now()}_${crypto.randomBytes(4).toString('hex')}`;
61
+ const suiteId = clean(config.suite) || 'sdk-real-work-20260919';
62
+ const caseId = clean(config.case) || clean(config.caseId) || 'general-task';
63
+ const model = clean(config.model) || 'Muse Spark 1.3';
64
+ const provider = clean(config.provider) || 'cursor';
65
+ const client = clean(config.client) || 'cursor';
66
+ const reasoning = clean(config.reasoning) || 'high';
67
+
68
+ const tenantId = clean(config.tenant || config.tenantId) || clean(options.tenantId) || clean(process.env.AGENTSAM_TENANT_ID) || DEFAULT_TENANT_ID;
69
+ const workspaceId = clean(config.workspace || config.workspaceId) || clean(options.workspaceId) || clean(process.env.AGENTSAM_WORKSPACE_ID) || (options.cwd ? path.basename(options.cwd) : path.basename(process.cwd())) || DEFAULT_WORKSPACE_ID;
70
+ const userId = clean(config.user || config.userId) || clean(options.userId) || clean(process.env.AGENTSAM_USER_ID) || clean(process.env.USER) || clean(os.userInfo?.()?.username) || DEFAULT_USER_ID;
71
+ const explicitDb = clean(config.database || config.db) || clean(options.database || options.db);
72
+ const database = explicitDb || resolveProjectD1Database(options.cwd ? path.resolve(options.cwd) : process.cwd()) || DEFAULT_D1_DATABASE;
73
+
74
+ const baseCommit = safeGit('git rev-parse HEAD', options.cwd);
75
+ const branch = safeGit('git branch --show-current', options.cwd);
76
+ const now = new Date().toISOString();
77
+
78
+ const runState = {
79
+ schema_version: 'agentsam.eval.live.v1',
80
+ run_id: runId,
81
+ suite_id: suiteId,
82
+ case_id: caseId,
83
+ tenant_id: tenantId,
84
+ workspace_id: workspaceId,
85
+ user_id: userId,
86
+ database,
87
+ model,
88
+ provider,
89
+ client,
90
+ reasoning,
91
+ status: 'running',
92
+ started_at: now,
93
+ base_commit: baseCommit,
94
+ branch,
95
+ };
96
+
97
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
98
+ fs.writeFileSync(filePath, JSON.stringify(runState, null, 2), 'utf8');
99
+
100
+ return runState;
101
+ }
102
+
103
+ export function getLiveEvalStatus(options = {}) {
104
+ const filePath = getEvalStatePath(options);
105
+ if (!fs.existsSync(filePath)) {
106
+ return { active: false };
107
+ }
108
+
109
+ try {
110
+ const state = JSON.parse(fs.readFileSync(filePath, 'utf8'));
111
+ if (state.status !== 'running') {
112
+ return { active: false, previousRun: state };
113
+ }
114
+
115
+ const elapsedMs = Date.now() - Date.parse(state.started_at);
116
+ const receipts = getSessionToolReceipts(options);
117
+ const summary = summarizeToolReceipts(receipts);
118
+
119
+ return {
120
+ active: true,
121
+ ...state,
122
+ elapsed_ms: elapsedMs,
123
+ receipts_summary: summary,
124
+ };
125
+ } catch {
126
+ return { active: false };
127
+ }
128
+ }
129
+
130
+ export async function finishLiveEvalRun(options = {}) {
131
+ const filePath = getEvalStatePath(options);
132
+ if (!fs.existsSync(filePath)) {
133
+ throw new Error('no_active_live_eval_run');
134
+ }
135
+
136
+ const state = JSON.parse(fs.readFileSync(filePath, 'utf8'));
137
+ const now = new Date().toISOString();
138
+ const durationMs = Date.now() - Date.parse(state.started_at);
139
+
140
+ const headCommit = safeGit('git rev-parse HEAD', options.cwd);
141
+ const diffStat = state.base_commit
142
+ ? safeGit(`git diff --shortstat ${state.base_commit} ${headCommit || 'HEAD'}`, options.cwd)
143
+ : safeGit('git diff --shortstat HEAD~1 HEAD', options.cwd);
144
+
145
+ let filesChanged = 0;
146
+ let insertions = 0;
147
+ let deletions = 0;
148
+ if (diffStat) {
149
+ const mFiles = diffStat.match(/(\d+)\s+files?\s+changed/);
150
+ const mIns = diffStat.match(/(\d+)\s+insertions?\(\+\)/);
151
+ const mDel = diffStat.match(/(\d+)\s+deletions?\(-\)/);
152
+ if (mFiles) filesChanged = Number(mFiles[1]);
153
+ if (mIns) insertions = Number(mIns[1]);
154
+ if (mDel) deletions = Number(mDel[1]);
155
+ }
156
+
157
+ const receipts = getSessionToolReceipts(options);
158
+ const toolSummary = summarizeToolReceipts(receipts);
159
+
160
+ const passed = options.gate ? options.gate.toUpperCase() === 'PASS' : (options.passed !== false);
161
+ const gateStatus = passed ? 'PASS' : 'FAIL';
162
+
163
+ const tenantId = clean(options.tenantId || options.tenant) || state.tenant_id || DEFAULT_TENANT_ID;
164
+ const workspaceId = clean(options.workspaceId || options.workspace) || state.workspace_id || DEFAULT_WORKSPACE_ID;
165
+ const userId = clean(options.userId || options.user) || state.user_id || DEFAULT_USER_ID;
166
+ const targetDb = clean(options.database || options.db) || state.database || resolveProjectD1Database(options.cwd ? path.resolve(options.cwd) : process.cwd()) || DEFAULT_D1_DATABASE;
167
+
168
+ // 1. Construct canonical D1 eval run record (agentsam_eval_runs)
169
+ const evalRunRow = {
170
+ id: state.run_id,
171
+ suite_id: state.suite_id,
172
+ case_id: state.case_id,
173
+ tenant_id: tenantId,
174
+ model_key: state.model,
175
+ provider: state.provider,
176
+ input_tokens: Number(options.inputTokens || 0),
177
+ output_tokens: Number(options.outputTokens || 0),
178
+ latency_ms: durationMs,
179
+ cost_usd: Number(options.costUsd || 0),
180
+ score_quality: passed ? 1.0 : 0.0,
181
+ score_overall: passed ? 1.0 : 0.0,
182
+ passed: passed ? 1 : 0,
183
+ run_at: state.started_at,
184
+ tool_calls_attempted: toolSummary.tool_call_count,
185
+ tool_calls_succeeded: toolSummary.success_count,
186
+ retry_count: toolSummary.failure_count,
187
+ };
188
+
189
+ // 2. Construct canonical D1 model eval observation record (agentsam_model_eval_observations)
190
+ const observationId = `obs_${state.run_id}`;
191
+ const totalTokens = evalRunRow.input_tokens + evalRunRow.output_tokens;
192
+ const fileLocations = {
193
+ branch: state.branch || null,
194
+ base_sha: state.base_commit || null,
195
+ commit_sha: headCommit || null,
196
+ files_changed: filesChanged,
197
+ insertions,
198
+ deletions,
199
+ gate_status: gateStatus,
200
+ tool_summary: toolSummary,
201
+ };
202
+
203
+ const modelObservationRow = {
204
+ id: observationId,
205
+ run_id: state.run_id,
206
+ created_at: now,
207
+ tenant_id: tenantId,
208
+ workspace_id: workspaceId,
209
+ user_id: userId,
210
+ provider: state.provider,
211
+ model_key: state.model,
212
+ task_key: state.case_id,
213
+ profile_slug: state.reasoning ? `reasoning-${state.reasoning}` : 'engineering-high',
214
+ route_key: state.branch || null,
215
+ passed: passed ? 1 : 0,
216
+ status: 'completed',
217
+ failure_class: passed ? null : (options.failureClass || 'verification_failed'),
218
+ error_message: passed ? null : (options.errorMessage || null),
219
+ latency_ms: durationMs,
220
+ input_tokens: evalRunRow.input_tokens,
221
+ output_tokens: evalRunRow.output_tokens,
222
+ total_tokens: totalTokens,
223
+ estimated_cost_usd: evalRunRow.cost_usd,
224
+ response_id: headCommit ? `commit_${headCommit.slice(0, 7)}` : null,
225
+ output_chars: Number(options.outputChars || 0),
226
+ output_sha256: headCommit ? headCommit.slice(0, 7) : null,
227
+ expected_markers_found: passed ? 1 : 0,
228
+ expected_markers_total: 1,
229
+ artifact_path: options.cwd || process.cwd(),
230
+ raw_response_path: state.branch ? `origin/${state.branch}` : null,
231
+ file_locations_json: JSON.stringify(fileLocations),
232
+ updated_at: Math.floor(Date.now() / 1000),
233
+ };
234
+
235
+ // 3. Build SQL statements for both tables
236
+ const sqlSuite = `INSERT OR IGNORE INTO agentsam_eval_suites (id, tenant_id, name, created_at, updated_at) VALUES (${escapeSqlString(evalRunRow.suite_id)}, ${escapeSqlString(evalRunRow.tenant_id)}, ${escapeSqlString(evalRunRow.suite_id)}, ${escapeSqlString(now)}, ${escapeSqlString(now)});`;
237
+ const sqlCase = `INSERT OR IGNORE INTO agentsam_eval_cases (id, suite_id, tenant_id, input_prompt, created_at) VALUES (${escapeSqlString(evalRunRow.case_id)}, ${escapeSqlString(evalRunRow.suite_id)}, ${escapeSqlString(evalRunRow.tenant_id)}, ${escapeSqlString(evalRunRow.case_id)}, ${escapeSqlString(now)});`;
238
+
239
+ const sqlRuns = `INSERT OR REPLACE INTO agentsam_eval_runs (
240
+ id, suite_id, case_id, tenant_id, model_key, provider,
241
+ latency_ms, cost_usd, input_tokens, output_tokens,
242
+ score_quality, score_overall, passed,
243
+ tool_calls_attempted, tool_calls_succeeded, retry_count, run_at
244
+ ) VALUES (
245
+ ${escapeSqlString(evalRunRow.id)},
246
+ ${escapeSqlString(evalRunRow.suite_id)},
247
+ ${escapeSqlString(evalRunRow.case_id)},
248
+ ${escapeSqlString(evalRunRow.tenant_id)},
249
+ ${escapeSqlString(evalRunRow.model_key)},
250
+ ${escapeSqlString(evalRunRow.provider)},
251
+ ${evalRunRow.latency_ms},
252
+ ${evalRunRow.cost_usd},
253
+ ${evalRunRow.input_tokens},
254
+ ${evalRunRow.output_tokens},
255
+ ${evalRunRow.score_quality},
256
+ ${evalRunRow.score_overall},
257
+ ${evalRunRow.passed},
258
+ ${evalRunRow.tool_calls_attempted},
259
+ ${evalRunRow.tool_calls_succeeded},
260
+ ${evalRunRow.retry_count},
261
+ ${escapeSqlString(evalRunRow.run_at)}
262
+ );`;
263
+
264
+ const sqlObs = `INSERT OR REPLACE INTO agentsam_model_eval_observations (
265
+ id, run_id, created_at, tenant_id, workspace_id, user_id,
266
+ provider, model_key, task_key, profile_slug, route_key,
267
+ passed, status, failure_class, error_message, latency_ms,
268
+ input_tokens, output_tokens, total_tokens, estimated_cost_usd,
269
+ response_id, output_chars, output_sha256,
270
+ expected_markers_found, expected_markers_total,
271
+ artifact_path, raw_response_path, file_locations_json, updated_at
272
+ ) VALUES (
273
+ ${escapeSqlString(modelObservationRow.id)},
274
+ ${escapeSqlString(modelObservationRow.run_id)},
275
+ ${escapeSqlString(modelObservationRow.created_at)},
276
+ ${escapeSqlString(modelObservationRow.tenant_id)},
277
+ ${escapeSqlString(modelObservationRow.workspace_id)},
278
+ ${escapeSqlString(modelObservationRow.user_id)},
279
+ ${escapeSqlString(modelObservationRow.provider)},
280
+ ${escapeSqlString(modelObservationRow.model_key)},
281
+ ${escapeSqlString(modelObservationRow.task_key)},
282
+ ${escapeSqlString(modelObservationRow.profile_slug)},
283
+ ${escapeSqlString(modelObservationRow.route_key)},
284
+ ${modelObservationRow.passed},
285
+ ${escapeSqlString(modelObservationRow.status)},
286
+ ${escapeSqlString(modelObservationRow.failure_class)},
287
+ ${escapeSqlString(modelObservationRow.error_message)},
288
+ ${modelObservationRow.latency_ms},
289
+ ${modelObservationRow.input_tokens},
290
+ ${modelObservationRow.output_tokens},
291
+ ${modelObservationRow.total_tokens},
292
+ ${modelObservationRow.estimated_cost_usd},
293
+ ${escapeSqlString(modelObservationRow.response_id)},
294
+ ${modelObservationRow.output_chars},
295
+ ${escapeSqlString(modelObservationRow.output_sha256)},
296
+ ${modelObservationRow.expected_markers_found},
297
+ ${modelObservationRow.expected_markers_total},
298
+ ${escapeSqlString(modelObservationRow.artifact_path)},
299
+ ${escapeSqlString(modelObservationRow.raw_response_path)},
300
+ ${escapeSqlString(modelObservationRow.file_locations_json)},
301
+ ${modelObservationRow.updated_at}
302
+ );`;
303
+
304
+ const combinedSql = `${sqlSuite}\n\n${sqlCase}\n\n${sqlRuns}\n\n${sqlObs}\n`;
305
+
306
+ const summary = {
307
+ model: state.model,
308
+ provider: state.provider,
309
+ client: state.client,
310
+ reasoning: state.reasoning,
311
+ suite_id: state.suite_id,
312
+ case_id: state.case_id,
313
+ tenant_id: tenantId,
314
+ workspace_id: workspaceId,
315
+ database: targetDb,
316
+ elapsed_ms: durationMs,
317
+ files_changed: filesChanged,
318
+ insertions,
319
+ deletions,
320
+ head_commit: headCommit,
321
+ gate_status: gateStatus,
322
+ ...toolSummary,
323
+ d1_sql: combinedSql,
324
+ };
325
+
326
+ // 4. Always archive the run evidence locally before anything else
327
+ const runsDir = path.join(homeDirectory(options), '.agentsam', 'eval', 'runs');
328
+ fs.mkdirSync(runsDir, { recursive: true });
329
+ const localRunFile = path.join(runsDir, `${state.run_id}.json`);
330
+ const runPayload = {
331
+ schema_version: 'agentsam.eval.run-record.v1',
332
+ evalRunRow,
333
+ modelObservationRow,
334
+ summary,
335
+ receipts,
336
+ };
337
+ fs.writeFileSync(localRunFile, JSON.stringify(runPayload, null, 2) + '\n', 'utf8');
338
+
339
+ // 5. Remote persistence execution (if requested)
340
+ let d1Executed = false;
341
+ let d1Error = null;
342
+ let persistenceMethod = null;
343
+
344
+ if (options.remote) {
345
+ const endpoint = clean(options.evalEndpoint) || clean(process.env.AGENTSAM_EVAL_ENDPOINT) || DEFAULT_EVAL_RECORD_ENDPOINT;
346
+ const bearerToken = resolveEvalBearerToken(options);
347
+
348
+ // Primary route: structured HTTP POST (credential-boundary compliant, no local raw D1 shellout)
349
+ try {
350
+ const controller = new AbortController();
351
+ const timer = setTimeout(() => controller.abort(), Number(options.timeoutMs || 8000));
352
+ const res = await fetch(endpoint, {
353
+ method: 'POST',
354
+ signal: controller.signal,
355
+ headers: {
356
+ 'Content-Type': 'application/json',
357
+ ...(bearerToken ? { Authorization: `Bearer ${bearerToken}` } : {}),
358
+ },
359
+ body: JSON.stringify({ evalRunRow, modelObservationRow }),
360
+ });
361
+ clearTimeout(timer);
362
+
363
+ if (res.ok) {
364
+ const data = await res.json();
365
+ if (data?.ok) {
366
+ d1Executed = true;
367
+ persistenceMethod = 'http_endpoint';
368
+ } else {
369
+ throw new Error(data?.error || `HTTP ${res.status}`);
370
+ }
371
+ } else {
372
+ throw new Error(`HTTP ${res.status}`);
373
+ }
374
+ } catch (httpErr) {
375
+ // Secondary fallback if wrangler is explicitly available/requested
376
+ if (options.wranglerFallback !== false) {
377
+ let tmpFile = null;
378
+ try {
379
+ tmpFile = path.join(os.tmpdir(), `agentsam_eval_${state.run_id}_${Date.now()}.sql`);
380
+ fs.writeFileSync(tmpFile, combinedSql, 'utf8');
381
+ execSync(`npx wrangler d1 execute ${targetDb} --remote --file="${tmpFile}"`, {
382
+ cwd: options.cwd || process.cwd(),
383
+ encoding: 'utf8',
384
+ stdio: ['ignore', 'pipe', 'pipe'],
385
+ });
386
+ d1Executed = true;
387
+ persistenceMethod = 'wrangler_file';
388
+ } catch (wranglerErr) {
389
+ d1Error = `HTTP (${httpErr.message}) & Wrangler (${wranglerErr.message})`;
390
+ } finally {
391
+ if (tmpFile && fs.existsSync(tmpFile)) {
392
+ try { fs.unlinkSync(tmpFile); } catch {}
393
+ }
394
+ }
395
+ } else {
396
+ d1Error = httpErr.message;
397
+ }
398
+ }
399
+ }
400
+
401
+ // 6. Evidence preservation check:
402
+ // If remote persistence was requested and failed, DO NOT erase active run or tool receipts unless --force
403
+ if (options.remote && !d1Executed && !options.force) {
404
+ return {
405
+ evalRunRow,
406
+ modelObservationRow,
407
+ persisted_locally: true,
408
+ local_file: localRunFile,
409
+ summary: {
410
+ ...summary,
411
+ d1_executed: false,
412
+ d1_error: d1Error,
413
+ persisted_remote: false,
414
+ state_preserved: true,
415
+ },
416
+ error: `remote_persistence_failed: ${d1Error}. Active run state preserved at ${filePath}. Retry with 'agentsam eval live finish --remote' or pass '--force' to finalize locally.`,
417
+ };
418
+ }
419
+
420
+ // 7. Clear active run and session receipts only upon successful persistence or local completion
421
+ if (fs.existsSync(filePath)) {
422
+ fs.unlinkSync(filePath);
423
+ }
424
+ clearSessionToolReceipts(options);
425
+
426
+ return {
427
+ evalRunRow,
428
+ modelObservationRow,
429
+ persisted_locally: true,
430
+ local_file: localRunFile,
431
+ summary: {
432
+ ...summary,
433
+ d1_executed: d1Executed,
434
+ d1_error: d1Error,
435
+ persistence_method: persistenceMethod,
436
+ persisted_remote: d1Executed,
437
+ },
438
+ };
439
+ }