@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
@@ -0,0 +1,245 @@
1
+ import assert from 'node:assert/strict';
2
+ import fs from 'node:fs';
3
+ import os from 'node:os';
4
+ import path from 'node:path';
5
+ import test from 'node:test';
6
+
7
+ import {
8
+ MCP_PRESETS,
9
+ deleteMcpServer,
10
+ fetchExternalClientRegistry,
11
+ fetchMcpServerCatalog,
12
+ getClientConfigPath,
13
+ getClientRegistryCachePath,
14
+ getServerCatalogCachePath,
15
+ getSessionToolReceipts,
16
+ inspectClientAdapter,
17
+ isClientRegistered,
18
+ listKnownServers,
19
+ listMcpServers,
20
+ listRegisteredClients,
21
+ readMcpServer,
22
+ recordToolReceipt,
23
+ removeServerFromClient,
24
+ resolveServerPreset,
25
+ summarizeToolReceipts,
26
+ syncServerToClient,
27
+ writeMcpServer,
28
+ } from '../../src/mcp/index.js';
29
+ import { runMcp } from '../../src/commands/mcp.js';
30
+
31
+ function tempHome() {
32
+ return fs.mkdtempSync(path.join(os.tmpdir(), 'agentsam-mcp-test-'));
33
+ }
34
+
35
+ test('MCP authority store manages servers under ~/.agentsam/mcp with safe permissions', () => {
36
+ const home = tempHome();
37
+ const config = {
38
+ url: 'https://mcp.inneranimalmedia.com/mcp',
39
+ auth: { type: 'bearer', token: 'iam_token_abc' },
40
+ clients: ['cursor', 'claude'],
41
+ };
42
+
43
+ const written = writeMcpServer('inneranimalmedia', config, { home });
44
+ assert.equal(written.name, 'inneranimalmedia');
45
+ assert.equal(written.url, 'https://mcp.inneranimalmedia.com/mcp');
46
+
47
+ const read = readMcpServer('inneranimalmedia', { home });
48
+ assert.equal(read.name, 'inneranimalmedia');
49
+ assert.equal(read.auth.token, 'iam_token_abc');
50
+ assert.deepEqual(read.clients, ['cursor', 'claude']);
51
+
52
+ const list = listMcpServers({ home });
53
+ assert.equal(list.length, 1);
54
+ assert.equal(list[0].name, 'inneranimalmedia');
55
+
56
+ const deleted = deleteMcpServer('inneranimalmedia', { home });
57
+ assert.equal(deleted, true);
58
+ assert.equal(readMcpServer('inneranimalmedia', { home }), null);
59
+ });
60
+
61
+ test('MCP external client registry recognizes chatgpt, claude, cursor and respects is_active', async () => {
62
+ const home = tempHome();
63
+
64
+ // Baseline seed / cached client list
65
+ const clients = listRegisteredClients({ home });
66
+ const keys = clients.map((c) => c.client_key);
67
+ assert.ok(keys.includes('chatgpt'), 'ChatGPT is recognized in the external client registry');
68
+ assert.ok(keys.includes('cursor'), 'Cursor is recognized in the external client registry');
69
+ assert.ok(keys.includes('claude'), 'Claude is recognized in the external client registry');
70
+ assert.ok(keys.includes('agentsam'), 'AgentSam is recognized in the external client registry');
71
+
72
+ assert.equal(isClientRegistered('chatgpt', { home }), true);
73
+ assert.equal(isClientRegistered('cursor', { home }), true);
74
+ assert.equal(isClientRegistered('nonexistent_client_xyz', { home }), false);
75
+
76
+ // Cache path is created upon writing
77
+ const cachePath = getClientRegistryCachePath({ home });
78
+ assert.equal(cachePath.endsWith('client-registry-cache.json'), true);
79
+ });
80
+
81
+ test('MCP client adapters materialize Cursor, Claude, and ChatGPT configurations cleanly', () => {
82
+ const home = tempHome();
83
+ const serverConfig = {
84
+ url: 'https://mcp.inneranimalmedia.com/mcp',
85
+ auth: { type: 'bearer', token: 'oauth_cursor_123' },
86
+ };
87
+
88
+ // Pre-seed an existing server in Cursor config to ensure no clobbering
89
+ const cursorConfigPath = getClientConfigPath('cursor', { home });
90
+ fs.mkdirSync(path.dirname(cursorConfigPath), { recursive: true });
91
+ fs.writeFileSync(
92
+ cursorConfigPath,
93
+ JSON.stringify({ mcpServers: { other_server: { url: 'http://localhost:8080' } } })
94
+ );
95
+
96
+ // Sync to Cursor
97
+ const cursorResult = syncServerToClient('cursor', 'inneranimalmedia', serverConfig, { home });
98
+ assert.equal(cursorResult.synced, true);
99
+
100
+ const cursorContent = JSON.parse(fs.readFileSync(cursorConfigPath, 'utf8'));
101
+ assert.ok(cursorContent.mcpServers.other_server, 'Preserved other server in Cursor config');
102
+ assert.equal(cursorContent.mcpServers.inneranimalmedia.url, 'https://mcp.inneranimalmedia.com/mcp');
103
+ assert.equal(cursorContent.mcpServers.inneranimalmedia.headers.Authorization, 'Bearer oauth_cursor_123');
104
+ assert.equal(cursorContent.mcpServers.inneranimalmedia.headers.Accept, 'application/json, text/event-stream');
105
+
106
+ // Inspect Cursor adapter
107
+ const inspection = inspectClientAdapter('cursor', 'inneranimalmedia', { home });
108
+ assert.equal(inspection.configured, true);
109
+ assert.equal(inspection.present, true);
110
+
111
+ // Sync to Claude
112
+ const claudeResult = syncServerToClient('claude', 'inneranimalmedia', serverConfig, { home });
113
+ assert.equal(claudeResult.synced, true);
114
+ const claudeConfigPath = getClientConfigPath('claude', { home });
115
+ const claudeContent = JSON.parse(fs.readFileSync(claudeConfigPath, 'utf8'));
116
+ assert.equal(claudeContent.mcpServers.inneranimalmedia.url, 'https://mcp.inneranimalmedia.com/mcp');
117
+
118
+ // Sync to ChatGPT
119
+ const chatgptResult = syncServerToClient('chatgpt', 'inneranimalmedia', serverConfig, { home });
120
+ assert.equal(chatgptResult.synced, true);
121
+ const chatgptConfigPath = getClientConfigPath('chatgpt', { home });
122
+ assert.ok(fs.existsSync(chatgptConfigPath));
123
+ const chatgptContent = JSON.parse(fs.readFileSync(chatgptConfigPath, 'utf8'));
124
+ assert.equal(chatgptContent.name, 'inneranimalmedia');
125
+ assert.equal(chatgptContent.server_url, 'https://mcp.inneranimalmedia.com/mcp');
126
+ assert.equal(chatgptContent.schema, 'agentsam.mcp.client-adapter.chatgpt.v1');
127
+
128
+ // Sync to AgentSam family adapter (~/.agentsam/mcp.json)
129
+ const agentsamResult = syncServerToClient('agentsam', 'inneranimalmedia', serverConfig, { home });
130
+ assert.equal(agentsamResult.synced, true);
131
+ const agentsamConfigPath = getClientConfigPath('agentsam', { home });
132
+ assert.equal(agentsamConfigPath, path.join(home, '.agentsam', 'mcp.json'));
133
+ assert.ok(fs.existsSync(agentsamConfigPath));
134
+ const agentsamContent = JSON.parse(fs.readFileSync(agentsamConfigPath, 'utf8'));
135
+ assert.equal(agentsamContent.mcpServers.inneranimalmedia.url, 'https://mcp.inneranimalmedia.com/mcp');
136
+ assert.equal(agentsamContent.mcpServers.inneranimalmedia.headers.Authorization, 'Bearer oauth_cursor_123');
137
+
138
+ // Remove from Cursor
139
+ const removeResult = removeServerFromClient('cursor', 'inneranimalmedia', { home });
140
+ assert.equal(removeResult.removed, true);
141
+ const postRemove = JSON.parse(fs.readFileSync(cursorConfigPath, 'utf8'));
142
+ assert.equal(postRemove.mcpServers.inneranimalmedia, undefined);
143
+ assert.ok(postRemove.mcpServers.other_server, 'Still preserved other server');
144
+
145
+ // Remove from AgentSam family adapter
146
+ const removeAgentsam = removeServerFromClient('agentsam', 'inneranimalmedia', { home });
147
+ assert.equal(removeAgentsam.removed, true);
148
+ const postRemoveAgentsam = JSON.parse(fs.readFileSync(agentsamConfigPath, 'utf8'));
149
+ assert.equal(postRemoveAgentsam.mcpServers.inneranimalmedia, undefined);
150
+
151
+ // Remove from ChatGPT
152
+ const removeChatgpt = removeServerFromClient('chatgpt', 'inneranimalmedia', { home });
153
+ assert.equal(removeChatgpt.removed, true);
154
+ assert.equal(fs.existsSync(chatgptConfigPath), false);
155
+ });
156
+
157
+ test('MCP server catalog resolves real registered servers with live health metrics', () => {
158
+ const home = tempHome();
159
+ const catalog = listKnownServers({ home });
160
+ assert.ok(catalog.length >= 8);
161
+
162
+ // Cloudflare API server from D1
163
+ const cfApi = resolveServerPreset('cloudflare-api', { home });
164
+ assert.ok(cfApi);
165
+ assert.equal(cfApi.url, 'https://mcp.cloudflare.com/mcp');
166
+ assert.equal(cfApi.health_status, 'degraded');
167
+ assert.equal(cfApi.avg_latency_ms, 9);
168
+
169
+ // InnerAnimalMedia Main MCP from D1
170
+ const iam = resolveServerPreset('inneranimalmedia', { home });
171
+ assert.ok(iam);
172
+ assert.equal(iam.health_status, 'healthy');
173
+ assert.equal(iam.avg_latency_ms, 443);
174
+ });
175
+
176
+ test('MCP telemetry logs tool receipts and computes accurate summaries', () => {
177
+ const home = tempHome();
178
+
179
+ recordToolReceipt({ tool_key: 'github_read', source_client: 'cursor', duration_ms: 120 }, { home });
180
+ recordToolReceipt({ tool_key: 'mcp:d1_query', source_client: 'cursor_mcp', duration_ms: 45 }, { home });
181
+ recordToolReceipt({ tool_key: 'terminal_exec', source_client: 'agentsam', duration_ms: 800 }, { home });
182
+ recordToolReceipt({ tool_key: 'mcp:tool_broken', error_code: 'TIMEOUT', duration_ms: 5000 }, { home });
183
+
184
+ const receipts = getSessionToolReceipts({ home });
185
+ assert.equal(receipts.length, 4);
186
+
187
+ const summary = summarizeToolReceipts(receipts);
188
+ assert.equal(summary.tool_call_count, 4);
189
+ assert.equal(summary.mcp_call_count, 2);
190
+ assert.equal(summary.github_call_count, 1);
191
+ assert.equal(summary.d1_call_count, 1);
192
+ assert.equal(summary.terminal_call_count, 1);
193
+ assert.equal(summary.failure_count, 1);
194
+ assert.equal(summary.success_count, 3);
195
+ });
196
+
197
+ test('agentsam mcp CLI handles add, list, status, doctor, and remove end-to-end', async () => {
198
+ const home = tempHome();
199
+ const logs = [];
200
+ const write = (str) => logs.push(str);
201
+
202
+ // Test --help output surfaces chatgpt and known catalog servers
203
+ await runMcp(['--help'], { home, write });
204
+ const helpText = logs.join('\n');
205
+ assert.ok(helpText.includes('chatgpt'), 'Help text displays ChatGPT as a recognized client');
206
+ assert.ok(helpText.includes('cloudflare-api'), 'Help text displays cloudflare-api preset');
207
+ logs.length = 0;
208
+
209
+ // Add inneranimalmedia preset for chatgpt client
210
+ const addRes = await runMcp(
211
+ ['add', 'inneranimalmedia', '--client', 'chatgpt', '--token', 'test_tok_777', '--json'],
212
+ { home, write }
213
+ );
214
+ assert.equal(addRes.ok, true);
215
+ assert.equal(addRes.server.name, 'inneranimalmedia');
216
+ assert.equal(addRes.server.auth.token, 'test_tok_777');
217
+ assert.equal(addRes.syncedAdapters[0].client, 'chatgpt');
218
+
219
+ // List
220
+ const listRes = await runMcp(['list', '--json'], { home, write });
221
+ assert.equal(listRes.length, 1);
222
+ assert.equal(listRes[0].name, 'inneranimalmedia');
223
+
224
+ // List catalog
225
+ const catalogRes = await runMcp(['list', '--catalog', '--json'], { home, write });
226
+ assert.ok(catalogRes.length >= 8);
227
+
228
+ // Status
229
+ const statusRes = await runMcp(['status', 'inneranimalmedia', '--json'], { home, write });
230
+ assert.equal(statusRes.name, 'inneranimalmedia');
231
+ assert.equal(statusRes.hasAuth, true);
232
+
233
+ // Doctor includes catalog health data
234
+ const doctorRes = await runMcp(['doctor', 'inneranimalmedia', '--json'], { home, write });
235
+ assert.equal(doctorRes.name, 'inneranimalmedia');
236
+ assert.equal(doctorRes.authConfigured, true);
237
+ assert.equal(doctorRes.catalogHealth?.health_status, 'healthy');
238
+
239
+ // Remove
240
+ const removeRes = await runMcp(['remove', 'inneranimalmedia', '--client', 'all', '--json'], { home, write });
241
+ assert.equal(removeRes.deletedAuthority, true);
242
+
243
+ const emptyList = await runMcp(['list', '--json'], { home, write });
244
+ assert.equal(emptyList.length, 0);
245
+ });
@@ -1,10 +1,12 @@
1
1
  import assert from 'node:assert/strict';
2
2
  import test from 'node:test';
3
- import { createInlineActivity } from '../../src/ui/cli/activity.js';
4
- import { renderCliFooter } from '../../src/ui/cli/footer.js';
3
+ import { createInlineActivity, INTERRUPT_HINT, renderShimmer } from '../../src/ui/cli/activity.js';
4
+ import { renderCliFooter, renderDiffPreview } from '../../src/ui/cli/footer.js';
5
5
  import { createCliRuntimePresenter, normalizeRuntimeEventEnvelope, RUNTIME_EVENT_ENVELOPE_SCHEMA } from '../../src/ui/cli/runtime-events.js';
6
6
  import { renderWaitingInput } from '../../src/ui/cli/waiting.js';
7
7
 
8
+ const stripAnsi = (text) => String(text || '').replace(/\x1B\[[0-9;]*[a-zA-Z]/g, '');
9
+
8
10
  test('CLI footer reports unknown context honestly', () => {
9
11
  const text = renderCliFooter({
10
12
  model: 'claude-test',
@@ -19,6 +21,71 @@ test('CLI footer reports unknown context honestly', () => {
19
21
  assert.match(text, /cache 2k/);
20
22
  });
21
23
 
24
+ test('CLI footer shows project identity, branch, and shortcut hints', () => {
25
+ const text = stripAnsi(renderCliFooter({
26
+ project: 'agentsam-sdk',
27
+ cwd: '/Users/sam/agentsam-sdk',
28
+ branch: 'feat/cli-interactive-presence',
29
+ model: 'claude-test',
30
+ }));
31
+ assert.match(text, /agentsam-sdk/);
32
+ assert.match(text, /feat\/cli-interactive-presence/);
33
+ assert.match(text, /ctrl-c to cancel/);
34
+ assert.match(text, /\/ commands/);
35
+ });
36
+
37
+ test('diff preview colors hunks and keeps NO_COLOR output readable', () => {
38
+ const diff = [
39
+ 'diff --git a/src/ui/cli/footer.js b/src/ui/cli/footer.js',
40
+ '--- a/src/ui/cli/footer.js',
41
+ '+++ b/src/ui/cli/footer.js',
42
+ '@@ -1,3 +1,4 @@',
43
+ ' import pc from \'picocolors\';',
44
+ '-const old = 1;',
45
+ '+const next = 2;',
46
+ ' keep',
47
+ ].join('\n');
48
+ const colored = renderDiffPreview(diff, { color: true });
49
+ assert.match(colored, /\x1b\[/);
50
+ assert.match(stripAnsi(colored), /\+const next = 2;/);
51
+ const plain = renderDiffPreview(diff, { color: false });
52
+ assert.doesNotMatch(plain, /\x1b\[/);
53
+ assert.match(plain, /-const old = 1;/);
54
+ assert.equal(stripAnsi(renderDiffPreview('', { color: false })).trim(), 'no changes');
55
+ });
56
+
57
+ test('inline activity shows elapsed time and ctrl-c cancel hint', () => {
58
+ let output = '';
59
+ let now = 0;
60
+ let tick = null;
61
+ const activity = createInlineActivity({
62
+ write: (value) => { output += value; },
63
+ interactive: true,
64
+ env: { NO_COLOR: '1' },
65
+ now: () => now,
66
+ setInterval: (fn) => { tick = fn; return 1; },
67
+ clearInterval() {},
68
+ });
69
+ activity.start('Working');
70
+ now = 1500;
71
+ tick();
72
+ const clean = stripAnsi(output);
73
+ assert.match(clean, /Working/);
74
+ assert.match(clean, /1\.5s/);
75
+ assert.match(clean, new RegExp(INTERRUPT_HINT.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')));
76
+ activity.clear();
77
+ });
78
+
79
+ test('shimmer uses color when allowed and stays plain under NO_COLOR', () => {
80
+ const colored = renderShimmer('Working', 4, { env: { COLORTERM: 'truecolor' } });
81
+ assert.match(colored, /\x1b\[38;2;/);
82
+ assert.match(stripAnsi(colored), /Working/);
83
+ const fallback = renderShimmer('Working', 4, { env: { TERM: 'xterm-256color' } });
84
+ assert.match(fallback, /\x1b\[38;5;/);
85
+ const plain = renderShimmer('Working', 4, { env: { NO_COLOR: '1', COLORTERM: 'truecolor' } });
86
+ assert.equal(plain, 'Working');
87
+ });
88
+
22
89
  test('runtime event envelope is the single standalone/platform producer contract', () => {
23
90
  const envelope = normalizeRuntimeEventEnvelope({
24
91
  schema_version: 1,
@@ -0,0 +1,88 @@
1
+ import assert from 'node:assert/strict';
2
+ import test from 'node:test';
3
+ import {
4
+ buildStatusActionPlan,
5
+ formatStatusNextSteps,
6
+ } from '../../src/status/actions.js';
7
+ import { renderLocalStatus } from '../../src/ui/ansi.js';
8
+
9
+ test('healthy Cloudflare deployment wins over localhost', () => {
10
+ const runtime = {
11
+ ready: true,
12
+ checks: {
13
+ account: true,
14
+ models: true,
15
+ terminal: true,
16
+ cloudflare: true,
17
+ },
18
+ local: {
19
+ deployTarget: 'cloudflare',
20
+ api: {
21
+ online: false,
22
+ url: 'http://127.0.0.1:8787/api/health',
23
+ },
24
+ db: {
25
+ ready: true,
26
+ exists: true,
27
+ },
28
+ },
29
+ cloudflare: {
30
+ configured: true,
31
+ worker_name: 'agentsam-sdk',
32
+ health: {
33
+ ok: true,
34
+ status: 200,
35
+ url: 'https://agentsam.inneranimalmedia.com/health',
36
+ },
37
+ },
38
+ };
39
+
40
+ const plan = buildStatusActionPlan(runtime);
41
+ const text = formatStatusNextSteps(plan);
42
+
43
+ assert.match(plan.headline, /Live project healthy/);
44
+ assert.ok(plan.actions.some((action) =>
45
+ action.command === 'https://agentsam.inneranimalmedia.com'
46
+ ));
47
+ assert.ok(plan.actions.some((action) =>
48
+ action.command === 'agentsam cloudflare status'
49
+ ));
50
+ assert.doesNotMatch(text, /npm run dev/);
51
+ assert.match(text, /open https:\/\/agentsam\.inneranimalmedia\.com/);
52
+ });
53
+
54
+ test('compact local card prefers live deployment', () => {
55
+ const text = renderLocalStatus({
56
+ configured: true,
57
+ project: 'agentsam-sdk',
58
+ lane: 'custom',
59
+ agent: 'default',
60
+ git: {
61
+ branch: 'main',
62
+ revision: 'abcdef123456',
63
+ dirty: false,
64
+ },
65
+ db: {
66
+ ready: true,
67
+ tables: [],
68
+ },
69
+ api: {
70
+ online: false,
71
+ url: 'http://127.0.0.1:8787/api/health',
72
+ },
73
+ pty: {
74
+ online: true,
75
+ url: 'http://127.0.0.1:3099/health',
76
+ },
77
+ deployTarget: 'cloudflare',
78
+ live: {
79
+ online: true,
80
+ url: 'https://agentsam.inneranimalmedia.com/health',
81
+ },
82
+ });
83
+
84
+ assert.match(text, /● live/);
85
+ assert.match(text, /open https:\/\/agentsam\.inneranimalmedia\.com/);
86
+ assert.match(text, /agentsam cloudflare status/);
87
+ assert.doesNotMatch(text, /npm run dev/);
88
+ });
@@ -0,0 +1,54 @@
1
+ import assert from 'node:assert/strict';
2
+ import test from 'node:test';
3
+ import { renderArchitectureExplorer, renderOperationInspector, drawBox } from '../../src/ui/wireframes.js';
4
+ import { buildGoProductRegistrySql } from '../../src/go/registry.js';
5
+
6
+ test('architecture explorer is boxed reasoning scenery', () => {
7
+ const view = renderArchitectureExplorer({
8
+ repo: 'agentsam-sdk',
9
+ focus: { package: 'protocol', owns: 'wire contracts', runtime: 'none', imported_by: 'client', files: '.proto' },
10
+ });
11
+ assert.match(view, /┌/);
12
+ assert.match(view, /package: protocol/);
13
+ assert.match(view, /DEPENDENCY MAP/);
14
+ assert.match(view, /\[contracts\]/);
15
+ });
16
+
17
+ test('operation inspector shows intent timeline', () => {
18
+ const view = renderOperationInspector({
19
+ operation: 'model.export',
20
+ op_id: 'op_01H',
21
+ active_index: 2,
22
+ step: { name: 'converter', artifact: 'GLB' },
23
+ receipt: { 'input document revision': 84, 'output artifact hash': 'abc' },
24
+ });
25
+ assert.match(view, /model\.export/);
26
+ assert.match(view, /intent/);
27
+ assert.match(view, /converter/);
28
+ assert.match(view, /GLB/);
29
+ assert.match(view, /input document revision/);
30
+ });
31
+
32
+ test('drawBox pads visible ANSI width', () => {
33
+ const box = drawBox(['hello'], { width: 20, title: 't' });
34
+ assert.match(box, /┌/);
35
+ assert.match(box, /└/);
36
+ });
37
+
38
+ test('buildGoProductRegistrySql upserts product + relationships without inventing tables', () => {
39
+ const sql = buildGoProductRegistrySql({
40
+ product: 'agentsam-go-worker',
41
+ status: 'wired',
42
+ url: 'https://agentsam-go-worker.example.workers.dev',
43
+ commit: 'abc123',
44
+ health: 'healthy',
45
+ });
46
+ assert.match(sql, /INSERT INTO agentsam_products/);
47
+ assert.match(sql, /ON CONFLICT\(slug\) DO UPDATE/);
48
+ assert.match(sql, /INSERT INTO asset_relationships/);
49
+ assert.match(sql, /sourced_from/);
50
+ assert.match(sql, /runs_on/);
51
+ assert.match(sql, /deployed_as/);
52
+ assert.doesNotMatch(sql, /CREATE TABLE/);
53
+ assert.doesNotMatch(sql, /account_id/);
54
+ });
@@ -29,8 +29,7 @@ describe('cloudflare connector routes', () => {
29
29
  it('returns 503 on start when only fixture credentials exist', async () => {
30
30
  const env = {
31
31
  CLOUDFLARE_OAUTH_CLIENT_ID: 'sillynotreal',
32
- CLOUDFLARE_OAUTH_CLIENT_SECRET: 'sillynotreal-secret',
33
- sessions: new Map([['sess_1', 'user-sam']]),
32
+ fixtureSessions: new Map([['sess_1', 'user-sam']]),
34
33
  };
35
34
  const res = await handleCloudflareConnectionRequest(
36
35
  req('https://agentsam.inneranimalmedia.com/api/connections/cloudflare/start', {
@@ -47,8 +46,7 @@ describe('cloudflare connector routes', () => {
47
46
  it('status stays safe and does not treat fixture as production configured', async () => {
48
47
  const env = {
49
48
  CLOUDFLARE_OAUTH_CLIENT_ID: 'sillynotreal',
50
- CLOUDFLARE_OAUTH_CLIENT_SECRET: 'sillynotreal-secret',
51
- sessions: new Map([['sess_1', 'user-sam']]),
49
+ fixtureSessions: new Map([['sess_1', 'user-sam']]),
52
50
  };
53
51
  const res = await handleCloudflareConnectionRequest(
54
52
  req('https://agentsam.inneranimalmedia.com/api/connections/cloudflare', {
@@ -65,7 +63,7 @@ describe('cloudflare connector routes', () => {
65
63
  });
66
64
 
67
65
  it('rejects owner_id in the JSON body', async () => {
68
- const env = { sessions: new Map([['sess_1', 'user-sam']]) };
66
+ const env = { fixtureSessions: new Map([['sess_1', 'user-sam']]) };
69
67
  const res = await handleCloudflareConnectionRequest(
70
68
  req('https://agentsam.inneranimalmedia.com/api/connections/cloudflare/disconnect', {
71
69
  method: 'POST',
@@ -82,7 +80,6 @@ describe('cloudflare connector routes', () => {
82
80
  it('rejects callback without a stored oauth state', async () => {
83
81
  const env = {
84
82
  CLOUDFLARE_OAUTH_CLIENT_ID: 'real-client-id',
85
- CLOUDFLARE_OAUTH_CLIENT_SECRET: 'real-client-secret-value',
86
83
  oauthState: new Map(),
87
84
  };
88
85
  const res = await handleCloudflareConnectionRequest(
@@ -10,10 +10,17 @@ function tempRoot() { return fs.mkdtempSync(path.join(os.tmpdir(), 'agentsam-cf-
10
10
 
11
11
  test('Cloudflare native command catalog exposes bounded read operations and never an auth-token secret read', () => {
12
12
  const ids = listWranglerNativeCommands().map((row) => row.id);
13
- assert.deepEqual(ids, ['whoami', 'deployments.list', 'versions.list', 'types.check', 'queues.list']);
13
+ assert.deepEqual(ids, ['whoami', 'deployments.list', 'versions.list', 'versions.view', 'types.check', 'queues.list', 'tunnel.list', 'tunnel.info']);
14
14
  assert.ok(!ids.some((id) => id.includes('token') || id.includes('secret') || id === 'deploy'));
15
15
  });
16
16
 
17
+ test('Wrangler version view requires an exact version and keeps secret values unavailable', () => {
18
+ const root = tempRoot();
19
+ const plan = buildWranglerInvocation('versions.view', { cwd: root, name: 'demo', version_id: 'ver_123' });
20
+ assert.deepEqual(plan.args, ['versions', 'view', 'ver_123', '--json', '--name', 'demo']);
21
+ assert.throws(() => buildWranglerInvocation('versions.view', { cwd: root, name: 'demo' }), /version_id_required/);
22
+ });
23
+
17
24
  test('Wrangler native invocation is argv-based and cwd/config scoped', () => {
18
25
  const root = tempRoot();
19
26
  fs.writeFileSync(path.join(root, 'wrangler.jsonc'), '{}');
@@ -115,6 +115,21 @@ test('AgentSam instructions compile in stable then repository-specific precedenc
115
115
  assert.ok(compiled.content.indexOf('base law') < compiled.content.indexOf('local law'));
116
116
  });
117
117
 
118
+ test('compatibility shims are not compiled into AgentSam instruction authority', t => {
119
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), 'agentsam-instruction-shims-'));
120
+ t.after(() => fs.rmSync(root, { recursive: true, force: true }));
121
+ fs.mkdirSync(path.join(root, '.git'));
122
+ fs.writeFileSync(path.join(root, 'AGENTSAM.md'), '# Stable\ncanonical only\n');
123
+ fs.writeFileSync(path.join(root, 'AGENTS.md'), 'shim should not become policy\n');
124
+ fs.writeFileSync(path.join(root, 'CLAUDE.md'), 'claude shim should not become policy\n');
125
+ const compiled = compileAgentInstructions(root);
126
+ assert.equal(compiled.sources.length, 1);
127
+ assert.equal(compiled.sources[0].filename, 'AGENTSAM.md');
128
+ assert.match(compiled.content, /canonical only/);
129
+ assert.doesNotMatch(compiled.content, /shim should not become policy/);
130
+ assert.doesNotMatch(compiled.content, /claude shim should not become policy/);
131
+ });
132
+
118
133
  test('project context loads bounded compiled AgentSam instructions', t => {
119
134
  const root = fs.mkdtempSync(path.join(os.tmpdir(), 'agentsam-context-rules-'));
120
135
  t.after(() => fs.rmSync(root, { recursive: true, force: true }));
@@ -16,6 +16,15 @@ import { createOpenAIResponsesAdapter } from '../src/providers/openai-responses.
16
16
 
17
17
  function response(status, body, headers = {}) { return new Response(JSON.stringify(body), { status, headers: { 'content-type': 'application/json', ...headers } }); }
18
18
 
19
+
20
+ test('public errors subpath preserves canonical and legacy diagnostic APIs', async () => {
21
+ const errors = await import('@inneranimalmedia/agentsam-sdk/errors');
22
+ assert.equal(typeof errors.createErrorEnvelope, 'function');
23
+ assert.equal(typeof errors.classifyCloudflareFailure, 'function');
24
+ assert.equal(typeof errors.classifyOpenAIError, 'function');
25
+ assert.equal(typeof errors.diagnosticFromError, 'function');
26
+ });
27
+
19
28
  test('OpenAI diagnostics preserve machine code, request id, retry metadata and redact secrets', () => {
20
29
  const error = createOpenAIHttpError({
21
30
  status: 429,