@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,195 @@
1
+ import {
2
+ formatResourcesSummary,
3
+ getIdentityProviderTemplate,
4
+ listSchemaProfiles,
5
+ loadIdentityProviders,
6
+ loadIdentityResources,
7
+ loadSchemaProfile,
8
+ resolveAuthFeature,
9
+ writeFeaturesResolved,
10
+ } from '../features/resolve.js';
11
+
12
+ function parseArgs(argv = []) {
13
+ const opts = {
14
+ cwd: process.cwd(),
15
+ json: false,
16
+ provider: '',
17
+ schemaProfile: '',
18
+ positionals: [],
19
+ };
20
+ for (let i = 0; i < argv.length; i += 1) {
21
+ const arg = argv[i];
22
+ if (arg === '--json') opts.json = true;
23
+ else if (arg === '--cwd') opts.cwd = argv[++i] || opts.cwd;
24
+ else if (arg === '--provider') opts.provider = argv[++i] || '';
25
+ else if (arg === '--schema' || arg === '--schema-profile') opts.schemaProfile = argv[++i] || '';
26
+ else if (!arg.startsWith('-')) opts.positionals.push(arg);
27
+ }
28
+ return opts;
29
+ }
30
+
31
+ function writeJson(value) {
32
+ process.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
33
+ }
34
+
35
+ export async function runIdentityProviders(argv = []) {
36
+ const opts = parseArgs(argv);
37
+ const providers = loadIdentityProviders();
38
+ if (opts.json) {
39
+ writeJson({ ok: true, providers });
40
+ return providers;
41
+ }
42
+ console.log('\nIdentity provider templates\n');
43
+ for (const row of providers) {
44
+ const status = row.status ? ` · ${row.status}` : '';
45
+ console.log(` ${row.id.padEnd(18)} ${String(row.kind || '').padEnd(10)} ${row.title || ''}${status}`);
46
+ }
47
+ console.log('');
48
+ return providers;
49
+ }
50
+
51
+ export async function runIdentityPlan(argv = []) {
52
+ const opts = parseArgs(argv);
53
+ const providerId = opts.provider || opts.positionals[0] || 'inneranimalmedia';
54
+ const provider = getIdentityProviderTemplate(providerId);
55
+ if (!provider) throw new Error(`unknown_provider_template:${providerId}`);
56
+
57
+ const selection = {
58
+ selected: true,
59
+ capabilities: ['identity.init'],
60
+ provider_template: provider.id,
61
+ };
62
+ const resolved = resolveAuthFeature(selection);
63
+ const resources = resolved.resources;
64
+ const tableNames = (resources.tables || []).map((t) => t.name).join(', ');
65
+ const migrations = (resources.migration_sources || []).join('\n ');
66
+ const plan = {
67
+ ok: true,
68
+ command: 'identity.plan',
69
+ provider: resolved.provider,
70
+ resources,
71
+ next: [
72
+ 'agentsam add auth',
73
+ `agentsam identity init --provider ${provider.id}`,
74
+ 'agentsam identity schema',
75
+ ],
76
+ };
77
+
78
+ if (opts.json) {
79
+ writeJson(plan);
80
+ return plan;
81
+ }
82
+
83
+ console.log(`
84
+ Identity plan
85
+ ─────────────
86
+ Provider: ${resolved.provider.id} (${resolved.provider.kind}) · ${resolved.provider.status || ''}
87
+ Engine: ${resources.engine}
88
+ Migrations: ${migrations}
89
+ Tables: ${tableNames}
90
+
91
+ Next:
92
+ agentsam add auth
93
+ agentsam identity init --provider ${provider.id}
94
+ agentsam identity schema
95
+ `);
96
+ return plan;
97
+ }
98
+
99
+ export async function runIdentitySchema(argv = []) {
100
+ const opts = parseArgs(argv);
101
+ const id = opts.schemaProfile || opts.positionals[0] || '';
102
+
103
+ if (!id) {
104
+ const resources = loadIdentityResources();
105
+ if (opts.json) {
106
+ writeJson({ ok: true, resources, also: listSchemaProfiles().filter((r) => r.id === 'better-auth-postgres') });
107
+ return resources;
108
+ }
109
+ if (!resources) {
110
+ console.error('\n ✗ identity resources.json missing\n');
111
+ process.exit(1);
112
+ }
113
+ console.log(`
114
+ Identity resources (packages/identity · oauth-login-portal)
115
+ ──────────────────────────────────────────────────────────
116
+ Engine: ${resources.engine}
117
+ Migrations:`);
118
+ for (const src of resources.migration_sources || []) {
119
+ console.log(` ${src}`);
120
+ }
121
+ console.log('Tables:');
122
+ for (const table of resources.tables || []) {
123
+ const owner = table.owner_column ? ` · owner ${table.owner_column}` : '';
124
+ const sensitive = table.sensitive ? ' · sensitive' : '';
125
+ console.log(` ${table.name.padEnd(24)} ${table.purpose || ''}${owner}${sensitive}`);
126
+ }
127
+ console.log('');
128
+ return resources;
129
+ }
130
+
131
+ const profile = loadSchemaProfile(id);
132
+ if (!profile) throw new Error(`unknown_resources:${id}`);
133
+ if (opts.json) {
134
+ writeJson(profile);
135
+ return profile;
136
+ }
137
+
138
+ if (profile.tables) {
139
+ console.log(`
140
+ Resources: ${profile.feature || profile.id || id}
141
+ Engine: ${profile.engine}
142
+ `);
143
+ for (const src of profile.migration_sources || (profile.source ? [profile.source] : [])) {
144
+ console.log(` migration ${src}`);
145
+ }
146
+ console.log('');
147
+ for (const table of profile.tables || []) {
148
+ const owner = table.owner_column ? ` · owner ${table.owner_column}` : '';
149
+ const sensitive = table.sensitive ? ' · sensitive' : '';
150
+ console.log(` ${String(table.name || '').padEnd(24)} ${table.purpose || ''}${owner}${sensitive}`);
151
+ }
152
+ console.log('');
153
+ } else {
154
+ console.log(`
155
+ ${profile.id || id}
156
+ Engine: ${profile.engine}
157
+ Source: ${profile.source || '(n/a)'}
158
+ ${profile.note ? `Note: ${profile.note}\n` : ''}`);
159
+ }
160
+ return profile;
161
+ }
162
+
163
+ export async function runIdentityResolve(argv = []) {
164
+ const opts = parseArgs(argv);
165
+ const { path: outPath, snapshot } = writeFeaturesResolved(opts.cwd);
166
+ if (opts.json) {
167
+ writeJson({ ok: true, path: outPath, snapshot });
168
+ return snapshot;
169
+ }
170
+ console.log(`\nResolved features → ${outPath}\n`);
171
+ for (const [id, feature] of Object.entries(snapshot.features || {})) {
172
+ const provider = feature.provider_template || feature.provider?.id || '—';
173
+ if (feature.resources) {
174
+ console.log(` ${id.padEnd(16)} provider=${provider} ${formatResourcesSummary(feature.resources)}`);
175
+ } else {
176
+ console.log(` ${id.padEnd(16)} provider=${provider}`);
177
+ }
178
+ }
179
+ console.log('');
180
+ return snapshot;
181
+ }
182
+
183
+ export function printIdentityHelp() {
184
+ console.error(`
185
+ Usage:
186
+ agentsam identity preview [--open] [--port 8791]
187
+ agentsam identity init --name <project> [--brand "Name"] [--provider inneranimalmedia]
188
+ agentsam identity providers [--json]
189
+ agentsam identity plan --provider <id> [--json]
190
+ agentsam identity schema [--json]
191
+ agentsam identity resolve [--cwd PATH] [--json]
192
+ `);
193
+ }
194
+
195
+ export { resolveAuthFeature };
@@ -11,7 +11,7 @@ import { CONFIG_PATH, repositoryRoot, initRepository, readConfig, defaultConfig,
11
11
  import { openSqliteStore } from '../knowledge/stores/sqlite.js';
12
12
  import { openPostgresStore } from '../knowledge/stores/postgres.js';
13
13
  import { planIndex, runIndex, retrieve } from '../knowledge/engine.js';
14
- import { createGeminiEmbedder } from '../knowledge/providers/gemini.js';
14
+ import { createProviderRegistry } from '../../packages/agentsam-knowledge/src/providers/index.js';
15
15
  import { compareObservations } from '../knowledge/evolution.js';
16
16
  import { ensureProjectManifest, getProjectName, getRepositoryId, portableRepositoryIdFromGit, tryReadProjectConfig } from '../lib/project-config.js';
17
17
  import { ensureProjectRules } from '../lib/project-rules.js';
@@ -24,7 +24,18 @@ const localPath = root => path.join(root, '.agentsam', 'knowledge', 'index.sqlit
24
24
  async function openStore(root, config, readOnly = false) {
25
25
  return config.storage.driver === 'sqlite' ? openSqliteStore(localPath(root), { readOnly }) : openPostgresStore(process.env[config.storage.connection_env]);
26
26
  }
27
- function provider() { return createGeminiEmbedder({ apiKey: process.env.GEMINI_API_KEY }); }
27
+ function provider(profile) {
28
+ if (profile?.provider === 'none') throw new Error('Embedding is disabled for this profile. Configure an explicit provider with `agentsam autorag configure --provider … --semantic`.');
29
+ const adapter = createProviderRegistry().get(profile?.provider);
30
+ return {
31
+ validate: input => adapter.validate(input),
32
+ async embed(text, input, context) {
33
+ return context?.kind === 'query'
34
+ ? adapter.embedQuery(text, input, context)
35
+ : (await adapter.embedDocuments([text], input, context))[0];
36
+ },
37
+ };
38
+ }
28
39
  function resolveKnowledgeConfig(root) {
29
40
  const filename = path.join(root, CONFIG_PATH);
30
41
  if (fs.existsSync(filename)) return readConfig(root);
@@ -51,7 +62,14 @@ export async function runRepositoryInit(argv) {
51
62
  if (projectRepositoryId && existingKnowledge.repository_id !== projectRepositoryId) {
52
63
  throw new Error(`repository_identity_mismatch: project=${projectRepositoryId} knowledge=${existingKnowledge.repository_id}`);
53
64
  }
54
- throw new Error(`${CONFIG_PATH} already exists; edit it to change scope/profile. Existing configuration was preserved.`);
65
+ show({
66
+ root,
67
+ config: CONFIG_PATH,
68
+ storage: existingKnowledge.storage?.driver || 'sqlite',
69
+ status: 'already_initialized',
70
+ note: `${CONFIG_PATH} already exists; existing configuration was preserved.`,
71
+ });
72
+ return;
55
73
  }
56
74
  let include = opts.include, exclude = opts.exclude, target = opts.target, dimensions = opts.dimensions;
57
75
  if (!opts.yes) {
@@ -91,7 +109,7 @@ export async function runKnowledge(argv) {
91
109
  else if (command === 'run') {
92
110
  // Lazy adapter creation means a fully cached --embed run needs no API key.
93
111
  let adapter;
94
- const embedder = { embed: (...args) => (adapter ??= provider()).embed(...args) };
112
+ const embedder = { validate: (...args) => (adapter ??= provider(config.embedding)).validate(...args), embed: (...args) => (adapter ??= provider(config.embedding)).embed(...args) };
95
113
  show(await runIndex({ root, config, store, embed: opts.embed, embedder, maxInputs: Number(opts['max-inputs'] ?? 100), maxCharacters: Number(opts['max-characters'] ?? 200000) }));
96
114
  } else if (command === 'history') show((await store?.history(scopeKey(config)) || []).map(g => ({ id: g.id, created_at: g.created_at, git: g.git, ...g.receipt })));
97
115
  else {
@@ -102,11 +120,52 @@ export async function runKnowledge(argv) {
102
120
  } finally { await store?.close(); }
103
121
  }
104
122
 
123
+ export async function runKnowledgeSearch({
124
+ cwd = process.cwd(),
125
+ query = '',
126
+ text = '',
127
+ semantic = false,
128
+ topK = 8,
129
+ tokenBudget = 6000,
130
+ generationId = null,
131
+ } = {}) {
132
+ const q = String(query || text || '').trim();
133
+ const root = repositoryRoot(cwd);
134
+ const sqliteFile = localPath(root);
135
+ const config = resolveKnowledgeConfig(root);
136
+ if (config.storage.driver === 'sqlite' && !fs.existsSync(sqliteFile)) {
137
+ return {
138
+ queryId: 'none',
139
+ query: { text: q, top_k: topK, token_budget: tokenBudget },
140
+ hits: [],
141
+ diagnostics: {
142
+ indexed: false,
143
+ message: 'Knowledge store not initialized. Run `agentsam index run` to build repository index.',
144
+ },
145
+ };
146
+ }
147
+ const store = await openStore(root, config, true);
148
+ try {
149
+ return await retrieve({
150
+ store,
151
+ config,
152
+ text: q,
153
+ semantic: Boolean(semantic),
154
+ embedder: semantic ? provider(config.embedding) : null,
155
+ topK: Number(topK || 8),
156
+ tokenBudget: Number(tokenBudget || 6000),
157
+ generationId,
158
+ });
159
+ } finally {
160
+ await store?.close();
161
+ }
162
+ }
163
+
105
164
  export async function runSearch(argv) {
106
165
  const { values: opts, positionals } = flags(argv, { semantic: { type: 'boolean' }, 'top-k': { type: 'string' }, 'token-budget': { type: 'string' }, generation: { type: 'string' } });
107
166
  if (opts.help) { console.log('agentsam search "query" [--cwd PATH] [--semantic] [--top-k 8] [--token-budget 6000] [--generation ID]'); return; }
108
167
  const root = repositoryRoot(opts.cwd), config = resolveKnowledgeConfig(root), store = await openStore(root, config, true);
109
- try { show(await retrieve({ store, config, text: positionals.join(' '), semantic: opts.semantic, embedder: opts.semantic ? provider() : null, topK: Number(opts['top-k'] || 8), tokenBudget: Number(opts['token-budget'] || 6000), generationId: opts.generation })); }
168
+ try { show(await retrieve({ store, config, text: positionals.join(' '), semantic: opts.semantic, embedder: opts.semantic ? provider(config.embedding) : null, topK: Number(opts['top-k'] || 8), tokenBudget: Number(opts['token-budget'] || 6000), generationId: opts.generation })); }
110
169
  finally { await store?.close(); }
111
170
  }
112
171
 
@@ -0,0 +1,341 @@
1
+ import {
2
+ deleteMcpServer,
3
+ detectInstalledClients,
4
+ inspectClientAdapter,
5
+ isClientRegistered,
6
+ listKnownServers,
7
+ listMcpServers,
8
+ listMcpTools,
9
+ listRegisteredClients,
10
+ pingMcpServer,
11
+ readMcpServer,
12
+ removeServerFromClient,
13
+ resolveServerPreset,
14
+ syncServerToClient,
15
+ writeMcpServer,
16
+ } from '../mcp/index.js';
17
+
18
+ function clean(value) {
19
+ return value == null ? '' : String(value).trim();
20
+ }
21
+
22
+ export function parseMcpArgs(argv = []) {
23
+ let subcommand = clean(argv[0]);
24
+ let help = false;
25
+ if (subcommand === '--help' || subcommand === '-h') {
26
+ help = true;
27
+ subcommand = '';
28
+ }
29
+ const target = clean(argv[1]);
30
+ let client = '';
31
+ let url = '';
32
+ let token = '';
33
+ let json = false;
34
+ let catalog = false;
35
+
36
+ for (let i = 1; i < argv.length; i += 1) {
37
+ const arg = argv[i];
38
+ if (arg === '--client') client = argv[++i] || '';
39
+ else if (arg === '--url') url = argv[++i] || '';
40
+ else if (arg === '--token') token = argv[++i] || '';
41
+ else if (arg === '--json') json = true;
42
+ else if (arg === '--catalog' || arg === '--all') catalog = true;
43
+ else if (arg === '--help' || arg === '-h') help = true;
44
+ }
45
+
46
+ return {
47
+ subcommand,
48
+ target: target.startsWith('--') ? '' : target,
49
+ client: client.toLowerCase(),
50
+ url,
51
+ token,
52
+ json,
53
+ catalog,
54
+ help,
55
+ };
56
+ }
57
+
58
+ function renderHelp(options = {}) {
59
+ const clients = listRegisteredClients(options);
60
+ const servers = listKnownServers(options);
61
+
62
+ const presetRows = servers.map((s) => {
63
+ const key = (s.name || s.server_key || '').padEnd(24);
64
+ const desc = s.description || s.display_name || s.health_status || '';
65
+ return ` ${key} ${s.url} (${desc})`;
66
+ }).join('\n');
67
+
68
+ const clientRows = clients.map((c) => {
69
+ const key = c.client_key.padEnd(24);
70
+ const note = c.notes || c.display_name;
71
+ return ` ${key} ${c.display_name} (${note})`;
72
+ }).join('\n');
73
+
74
+ return `
75
+ AgentSam · MCP Client Management
76
+
77
+ Usage:
78
+ agentsam mcp add <name> [--client <client>|all] [--url <url>] [--token <token>]
79
+ agentsam mcp list [--catalog|--all] [--json]
80
+ agentsam mcp status [<name>] [--json]
81
+ agentsam mcp doctor [<name>] [--json]
82
+ agentsam mcp remove <name> [--client <client>|all]
83
+
84
+ Known server presets:
85
+ ${presetRows}
86
+
87
+ Recognized client adapters:
88
+ ${clientRows}
89
+ `;
90
+ }
91
+
92
+ export async function runMcp(argv = [], options = {}) {
93
+ const args = parseMcpArgs(argv);
94
+ const write = options.write || ((text) => process.stdout.write(text));
95
+
96
+ if (args.help || !args.subcommand) {
97
+ write(renderHelp(options));
98
+ return null;
99
+ }
100
+
101
+ const { subcommand, target } = args;
102
+
103
+ if (subcommand === 'list') {
104
+ if (args.catalog) {
105
+ const catalog = listKnownServers(options);
106
+ if (args.json) {
107
+ write(JSON.stringify({ catalog }, null, 2) + '\n');
108
+ return catalog;
109
+ }
110
+ write('\n Known MCP Server Catalog (Registry: agentsam_mcp_servers)\n\n');
111
+ for (const s of catalog) {
112
+ write(` • ${s.name || s.server_key} (${s.display_name || s.name})\n`);
113
+ write(` url: ${s.url}\n`);
114
+ write(` auth_type: ${s.auth_type || 'none'}\n`);
115
+ write(` health: ${s.health_status || 'unknown'}${s.avg_latency_ms != null ? ` · ${s.avg_latency_ms}ms` : ''}\n\n`);
116
+ }
117
+ return catalog;
118
+ }
119
+
120
+ const servers = listMcpServers(options);
121
+ if (args.json) {
122
+ write(JSON.stringify({ servers }, null, 2) + '\n');
123
+ return servers;
124
+ }
125
+ if (servers.length === 0) {
126
+ write(' No MCP servers configured yet. Add one with: agentsam mcp add inneranimalmedia\n');
127
+ return servers;
128
+ }
129
+ write('\n Configured MCP Servers (Authority: ~/.agentsam/mcp/)\n\n');
130
+ for (const s of servers) {
131
+ write(` • ${s.name}\n`);
132
+ write(` url: ${s.url}\n`);
133
+ write(` clients: ${(s.clients || []).join(', ') || 'none'}\n`);
134
+ write(` auth: ${s.auth?.token ? 'bearer token configured' : 'none'}\n`);
135
+ write(` updated: ${s.updated_at || s.created_at || 'unknown'}\n\n`);
136
+ }
137
+ return servers;
138
+ }
139
+
140
+ if (subcommand === 'add') {
141
+ const name = target || 'inneranimalmedia';
142
+ const preset = resolveServerPreset(name, options);
143
+ const url = args.url || preset?.url;
144
+
145
+ if (!url) {
146
+ throw new Error(`missing_url: specify --url for custom MCP server "${name}"`);
147
+ }
148
+
149
+ let requestedClients = ['cursor'];
150
+ if (args.client) {
151
+ if (args.client === 'all') {
152
+ const detected = detectInstalledClients(options);
153
+ requestedClients = detected.length > 0 ? detected : ['cursor', 'claude'];
154
+ } else {
155
+ requestedClients = [args.client];
156
+ }
157
+ } else if (preset?.defaultClients?.length) {
158
+ requestedClients = preset.defaultClients;
159
+ }
160
+
161
+ const serverConfig = {
162
+ name,
163
+ url,
164
+ protocol: preset?.protocol || 'sse',
165
+ auth: args.token ? { type: preset?.auth_type || 'bearer', token: args.token } : null,
166
+ clients: requestedClients,
167
+ metadata: preset ? { preset: name, description: preset.description, health_status: preset.health_status } : {},
168
+ };
169
+
170
+ // Store in AgentSam authority
171
+ const written = writeMcpServer(name, serverConfig, options);
172
+
173
+ // Materialize client adapters
174
+ const syncedAdapters = [];
175
+ for (const c of requestedClients) {
176
+ const res = syncServerToClient(c, name, serverConfig, options);
177
+ syncedAdapters.push(res);
178
+ }
179
+
180
+ // Ping to verify connectivity
181
+ const ping = await pingMcpServer(serverConfig, options);
182
+
183
+ if (args.json) {
184
+ const payload = { ok: true, server: written, syncedAdapters, ping };
185
+ write(JSON.stringify(payload, null, 2) + '\n');
186
+ return payload;
187
+ }
188
+
189
+ write(`\n ✓ Configured MCP server: ${name}\n`);
190
+ write(` Authority: ~/.agentsam/mcp/${name}.json\n`);
191
+ write(` URL: ${url}\n`);
192
+ for (const a of syncedAdapters) {
193
+ write(` Adapter: ${a.client} -> ${a.configPath}\n`);
194
+ }
195
+ if (ping.ok) {
196
+ write(` Ping: ✓ Connected (${ping.latencyMs}ms)\n`);
197
+ } else {
198
+ write(` Ping: ⚠ Warning (${ping.error || 'unreachable'})\n`);
199
+ }
200
+ write('\n');
201
+ return { server: written, syncedAdapters, ping };
202
+ }
203
+
204
+ if (subcommand === 'status') {
205
+ const name = target || 'inneranimalmedia';
206
+ const server = readMcpServer(name, options);
207
+ if (!server) {
208
+ if (args.json) {
209
+ write(JSON.stringify({ ok: false, error: 'server_not_configured', name }) + '\n');
210
+ return null;
211
+ }
212
+ write(` MCP server "${name}" is not configured. Run: agentsam mcp add ${name}\n`);
213
+ return null;
214
+ }
215
+
216
+ const ping = await pingMcpServer(server, options);
217
+ const clientStatuses = (server.clients || ['cursor']).map((c) =>
218
+ inspectClientAdapter(c, name, options),
219
+ );
220
+
221
+ const report = {
222
+ name,
223
+ url: server.url,
224
+ ping,
225
+ clients: clientStatuses,
226
+ hasAuth: Boolean(server.auth?.token),
227
+ };
228
+
229
+ if (args.json) {
230
+ write(JSON.stringify(report, null, 2) + '\n');
231
+ return report;
232
+ }
233
+
234
+ write(`\n MCP Server Status: ${name}\n`);
235
+ write(` URL: ${server.url}\n`);
236
+ write(` Ping: ${ping.ok ? `✓ Active (${ping.latencyMs}ms)` : `✗ Error: ${ping.error}`}\n`);
237
+ write(` Auth: ${report.hasAuth ? '✓ Bearer token present' : '○ No auth token'}\n`);
238
+ for (const c of clientStatuses) {
239
+ write(` ${c.client}: ${c.configured ? '✓ Configured' : '○ Not configured'} (${c.path})\n`);
240
+ }
241
+ write('\n');
242
+ return report;
243
+ }
244
+
245
+ if (subcommand === 'doctor') {
246
+ const name = target || 'inneranimalmedia';
247
+ const server = readMcpServer(name, options);
248
+
249
+ if (!server) {
250
+ const errPayload = { ok: false, error: 'server_not_configured', name };
251
+ if (args.json) write(JSON.stringify(errPayload, null, 2) + '\n');
252
+ else write(` MCP server "${name}" is not configured.\n`);
253
+ return errPayload;
254
+ }
255
+
256
+ const preset = resolveServerPreset(name, options);
257
+ const ping = await pingMcpServer(server, options);
258
+ const clientStatuses = (server.clients || ['cursor']).map((c) =>
259
+ inspectClientAdapter(c, name, options),
260
+ );
261
+ const toolsProbe = ping.ok ? await listMcpTools(server, options) : { count: 0, tools: [] };
262
+
263
+ const detectedClients = detectInstalledClients(options);
264
+ const diagnostics = {
265
+ name,
266
+ authorityPath: `~/.agentsam/mcp/${name}.json`,
267
+ url: server.url,
268
+ connectivity: ping.ok ? 'pass' : 'fail',
269
+ latencyMs: ping.latencyMs,
270
+ authConfigured: Boolean(server.auth?.token),
271
+ discoveredTools: toolsProbe.count,
272
+ clients: clientStatuses,
273
+ detectedHostClients: detectedClients,
274
+ catalogHealth: preset ? {
275
+ health_status: preset.health_status,
276
+ avg_latency_ms: preset.avg_latency_ms,
277
+ error_rate: preset.error_rate,
278
+ } : null,
279
+ };
280
+
281
+ if (args.json) {
282
+ write(JSON.stringify(diagnostics, null, 2) + '\n');
283
+ return diagnostics;
284
+ }
285
+
286
+ write(`\n AgentSam MCP Doctor · ${name}\n\n`);
287
+ write(` [1] Authority state: ✓ Valid (~/.agentsam/mcp/${name}.json)\n`);
288
+ write(` [2] Endpoint ping: ${ping.ok ? `✓ Reachable (${ping.latencyMs}ms)` : `✗ Unreachable (${ping.error})`}\n`);
289
+ if (preset?.health_status) {
290
+ write(` [3] Live health data: ${preset.health_status} (avg latency: ${preset.avg_latency_ms ?? 0}ms, error rate: ${preset.error_rate ?? 0}%)\n`);
291
+ }
292
+ write(` [4] Auth credential: ${diagnostics.authConfigured ? '✓ Token configured' : '○ Unauthenticated / public'}\n`);
293
+ write(` [5] Tool discovery: ${toolsProbe.count > 0 ? `✓ Found ${toolsProbe.count} tools` : '○ 0 tools discovered'}\n`);
294
+ write(` [6] Client adapters:\n`);
295
+ for (const c of clientStatuses) {
296
+ write(` • ${c.client}: ${c.configured ? '✓ Synced' : '✗ Desynced'} (${c.path})\n`);
297
+ }
298
+ write('\n');
299
+ return diagnostics;
300
+ }
301
+
302
+ if (subcommand === 'remove') {
303
+ const name = target;
304
+ if (!name) throw new Error('mcp_server_name_required');
305
+
306
+ const server = readMcpServer(name, options);
307
+ const targetClients = args.client
308
+ ? (args.client === 'all' ? (server?.clients || ['cursor', 'claude']) : [args.client])
309
+ : (server?.clients || ['cursor', 'claude']);
310
+
311
+ const removedAdapters = [];
312
+ for (const c of targetClients) {
313
+ const res = removeServerFromClient(c, name, options);
314
+ removedAdapters.push(res);
315
+ }
316
+
317
+ let deletedAuthority = false;
318
+ if (!args.client || args.client === 'all') {
319
+ deletedAuthority = deleteMcpServer(name, options);
320
+ }
321
+
322
+ const result = { name, removedAdapters, deletedAuthority };
323
+ if (args.json) {
324
+ write(JSON.stringify(result, null, 2) + '\n');
325
+ return result;
326
+ }
327
+
328
+ write(`\n ✓ Removed MCP server: ${name}\n`);
329
+ for (const r of removedAdapters) {
330
+ if (r.removed) write(` Removed from client adapter: ${r.client} (${r.configPath})\n`);
331
+ }
332
+ if (deletedAuthority) {
333
+ write(` Deleted authority: ~/.agentsam/mcp/${name}.json\n`);
334
+ }
335
+ write('\n');
336
+ return result;
337
+ }
338
+
339
+ write(` Unknown mcp subcommand: "${subcommand}". Use "agentsam mcp --help" for guidance.\n`);
340
+ return null;
341
+ }
@@ -74,7 +74,9 @@ function parse(args) {
74
74
  }
75
75
 
76
76
  export function resolveMerklePersistenceIdentity(root, options = {}) {
77
- const session = options.session ?? readAccountSession(options.sessionOptions || {});
77
+ const session = Object.hasOwn(options, 'session')
78
+ ? options.session
79
+ : readAccountSession(options.sessionOptions || {});
78
80
  const accountId = String(session?.account_id || '').trim();
79
81
  if (!accountId) throw new Error('agentsam_login_required_for_merkle_persistence');
80
82
 
@@ -51,11 +51,15 @@ function parse(argv) {
51
51
  if (arg === '--' && !positionalOnly) { positionalOnly = true; continue; }
52
52
  if (positionalOnly || !arg.startsWith('-')) opts.paths.push(arg);
53
53
  else if (arg === '--interactive' || arg === '--tui') opts.tui = true;
54
- else if (['--json', '--force', '--semantic'].includes(arg)) opts[arg.slice(2)] = true;
55
- else if (['--out', '--root', '--include', '--exclude'].includes(arg)) {
54
+ else if (['--json', '--force', '--semantic', '--persist'].includes(arg)) opts[arg.slice(2)] = true;
55
+ else if (['--out', '--root', '--include', '--exclude', '--connection-id', '--runtime-lease-id', '--capture-kind', '--wrangler-config'].includes(arg)) {
56
56
  const value = args[++i];
57
57
  if (!value || value.startsWith('--')) throw new Error(`Missing value for ${arg}`);
58
58
  if (['--include', '--exclude'].includes(arg)) opts[arg.slice(2)].push(value);
59
+ else if (arg === '--connection-id') opts.connectionId = value;
60
+ else if (arg === '--runtime-lease-id') opts.runtimeLeaseId = value;
61
+ else if (arg === '--capture-kind') opts.captureKind = value;
62
+ else if (arg === '--wrangler-config') opts.wranglerConfig = value;
59
63
  else opts[arg.slice(2)] = value;
60
64
  } else throw new Error(`Unknown option: ${arg}`);
61
65
  }
@@ -106,7 +110,18 @@ export async function runMerkle(argv = []) {
106
110
  if (opts.command === 'diff') return comparison(opts, progress);
107
111
  if (opts.command === 'snapshot') {
108
112
  const { snapshot: tree, output } = await saveSnapshot(target, { ...progress, policy: opts.policy, out: opts.out, force: opts.force, semantic: opts.semantic });
109
- return { title: 'Merkle snapshot', tree, output };
113
+ let persisted = null;
114
+ if (opts.persist || opts.connectionId || opts.runtimeLeaseId) {
115
+ const persistArgs = [output];
116
+ if (opts.wranglerConfig) persistArgs.push('--wrangler-config', opts.wranglerConfig);
117
+ if (opts.captureKind) persistArgs.push('--capture-kind', opts.captureKind);
118
+ else if (opts.connectionId || opts.runtimeLeaseId) persistArgs.push('--capture-kind', 'agent');
119
+ if (opts.connectionId) persistArgs.push('--connection-id', opts.connectionId);
120
+ if (opts.runtimeLeaseId) persistArgs.push('--runtime-lease-id', opts.runtimeLeaseId);
121
+ if (opts.json) persistArgs.push('--json');
122
+ persisted = await runMerklePersist(persistArgs);
123
+ }
124
+ return { title: 'Merkle snapshot', tree, output, persisted };
110
125
  }
111
126
  const isSnapshot = ['inspect', 'explore'].includes(opts.command) && !(await fs.stat(target)).isDirectory();
112
127
  if (isSnapshot && (opts.include.length || opts.exclude.length)) throw new Error('Snapshot inspection uses saved ignore rules.');