@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
@@ -0,0 +1,207 @@
1
+ import { normalizePluginManifest } from './contracts.js';
2
+
3
+ function clean(value) { return value == null ? '' : String(value).trim(); }
4
+ function json(value, fallback) { try { return JSON.parse(String(value ?? '')); } catch { return fallback; } }
5
+ function id(prefix) { return `${prefix}_${crypto.randomUUID().replaceAll('-', '').slice(0, 16)}`; }
6
+
7
+ async function runMutation(db, sql, args = []) {
8
+ const prepared = db.prepare(sql);
9
+ const bound = args.length ? prepared.bind(...args) : prepared;
10
+ if (typeof bound.run === 'function') return bound.run();
11
+ if (typeof bound.all === 'function') return bound.all();
12
+ if (typeof prepared.run === 'function') return prepared.run(...args);
13
+ throw new TypeError('database_statement_runner_unavailable');
14
+ }
15
+
16
+ export async function installPlugin(db, options = {}) {
17
+ if (!db?.prepare) throw new TypeError('D1-compatible database binding required');
18
+ const accountId = clean(options.accountId);
19
+ const environment = clean(options.environment || 'production');
20
+ if (!accountId) throw new Error('plugin_account_id_required');
21
+ const manifest = normalizePluginManifest(options.manifest);
22
+ let plugin = await db.prepare(`
23
+ SELECT id FROM agentsam_plugins
24
+ WHERE account_id = ? AND environment = ? AND plugin_key = ? AND installation_key = ?
25
+ LIMIT 1
26
+ `).bind(accountId, environment, manifest.plugin_key, manifest.installation_key).first();
27
+ const pluginId = plugin?.id || id('plg');
28
+ const values = [
29
+ manifest.provider_key, manifest.plugin_kind, manifest.category, manifest.display_name, manifest.short_name,
30
+ manifest.description, JSON.stringify(manifest.mention_aliases), manifest.endpoint_url, manifest.transport,
31
+ manifest.auth_type, manifest.secret_ref, manifest.oauth_connect_url,
32
+ JSON.stringify(manifest.capabilities.map((row) => row.capability_key)), JSON.stringify(manifest.tool_lanes),
33
+ JSON.stringify(manifest.resource_scope), JSON.stringify(manifest.config), JSON.stringify(manifest.metadata),
34
+ manifest.icon_url, manifest.icon_dark_url, manifest.icon_alt, manifest.icon_fit,
35
+ manifest.composer_visible ? 1 : 0, manifest.settings_visible ? 1 : 0, manifest.sort_priority,
36
+ manifest.health_strategy,
37
+ ];
38
+ if (plugin?.id) {
39
+ await runMutation(db, `
40
+ UPDATE agentsam_plugins SET
41
+ provider_key=?, plugin_kind=?, category=?, display_name=?, short_name=?, description=?, mention_aliases_json=?,
42
+ endpoint_url=?, transport=?, auth_type=?, secret_ref=?, oauth_connect_url=?, capabilities_json=?, tool_lanes_json=?,
43
+ resource_scope_json=?, config_json=?, metadata_json=?, icon_url=?, icon_dark_url=?, icon_alt=?, icon_fit=?,
44
+ composer_visible=?, settings_visible=?, sort_priority=?, health_strategy=?, is_enabled=1, updated_at=unixepoch()
45
+ WHERE id=?
46
+ `, [...values, pluginId]);
47
+ } else {
48
+ await runMutation(db, `
49
+ INSERT INTO agentsam_plugins (
50
+ id, account_id, plugin_key, provider_key, installation_key, environment, plugin_kind, category,
51
+ display_name, short_name, description, mention_aliases_json, endpoint_url, transport, auth_type,
52
+ secret_ref, oauth_connect_url, capabilities_json, tool_lanes_json, resource_scope_json, config_json,
53
+ metadata_json, icon_url, icon_dark_url, icon_alt, icon_fit, composer_visible, settings_visible,
54
+ sort_priority, is_enabled, setup_status, health_strategy, health_status, created_at, updated_at
55
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1, 'unconfigured', ?, 'unknown', unixepoch(), unixepoch())
56
+ `, [pluginId, accountId, manifest.plugin_key, manifest.provider_key, manifest.installation_key, environment, ...values.slice(1)]);
57
+ }
58
+
59
+ for (const capability of manifest.capabilities) {
60
+ await runMutation(db, `
61
+ INSERT INTO agentsam_capabilities (capability_key, domain, verb, description, is_mutating, is_active, created_at, updated_at)
62
+ VALUES (?, ?, ?, ?, ?, 1, unixepoch(), unixepoch())
63
+ ON CONFLICT(capability_key) DO UPDATE SET
64
+ domain=excluded.domain, verb=excluded.verb, description=excluded.description,
65
+ is_mutating=excluded.is_mutating, is_active=1, updated_at=unixepoch()
66
+ `, [capability.capability_key, capability.domain, capability.verb, capability.description, capability.is_mutating ? 1 : 0]);
67
+ }
68
+
69
+ for (const tool of manifest.tools) {
70
+ const existing = await db.prepare(`
71
+ SELECT id, tool_name FROM agentsam_tools
72
+ WHERE plugin_id = ? AND account_id = ? AND tool_key = ?
73
+ LIMIT 1
74
+ `).bind(pluginId, accountId, tool.tool_key).first();
75
+ const toolId = existing?.id || id('ast');
76
+ // The canonical schema intentionally keeps tool_name globally unique even
77
+ // though installed tools belong to an account. tool_key is the stable,
78
+ // model-facing identifier; tool_name is an internal unique function name.
79
+ const installedToolName = existing?.tool_name || `${tool.tool_name}__${toolId}`;
80
+ if (existing?.id) {
81
+ await runMutation(db, `
82
+ UPDATE agentsam_tools SET
83
+ display_name=?, tool_category=?, handler_type=?, description=?, input_schema=?, output_schema=?, handler_config=?,
84
+ intent_tags=?, risk_level=?, requires_approval=?, requires_confirmation=?, is_active=?, updated_at=unixepoch(),
85
+ tool_key=?, capability_key=?, handler_key=?, domain=?, oauth_visible=1, dispatch_target=?, connector_visible=?,
86
+ connector_priority=?, connector_access_class=?, account_id=?, plugin_key=?, plugin_id=?
87
+ WHERE id=?
88
+ `, [
89
+ tool.display_name, tool.tool_category, tool.handler_type, tool.description, JSON.stringify(tool.input_schema),
90
+ tool.output_schema ? JSON.stringify(tool.output_schema) : null, JSON.stringify(tool.handler_config), JSON.stringify(tool.intent_tags),
91
+ tool.risk_level, tool.requires_approval ? 1 : 0, tool.requires_confirmation ? 1 : 0, tool.is_active ? 1 : 0,
92
+ tool.tool_key, tool.capability_key, tool.handler_key, manifest.provider_key, tool.dispatch_target,
93
+ tool.connector_visible ? 1 : 0, manifest.sort_priority, tool.connector_access_class, accountId, manifest.plugin_key, pluginId, toolId,
94
+ ]);
95
+ } else {
96
+ await runMutation(db, `
97
+ INSERT INTO agentsam_tools (
98
+ id, tool_name, display_name, tool_category, handler_type, description, input_schema, output_schema,
99
+ handler_config, intent_tags, risk_level, requires_approval, requires_confirmation, is_active,
100
+ tool_key, capability_key, handler_key, domain, oauth_visible, dispatch_target, connector_visible,
101
+ connector_priority, connector_access_class, account_id, plugin_key, plugin_id, created_at, updated_at
102
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1, ?, ?, ?, ?, ?, ?, ?, unixepoch(), unixepoch())
103
+ `, [
104
+ toolId, installedToolName, tool.display_name, tool.tool_category, tool.handler_type, tool.description,
105
+ JSON.stringify(tool.input_schema), tool.output_schema ? JSON.stringify(tool.output_schema) : null,
106
+ JSON.stringify(tool.handler_config), JSON.stringify(tool.intent_tags), tool.risk_level,
107
+ tool.requires_approval ? 1 : 0, tool.requires_confirmation ? 1 : 0, tool.is_active ? 1 : 0,
108
+ tool.tool_key, tool.capability_key, tool.handler_key, manifest.provider_key, tool.dispatch_target,
109
+ tool.connector_visible ? 1 : 0, manifest.sort_priority, tool.connector_access_class, accountId, manifest.plugin_key, pluginId,
110
+ ]);
111
+ }
112
+ await runMutation(db, `
113
+ INSERT OR REPLACE INTO agentsam_tool_capabilities
114
+ (tool_id, capability_key, requirement_type, is_primary, operations_json, created_at)
115
+ VALUES (?, ?, 'required', 1, ?, unixepoch())
116
+ `, [toolId, tool.capability_key, JSON.stringify([tool.handler_key])]);
117
+ }
118
+ return { plugin_id: pluginId, account_id: accountId, plugin_key: manifest.plugin_key, tools: manifest.tools.length };
119
+ }
120
+
121
+ export async function listPlugins(db, options = {}) {
122
+ const accountId = clean(options.accountId);
123
+ const environment = clean(options.environment || 'production');
124
+ const result = await db.prepare(`
125
+ SELECT * FROM agentsam_plugins
126
+ WHERE account_id = ? AND environment = ? AND is_enabled = 1
127
+ ORDER BY sort_priority, display_name
128
+ `).bind(accountId, environment).all();
129
+ return (result?.results || []).map((row) => ({
130
+ ...row,
131
+ mention_aliases: json(row.mention_aliases_json, []), capabilities: json(row.capabilities_json, []),
132
+ tool_lanes: json(row.tool_lanes_json, []), resource_scope: json(row.resource_scope_json, {}),
133
+ config: json(row.config_json, {}), metadata: json(row.metadata_json, {}),
134
+ }));
135
+ }
136
+
137
+ export async function listPluginTools(db, options = {}) {
138
+ const accountId = clean(options.accountId);
139
+ const result = await db.prepare(`
140
+ SELECT t.* FROM agentsam_tools t
141
+ JOIN agentsam_plugins p ON p.id = t.plugin_id
142
+ WHERE t.account_id = ? AND t.is_active = 1 AND p.is_enabled = 1
143
+ ORDER BY t.connector_priority, t.sort_priority, t.tool_name
144
+ `).bind(accountId).all();
145
+ return (result?.results || []).map((row) => ({
146
+ ...row, input_schema: json(row.input_schema, {}), output_schema: json(row.output_schema, null),
147
+ handler_config: json(row.handler_config, {}), intent_tags: json(row.intent_tags, []),
148
+ }));
149
+ }
150
+
151
+ export async function recordPluginHealthCheck(db, value = {}) {
152
+ const startedAt = Number(value.startedAt || Math.floor(Date.now() / 1000));
153
+ const completedAt = Number(value.completedAt || Math.floor(Date.now() / 1000));
154
+ const checkId = id('plgh');
155
+ await runMutation(db, `
156
+ INSERT INTO agentsam_plugin_health_checks (
157
+ id, plugin_id, plugin_key, account_id, environment, check_kind, check_source, status,
158
+ started_at, completed_at, latency_ms, http_status, provider_request_id, error_code, error_message, details_json, created_at
159
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, unixepoch())
160
+ `, [
161
+ checkId, value.pluginId, value.pluginKey, value.accountId, value.environment || 'production', value.checkKind || 'adapter',
162
+ value.checkSource || 'manual', value.status, startedAt, completedAt, value.latencyMs ?? null, value.httpStatus ?? null,
163
+ value.providerRequestId || null, value.errorCode || null, value.errorMessage || null, JSON.stringify(value.details || {}),
164
+ ]);
165
+ const healthy = value.status === 'healthy';
166
+ await runMutation(db, `
167
+ UPDATE agentsam_plugins SET health_status=?, last_health_at=?,
168
+ last_healthy_at=CASE WHEN ? THEN ? ELSE last_healthy_at END,
169
+ consecutive_failures=CASE WHEN ? THEN 0 ELSE consecutive_failures + 1 END,
170
+ avg_latency_ms=CASE
171
+ WHEN ? IS NULL THEN avg_latency_ms
172
+ WHEN avg_latency_ms IS NULL THEN ?
173
+ ELSE ((avg_latency_ms * 4) + ?) / 5
174
+ END,
175
+ error_rate_24h=COALESCE((
176
+ SELECT CAST(SUM(CASE WHEN status = 'healthy' THEN 0 ELSE 1 END) AS REAL) / COUNT(*)
177
+ FROM agentsam_plugin_health_checks
178
+ WHERE plugin_id = ? AND created_at >= unixepoch() - 86400
179
+ ), 0),
180
+ last_error_code=?, last_error_message=?, updated_at=unixepoch()
181
+ WHERE id=? AND account_id=?
182
+ `, [
183
+ value.status, completedAt, healthy ? 1 : 0, completedAt, healthy ? 1 : 0,
184
+ value.latencyMs ?? null, value.latencyMs ?? null, value.latencyMs ?? null, value.pluginId,
185
+ value.errorCode || null, value.errorMessage || null,
186
+ value.pluginId, value.accountId,
187
+ ]);
188
+ return { id: checkId, status: value.status };
189
+ }
190
+
191
+ export async function recordToolCall(db, value = {}) {
192
+ const callId = clean(value.id) || id('atcl');
193
+ await runMutation(db, `
194
+ INSERT INTO agentsam_tool_call_log (
195
+ id, account_id, agent_run_id, conversation_id, call_index, tool_key, status, duration_ms,
196
+ error_code, failure_origin, cost_usd, input_tokens, output_tokens, cost_basis, source_client,
197
+ cache_hit, external_execution, result_source, created_at_unix, cache_eligible
198
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, unixepoch(), ?)
199
+ `, [
200
+ callId, value.accountId, value.agentRunId || null, value.conversationId || null, value.callIndex ?? null,
201
+ value.toolKey, value.status, Math.max(0, Number(value.durationMs || 0)), value.errorCode || '', value.failureOrigin || null,
202
+ Math.max(0, Number(value.costUsd || 0)), Math.max(0, Number(value.inputTokens || 0)), Math.max(0, Number(value.outputTokens || 0)),
203
+ value.costBasis || 'unknown', value.sourceClient || 'agentsam-sdk', value.cacheHit ? 1 : 0, value.externalExecution === false ? 0 : 1,
204
+ value.resultSource || 'live', value.cacheEligible ? 1 : 0,
205
+ ]);
206
+ return callId;
207
+ }
@@ -0,0 +1,45 @@
1
+ function clean(value) { return value == null ? '' : String(value).trim(); }
2
+
3
+ export function resolveProjectPluginResources(projectConfig, pluginKey, resourceKey = null) {
4
+ return resolveProjectPluginScope(projectConfig, pluginKey, resourceKey);
5
+ }
6
+
7
+ export function resolveProjectRuntimeResources(projectConfig, pluginKey, resourceKey = null) {
8
+ const scope = resolveProjectPluginScope(projectConfig, pluginKey, resourceKey);
9
+ return Object.freeze({
10
+ project_name: clean(projectConfig?.project?.name) || null,
11
+ repository_id: clean(projectConfig?.repository?.id) || null,
12
+ plugin_key: scope.plugin_key,
13
+ resource_key: scope.resource_key || resourceKey || null,
14
+ resource: scope,
15
+ });
16
+ }
17
+
18
+ /** Resolve only the active project's declared resource scope. */
19
+ export function resolveProjectPluginScope(projectConfig, pluginKey, resourceKey = null) {
20
+ const key = clean(pluginKey).replace(/^@/, '');
21
+ if (!key) throw new Error('plugin_key_required');
22
+ const plugins = projectConfig?.plugins || projectConfig?.integrations || {};
23
+ const plugin = plugins[key] || plugins[`@${key}`];
24
+ if (!plugin || typeof plugin !== 'object') throw new Error(`project_plugin_scope_missing:${key}`);
25
+ const resources = plugin.resources && typeof plugin.resources === 'object' ? plugin.resources : plugin;
26
+ if (resourceKey == null) return { plugin_key: key, ...resources };
27
+ const resource = resources[resourceKey];
28
+ if (!resource || typeof resource !== 'object') throw new Error(`project_resource_missing:${key}:${resourceKey}`);
29
+ return { plugin_key: key, resource_key: resourceKey, ...resource };
30
+ }
31
+
32
+ export function resolveProjectVectorizeScope(projectConfig, options = {}) {
33
+ const pluginKey = clean(options.pluginKey || 'cloudflare');
34
+ const resourceKey = clean(options.resourceKey || options.index || options.binding);
35
+ const scope = resolveProjectPluginScope(projectConfig, pluginKey, resourceKey || null);
36
+ const vectorize = scope.vectorize || scope;
37
+ const binding = clean(options.binding || vectorize.binding || vectorize.binding_name);
38
+ const index = clean(options.index || vectorize.index || vectorize.index_name);
39
+ const model = clean(options.model || vectorize.model || vectorize.embedding_model);
40
+ const dimensions = Number(options.dimensions || vectorize.dimensions || vectorize.dimension);
41
+ if (!binding || !index || !model || !Number.isInteger(dimensions) || dimensions < 1) {
42
+ throw new Error(`project_vectorize_scope_incomplete:${pluginKey}:${resourceKey || 'default'}`);
43
+ }
44
+ return Object.freeze({ plugin_key: pluginKey, resource_key: resourceKey || null, binding, index, model, dimensions });
45
+ }
@@ -0,0 +1,118 @@
1
+ import { recordToolCall } from './registry.js';
2
+
3
+ function clean(value) { return value == null ? '' : String(value).trim(); }
4
+
5
+ export async function executeAgentSamTool(options = {}) {
6
+ const tool = options.tool;
7
+ if (!tool?.tool_key) throw new Error('agentsam_tool_required');
8
+ const context = options.context || {};
9
+ const started = Date.now();
10
+ let status = 'success';
11
+ let errorCode = '';
12
+ let failureOrigin = null;
13
+ try {
14
+ if (typeof options.authorizeTool === 'function') {
15
+ const authorization = await options.authorizeTool({ tool, args: options.args || {}, context });
16
+ if (authorization === false || authorization?.allowed === false) {
17
+ const error = new Error(`tool_not_authorized:${tool.tool_key}`);
18
+ error.code = 'AGENTSAM_TOOL_NOT_AUTHORIZED';
19
+ throw error;
20
+ }
21
+ }
22
+ if (Boolean(tool.requires_approval) || Boolean(tool.requires_confirmation)) {
23
+ const approved = typeof options.requireApproval === 'function'
24
+ ? await options.requireApproval({ tool, args: options.args || {}, context })
25
+ : false;
26
+ if (approved !== true) {
27
+ const error = new Error(`tool_not_approved:${tool.tool_key}`);
28
+ error.code = 'AGENTSAM_TOOL_NOT_APPROVED';
29
+ throw error;
30
+ }
31
+ }
32
+ const target = clean(tool.dispatch_target || 'plugin');
33
+ // The persisted row selects the lane and handler family. This keeps
34
+ // installed plugins generic instead of embedding provider names in the
35
+ // AgentSam orchestration loop.
36
+ const dispatcher = typeof options.resolveDispatcher === 'function'
37
+ ? await options.resolveDispatcher({ tool, target, context })
38
+ : options.dispatchers?.[target]
39
+ || options.dispatchers?.[clean(tool.handler_type)]
40
+ || options.handlers?.[clean(tool.handler_type)]
41
+ || options.handlers?.[clean(tool.handler_key)];
42
+ if (typeof dispatcher !== 'function') throw new Error(`tool_dispatcher_unavailable:${target}`);
43
+ return await dispatcher({ tool, args: options.args || {}, context });
44
+ } catch (error) {
45
+ status = error?.code === 'AGENTSAM_TOOL_NOT_AUTHORIZED' || error?.code === 'AGENTSAM_TOOL_NOT_APPROVED' ? 'blocked' : 'error';
46
+ errorCode = clean(error?.code || error?.message || 'tool_error').slice(0, 160);
47
+ failureOrigin = status === 'blocked' ? 'policy' : 'tool';
48
+ throw error;
49
+ } finally {
50
+ if (options.db?.prepare && context.accountId) {
51
+ try {
52
+ await recordToolCall(options.db, {
53
+ accountId: context.accountId,
54
+ agentRunId: context.agentRunId,
55
+ conversationId: context.conversationId,
56
+ callIndex: context.callIndex,
57
+ toolKey: tool.tool_key,
58
+ status,
59
+ durationMs: Date.now() - started,
60
+ errorCode,
61
+ failureOrigin,
62
+ sourceClient: context.sourceClient || 'agentsam-sdk',
63
+ externalExecution: true,
64
+ });
65
+ } catch {
66
+ // Execution evidence is best-effort here; the primary tool result wins.
67
+ }
68
+ }
69
+ }
70
+ }
71
+
72
+ export function createPluginRuntime(options = {}) {
73
+ const tools = Array.isArray(options.tools) ? options.tools : [];
74
+ const byKey = new Map(tools.map((tool) => [clean(tool.tool_key), tool]));
75
+ return Object.freeze({
76
+ tools: Object.freeze([...tools]),
77
+ toolDescriptors() {
78
+ return tools.map((tool) => ({
79
+ name: tool.tool_key,
80
+ description: tool.description || '',
81
+ category: tool.tool_category || tool.plugin_key || 'integrations',
82
+ risk: tool.risk_level || 'low',
83
+ input_schema: tool.input_schema || { type: 'object', properties: {}, required: [], additionalProperties: false },
84
+ requires_approval: Boolean(tool.requires_approval),
85
+ requires_confirmation: Boolean(tool.requires_confirmation),
86
+ dispatch_target: tool.dispatch_target,
87
+ }));
88
+ },
89
+ resolveTool(toolKey) { return byKey.get(clean(toolKey)) || null; },
90
+ execute(toolKey, args = {}, context = {}) {
91
+ const tool = byKey.get(clean(toolKey));
92
+ if (!tool) throw new Error(`agentsam_tool_not_found:${toolKey}`);
93
+ return executeAgentSamTool({
94
+ tool, args, context, db: options.db, dispatchers: options.dispatchers,
95
+ handlers: options.handlers, resolveDispatcher: options.resolveDispatcher,
96
+ authorizeTool: options.authorizeTool, requireApproval: options.requireApproval,
97
+ });
98
+ },
99
+ });
100
+ }
101
+
102
+ export function createPluginCapabilityAdapter(pluginRuntime, baseAdapter = null) {
103
+ if (!pluginRuntime?.toolDescriptors || !pluginRuntime?.execute) throw new TypeError('plugin_runtime_required');
104
+ return Object.freeze({
105
+ toolDescriptors(options = {}) {
106
+ const base = baseAdapter?.toolDescriptors?.(options) || [];
107
+ return [...base, ...pluginRuntime.toolDescriptors()];
108
+ },
109
+ canInvoke(id) { return Boolean(pluginRuntime.resolveTool(id) || baseAdapter?.canInvoke?.(id)); },
110
+ async invoke(id, input = {}) {
111
+ if (pluginRuntime.resolveTool(id)) {
112
+ return { capability_id: id, capability_version: 'plugin-v1', result: await pluginRuntime.execute(id, input) };
113
+ }
114
+ if (!baseAdapter?.invoke) throw new Error(`capability_handler_unavailable:${id}`);
115
+ return baseAdapter.invoke(id, input);
116
+ },
117
+ });
118
+ }
@@ -0,0 +1,31 @@
1
+ function clean(value) { return value == null ? '' : String(value).trim(); }
2
+
3
+ export function resolveVectorizeConfig(tool, context = {}, args = {}) {
4
+ const config = tool?.handler_config || {};
5
+ const scope = context.resourceScope || context.resource_scope || {};
6
+ const bindingName = clean(args.binding || config.binding || scope.binding);
7
+ const indexName = clean(args.index || config.index || scope.index);
8
+ const model = clean(args.model || config.model || scope.model) || null;
9
+ if (!bindingName || !indexName) throw new Error('project_vectorize_binding_and_index_required');
10
+ const binding = typeof context.resolveBinding === 'function'
11
+ ? context.resolveBinding(bindingName, { tool, scope })
12
+ : context.bindings?.[bindingName];
13
+ if (!binding || typeof binding.query !== 'function') throw new Error(`project_vectorize_binding_unavailable:${bindingName}`);
14
+ return { binding, bindingName, indexName, model, dimensions: Number(config.dimensions || scope.dimensions || 0) || null };
15
+ }
16
+
17
+ export async function executeVectorizeTool({ tool, args = {}, context = {} }) {
18
+ const { binding, bindingName, indexName, model, dimensions } = resolveVectorizeConfig(tool, context, args);
19
+ const operation = clean(args.operation || tool.handler_config?.operation || 'query').toLowerCase();
20
+ const index = typeof binding.get === 'function' ? binding.get(indexName) : binding;
21
+ if (!index) throw new Error(`project_vectorize_index_unavailable:${bindingName}:${indexName}`);
22
+ if (operation === 'query') {
23
+ const vector = args.vector || (typeof context.embed === 'function' ? await context.embed(String(args.text || args.q || ''), { model, dimensions }) : null);
24
+ if (!Array.isArray(vector)) throw new Error('project_vectorize_query_vector_required');
25
+ if (dimensions && vector.length !== dimensions) throw new Error(`project_vectorize_dimension_mismatch:${vector.length}!=${dimensions}`);
26
+ return index.query(vector, { topK: Number(args.topK || args.top_k || 10), returnMetadata: args.returnMetadata !== false, namespace: args.namespace });
27
+ }
28
+ if (operation === 'upsert') return index.upsert(args.vectors || args.items || []);
29
+ if (operation === 'delete') return index.deleteByIds(args.ids || []);
30
+ throw new Error(`project_vectorize_operation_unsupported:${operation}`);
31
+ }
@@ -0,0 +1,171 @@
1
+ /**
2
+ * Generic AgentSam progression engine — not brand-specific.
3
+ * Capabilities emit state + findings; this ranks next_actions for any domain.
4
+ */
5
+
6
+ /**
7
+ * @typedef {{
8
+ * id: string,
9
+ * label: string,
10
+ * reason: string,
11
+ * command?: string,
12
+ * capability?: string,
13
+ * priority?: number,
14
+ * requires_model?: boolean,
15
+ * safe?: boolean,
16
+ * }} NextAction
17
+ */
18
+
19
+ /**
20
+ * @param {{
21
+ * capability: string,
22
+ * result?: object,
23
+ * session?: object,
24
+ * rules?: Array<{
25
+ * when: (ctx: object) => boolean,
26
+ * action: NextAction | ((ctx: object) => NextAction)
27
+ * }>
28
+ * }} opts
29
+ * @returns {{ next_actions: NextAction[] }}
30
+ */
31
+ export function suggestNextActions(opts = {}) {
32
+ const ctx = {
33
+ capability: opts.capability || '',
34
+ result: opts.result || {},
35
+ session: opts.session || {},
36
+ };
37
+
38
+ const rules = opts.rules?.length ? opts.rules : defaultRules();
39
+ const out = [];
40
+ for (const rule of rules) {
41
+ try {
42
+ if (!rule.when(ctx)) continue;
43
+ const action = typeof rule.action === 'function' ? rule.action(ctx) : rule.action;
44
+ if (action?.id) out.push({
45
+ requires_model: false,
46
+ safe: true,
47
+ priority: 50,
48
+ ...action,
49
+ });
50
+ } catch {
51
+ // ignore broken rules
52
+ }
53
+ }
54
+
55
+ out.sort((a, b) => (b.priority || 0) - (a.priority || 0));
56
+ // de-dupe by id
57
+ const seen = new Set();
58
+ const next_actions = [];
59
+ for (const a of out) {
60
+ if (seen.has(a.id)) continue;
61
+ seen.add(a.id);
62
+ next_actions.push(a);
63
+ }
64
+ return { next_actions };
65
+ }
66
+
67
+ function defaultRules() {
68
+ return [
69
+ {
70
+ when: (ctx) => ctx.capability === 'brand.scan' && (ctx.result.conflicts?.length || 0) > 0,
71
+ action: (ctx) => ({
72
+ id: 'brand.inspect.conflicts',
73
+ label: 'Inspect token conflicts',
74
+ reason: `${ctx.result.conflicts.length} probable conflicts discovered`,
75
+ command: 'agentsam brand inspect conflicts',
76
+ capability: 'brand.inspect',
77
+ priority: 90,
78
+ }),
79
+ },
80
+ {
81
+ when: (ctx) => ctx.capability === 'brand.scan' && ctx.result.complete !== false,
82
+ action: {
83
+ id: 'brand.plan',
84
+ label: 'Generate a brand normalization plan',
85
+ reason: 'Scan complete — plan preserve/normalize/migrate steps',
86
+ command: 'agentsam plan brand',
87
+ capability: 'brand.plan',
88
+ priority: 80,
89
+ },
90
+ },
91
+ {
92
+ when: (ctx) => ctx.capability === 'brand.scan',
93
+ action: {
94
+ id: 'brand.resolve',
95
+ label: 'Resolve semantic color roles',
96
+ reason: 'Cluster near-duplicate colors into inferred roles',
97
+ command: 'agentsam brand resolve',
98
+ capability: 'brand.resolve',
99
+ priority: 75,
100
+ },
101
+ },
102
+ {
103
+ when: (ctx) => ctx.capability === 'brand.plan',
104
+ action: {
105
+ id: 'brand.apply.preview',
106
+ label: 'Review apply steps (dry-run)',
107
+ reason: 'Mutations require explicit approval',
108
+ command: 'agentsam brand apply --dry-run',
109
+ capability: 'brand.apply',
110
+ priority: 70,
111
+ safe: true,
112
+ },
113
+ },
114
+ {
115
+ when: (ctx) => ctx.capability === 'repository.snapshot',
116
+ action: {
117
+ id: 'brand.scan',
118
+ label: 'Scan brand evidence',
119
+ reason: 'Repository authority ready — discover visual language',
120
+ command: 'agentsam brand scan',
121
+ capability: 'brand.scan',
122
+ priority: 85,
123
+ },
124
+ },
125
+ {
126
+ when: (ctx) => ctx.capability === 'brand.scan' || ctx.capability === 'repository.snapshot',
127
+ action: {
128
+ id: 'inspect.repository',
129
+ label: 'Inspect repository snapshot',
130
+ reason: 'Review classified files and trust boundary',
131
+ command: 'agentsam inspect',
132
+ capability: 'repository.snapshot',
133
+ priority: 40,
134
+ },
135
+ },
136
+ ];
137
+ }
138
+
139
+ /**
140
+ * Deterministic intent router for free-text without a model.
141
+ */
142
+ export function routeDeterministicIntent(text, session = {}) {
143
+ const q = String(text || '').trim().toLowerCase();
144
+ if (!q) return null;
145
+
146
+ if (/^(status|where am i)\b/.test(q) || q === 'status') {
147
+ return { intent: 'status', command: 'agentsam status' };
148
+ }
149
+ if (/what (should|can) i do next|what next|^next\b|suggest/.test(q)) {
150
+ return { intent: 'next', use_progression: true };
151
+ }
152
+ if (/show (me )?(the )?brand|brand status|what.*(brand|colors)/.test(q)) {
153
+ return { intent: 'show-brand', command: 'agentsam brand' };
154
+ }
155
+ if (/show (me )?(the )?plan|what.*(plan)/.test(q)) {
156
+ return { intent: 'show-plan', command: 'agentsam plan brand' };
157
+ }
158
+ if (/what (did you )?find|show findings|inconsisten/.test(q)) {
159
+ return { intent: 'show-findings', command: 'agentsam brand inspect conflicts' };
160
+ }
161
+ if (/^help\b|\?$/.test(q)) {
162
+ return { intent: 'help', command: 'agentsam help' };
163
+ }
164
+ if (/continue|keep going/.test(q)) {
165
+ return { intent: 'continue', use_progression: true };
166
+ }
167
+ if (session.last_capability && /explain|why/.test(q)) {
168
+ return { intent: 'explain-last', command: null };
169
+ }
170
+ return null;
171
+ }
@@ -0,0 +1 @@
1
+ export { suggestNextActions, routeDeterministicIntent } from './engine.js';
@@ -48,7 +48,7 @@ function toolCalls(message = {}) {
48
48
  export function createCloudflareChatAdapter(options = {}) {
49
49
  const credential = options.credential || {};
50
50
  const apiToken = clean(credential.value || process.env.CLOUDFLARE_API_TOKEN);
51
- const accountId = clean(credential.account_id || process.env.CLOUDFLARE_ACCOUNT_ID || process.env.ACCOUNT_ID);
51
+ const accountId = clean(credential.account_id || process.env.CLOUDFLARE_ACCOUNT_ID);
52
52
  const gatewayId = clean(options.gatewayId || process.env.CLOUDFLARE_AI_GATEWAY_ID || 'default');
53
53
  const fetchImpl = options.fetchImpl || fetch;
54
54
 
@@ -1,3 +1,4 @@
1
+ import { compileToolSchema } from './tool-schema.js';
1
2
  import { createAgentEvent, createUsageSnapshot } from '../telemetry/index.js';
2
3
  import { calculateModelCost } from '../models/index.js';
3
4
  import { diagnosticFromError } from '../errors/index.js';
@@ -14,7 +15,7 @@ function toolDeclarations(tools = []) {
14
15
  return tools.map((tool) => ({
15
16
  name: tool.name,
16
17
  description: tool.description || '',
17
- parameters: tool.parameters || { type: 'object', properties: {} },
18
+ parametersJsonSchema: compileToolSchema({ provider: 'gemini', canonicalSchema: tool.parameters, name: tool.name }).providerSchema,
18
19
  }));
19
20
  }
20
21
  function usageParts(response = {}) {