@inneranimalmedia/agentsam-sdk 2.6.1 → 2.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (507) hide show
  1. package/AGENTSAM.md +45 -1
  2. package/README.md +80 -0
  3. package/apps/README.md +34 -0
  4. package/apps/cad-creator/README.md +728 -0
  5. package/apps/cad-creator/shared/cad/package.json +19 -0
  6. package/apps/cad-creator/shared/cad/src/domain/operations.ts +7 -0
  7. package/apps/cad-creator/shared/cad/src/domain/project-contract.d.ts +3 -0
  8. package/apps/cad-creator/shared/cad/src/domain/project-contract.js +75 -0
  9. package/apps/cad-creator/shared/cad/src/domain/project-tools.d.ts +1 -0
  10. package/apps/cad-creator/shared/cad/src/domain/project-tools.js +24 -0
  11. package/apps/cad-creator/shared/cad/src/domain/validation.ts +191 -0
  12. package/apps/cad-creator/shared/cad/src/index.ts +4 -0
  13. package/apps/cad-creator/shared/cad/src/robotics/types.ts +232 -0
  14. package/apps/cad-creator/shared/cad/src/types.ts +507 -0
  15. package/apps/cad-creator/shared/cad/tsconfig.json +14 -0
  16. package/docs/AUTH_IDENTITY_CONTRACT.md +25 -27
  17. package/docs/AUTORAG.md +58 -0
  18. package/docs/BRAND_INTELLIGENCE.md +30 -0
  19. package/docs/CLI_SHELL.md +4 -2
  20. package/docs/CMS_CONTEXTUAL_COMPOSER.md +38 -0
  21. package/docs/MERKLE.md +4 -0
  22. package/docs/PROJECT_CONFIG.md +3 -0
  23. package/docs/REPOSITORY_KNOWLEDGE.md +2 -0
  24. package/docs/SDK_WORKER.md +4 -3
  25. package/docs/THEME_REFINERY.md +120 -0
  26. package/docs/architecture/PROVIDER-TOOLS-AND-COMPACTION.md +60 -0
  27. package/docs/architecture/STORAGE.md +87 -0
  28. package/docs/cad-project-tools.md +69 -0
  29. package/docs/cms-scaffolding-pattern-reference.md +73 -0
  30. package/docs/plans/AGENTSAM-INTERACTIVE-UI-REQUIREMENTS-codex-tui-20260919.md +113 -0
  31. package/docs/plans/AGENTSAM-INTERACTIVE-UI-REQUIREMENTS.md +85 -0
  32. package/docs/plans/AGENTSAM-MCP-CLIENT-2026-09-19.md +181 -0
  33. package/docs/plans/ASBD-PORTABLE-WORKGRAPH-UI-DEFERRED.md +34 -0
  34. package/docs/plans/ASTRA-BRIEF-2026-09-18.md +258 -0
  35. package/docs/plans/MULTI-AGENT-SPRINTS-2026-09-19.md +373 -0
  36. package/docs/plans/NEXT-AGENT-HANDOFF.md +167 -0
  37. package/docs/plans/RECONCILIATION-2026-09-19.md +178 -0
  38. package/docs/plugins.md +43 -0
  39. package/docs/tools/README.md +57 -0
  40. package/docs/tools/agent-and-orchestration.md +49 -0
  41. package/docs/tools/browser-and-research.md +46 -0
  42. package/docs/tools/cloudflare-platform.md +32 -0
  43. package/docs/tools/cms.md +25 -0
  44. package/docs/tools/communications.md +41 -0
  45. package/docs/tools/database-and-storage.md +62 -0
  46. package/docs/tools/design-and-media.md +64 -0
  47. package/docs/tools/filesystem-and-code.md +55 -0
  48. package/docs/tools/github.md +56 -0
  49. package/docs/tools/integrations-and-misc.md +16 -0
  50. package/docs/tools/memory.md +21 -0
  51. package/docs/tools/terminal-and-execution.md +29 -0
  52. package/docs/tools/tickets-and-platform.md +30 -0
  53. package/migrations/d1/0001_agentsam_plugin_runtime.sql +177 -0
  54. package/migrations/d1/0002_agentsam_ticket_ownership.sql +8 -0
  55. package/migrations/d1/0002_dynamic_model_policies.sql +23 -0
  56. package/migrations/d1/0003_expand_tool_handler_families.sql +18 -0
  57. package/migrations/d1/0004_project_aware_retrieval_lanes.sql +24 -0
  58. package/migrations/d1/0005_portable_knowledge_identity.sql +104 -0
  59. package/migrations/d1/0006_repair_ops_trail_account_scope.sql +14 -0
  60. package/migrations/d1/0007_repair_ops_trail_agent_run_account.sql +13 -0
  61. package/migrations/d1/0008_backfill_knowledge_run_legacy_tenant.sql +14 -0
  62. package/migrations/d1/0009_normalize_cloudflare_plugin_installations.sql +137 -0
  63. package/migrations/runtime/0001_cli_runtime.sql +67 -0
  64. package/migrations/runtime/0002_project_sessions.sql +15 -0
  65. package/migrations/runtime/0003_provider_continuations.sql +8 -0
  66. package/package.json +92 -12
  67. package/packages/agentsam-brand/README.md +21 -0
  68. package/packages/agentsam-brand/package.json +22 -0
  69. package/packages/agentsam-brand/src/contract.js +59 -0
  70. package/packages/agentsam-brand/src/extract.js +126 -0
  71. package/packages/agentsam-brand/src/goap-actions.js +73 -0
  72. package/packages/agentsam-brand/src/index.js +48 -0
  73. package/packages/agentsam-brand/src/plan.js +115 -0
  74. package/packages/agentsam-brand/src/resolve.js +139 -0
  75. package/packages/agentsam-brand/src/scan.js +250 -0
  76. package/packages/agentsam-brand/test/brand-scan.test.mjs +106 -0
  77. package/packages/agentsam-contracts/README.md +23 -0
  78. package/packages/agentsam-contracts/package.json +32 -0
  79. package/packages/agentsam-contracts/src/adapter.ts +25 -0
  80. package/packages/agentsam-contracts/src/agent.ts +35 -0
  81. package/packages/agentsam-contracts/src/artifacts.ts +33 -0
  82. package/packages/agentsam-contracts/src/authority.ts +29 -0
  83. package/packages/agentsam-contracts/src/context.ts +16 -0
  84. package/packages/agentsam-contracts/src/errors.ts +46 -0
  85. package/packages/agentsam-contracts/src/events.ts +47 -0
  86. package/packages/agentsam-contracts/src/execution.ts +50 -0
  87. package/packages/agentsam-contracts/src/hooks.ts +40 -0
  88. package/packages/agentsam-contracts/src/identity.ts +16 -0
  89. package/packages/agentsam-contracts/src/index.ts +14 -0
  90. package/packages/agentsam-contracts/src/models.ts +9 -0
  91. package/packages/agentsam-contracts/src/providers.ts +33 -0
  92. package/packages/agentsam-contracts/src/repository.ts +64 -0
  93. package/packages/agentsam-contracts/src/tools.ts +98 -0
  94. package/packages/agentsam-contracts/test/contracts.test.mjs +16 -0
  95. package/packages/agentsam-contracts/test/errors-catalog.test.mjs +25 -0
  96. package/packages/agentsam-contracts/test/repository.test.mjs +18 -0
  97. package/packages/agentsam-contracts/tsconfig.json +12 -0
  98. package/packages/agentsam-errors/package.json +17 -0
  99. package/packages/agentsam-errors/src/adapters/anthropic.js +15 -0
  100. package/packages/agentsam-errors/src/adapters/cad.js +109 -0
  101. package/packages/agentsam-errors/src/adapters/cloudflare.js +21 -0
  102. package/packages/agentsam-errors/src/adapters/cursor.js +4 -0
  103. package/packages/agentsam-errors/src/adapters/device.js +38 -0
  104. package/packages/agentsam-errors/src/adapters/docker.js +28 -0
  105. package/packages/agentsam-errors/src/adapters/gcp.js +14 -0
  106. package/packages/agentsam-errors/src/adapters/github.js +22 -0
  107. package/packages/agentsam-errors/src/adapters/google.js +17 -0
  108. package/packages/agentsam-errors/src/adapters/index.js +55 -0
  109. package/packages/agentsam-errors/src/adapters/internal.js +40 -0
  110. package/packages/agentsam-errors/src/adapters/oauth.js +24 -0
  111. package/packages/agentsam-errors/src/adapters/openai.js +17 -0
  112. package/packages/agentsam-errors/src/adapters/process.js +35 -0
  113. package/packages/agentsam-errors/src/adapters/provider.js +114 -0
  114. package/packages/agentsam-errors/src/envelope.js +186 -0
  115. package/packages/agentsam-errors/src/error.js +24 -0
  116. package/packages/agentsam-errors/src/fingerprint.js +35 -0
  117. package/packages/agentsam-errors/src/index.js +10 -0
  118. package/packages/agentsam-errors/src/normalize.js +30 -0
  119. package/packages/agentsam-errors/src/redaction.js +52 -0
  120. package/packages/agentsam-errors/src/render.js +16 -0
  121. package/packages/agentsam-errors/src/retry.js +10 -0
  122. package/packages/agentsam-errors/src/transport.js +52 -0
  123. package/packages/agentsam-errors/src/vocabulary.js +320 -0
  124. package/packages/agentsam-errors/test/envelope.test.mjs +70 -0
  125. package/packages/agentsam-errors/test/providers.test.mjs +99 -0
  126. package/packages/agentsam-errors/test/redaction.test.mjs +21 -0
  127. package/packages/agentsam-errors/test/runtime-cad-device.test.mjs +76 -0
  128. package/packages/agentsam-errors/test/transport.test.mjs +46 -0
  129. package/packages/agentsam-knowledge/package.json +15 -0
  130. package/packages/agentsam-knowledge/src/autorag/index.js +64 -0
  131. package/packages/agentsam-knowledge/src/backends/index.js +26 -0
  132. package/packages/agentsam-knowledge/src/index.js +3 -0
  133. package/packages/agentsam-knowledge/src/providers/index.js +95 -0
  134. package/packages/agentsam-knowledge/test/autorag.test.mjs +42 -0
  135. package/packages/agentsam-nav/README.md +40 -0
  136. package/packages/agentsam-nav/dist/Nav.d.ts +43 -0
  137. package/packages/agentsam-nav/dist/NavCollapsible.d.ts +10 -0
  138. package/packages/agentsam-nav/dist/NavContent.d.ts +2 -0
  139. package/packages/agentsam-nav/dist/NavFooter.d.ts +2 -0
  140. package/packages/agentsam-nav/dist/NavGroup.d.ts +3 -0
  141. package/packages/agentsam-nav/dist/NavHeader.d.ts +2 -0
  142. package/packages/agentsam-nav/dist/NavMenu.d.ts +22 -0
  143. package/packages/agentsam-nav/dist/NavProvider.d.ts +35 -0
  144. package/packages/agentsam-nav/dist/NavTrigger.d.ts +2 -0
  145. package/packages/agentsam-nav/dist/Surfaces.d.ts +41 -0
  146. package/packages/agentsam-nav/dist/browser.d.ts +11 -0
  147. package/packages/agentsam-nav/dist/browser.global.js +132 -0
  148. package/packages/agentsam-nav/dist/browser.js +613 -0
  149. package/packages/agentsam-nav/dist/contracts.d.ts +76 -0
  150. package/packages/agentsam-nav/dist/index.d.ts +11 -0
  151. package/packages/agentsam-nav/dist/index.js +614 -0
  152. package/packages/agentsam-nav/dist/legacy.css +83 -0
  153. package/packages/agentsam-nav/dist/shell.css +113 -0
  154. package/packages/agentsam-nav/dist/theme.css +113 -0
  155. package/packages/agentsam-nav/dist/utils.d.ts +1 -0
  156. package/packages/agentsam-nav/package.json +43 -0
  157. package/packages/agentsam-queue-control/README.md +107 -0
  158. package/packages/agentsam-queue-control/package.json +31 -0
  159. package/packages/agentsam-queue-control/schemas/job-envelope.schema.json +56 -0
  160. package/packages/agentsam-queue-control/src/adapters/cloudflare.js +152 -0
  161. package/packages/agentsam-queue-control/src/adapters/memory.js +38 -0
  162. package/packages/agentsam-queue-control/src/contracts.js +130 -0
  163. package/packages/agentsam-queue-control/src/control-plane.js +141 -0
  164. package/packages/agentsam-queue-control/src/dispatch.js +43 -0
  165. package/packages/agentsam-queue-control/src/index.js +7 -0
  166. package/packages/agentsam-queue-control/src/policy.js +88 -0
  167. package/packages/agentsam-queue-control/src/topology.js +66 -0
  168. package/packages/agentsam-queue-control/test/queue-control.test.mjs +100 -0
  169. package/packages/agentsam-repository/src/goap.js +718 -0
  170. package/packages/agentsam-repository/src/goap.js.bak-20260922011251 +670 -0
  171. package/packages/agentsam-repository/src/index.js +5 -0
  172. package/packages/agentsam-repository/src/merkle/cloudflare-persistence.js +2 -2
  173. package/packages/agentsam-repository/src/tickets.js +184 -0
  174. package/packages/agentsam-repository/src/work-tracking.js +199 -0
  175. package/packages/agentsam-repository/src/workspace-state.js +176 -0
  176. package/packages/agentsam-repository/test/goap-tickets-workspace-state.test.mjs +152 -0
  177. package/packages/connectors/cloudflare/src/index.js +297 -15
  178. package/packages/connectors/cloudflare/src/owner.js +43 -40
  179. package/packages/connectors/cloudflare/src/routes.js +167 -26
  180. package/packages/connectors/cloudflare/tests/connector.test.mjs +112 -2
  181. package/packages/heuristic-theme/README.md +11 -0
  182. package/packages/heuristic-theme/package.json +25 -0
  183. package/packages/heuristic-theme/src/index.js +2 -0
  184. package/packages/heuristic-theme/src/registry.js +36 -0
  185. package/packages/heuristic-theme/src/theme.js +41 -0
  186. package/packages/heuristic-theme/test/theme.test.mjs +26 -0
  187. package/packages/identity/.agentsam/features/oauth-login-portal/agentsam.feature.json +64 -0
  188. package/packages/identity/.agentsam/features/oauth-login-portal/providers.json +96 -0
  189. package/packages/identity/.agentsam/features/oauth-login-portal/resources.json +47 -0
  190. package/packages/identity/.agentsam/features/oauth-login-portal/routes.json +74 -0
  191. package/packages/identity/.agentsam/features/oauth-login-portal/ui.json +35 -0
  192. package/packages/identity/package.json +4 -3
  193. package/packages/identity/src/adapters/cloudflare-d1/ids.js +4 -0
  194. package/packages/identity/src/adapters/cloudflare-d1/index.js +39 -1
  195. package/packages/identity/src/contracts/auth-config.js +23 -40
  196. package/packages/identity/src/contracts/provider.js +3 -2
  197. package/packages/identity/src/frontend/auth-portal/pages/login.html +7 -0
  198. package/packages/identity/src/index.js +2 -0
  199. package/packages/identity/src/oauth/credentials.js +13 -0
  200. package/packages/identity/src/oauth/iam-platform.js +5 -5
  201. package/packages/identity/src/providers/cloudflare/index.js +19 -0
  202. package/packages/identity/src/providers/cloudflare/mapper.js +21 -0
  203. package/packages/identity/src/providers/cloudflare/oauth.js +48 -0
  204. package/packages/identity/src/providers/cloudflare/profile.js +28 -0
  205. package/packages/identity/src/providers/index.js +18 -2
  206. package/packages/identity/src/server/identity-service.js +13 -3
  207. package/packages/identity/src/server/worker-router.js +63 -8
  208. package/packages/identity/tests/auth-config.test.mjs +14 -23
  209. package/packages/identity/tests/identity-service.test.mjs +15 -0
  210. package/packages/providers/completeful/README.md +38 -0
  211. package/packages/providers/completeful/package.json +29 -0
  212. package/packages/providers/completeful/src/client.js +162 -0
  213. package/packages/providers/completeful/src/events.js +49 -0
  214. package/packages/providers/completeful/src/index.js +22 -0
  215. package/packages/providers/completeful/src/tools.js +579 -0
  216. package/packages/providers/completeful/src/webhooks.js +55 -0
  217. package/packages/providers/completeful/test/provider.test.mjs +196 -0
  218. package/packages/theme-church-site/README.md +10 -0
  219. package/packages/theme-church-site/package.json +30 -0
  220. package/packages/theme-church-site/src/harvest.json +14 -0
  221. package/packages/theme-church-site/src/index.js +84 -0
  222. package/packages/theme-church-site/test/theme.test.mjs +19 -0
  223. package/packages/theme-companions-site/README.md +10 -0
  224. package/packages/theme-companions-site/package.json +30 -0
  225. package/packages/theme-companions-site/src/harvest.json +12 -0
  226. package/packages/theme-companions-site/src/index.js +82 -0
  227. package/packages/theme-companions-site/test/theme.test.mjs +19 -0
  228. package/packages/theme-floors-site/README.md +10 -0
  229. package/packages/theme-floors-site/package.json +30 -0
  230. package/packages/theme-floors-site/src/harvest.json +14 -0
  231. package/packages/theme-floors-site/src/index.js +82 -0
  232. package/packages/theme-floors-site/test/theme.test.mjs +19 -0
  233. package/packages/theme-fuelnfree-site/README.md +10 -0
  234. package/packages/theme-fuelnfree-site/package.json +30 -0
  235. package/packages/theme-fuelnfree-site/src/harvest.json +13 -0
  236. package/packages/theme-fuelnfree-site/src/index.js +81 -0
  237. package/packages/theme-fuelnfree-site/test/theme.test.mjs +19 -0
  238. package/packages/theme-handyman-site/README.md +10 -0
  239. package/packages/theme-handyman-site/package.json +30 -0
  240. package/packages/theme-handyman-site/src/harvest.json +10 -0
  241. package/packages/theme-handyman-site/src/index.js +83 -0
  242. package/packages/theme-handyman-site/test/theme.test.mjs +19 -0
  243. package/packages/theme-insurance-site/README.md +10 -0
  244. package/packages/theme-insurance-site/package.json +30 -0
  245. package/packages/theme-insurance-site/src/harvest.json +10 -0
  246. package/packages/theme-insurance-site/src/index.js +83 -0
  247. package/packages/theme-insurance-site/test/theme.test.mjs +19 -0
  248. package/packages/theme-shinshu-site/README.md +10 -0
  249. package/packages/theme-shinshu-site/package.json +30 -0
  250. package/packages/theme-shinshu-site/src/harvest.json +12 -0
  251. package/packages/theme-shinshu-site/src/index.js +83 -0
  252. package/packages/theme-shinshu-site/test/theme.test.mjs +19 -0
  253. package/packages/work-graph/README.md +49 -0
  254. package/packages/work-graph/package.json +19 -0
  255. package/packages/work-graph/prototype/README.md +32 -0
  256. package/packages/work-graph/prototype/data/demo-workgraph.js +47 -0
  257. package/packages/work-graph/prototype/renderers/timeline-model.js +21 -0
  258. package/packages/work-graph/prototype/renderers/workgraph-runtime.js +38 -0
  259. package/packages/work-graph/prototype-gnantt.html +655 -0
  260. package/packages/work-graph/src/adapters/business/projects.js +23 -0
  261. package/packages/work-graph/src/adapters/engineering/git.js +22 -0
  262. package/packages/work-graph/src/adapters/engineering/mcp.js +22 -0
  263. package/packages/work-graph/src/index.js +76 -0
  264. package/packages/work-graph/src/renderers/gantt-model.js +11 -0
  265. package/packages/work-graph/src/renderers/timeline.js +16 -0
  266. package/packages/work-graph/test/work-graph.test.mjs +37 -0
  267. package/protocol/README.md +12 -0
  268. package/protocol/capabilities/cloudflare-cpu-audit-input.schema.json +30 -6
  269. package/protocol/capabilities/cloudflare-cpu-profile-input.schema.json +18 -4
  270. package/protocol/capabilities/cloudflare-wrangler-native-input.schema.json +59 -10
  271. package/protocol/capabilities/knowledge-search-input.schema.json +35 -0
  272. package/protocol/capabilities/manifest.json +163 -1
  273. package/protocol/capabilities/repository-audit-input.schema.json +39 -6
  274. package/protocol/capabilities/repository-snapshot-input.schema.json +15 -3
  275. package/protocol/capabilities/terminal-exec-input.schema.json +55 -0
  276. package/protocol/commerce/catalog.v1.json +50 -0
  277. package/protocol/errors/error-catalog.json +164 -0
  278. package/protocol/errors/error-envelope.schema.json +544 -0
  279. package/protocol/features/README.md +57 -0
  280. package/protocol/features/agentsam.feature.v1.schema.json +290 -0
  281. package/protocol/features/catalog.json +65 -0
  282. package/protocol/features/examples/provider-resend.feature.json +17 -0
  283. package/protocol/go/agentsam-go-runtime.v1.json +17 -0
  284. package/protocol/knowledge/LIFECYCLE.md +140 -0
  285. package/protocol/knowledge/README.md +4 -0
  286. package/protocol/presets/catalog.json +128 -19
  287. package/protocol/rpc/v1/errors.proto +24 -0
  288. package/protocol/theme-refinery/d1-reconciliation.md +48 -0
  289. package/protocol/theme-refinery/product-metadata.schema.json +27 -0
  290. package/protocol/theme-refinery/receipts/products-registry-batch-20260924.json +318 -0
  291. package/protocol/theme-refinery/receipts/theme-harvest-20260924.json +472 -0
  292. package/protocol/theme-refinery/reconciliation-receipt.schema.json +83 -0
  293. package/services/cad/server.py +249 -2
  294. package/src/agent/capability-adapter.js +15 -5
  295. package/src/agent/index.js +2 -1
  296. package/src/agent/model-turn.js +51 -0
  297. package/src/agent/responses-runner.js +304 -38
  298. package/src/capabilities/index.js +1 -0
  299. package/src/capabilities/terminal-exec.js +78 -0
  300. package/src/cli.js +129 -31
  301. package/src/cloudflare/index.js +6 -0
  302. package/src/cloudflare/runtime-status.js +393 -0
  303. package/src/cloudflare/wrangler.js +17 -1
  304. package/src/commands/account-auth.js +1 -1
  305. package/src/commands/app.js +106 -0
  306. package/src/commands/autorag.js +77 -0
  307. package/src/commands/brand.js +293 -0
  308. package/src/commands/cad.js +1 -0
  309. package/src/commands/connections.js +126 -29
  310. package/src/commands/context-economics.js +8 -0
  311. package/src/commands/db.js +7 -0
  312. package/src/commands/deploy.js +2 -2
  313. package/src/commands/env.js +5 -4
  314. package/src/commands/eval.js +209 -14
  315. package/src/commands/go.js +365 -0
  316. package/src/commands/goap.js +176 -0
  317. package/src/commands/identity-init.js +27 -3
  318. package/src/commands/identity-protocol.js +195 -0
  319. package/src/commands/knowledge.js +64 -5
  320. package/src/commands/mcp.js +341 -0
  321. package/src/commands/merkle-persist.js +3 -1
  322. package/src/commands/merkle.js +18 -3
  323. package/src/commands/models.js +109 -23
  324. package/src/commands/plugins.js +175 -0
  325. package/src/commands/preferences.js +28 -8
  326. package/src/commands/product.js +53 -10
  327. package/src/commands/providers.js +389 -0
  328. package/src/commands/resume.js +9 -5
  329. package/src/commands/runtime-status.js +154 -0
  330. package/src/commands/shell.js +469 -54
  331. package/src/commands/status.js +82 -7
  332. package/src/commands/tunnel.js +228 -195
  333. package/src/commands/whoami.js +115 -22
  334. package/src/context/budget.js +6 -0
  335. package/src/context/index.js +2 -1
  336. package/src/context/project-card.js +75 -0
  337. package/src/errors/contract.js +34 -211
  338. package/src/errors/diagnostic.js +95 -50
  339. package/src/errors/index.js +6 -13
  340. package/src/eval/index.js +6 -0
  341. package/src/eval/live.js +439 -0
  342. package/src/features/resolve.js +242 -0
  343. package/src/go/build.js +108 -0
  344. package/src/go/cloudflare.js +207 -0
  345. package/src/go/contract.js +139 -0
  346. package/src/go/discover.js +96 -0
  347. package/src/go/index.js +13 -0
  348. package/src/go/receipts.js +77 -0
  349. package/src/go/registry.js +223 -0
  350. package/src/go/verify.js +31 -0
  351. package/src/index.js +100 -1
  352. package/src/knowledge/config.js +13 -5
  353. package/src/knowledge/engine.js +23 -8
  354. package/src/knowledge/index.js +1 -0
  355. package/src/knowledge/lane-registry.js +46 -0
  356. package/src/knowledge/providers/gemini.js +48 -8
  357. package/src/knowledge/service/client.js +13 -1
  358. package/src/knowledge/service/grpc-codec.js +156 -53
  359. package/src/knowledge/service/job-engine.js +133 -11
  360. package/src/knowledge/service/job-worker.js +34 -5
  361. package/src/knowledge/service/server.js +10 -1
  362. package/src/knowledge/store-discovery.js +77 -0
  363. package/src/lib/account-session.js +100 -25
  364. package/src/lib/agent-instructions.js +3 -0
  365. package/src/lib/auth.js +318 -51
  366. package/src/lib/cad/blender.js +42 -3
  367. package/src/lib/cad/d1-project-store.js +43 -0
  368. package/src/lib/cad/discovery.js +616 -0
  369. package/src/lib/cad/docker-executor.js +352 -0
  370. package/src/lib/cad/freecad.js +253 -0
  371. package/src/lib/cad/index.js +40 -0
  372. package/src/lib/cad/openscad.js +198 -0
  373. package/src/lib/cad/project-cli.d.ts +2 -0
  374. package/src/lib/cad/project-cli.js +21 -0
  375. package/src/lib/cad/project-contract.d.ts +3 -0
  376. package/src/lib/cad/project-contract.js +1 -0
  377. package/src/lib/cad/project-recipe.js +30 -0
  378. package/src/lib/cad/project-runtime.d.ts +2 -0
  379. package/src/lib/cad/project-runtime.js +53 -0
  380. package/src/lib/cad/project-store.js +25 -0
  381. package/src/lib/cad/project-workflows.js +31 -0
  382. package/src/lib/cad-docker.js +21 -2
  383. package/src/lib/cli-preferences.js +17 -2
  384. package/src/lib/core-client.js +97 -33
  385. package/src/lib/deploy/local-studio.js +6 -5
  386. package/src/lib/detect-context.js +14 -16
  387. package/src/lib/dockerize.js +3 -0
  388. package/src/lib/execution-approvals.js +1 -0
  389. package/src/lib/identity-scaffold.js +4 -1
  390. package/src/lib/knowledge-docker.js +9 -1
  391. package/src/lib/local-sessions.js +124 -34
  392. package/src/lib/local-status.js +35 -14
  393. package/src/lib/project-config.js +9 -0
  394. package/src/lib/provider-credentials.js +233 -55
  395. package/src/lib/scaffold/resolve-cloudflare-account.js +37 -0
  396. package/src/lib/scaffold/wizards/cms.js +2 -8
  397. package/src/lib/scaffold/wizards/worker-api.js +2 -8
  398. package/src/lib/slash-commands.js +10 -2
  399. package/src/local/migrations.js +109 -1
  400. package/src/local/runtime-store.js +31 -5
  401. package/src/local/sqlite.js +36 -1
  402. package/src/mcp/authority.js +348 -0
  403. package/src/mcp/client-adapters.js +431 -0
  404. package/src/mcp/client.js +172 -0
  405. package/src/mcp/index.js +47 -0
  406. package/src/mcp/telemetry.js +103 -0
  407. package/src/models/catalog.js +329 -51
  408. package/src/models/discovery.js +59 -4
  409. package/src/models/index.js +2 -0
  410. package/src/models/inventory-core.js +182 -0
  411. package/src/models/policy.js +20 -0
  412. package/src/plugins/cloudflare.js +103 -0
  413. package/src/plugins/completeful.js +69 -0
  414. package/src/plugins/contracts.js +86 -0
  415. package/src/plugins/index.js +11 -0
  416. package/src/plugins/registry.js +207 -0
  417. package/src/plugins/resource-scope.js +45 -0
  418. package/src/plugins/runtime.js +118 -0
  419. package/src/plugins/vectorize.js +31 -0
  420. package/src/progression/engine.js +171 -0
  421. package/src/progression/index.js +1 -0
  422. package/src/providers/cloudflare-chat.js +1 -1
  423. package/src/providers/gemini-generate-content.js +2 -1
  424. package/src/providers/openai-responses.js +45 -16
  425. package/src/providers/tool-schema.js +85 -0
  426. package/src/repository/index.js +29 -0
  427. package/src/rpc/generated/errors_pb.js +961 -1
  428. package/src/security/local-vault.js +415 -0
  429. package/src/security/process.js +20 -4
  430. package/src/status/actions.js +192 -0
  431. package/src/tools/hydrate.js +5 -1
  432. package/src/tools/index.js +7 -0
  433. package/src/tools/redact.js +64 -0
  434. package/src/tools/registry.js +83 -0
  435. package/src/tools/runtime.js +257 -0
  436. package/src/tools/search.js +21 -8
  437. package/src/ui/ansi.js +117 -3
  438. package/src/ui/cli/activity.js +76 -7
  439. package/src/ui/cli/footer.js +110 -9
  440. package/src/ui/cli/help.js +14 -5
  441. package/src/ui/wireframes.js +166 -0
  442. package/test/account-session.test.mjs +76 -11
  443. package/test/apps-scaffold-contract.test.mjs +58 -0
  444. package/test/capabilities.test.mjs +1 -1
  445. package/test/cli/eval-live.test.mjs +219 -0
  446. package/test/cli/go.test.mjs +71 -0
  447. package/test/cli/local-vault-and-provider-setup.test.mjs +268 -0
  448. package/test/cli/mcp-client.test.mjs +245 -0
  449. package/test/cli/runtime-ui.test.mjs +69 -2
  450. package/test/cli/status-actions.test.mjs +88 -0
  451. package/test/cli/wireframes-go-registry.test.mjs +54 -0
  452. package/test/cloudflare-connector.test.mjs +3 -6
  453. package/test/cloudflare-runtime.test.mjs +8 -1
  454. package/test/context.test.mjs +15 -0
  455. package/test/error-diagnostics.test.mjs +9 -0
  456. package/test/fixtures/cad/courtyard-house.json +208 -0
  457. package/test/go/cloudflare-probe.test.mjs +53 -0
  458. package/test/integration/app-command.test.mjs +55 -0
  459. package/test/integration/cad-discovery.test.mjs +158 -0
  460. package/test/integration/cad-docker-executor.test.mjs +249 -0
  461. package/test/integration/cad-execution.test.mjs +184 -0
  462. package/test/integration/cad-project-app.test.mjs +31 -0
  463. package/test/integration/cad-project-d1.test.mjs +25 -0
  464. package/test/integration/cad-project-native.test.mjs +24 -0
  465. package/test/integration/cad-project-workflow.test.mjs +9 -0
  466. package/test/integration/cad-project.test.mjs +82 -0
  467. package/test/integration/cli-help.test.mjs +4 -0
  468. package/test/integration/cms-site-tenancy-contract.test.mjs +256 -0
  469. package/test/integration/core-client.integration.test.mjs +55 -0
  470. package/test/integration/error-runtime-rpc.test.mjs +71 -0
  471. package/test/integration/features-resolve.test.mjs +128 -0
  472. package/test/integration/install-script.test.mjs +107 -0
  473. package/test/integration/inventory-core.test.mjs +53 -0
  474. package/test/integration/plugins-cloudflare.integration.test.mjs +28 -0
  475. package/test/integration/provider-env-cli.test.mjs +1 -1
  476. package/test/integration/runtime-migrations.test.mjs +6 -1
  477. package/test/integration/runtime-status.integration.test.mjs +211 -0
  478. package/test/integration/scaffold-cloudflare.test.mjs +46 -0
  479. package/test/integration/storage-architecture.test.mjs +154 -0
  480. package/test/integration/store-discovery.test.mjs +44 -0
  481. package/test/integration/terminal-exec.integration.test.mjs +86 -0
  482. package/test/integration/tool-runtime.test.mjs +124 -0
  483. package/test/integration/tool-schema.test.mjs +59 -0
  484. package/test/knowledge-service.test.mjs +4 -0
  485. package/test/local-sessions.test.mjs +11 -2
  486. package/test/local-studio-deploy.test.mjs +1 -1
  487. package/test/model-catalog.test.mjs +28 -1
  488. package/test/models.test.mjs +159 -5
  489. package/test/openai-responses.test.mjs +60 -0
  490. package/test/provider-credentials.test.mjs +15 -5
  491. package/test/responses-runner.test.mjs +321 -6
  492. package/test/sdk-worker-contract.test.mjs +5 -1
  493. package/test/shell.test.mjs +149 -4
  494. package/test/smoke.mjs +4 -3
  495. package/test/tools-search.test.mjs +33 -0
  496. package/test/unit/website-assets-bindings.test.mjs +60 -0
  497. package/test/whoami-resume.test.mjs +87 -7
  498. package/examples/gorilla-shell/README.md +0 -15
  499. package/src/lib/gorilla-template.js +0 -54
  500. package/src/lib/prompt-byok.js +0 -57
  501. package/src/lib/save-sdk-token.js +0 -19
  502. package/templates/gorilla-shell/App.tsx +0 -639
  503. package/templates/gorilla-shell/README.md +0 -34
  504. package/templates/gorilla-shell/index.html +0 -15
  505. package/templates/gorilla-shell/main.jsx +0 -9
  506. package/templates/gorilla-shell/package.json +0 -19
  507. package/templates/gorilla-shell/vite.config.js +0 -21
@@ -37,6 +37,52 @@ function checksumSource(source) {
37
37
  return 'fnv1a32:' + (hash >>> 0).toString(16).padStart(8, '0');
38
38
  }
39
39
 
40
+ // A naive source.split(';') breaks on ANY semicolon -- including one
41
+ // inside a wrapped comment line's prose ("...available; standalone...")
42
+ // and every semicolon inside a CREATE TRIGGER's BEGIN...END body. Both
43
+ // happen in real migration files (this one has both). Comment-strip first,
44
+ // then split statement-aware: only treat ';' as a terminator outside a
45
+ // BEGIN/END block, so a trigger body survives as one statement instead of
46
+ // fragmenting into pieces that don't individually look like anything.
47
+ function stripSqlComments(source) {
48
+ return source
49
+ .split('\n')
50
+ .map((line) => (line.trim().startsWith('--') ? '' : line))
51
+ .join('\n');
52
+ }
53
+
54
+ function splitSqlStatements(source) {
55
+ const clean = stripSqlComments(source);
56
+ // CASE ... END is also closed by the bare keyword END (no BEGIN of its
57
+ // own) -- a trigger body containing a CASE expression has one more END
58
+ // than BEGIN. Track BEGIN and CASE as the same depth-increasing class so
59
+ // a CASE's END doesn't prematurely close the enclosing trigger's depth.
60
+ const tokens = clean.split(/(\bBEGIN\b|\bCASE\b|\bEND\b|;)/i);
61
+ const statements = [];
62
+ let current = '';
63
+ let depth = 0;
64
+ for (const token of tokens) {
65
+ if (/^(BEGIN|CASE)$/i.test(token)) { depth += 1; current += token; continue; }
66
+ if (/^END$/i.test(token)) { depth = Math.max(0, depth - 1); current += token; continue; }
67
+ if (token === ';' && depth === 0) {
68
+ const trimmed = current.trim();
69
+ if (trimmed) statements.push(trimmed);
70
+ current = '';
71
+ continue;
72
+ }
73
+ current += token;
74
+ }
75
+ const trimmed = current.trim();
76
+ if (trimmed) statements.push(trimmed);
77
+ return statements;
78
+ }
79
+
80
+ function isIdempotentSafe(source) {
81
+ const statements = splitSqlStatements(source);
82
+ const IDEMPOTENT_RE = /^(CREATE\s+TABLE\s+IF\s+NOT\s+EXISTS|CREATE\s+(UNIQUE\s+)?INDEX\s+IF\s+NOT\s+EXISTS|CREATE\s+TRIGGER\s+IF\s+NOT\s+EXISTS|PRAGMA)/i;
83
+ return statements.length > 0 && statements.every((stmt) => IDEMPOTENT_RE.test(stmt.trim()));
84
+ }
85
+
40
86
  export async function listAppliedMigrations(db) {
41
87
  ensureLedger(db);
42
88
  const result = await db.prepare(
@@ -60,7 +106,23 @@ export async function applyRuntimeMigrations(db, options = {}) {
60
106
 
61
107
  if (previous) {
62
108
  if (previous.checksum && previous.checksum !== checksum) {
63
- throw new Error('migration_checksum_mismatch:' + id);
109
+ if (!isIdempotentSafe(source)) throw new Error('migration_checksum_mismatch:' + id);
110
+ // File grew via additive, idempotent statements only (e.g. a new
111
+ // CREATE TABLE IF NOT EXISTS appended for a later feature). Safe to
112
+ // re-run and accept the new checksum rather than hard-lock the CLI.
113
+ db.exec('BEGIN IMMEDIATE');
114
+ try {
115
+ db.exec(source);
116
+ await db.prepare(
117
+ 'UPDATE agentsam_schema_migrations SET checksum = ? WHERE id = ?'
118
+ ).bind(checksum, id).run();
119
+ db.exec('COMMIT');
120
+ results.push({ id, filename, status: 'repaired', checksum, previous_checksum: previous.checksum });
121
+ continue;
122
+ } catch (error) {
123
+ try { db.exec('ROLLBACK'); } catch {}
124
+ throw new Error('migration_repair_failed:' + id + ':' + (error?.message || error));
125
+ }
64
126
  }
65
127
  results.push({ id, filename, status: 'already_applied', checksum });
66
128
  continue;
@@ -88,6 +150,52 @@ export async function applyRuntimeMigrations(db, options = {}) {
88
150
  });
89
151
  }
90
152
 
153
+ // Synchronous entry point for the interactive shell. Both runners consume the
154
+ // same versioned SQL and checksums; schema ownership stays in migrations/runtime.
155
+ export function applyRuntimeMigrationsSync(db, options = {}) {
156
+ const dir = path.resolve(options.migrationsDir || DEFAULT_MIGRATIONS_DIR);
157
+ ensureLedger(db);
158
+ const applied = new Map(db.prepare(
159
+ 'SELECT id, applied_at_unix, checksum FROM agentsam_schema_migrations ORDER BY id'
160
+ ).all().map((row) => [String(row.id), row]));
161
+ const results = [];
162
+ for (const filename of migrationFiles(dir)) {
163
+ const id = filename.replace(/\.sql$/i, '');
164
+ const source = fs.readFileSync(path.join(dir, filename), 'utf8');
165
+ const checksum = checksumSource(source);
166
+ const previous = applied.get(id);
167
+ if (previous) {
168
+ if (previous.checksum && previous.checksum !== checksum) {
169
+ if (!isIdempotentSafe(source)) throw new Error('migration_checksum_mismatch:' + id);
170
+ db.exec('BEGIN IMMEDIATE');
171
+ try {
172
+ db.exec(source);
173
+ db.prepare('UPDATE agentsam_schema_migrations SET checksum = ? WHERE id = ?').run(checksum, id);
174
+ db.exec('COMMIT');
175
+ results.push({ id, filename, status: 'repaired', checksum, previous_checksum: previous.checksum });
176
+ continue;
177
+ } catch (error) {
178
+ try { db.exec('ROLLBACK'); } catch {}
179
+ throw new Error('migration_repair_failed:' + id + ':' + (error?.message || error));
180
+ }
181
+ }
182
+ results.push({ id, filename, status: 'already_applied', checksum });
183
+ continue;
184
+ }
185
+ db.exec('BEGIN IMMEDIATE');
186
+ try {
187
+ db.exec(source);
188
+ db.prepare('INSERT INTO agentsam_schema_migrations (id, checksum) VALUES (?, ?)').run(id, checksum);
189
+ db.exec('COMMIT');
190
+ results.push({ id, filename, status: 'applied', checksum });
191
+ } catch (error) {
192
+ try { db.exec('ROLLBACK'); } catch {}
193
+ throw new Error('migration_failed:' + id + ':' + (error?.message || error));
194
+ }
195
+ }
196
+ return Object.freeze({ migrationsDir: dir, total: results.length, applied: results.filter((row) => row.status === 'applied').length, results: Object.freeze(results) });
197
+ }
198
+
91
199
  export function runtimeMigrationsDirectory() {
92
200
  return DEFAULT_MIGRATIONS_DIR;
93
201
  }
@@ -2,12 +2,28 @@ import path from 'node:path';
2
2
  import { createHash, randomUUID } from 'node:crypto';
3
3
  import { createLocalSqliteDatabase } from './sqlite.js';
4
4
  import { applyRuntimeMigrations } from './migrations.js';
5
+ import { findCliProjectRoot } from '../lib/cli-preferences.js';
6
+ import { getLocalDatabasePath, tryReadProjectConfig } from '../lib/project-config.js';
5
7
 
6
8
  function clean(value) { return value == null ? '' : String(value).trim(); }
7
9
  function hash(value) { return createHash('sha256').update(String(value || '')).digest('hex'); }
8
10
 
9
- export function runtimeDatabasePath(cwd = process.cwd()) {
10
- return path.join(path.resolve(cwd), '.agentsam', 'data', 'agentsam.sqlite');
11
+ export const SQLITE_RUNTIME_CAPABILITIES = Object.freeze({
12
+ transactions: true,
13
+ relational_queries: true,
14
+ ttl_cleanup: 'application_managed',
15
+ remote_shared_state: false,
16
+ local_only: true,
17
+ concurrent_writers: 'sqlite_serialized',
18
+ migrations: true,
19
+ vector_search: false,
20
+ blob_storage: false,
21
+ distributed_actor_semantics: false,
22
+ });
23
+
24
+ export function runtimeDatabasePath(startDir = process.cwd()) {
25
+ const root = findCliProjectRoot(startDir);
26
+ return path.resolve(root, getLocalDatabasePath(tryReadProjectConfig(root)));
11
27
  }
12
28
 
13
29
  async function withStore(cwd, fn) {
@@ -26,7 +42,7 @@ export function createRuntimeRunId() {
26
42
 
27
43
  export async function startRuntimeRun(value = {}) {
28
44
  const id = clean(value.id) || createRuntimeRunId();
29
- await withStore(value.cwd, async (db) => {
45
+ await withStore(value.projectRoot || value.cwd, async (db) => {
30
46
  await db.prepare(`
31
47
  INSERT INTO agentsam_agent_run (
32
48
  id, account_id, source_client, surface, mode, model_key,
@@ -46,7 +62,7 @@ export async function startRuntimeRun(value = {}) {
46
62
 
47
63
  export async function finishRuntimeRun(value = {}) {
48
64
  if (!clean(value.id)) return;
49
- await withStore(value.cwd, async (db) => {
65
+ await withStore(value.projectRoot || value.cwd, async (db) => {
50
66
  const usage = value.usage || {};
51
67
  await db.prepare(`
52
68
  UPDATE agentsam_agent_run
@@ -87,7 +103,7 @@ export async function recordRuntimeCompaction(value = {}) {
87
103
  const after = Math.max(0, Math.round(Number(value.tokens_after || 0)));
88
104
  const sourceHash = hash(summary || JSON.stringify(value.metadata || {}));
89
105
 
90
- await withStore(value.cwd, async (db) => {
106
+ await withStore(value.projectRoot || value.cwd, async (db) => {
91
107
  await db.prepare(`
92
108
  INSERT INTO agentsam_compaction_events (
93
109
  id, account_id, agent_run_id, compaction_type, compaction_scope,
@@ -139,3 +155,13 @@ export async function recordRuntimeCompaction(value = {}) {
139
155
  });
140
156
  return id;
141
157
  }
158
+
159
+ export async function pruneExpiredRuntimeState(value = {}) {
160
+ const nowUnix = Number.isFinite(Number(value.nowUnix)) ? Math.floor(Number(value.nowUnix)) : Math.floor(Date.now() / 1000);
161
+ return withStore(value.projectRoot || value.cwd, async (db) => {
162
+ const digests = await db.prepare('DELETE FROM agentsam_context_digest WHERE expires_at_unix IS NOT NULL AND expires_at_unix <= ?').bind(nowUnix).run();
163
+ const compactions = await db.prepare('DELETE FROM agentsam_compaction_events WHERE expires_at_epoch IS NOT NULL AND expires_at_epoch <= ?').bind(nowUnix).run();
164
+ const approvals = await db.prepare("UPDATE agentsam_approval_queue SET status = 'expired' WHERE status = 'pending' AND expires_at IS NOT NULL AND expires_at <= ?").bind(nowUnix).run();
165
+ return { digests: Number(digests.changes || 0), compactions: Number(compactions.changes || 0), approvals_expired: Number(approvals.changes || 0) };
166
+ });
167
+ }
@@ -1,7 +1,10 @@
1
1
  import fs from 'node:fs';
2
2
  import path from 'node:path';
3
+ import { createRequire } from 'node:module';
3
4
  import { applyRuntimeMigrations } from './migrations.js';
4
5
 
6
+ const require = createRequire(import.meta.url);
7
+
5
8
  async function loadSqlite() {
6
9
  try {
7
10
  return await import('node:sqlite');
@@ -18,11 +21,43 @@ function resolveFile(filePath) {
18
21
  return path.resolve(String(filePath || '.agentsam/data/agentsam.sqlite'));
19
22
  }
20
23
 
24
+ function prepareDatabaseFile(resolved) {
25
+ const dir = path.dirname(resolved);
26
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
27
+ if (process.platform !== 'win32') {
28
+ try { fs.chmodSync(dir, 0o700); } catch { /* platform policy may own directory mode */ }
29
+ }
30
+ }
31
+
32
+ function restrictDatabaseFile(resolved) {
33
+ if (process.platform !== 'win32') {
34
+ try { fs.chmodSync(resolved, 0o600); } catch { /* platform policy may own file mode */ }
35
+ }
36
+ }
37
+
38
+ // The shell's session API is synchronous. It uses the same database file and
39
+ // migration directory as the async runtime store, with no second state store.
40
+ export function createLocalSqliteDatabaseSync(filePath = '.agentsam/data/agentsam.sqlite') {
41
+ let DatabaseSync;
42
+ try { ({ DatabaseSync } = require('node:sqlite')); }
43
+ catch (error) {
44
+ const wrapped = new Error('Local SQLite requires Node 22.5+ (node:sqlite). Upgrade Node, then retry.');
45
+ wrapped.cause = error;
46
+ throw wrapped;
47
+ }
48
+ const resolved = resolveFile(filePath);
49
+ prepareDatabaseFile(resolved);
50
+ const db = new DatabaseSync(resolved);
51
+ restrictDatabaseFile(resolved);
52
+ return db;
53
+ }
54
+
21
55
  export async function createLocalSqliteDatabase(filePath = '.agentsam/data/agentsam.sqlite') {
22
56
  const { DatabaseSync } = await loadSqlite();
23
57
  const resolved = resolveFile(filePath);
24
- fs.mkdirSync(path.dirname(resolved), { recursive: true });
58
+ prepareDatabaseFile(resolved);
25
59
  const database = new DatabaseSync(resolved);
60
+ restrictDatabaseFile(resolved);
26
61
 
27
62
  return {
28
63
  filePath: resolved,
@@ -0,0 +1,348 @@
1
+ import fs from 'node:fs';
2
+ import os from 'node:os';
3
+ import path from 'node:path';
4
+
5
+ export const MCP_AUTHORITY_SCHEMA = 'agentsam.mcp.authority.v1';
6
+ export const SERVER_CATALOG_CACHE_SCHEMA = 'agentsam.mcp.server-catalog.v1';
7
+ export const DEFAULT_SERVER_CATALOG_URL = 'https://mcp.inneranimalmedia.com/api/mcp/servers';
8
+
9
+ /**
10
+ * Seed MCP server catalog snapshot derived directly from D1 table:
11
+ * `agentsam_mcp_servers`.
12
+ *
13
+ * Captures live server authority, authentication requirements, and live health metrics
14
+ * for offline and instantaneous CLI resolution.
15
+ */
16
+ export const SEED_MCP_SERVER_CATALOG = Object.freeze([
17
+ {
18
+ name: 'inneranimalmedia',
19
+ display_name: 'InnerAnimalMedia Main MCP',
20
+ url: 'https://mcp.inneranimalmedia.com/mcp',
21
+ authUrl: 'https://mcp.inneranimalmedia.com/auth/connect',
22
+ auth_type: 'bearer',
23
+ protocol: 'sse',
24
+ defaultClients: ['cursor', 'claude'],
25
+ health_status: 'healthy',
26
+ avg_latency_ms: 443,
27
+ error_rate: 0,
28
+ description: 'Inner Animal Media canonical MCP server (~218 tools, D1 telemetry)',
29
+ },
30
+ {
31
+ name: 'agent_sam_bridge',
32
+ display_name: 'Agent Sam Bridge MCP',
33
+ url: 'https://mcp.inneranimalmedia.com/mcp',
34
+ auth_type: 'bearer',
35
+ protocol: 'sse',
36
+ defaultClients: ['cursor'],
37
+ health_status: 'healthy',
38
+ avg_latency_ms: 432,
39
+ error_rate: 0,
40
+ description: 'Agent Sam Bridge MCP',
41
+ },
42
+ {
43
+ name: 'cloudflare-api',
44
+ display_name: 'Cloudflare API',
45
+ url: 'https://mcp.cloudflare.com/mcp',
46
+ auth_type: 'bearer',
47
+ protocol: 'sse',
48
+ defaultClients: ['cursor'],
49
+ health_status: 'degraded',
50
+ avg_latency_ms: 9,
51
+ error_rate: 0,
52
+ description: 'Cloudflare API (Codex registered)',
53
+ },
54
+ {
55
+ name: 'cloudflare-docs',
56
+ display_name: 'Cloudflare Docs',
57
+ url: 'https://docs.mcp.cloudflare.com/mcp',
58
+ auth_type: 'none',
59
+ protocol: 'sse',
60
+ defaultClients: ['cursor'],
61
+ health_status: 'degraded',
62
+ avg_latency_ms: 10,
63
+ error_rate: 0,
64
+ description: 'Cloudflare documentation reference tools',
65
+ },
66
+ {
67
+ name: 'cloudflare-bindings',
68
+ display_name: 'Cloudflare Bindings',
69
+ url: 'https://bindings.mcp.cloudflare.com/mcp',
70
+ auth_type: 'user_oauth_cloudflare',
71
+ protocol: 'sse',
72
+ defaultClients: ['cursor'],
73
+ health_status: 'degraded',
74
+ avg_latency_ms: 8,
75
+ error_rate: 0,
76
+ description: 'Cloudflare Workers storage, AI, and compute bindings',
77
+ },
78
+ {
79
+ name: 'cloudflare-builds',
80
+ display_name: 'Cloudflare Builds',
81
+ url: 'https://builds.mcp.cloudflare.com/mcp',
82
+ auth_type: 'bearer',
83
+ protocol: 'sse',
84
+ defaultClients: ['cursor'],
85
+ health_status: 'degraded',
86
+ avg_latency_ms: 6,
87
+ error_rate: 0,
88
+ description: 'Cloudflare Workers Builds and CI/CD operations',
89
+ },
90
+ {
91
+ name: 'cloudflare-observability',
92
+ display_name: 'Cloudflare Observability',
93
+ url: 'https://observability.mcp.cloudflare.com/mcp',
94
+ auth_type: 'bearer',
95
+ protocol: 'sse',
96
+ defaultClients: ['cursor'],
97
+ health_status: 'degraded',
98
+ avg_latency_ms: 10,
99
+ error_rate: 0,
100
+ description: 'Cloudflare logs and analytics tools',
101
+ },
102
+ {
103
+ name: 'github-official',
104
+ display_name: 'GitHub (official)',
105
+ url: 'https://api.githubcopilot.com/mcp/',
106
+ auth_type: 'user_oauth_github',
107
+ protocol: 'sse',
108
+ defaultClients: ['cursor'],
109
+ health_status: 'degraded',
110
+ avg_latency_ms: 338,
111
+ error_rate: 0,
112
+ description: 'Official GitHub Copilot MCP server',
113
+ },
114
+ {
115
+ name: 'gmail-official',
116
+ display_name: 'Gmail (official Google MCP)',
117
+ url: 'https://gmailmcp.googleapis.com/mcp/v1',
118
+ auth_type: 'user_oauth_gmail',
119
+ protocol: 'sse',
120
+ defaultClients: ['cursor'],
121
+ health_status: 'degraded',
122
+ avg_latency_ms: 662,
123
+ error_rate: 0,
124
+ description: 'Official Google Gmail MCP server',
125
+ },
126
+ {
127
+ name: 'cf_builds',
128
+ display_name: 'Cloudflare Builds System',
129
+ url: 'internal',
130
+ auth_type: 'bearer',
131
+ protocol: 'sse',
132
+ defaultClients: ['cursor'],
133
+ health_status: 'unknown',
134
+ avg_latency_ms: null,
135
+ error_rate: 0,
136
+ description: 'Cloudflare internal builds system',
137
+ },
138
+ ]);
139
+
140
+ /**
141
+ * Backward compatibility dictionary mapping server_key/name to preset definition.
142
+ */
143
+ export const MCP_PRESETS = Object.freeze(
144
+ Object.fromEntries(SEED_MCP_SERVER_CATALOG.map((s) => [s.name, s])),
145
+ );
146
+
147
+ function clean(value) {
148
+ return value == null ? '' : String(value).trim();
149
+ }
150
+
151
+ export function homeDirectory(options = {}) {
152
+ return path.resolve(clean(options.home) || clean(options.env?.HOME) || clean(options.env?.USERPROFILE) || os.homedir());
153
+ }
154
+
155
+ export function getMcpDir(options = {}) {
156
+ return path.join(homeDirectory(options), '.agentsam', 'mcp');
157
+ }
158
+
159
+ export function getServerCatalogCachePath(options = {}) {
160
+ return path.join(getMcpDir(options), 'server-catalog-cache.json');
161
+ }
162
+
163
+ export function loadCachedServerCatalog(options = {}) {
164
+ try {
165
+ const cacheFile = getServerCatalogCachePath(options);
166
+ if (!fs.existsSync(cacheFile)) return null;
167
+ const raw = fs.readFileSync(cacheFile, 'utf8');
168
+ const parsed = JSON.parse(raw);
169
+ if (parsed && Array.isArray(parsed.servers)) {
170
+ return {
171
+ schema_version: parsed.schema_version,
172
+ fetched_at: parsed.fetched_at || null,
173
+ servers: parsed.servers.filter((s) => Number(s.is_active ?? 1) !== 0),
174
+ };
175
+ }
176
+ return null;
177
+ } catch {
178
+ return null;
179
+ }
180
+ }
181
+
182
+ export function writeCachedServerCatalog(servers = [], options = {}) {
183
+ const cacheFile = getServerCatalogCachePath(options);
184
+ fs.mkdirSync(path.dirname(cacheFile), { recursive: true });
185
+ const payload = {
186
+ schema_version: SERVER_CATALOG_CACHE_SCHEMA,
187
+ fetched_at: new Date().toISOString(),
188
+ servers: Array.isArray(servers) ? servers : [],
189
+ };
190
+ fs.writeFileSync(cacheFile, JSON.stringify(payload, null, 2) + '\n', 'utf8');
191
+ return payload;
192
+ }
193
+
194
+ export async function fetchMcpServerCatalog(options = {}) {
195
+ const url = options.catalogUrl || DEFAULT_SERVER_CATALOG_URL;
196
+ const timeoutMs = options.timeoutMs || 5000;
197
+
198
+ try {
199
+ const controller = new AbortController();
200
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
201
+ const res = await fetch(url, {
202
+ signal: controller.signal,
203
+ headers: { Accept: 'application/json' },
204
+ });
205
+ clearTimeout(timer);
206
+
207
+ if (res.ok) {
208
+ const body = await res.json();
209
+ if (body?.ok && Array.isArray(body.servers)) {
210
+ writeCachedServerCatalog(body.servers, options);
211
+ return body.servers.filter((s) => Number(s.is_active ?? 1) !== 0);
212
+ }
213
+ }
214
+ } catch {
215
+ // Network failure / timeout — fall through to cache
216
+ }
217
+
218
+ const cached = loadCachedServerCatalog(options);
219
+ if (cached?.servers?.length) {
220
+ return cached.servers;
221
+ }
222
+
223
+ return SEED_MCP_SERVER_CATALOG;
224
+ }
225
+
226
+ export function listKnownServers(options = {}) {
227
+ const cached = loadCachedServerCatalog(options);
228
+ if (cached?.servers?.length) {
229
+ return cached.servers;
230
+ }
231
+ return SEED_MCP_SERVER_CATALOG;
232
+ }
233
+
234
+ export function resolveServerPreset(name, options = {}) {
235
+ const cleanName = clean(name).toLowerCase();
236
+ if (!cleanName) return null;
237
+
238
+ const catalog = listKnownServers(options);
239
+ const found = catalog.find((s) => (s.name || s.server_key || '').toLowerCase() === cleanName);
240
+ if (found) {
241
+ return {
242
+ name: found.name || found.server_key,
243
+ display_name: found.display_name || found.name || found.server_key,
244
+ url: found.url,
245
+ authUrl: found.authUrl || (found.name === 'inneranimalmedia' ? 'https://mcp.inneranimalmedia.com/auth/connect' : null),
246
+ auth_type: found.auth_type || 'bearer',
247
+ protocol: found.protocol || 'sse',
248
+ defaultClients: found.defaultClients || ['cursor'],
249
+ health_status: found.health_status || 'unknown',
250
+ avg_latency_ms: found.avg_latency_ms ?? null,
251
+ error_rate: found.error_rate ?? 0,
252
+ description: found.description || found.display_name || '',
253
+ };
254
+ }
255
+
256
+ return MCP_PRESETS[cleanName] || null;
257
+ }
258
+
259
+ export function getMcpServerConfigPath(name, options = {}) {
260
+ const safeName = clean(name).toLowerCase().replace(/[^a-z0-9_-]/g, '-');
261
+ if (!safeName) throw new Error('mcp_server_name_required');
262
+ return path.join(getMcpDir(options), `${safeName}.json`);
263
+ }
264
+
265
+ function ensureSecureDir(dir) {
266
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
267
+ if (process.platform !== 'win32') {
268
+ try {
269
+ fs.chmodSync(dir, 0o700);
270
+ } catch {
271
+ // Best-effort permissions
272
+ }
273
+ }
274
+ }
275
+
276
+ export function readMcpServer(name, options = {}) {
277
+ try {
278
+ const filePath = getMcpServerConfigPath(name, options);
279
+ if (!fs.existsSync(filePath)) return null;
280
+ const raw = fs.readFileSync(filePath, 'utf8');
281
+ const parsed = JSON.parse(raw);
282
+ if (parsed && typeof parsed === 'object') {
283
+ return parsed;
284
+ }
285
+ return null;
286
+ } catch {
287
+ return null;
288
+ }
289
+ }
290
+
291
+ export function writeMcpServer(name, serverConfig, options = {}) {
292
+ const dir = getMcpDir(options);
293
+ ensureSecureDir(dir);
294
+
295
+ const filePath = getMcpServerConfigPath(name, options);
296
+ const now = new Date().toISOString();
297
+ const existing = readMcpServer(name, options);
298
+
299
+ const record = {
300
+ schema_version: MCP_AUTHORITY_SCHEMA,
301
+ name: clean(name).toLowerCase(),
302
+ url: clean(serverConfig.url),
303
+ protocol: clean(serverConfig.protocol) || 'sse',
304
+ auth: serverConfig.auth || null,
305
+ clients: Array.isArray(serverConfig.clients) ? [...new Set(serverConfig.clients.map(clean).filter(Boolean))] : ['cursor'],
306
+ metadata: serverConfig.metadata || {},
307
+ created_at: existing?.created_at || now,
308
+ updated_at: now,
309
+ };
310
+
311
+ fs.writeFileSync(filePath, JSON.stringify(record, null, 2), {
312
+ mode: 0o600,
313
+ });
314
+
315
+ return record;
316
+ }
317
+
318
+ export function listMcpServers(options = {}) {
319
+ const dir = getMcpDir(options);
320
+ if (!fs.existsSync(dir)) return [];
321
+
322
+ const files = fs.readdirSync(dir).filter((f) => f.endsWith('.json') && !f.endsWith('-cache.json'));
323
+ const servers = [];
324
+ for (const file of files) {
325
+ try {
326
+ const parsed = JSON.parse(fs.readFileSync(path.join(dir, file), 'utf8'));
327
+ if (parsed && parsed.name && parsed.schema_version === MCP_AUTHORITY_SCHEMA) {
328
+ servers.push(parsed);
329
+ }
330
+ } catch {
331
+ // Ignore corrupt entries
332
+ }
333
+ }
334
+ return servers.sort((a, b) => a.name.localeCompare(b.name));
335
+ }
336
+
337
+ export function deleteMcpServer(name, options = {}) {
338
+ try {
339
+ const filePath = getMcpServerConfigPath(name, options);
340
+ if (fs.existsSync(filePath)) {
341
+ fs.unlinkSync(filePath);
342
+ return true;
343
+ }
344
+ return false;
345
+ } catch {
346
+ return false;
347
+ }
348
+ }