@inneranimalmedia/agentsam-sdk 2.6.2 → 2.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (497) hide show
  1. package/AGENTSAM.md +45 -1
  2. package/README.md +80 -0
  3. package/apps/README.md +34 -0
  4. package/apps/cad-creator/README.md +728 -0
  5. package/apps/cad-creator/shared/cad/package.json +19 -0
  6. package/apps/cad-creator/shared/cad/src/domain/operations.ts +7 -0
  7. package/apps/cad-creator/shared/cad/src/domain/project-contract.d.ts +3 -0
  8. package/apps/cad-creator/shared/cad/src/domain/project-contract.js +75 -0
  9. package/apps/cad-creator/shared/cad/src/domain/project-tools.d.ts +1 -0
  10. package/apps/cad-creator/shared/cad/src/domain/project-tools.js +24 -0
  11. package/apps/cad-creator/shared/cad/src/domain/validation.ts +191 -0
  12. package/apps/cad-creator/shared/cad/src/index.ts +4 -0
  13. package/apps/cad-creator/shared/cad/src/robotics/types.ts +232 -0
  14. package/apps/cad-creator/shared/cad/src/types.ts +507 -0
  15. package/apps/cad-creator/shared/cad/tsconfig.json +14 -0
  16. package/docs/AUTORAG.md +58 -0
  17. package/docs/BRAND_INTELLIGENCE.md +30 -0
  18. package/docs/CLI_SHELL.md +4 -2
  19. package/docs/CMS_CONTEXTUAL_COMPOSER.md +38 -0
  20. package/docs/MERKLE.md +4 -0
  21. package/docs/PROJECT_CONFIG.md +3 -0
  22. package/docs/REPOSITORY_KNOWLEDGE.md +2 -0
  23. package/docs/THEME_REFINERY.md +120 -0
  24. package/docs/architecture/PROVIDER-TOOLS-AND-COMPACTION.md +60 -0
  25. package/docs/architecture/STORAGE.md +87 -0
  26. package/docs/cad-project-tools.md +69 -0
  27. package/docs/cms-scaffolding-pattern-reference.md +73 -0
  28. package/docs/plans/AGENTSAM-INTERACTIVE-UI-REQUIREMENTS-codex-tui-20260919.md +113 -0
  29. package/docs/plans/AGENTSAM-INTERACTIVE-UI-REQUIREMENTS.md +85 -0
  30. package/docs/plans/AGENTSAM-MCP-CLIENT-2026-09-19.md +181 -0
  31. package/docs/plans/ASBD-PORTABLE-WORKGRAPH-UI-DEFERRED.md +34 -0
  32. package/docs/plans/ASTRA-BRIEF-2026-09-18.md +258 -0
  33. package/docs/plans/MULTI-AGENT-SPRINTS-2026-09-19.md +373 -0
  34. package/docs/plans/NEXT-AGENT-HANDOFF.md +167 -0
  35. package/docs/plans/RECONCILIATION-2026-09-19.md +178 -0
  36. package/docs/plugins.md +43 -0
  37. package/docs/tools/README.md +57 -0
  38. package/docs/tools/agent-and-orchestration.md +49 -0
  39. package/docs/tools/browser-and-research.md +46 -0
  40. package/docs/tools/cloudflare-platform.md +32 -0
  41. package/docs/tools/cms.md +25 -0
  42. package/docs/tools/communications.md +41 -0
  43. package/docs/tools/database-and-storage.md +62 -0
  44. package/docs/tools/design-and-media.md +64 -0
  45. package/docs/tools/filesystem-and-code.md +55 -0
  46. package/docs/tools/github.md +56 -0
  47. package/docs/tools/integrations-and-misc.md +16 -0
  48. package/docs/tools/memory.md +21 -0
  49. package/docs/tools/terminal-and-execution.md +29 -0
  50. package/docs/tools/tickets-and-platform.md +30 -0
  51. package/migrations/d1/0001_agentsam_plugin_runtime.sql +177 -0
  52. package/migrations/d1/0002_agentsam_ticket_ownership.sql +8 -0
  53. package/migrations/d1/0002_dynamic_model_policies.sql +23 -0
  54. package/migrations/d1/0003_expand_tool_handler_families.sql +18 -0
  55. package/migrations/d1/0004_project_aware_retrieval_lanes.sql +24 -0
  56. package/migrations/d1/0005_portable_knowledge_identity.sql +104 -0
  57. package/migrations/d1/0006_repair_ops_trail_account_scope.sql +14 -0
  58. package/migrations/d1/0007_repair_ops_trail_agent_run_account.sql +13 -0
  59. package/migrations/d1/0008_backfill_knowledge_run_legacy_tenant.sql +14 -0
  60. package/migrations/d1/0009_normalize_cloudflare_plugin_installations.sql +137 -0
  61. package/migrations/runtime/0001_cli_runtime.sql +67 -0
  62. package/migrations/runtime/0002_project_sessions.sql +15 -0
  63. package/migrations/runtime/0003_provider_continuations.sql +8 -0
  64. package/package.json +92 -12
  65. package/packages/agentsam-brand/README.md +21 -0
  66. package/packages/agentsam-brand/package.json +22 -0
  67. package/packages/agentsam-brand/src/contract.js +59 -0
  68. package/packages/agentsam-brand/src/extract.js +126 -0
  69. package/packages/agentsam-brand/src/goap-actions.js +73 -0
  70. package/packages/agentsam-brand/src/index.js +48 -0
  71. package/packages/agentsam-brand/src/plan.js +115 -0
  72. package/packages/agentsam-brand/src/resolve.js +139 -0
  73. package/packages/agentsam-brand/src/scan.js +250 -0
  74. package/packages/agentsam-brand/test/brand-scan.test.mjs +106 -0
  75. package/packages/agentsam-contracts/README.md +23 -0
  76. package/packages/agentsam-contracts/package.json +32 -0
  77. package/packages/agentsam-contracts/src/adapter.ts +25 -0
  78. package/packages/agentsam-contracts/src/agent.ts +35 -0
  79. package/packages/agentsam-contracts/src/artifacts.ts +33 -0
  80. package/packages/agentsam-contracts/src/authority.ts +29 -0
  81. package/packages/agentsam-contracts/src/context.ts +16 -0
  82. package/packages/agentsam-contracts/src/errors.ts +46 -0
  83. package/packages/agentsam-contracts/src/events.ts +47 -0
  84. package/packages/agentsam-contracts/src/execution.ts +50 -0
  85. package/packages/agentsam-contracts/src/hooks.ts +40 -0
  86. package/packages/agentsam-contracts/src/identity.ts +16 -0
  87. package/packages/agentsam-contracts/src/index.ts +14 -0
  88. package/packages/agentsam-contracts/src/models.ts +9 -0
  89. package/packages/agentsam-contracts/src/providers.ts +33 -0
  90. package/packages/agentsam-contracts/src/repository.ts +64 -0
  91. package/packages/agentsam-contracts/src/tools.ts +98 -0
  92. package/packages/agentsam-contracts/test/contracts.test.mjs +16 -0
  93. package/packages/agentsam-contracts/test/errors-catalog.test.mjs +25 -0
  94. package/packages/agentsam-contracts/test/repository.test.mjs +18 -0
  95. package/packages/agentsam-contracts/tsconfig.json +12 -0
  96. package/packages/agentsam-errors/package.json +17 -0
  97. package/packages/agentsam-errors/src/adapters/anthropic.js +15 -0
  98. package/packages/agentsam-errors/src/adapters/cad.js +109 -0
  99. package/packages/agentsam-errors/src/adapters/cloudflare.js +21 -0
  100. package/packages/agentsam-errors/src/adapters/cursor.js +4 -0
  101. package/packages/agentsam-errors/src/adapters/device.js +38 -0
  102. package/packages/agentsam-errors/src/adapters/docker.js +28 -0
  103. package/packages/agentsam-errors/src/adapters/gcp.js +14 -0
  104. package/packages/agentsam-errors/src/adapters/github.js +22 -0
  105. package/packages/agentsam-errors/src/adapters/google.js +17 -0
  106. package/packages/agentsam-errors/src/adapters/index.js +55 -0
  107. package/packages/agentsam-errors/src/adapters/internal.js +40 -0
  108. package/packages/agentsam-errors/src/adapters/oauth.js +24 -0
  109. package/packages/agentsam-errors/src/adapters/openai.js +17 -0
  110. package/packages/agentsam-errors/src/adapters/process.js +35 -0
  111. package/packages/agentsam-errors/src/adapters/provider.js +114 -0
  112. package/packages/agentsam-errors/src/envelope.js +186 -0
  113. package/packages/agentsam-errors/src/error.js +24 -0
  114. package/packages/agentsam-errors/src/fingerprint.js +35 -0
  115. package/packages/agentsam-errors/src/index.js +10 -0
  116. package/packages/agentsam-errors/src/normalize.js +30 -0
  117. package/packages/agentsam-errors/src/redaction.js +52 -0
  118. package/packages/agentsam-errors/src/render.js +16 -0
  119. package/packages/agentsam-errors/src/retry.js +10 -0
  120. package/packages/agentsam-errors/src/transport.js +52 -0
  121. package/packages/agentsam-errors/src/vocabulary.js +320 -0
  122. package/packages/agentsam-errors/test/envelope.test.mjs +70 -0
  123. package/packages/agentsam-errors/test/providers.test.mjs +99 -0
  124. package/packages/agentsam-errors/test/redaction.test.mjs +21 -0
  125. package/packages/agentsam-errors/test/runtime-cad-device.test.mjs +76 -0
  126. package/packages/agentsam-errors/test/transport.test.mjs +46 -0
  127. package/packages/agentsam-knowledge/package.json +15 -0
  128. package/packages/agentsam-knowledge/src/autorag/index.js +64 -0
  129. package/packages/agentsam-knowledge/src/backends/index.js +26 -0
  130. package/packages/agentsam-knowledge/src/index.js +3 -0
  131. package/packages/agentsam-knowledge/src/providers/index.js +95 -0
  132. package/packages/agentsam-knowledge/test/autorag.test.mjs +42 -0
  133. package/packages/agentsam-nav/README.md +40 -0
  134. package/packages/agentsam-nav/dist/Nav.d.ts +43 -0
  135. package/packages/agentsam-nav/dist/NavCollapsible.d.ts +10 -0
  136. package/packages/agentsam-nav/dist/NavContent.d.ts +2 -0
  137. package/packages/agentsam-nav/dist/NavFooter.d.ts +2 -0
  138. package/packages/agentsam-nav/dist/NavGroup.d.ts +3 -0
  139. package/packages/agentsam-nav/dist/NavHeader.d.ts +2 -0
  140. package/packages/agentsam-nav/dist/NavMenu.d.ts +22 -0
  141. package/packages/agentsam-nav/dist/NavProvider.d.ts +35 -0
  142. package/packages/agentsam-nav/dist/NavTrigger.d.ts +2 -0
  143. package/packages/agentsam-nav/dist/Surfaces.d.ts +41 -0
  144. package/packages/agentsam-nav/dist/browser.d.ts +11 -0
  145. package/packages/agentsam-nav/dist/browser.global.js +132 -0
  146. package/packages/agentsam-nav/dist/browser.js +613 -0
  147. package/packages/agentsam-nav/dist/contracts.d.ts +76 -0
  148. package/packages/agentsam-nav/dist/index.d.ts +11 -0
  149. package/packages/agentsam-nav/dist/index.js +614 -0
  150. package/packages/agentsam-nav/dist/legacy.css +83 -0
  151. package/packages/agentsam-nav/dist/shell.css +113 -0
  152. package/packages/agentsam-nav/dist/theme.css +113 -0
  153. package/packages/agentsam-nav/dist/utils.d.ts +1 -0
  154. package/packages/agentsam-nav/package.json +43 -0
  155. package/packages/agentsam-queue-control/README.md +107 -0
  156. package/packages/agentsam-queue-control/package.json +31 -0
  157. package/packages/agentsam-queue-control/schemas/job-envelope.schema.json +56 -0
  158. package/packages/agentsam-queue-control/src/adapters/cloudflare.js +152 -0
  159. package/packages/agentsam-queue-control/src/adapters/memory.js +38 -0
  160. package/packages/agentsam-queue-control/src/contracts.js +130 -0
  161. package/packages/agentsam-queue-control/src/control-plane.js +141 -0
  162. package/packages/agentsam-queue-control/src/dispatch.js +43 -0
  163. package/packages/agentsam-queue-control/src/index.js +7 -0
  164. package/packages/agentsam-queue-control/src/policy.js +88 -0
  165. package/packages/agentsam-queue-control/src/topology.js +66 -0
  166. package/packages/agentsam-queue-control/test/queue-control.test.mjs +100 -0
  167. package/packages/agentsam-repository/src/goap.js +718 -0
  168. package/packages/agentsam-repository/src/goap.js.bak-20260922011251 +670 -0
  169. package/packages/agentsam-repository/src/index.js +5 -0
  170. package/packages/agentsam-repository/src/merkle/cloudflare-persistence.js +2 -2
  171. package/packages/agentsam-repository/src/tickets.js +184 -0
  172. package/packages/agentsam-repository/src/work-tracking.js +199 -0
  173. package/packages/agentsam-repository/src/workspace-state.js +176 -0
  174. package/packages/agentsam-repository/test/goap-tickets-workspace-state.test.mjs +152 -0
  175. package/packages/connectors/cloudflare/src/index.js +297 -15
  176. package/packages/connectors/cloudflare/src/owner.js +43 -40
  177. package/packages/connectors/cloudflare/src/routes.js +167 -26
  178. package/packages/connectors/cloudflare/tests/connector.test.mjs +112 -2
  179. package/packages/heuristic-theme/README.md +11 -0
  180. package/packages/heuristic-theme/package.json +25 -0
  181. package/packages/heuristic-theme/src/index.js +2 -0
  182. package/packages/heuristic-theme/src/registry.js +36 -0
  183. package/packages/heuristic-theme/src/theme.js +41 -0
  184. package/packages/heuristic-theme/test/theme.test.mjs +26 -0
  185. package/packages/identity/.agentsam/features/oauth-login-portal/agentsam.feature.json +64 -0
  186. package/packages/identity/.agentsam/features/oauth-login-portal/providers.json +96 -0
  187. package/packages/identity/.agentsam/features/oauth-login-portal/resources.json +47 -0
  188. package/packages/identity/.agentsam/features/oauth-login-portal/routes.json +74 -0
  189. package/packages/identity/.agentsam/features/oauth-login-portal/ui.json +35 -0
  190. package/packages/identity/package.json +3 -2
  191. package/packages/identity/src/adapters/cloudflare-d1/ids.js +4 -0
  192. package/packages/identity/src/adapters/cloudflare-d1/index.js +39 -1
  193. package/packages/identity/src/contracts/provider.js +3 -2
  194. package/packages/identity/src/frontend/auth-portal/pages/login.html +7 -0
  195. package/packages/identity/src/index.js +2 -0
  196. package/packages/identity/src/oauth/credentials.js +13 -0
  197. package/packages/identity/src/oauth/iam-platform.js +5 -5
  198. package/packages/identity/src/providers/cloudflare/index.js +19 -0
  199. package/packages/identity/src/providers/cloudflare/mapper.js +21 -0
  200. package/packages/identity/src/providers/cloudflare/oauth.js +48 -0
  201. package/packages/identity/src/providers/cloudflare/profile.js +28 -0
  202. package/packages/identity/src/providers/index.js +18 -2
  203. package/packages/identity/src/server/identity-service.js +13 -3
  204. package/packages/identity/src/server/worker-router.js +63 -8
  205. package/packages/identity/tests/identity-service.test.mjs +15 -0
  206. package/packages/providers/completeful/README.md +38 -0
  207. package/packages/providers/completeful/package.json +29 -0
  208. package/packages/providers/completeful/src/client.js +162 -0
  209. package/packages/providers/completeful/src/events.js +49 -0
  210. package/packages/providers/completeful/src/index.js +22 -0
  211. package/packages/providers/completeful/src/tools.js +579 -0
  212. package/packages/providers/completeful/src/webhooks.js +55 -0
  213. package/packages/providers/completeful/test/provider.test.mjs +196 -0
  214. package/packages/theme-church-site/README.md +10 -0
  215. package/packages/theme-church-site/package.json +30 -0
  216. package/packages/theme-church-site/src/harvest.json +14 -0
  217. package/packages/theme-church-site/src/index.js +84 -0
  218. package/packages/theme-church-site/test/theme.test.mjs +19 -0
  219. package/packages/theme-companions-site/README.md +10 -0
  220. package/packages/theme-companions-site/package.json +30 -0
  221. package/packages/theme-companions-site/src/harvest.json +12 -0
  222. package/packages/theme-companions-site/src/index.js +82 -0
  223. package/packages/theme-companions-site/test/theme.test.mjs +19 -0
  224. package/packages/theme-floors-site/README.md +10 -0
  225. package/packages/theme-floors-site/package.json +30 -0
  226. package/packages/theme-floors-site/src/harvest.json +14 -0
  227. package/packages/theme-floors-site/src/index.js +82 -0
  228. package/packages/theme-floors-site/test/theme.test.mjs +19 -0
  229. package/packages/theme-fuelnfree-site/README.md +10 -0
  230. package/packages/theme-fuelnfree-site/package.json +30 -0
  231. package/packages/theme-fuelnfree-site/src/harvest.json +13 -0
  232. package/packages/theme-fuelnfree-site/src/index.js +81 -0
  233. package/packages/theme-fuelnfree-site/test/theme.test.mjs +19 -0
  234. package/packages/theme-handyman-site/README.md +10 -0
  235. package/packages/theme-handyman-site/package.json +30 -0
  236. package/packages/theme-handyman-site/src/harvest.json +10 -0
  237. package/packages/theme-handyman-site/src/index.js +83 -0
  238. package/packages/theme-handyman-site/test/theme.test.mjs +19 -0
  239. package/packages/theme-insurance-site/README.md +10 -0
  240. package/packages/theme-insurance-site/package.json +30 -0
  241. package/packages/theme-insurance-site/src/harvest.json +10 -0
  242. package/packages/theme-insurance-site/src/index.js +83 -0
  243. package/packages/theme-insurance-site/test/theme.test.mjs +19 -0
  244. package/packages/theme-shinshu-site/README.md +10 -0
  245. package/packages/theme-shinshu-site/package.json +30 -0
  246. package/packages/theme-shinshu-site/src/harvest.json +12 -0
  247. package/packages/theme-shinshu-site/src/index.js +83 -0
  248. package/packages/theme-shinshu-site/test/theme.test.mjs +19 -0
  249. package/packages/work-graph/README.md +49 -0
  250. package/packages/work-graph/package.json +19 -0
  251. package/packages/work-graph/prototype/README.md +32 -0
  252. package/packages/work-graph/prototype/data/demo-workgraph.js +47 -0
  253. package/packages/work-graph/prototype/renderers/timeline-model.js +21 -0
  254. package/packages/work-graph/prototype/renderers/workgraph-runtime.js +38 -0
  255. package/packages/work-graph/prototype-gnantt.html +655 -0
  256. package/packages/work-graph/src/adapters/business/projects.js +23 -0
  257. package/packages/work-graph/src/adapters/engineering/git.js +22 -0
  258. package/packages/work-graph/src/adapters/engineering/mcp.js +22 -0
  259. package/packages/work-graph/src/index.js +76 -0
  260. package/packages/work-graph/src/renderers/gantt-model.js +11 -0
  261. package/packages/work-graph/src/renderers/timeline.js +16 -0
  262. package/packages/work-graph/test/work-graph.test.mjs +37 -0
  263. package/protocol/README.md +12 -0
  264. package/protocol/capabilities/cloudflare-cpu-audit-input.schema.json +30 -6
  265. package/protocol/capabilities/cloudflare-cpu-profile-input.schema.json +18 -4
  266. package/protocol/capabilities/cloudflare-wrangler-native-input.schema.json +59 -10
  267. package/protocol/capabilities/knowledge-search-input.schema.json +35 -0
  268. package/protocol/capabilities/manifest.json +163 -1
  269. package/protocol/capabilities/repository-audit-input.schema.json +39 -6
  270. package/protocol/capabilities/repository-snapshot-input.schema.json +15 -3
  271. package/protocol/capabilities/terminal-exec-input.schema.json +55 -0
  272. package/protocol/commerce/catalog.v1.json +50 -0
  273. package/protocol/errors/error-catalog.json +164 -0
  274. package/protocol/errors/error-envelope.schema.json +544 -0
  275. package/protocol/features/README.md +57 -0
  276. package/protocol/features/agentsam.feature.v1.schema.json +290 -0
  277. package/protocol/features/catalog.json +65 -0
  278. package/protocol/features/examples/provider-resend.feature.json +17 -0
  279. package/protocol/go/agentsam-go-runtime.v1.json +17 -0
  280. package/protocol/knowledge/LIFECYCLE.md +140 -0
  281. package/protocol/knowledge/README.md +4 -0
  282. package/protocol/presets/catalog.json +128 -19
  283. package/protocol/rpc/v1/errors.proto +24 -0
  284. package/protocol/theme-refinery/d1-reconciliation.md +48 -0
  285. package/protocol/theme-refinery/product-metadata.schema.json +27 -0
  286. package/protocol/theme-refinery/receipts/products-registry-batch-20260924.json +318 -0
  287. package/protocol/theme-refinery/receipts/theme-harvest-20260924.json +472 -0
  288. package/protocol/theme-refinery/reconciliation-receipt.schema.json +83 -0
  289. package/services/cad/server.py +249 -2
  290. package/src/agent/capability-adapter.js +15 -5
  291. package/src/agent/index.js +2 -1
  292. package/src/agent/model-turn.js +51 -0
  293. package/src/agent/responses-runner.js +304 -38
  294. package/src/capabilities/index.js +1 -0
  295. package/src/capabilities/terminal-exec.js +78 -0
  296. package/src/cli.js +117 -9
  297. package/src/cloudflare/index.js +6 -0
  298. package/src/cloudflare/runtime-status.js +393 -0
  299. package/src/cloudflare/wrangler.js +17 -1
  300. package/src/commands/app.js +106 -0
  301. package/src/commands/autorag.js +77 -0
  302. package/src/commands/brand.js +293 -0
  303. package/src/commands/cad.js +1 -0
  304. package/src/commands/connections.js +126 -29
  305. package/src/commands/context-economics.js +8 -0
  306. package/src/commands/db.js +7 -0
  307. package/src/commands/env.js +5 -4
  308. package/src/commands/eval.js +209 -14
  309. package/src/commands/go.js +365 -0
  310. package/src/commands/goap.js +176 -0
  311. package/src/commands/identity-init.js +27 -3
  312. package/src/commands/identity-protocol.js +195 -0
  313. package/src/commands/knowledge.js +64 -5
  314. package/src/commands/mcp.js +341 -0
  315. package/src/commands/merkle-persist.js +3 -1
  316. package/src/commands/merkle.js +18 -3
  317. package/src/commands/models.js +109 -23
  318. package/src/commands/plugins.js +175 -0
  319. package/src/commands/preferences.js +28 -8
  320. package/src/commands/product.js +53 -10
  321. package/src/commands/providers.js +118 -37
  322. package/src/commands/resume.js +9 -5
  323. package/src/commands/runtime-status.js +154 -0
  324. package/src/commands/shell.js +466 -55
  325. package/src/commands/status.js +82 -7
  326. package/src/commands/tunnel.js +228 -195
  327. package/src/commands/whoami.js +78 -6
  328. package/src/context/budget.js +6 -0
  329. package/src/context/index.js +2 -1
  330. package/src/context/project-card.js +75 -0
  331. package/src/errors/contract.js +34 -211
  332. package/src/errors/diagnostic.js +95 -51
  333. package/src/errors/index.js +6 -13
  334. package/src/eval/index.js +6 -0
  335. package/src/eval/live.js +439 -0
  336. package/src/features/resolve.js +242 -0
  337. package/src/go/build.js +108 -0
  338. package/src/go/cloudflare.js +207 -0
  339. package/src/go/contract.js +139 -0
  340. package/src/go/discover.js +96 -0
  341. package/src/go/index.js +13 -0
  342. package/src/go/receipts.js +77 -0
  343. package/src/go/registry.js +223 -0
  344. package/src/go/verify.js +31 -0
  345. package/src/index.js +100 -1
  346. package/src/knowledge/config.js +13 -5
  347. package/src/knowledge/engine.js +23 -8
  348. package/src/knowledge/index.js +1 -0
  349. package/src/knowledge/lane-registry.js +46 -0
  350. package/src/knowledge/providers/gemini.js +48 -8
  351. package/src/knowledge/service/client.js +13 -1
  352. package/src/knowledge/service/grpc-codec.js +156 -53
  353. package/src/knowledge/service/job-engine.js +133 -11
  354. package/src/knowledge/service/job-worker.js +34 -5
  355. package/src/knowledge/service/server.js +10 -1
  356. package/src/knowledge/store-discovery.js +77 -0
  357. package/src/lib/account-session.js +8 -2
  358. package/src/lib/agent-instructions.js +3 -0
  359. package/src/lib/auth.js +7 -3
  360. package/src/lib/cad/blender.js +42 -3
  361. package/src/lib/cad/d1-project-store.js +43 -0
  362. package/src/lib/cad/discovery.js +616 -0
  363. package/src/lib/cad/docker-executor.js +352 -0
  364. package/src/lib/cad/freecad.js +253 -0
  365. package/src/lib/cad/index.js +40 -0
  366. package/src/lib/cad/openscad.js +198 -0
  367. package/src/lib/cad/project-cli.d.ts +2 -0
  368. package/src/lib/cad/project-cli.js +21 -0
  369. package/src/lib/cad/project-contract.d.ts +3 -0
  370. package/src/lib/cad/project-contract.js +1 -0
  371. package/src/lib/cad/project-recipe.js +30 -0
  372. package/src/lib/cad/project-runtime.d.ts +2 -0
  373. package/src/lib/cad/project-runtime.js +53 -0
  374. package/src/lib/cad/project-store.js +25 -0
  375. package/src/lib/cad/project-workflows.js +31 -0
  376. package/src/lib/cad-docker.js +21 -2
  377. package/src/lib/cli-preferences.js +17 -2
  378. package/src/lib/core-client.js +37 -18
  379. package/src/lib/deploy/local-studio.js +6 -5
  380. package/src/lib/dockerize.js +3 -0
  381. package/src/lib/execution-approvals.js +1 -0
  382. package/src/lib/identity-scaffold.js +4 -1
  383. package/src/lib/knowledge-docker.js +9 -1
  384. package/src/lib/local-sessions.js +124 -34
  385. package/src/lib/local-status.js +35 -14
  386. package/src/lib/project-config.js +9 -0
  387. package/src/lib/provider-credentials.js +73 -11
  388. package/src/lib/scaffold/resolve-cloudflare-account.js +37 -0
  389. package/src/lib/scaffold/wizards/cms.js +2 -8
  390. package/src/lib/scaffold/wizards/worker-api.js +2 -8
  391. package/src/lib/slash-commands.js +9 -2
  392. package/src/local/migrations.js +109 -1
  393. package/src/local/runtime-store.js +31 -5
  394. package/src/local/sqlite.js +36 -1
  395. package/src/mcp/authority.js +348 -0
  396. package/src/mcp/client-adapters.js +431 -0
  397. package/src/mcp/client.js +172 -0
  398. package/src/mcp/index.js +47 -0
  399. package/src/mcp/telemetry.js +103 -0
  400. package/src/models/catalog.js +329 -51
  401. package/src/models/discovery.js +24 -4
  402. package/src/models/index.js +2 -0
  403. package/src/models/inventory-core.js +182 -0
  404. package/src/models/policy.js +20 -0
  405. package/src/plugins/cloudflare.js +103 -0
  406. package/src/plugins/completeful.js +69 -0
  407. package/src/plugins/contracts.js +86 -0
  408. package/src/plugins/index.js +11 -0
  409. package/src/plugins/registry.js +207 -0
  410. package/src/plugins/resource-scope.js +45 -0
  411. package/src/plugins/runtime.js +118 -0
  412. package/src/plugins/vectorize.js +31 -0
  413. package/src/progression/engine.js +171 -0
  414. package/src/progression/index.js +1 -0
  415. package/src/providers/cloudflare-chat.js +1 -1
  416. package/src/providers/gemini-generate-content.js +2 -1
  417. package/src/providers/openai-responses.js +45 -16
  418. package/src/providers/tool-schema.js +85 -0
  419. package/src/repository/index.js +29 -0
  420. package/src/rpc/generated/errors_pb.js +961 -1
  421. package/src/security/local-vault.js +415 -0
  422. package/src/security/process.js +20 -4
  423. package/src/status/actions.js +192 -0
  424. package/src/tools/hydrate.js +5 -1
  425. package/src/tools/index.js +7 -0
  426. package/src/tools/redact.js +64 -0
  427. package/src/tools/registry.js +83 -0
  428. package/src/tools/runtime.js +257 -0
  429. package/src/tools/search.js +21 -8
  430. package/src/ui/ansi.js +117 -3
  431. package/src/ui/cli/activity.js +76 -7
  432. package/src/ui/cli/footer.js +110 -9
  433. package/src/ui/cli/help.js +11 -4
  434. package/src/ui/wireframes.js +166 -0
  435. package/test/account-session.test.mjs +28 -0
  436. package/test/apps-scaffold-contract.test.mjs +16 -1
  437. package/test/capabilities.test.mjs +1 -1
  438. package/test/cli/eval-live.test.mjs +219 -0
  439. package/test/cli/go.test.mjs +71 -0
  440. package/test/cli/local-vault-and-provider-setup.test.mjs +268 -0
  441. package/test/cli/mcp-client.test.mjs +245 -0
  442. package/test/cli/runtime-ui.test.mjs +69 -2
  443. package/test/cli/status-actions.test.mjs +88 -0
  444. package/test/cli/wireframes-go-registry.test.mjs +54 -0
  445. package/test/cloudflare-connector.test.mjs +3 -6
  446. package/test/cloudflare-runtime.test.mjs +8 -1
  447. package/test/context.test.mjs +15 -0
  448. package/test/error-diagnostics.test.mjs +9 -0
  449. package/test/fixtures/cad/courtyard-house.json +208 -0
  450. package/test/go/cloudflare-probe.test.mjs +53 -0
  451. package/test/integration/app-command.test.mjs +55 -0
  452. package/test/integration/cad-discovery.test.mjs +158 -0
  453. package/test/integration/cad-docker-executor.test.mjs +249 -0
  454. package/test/integration/cad-execution.test.mjs +184 -0
  455. package/test/integration/cad-project-app.test.mjs +31 -0
  456. package/test/integration/cad-project-d1.test.mjs +25 -0
  457. package/test/integration/cad-project-native.test.mjs +24 -0
  458. package/test/integration/cad-project-workflow.test.mjs +9 -0
  459. package/test/integration/cad-project.test.mjs +82 -0
  460. package/test/integration/cli-help.test.mjs +4 -0
  461. package/test/integration/cms-site-tenancy-contract.test.mjs +256 -0
  462. package/test/integration/core-client.integration.test.mjs +55 -0
  463. package/test/integration/error-runtime-rpc.test.mjs +71 -0
  464. package/test/integration/features-resolve.test.mjs +128 -0
  465. package/test/integration/install-script.test.mjs +107 -0
  466. package/test/integration/inventory-core.test.mjs +53 -0
  467. package/test/integration/plugins-cloudflare.integration.test.mjs +28 -0
  468. package/test/integration/provider-env-cli.test.mjs +1 -1
  469. package/test/integration/runtime-migrations.test.mjs +6 -1
  470. package/test/integration/runtime-status.integration.test.mjs +211 -0
  471. package/test/integration/scaffold-cloudflare.test.mjs +46 -0
  472. package/test/integration/storage-architecture.test.mjs +154 -0
  473. package/test/integration/store-discovery.test.mjs +44 -0
  474. package/test/integration/terminal-exec.integration.test.mjs +86 -0
  475. package/test/integration/tool-runtime.test.mjs +124 -0
  476. package/test/integration/tool-schema.test.mjs +59 -0
  477. package/test/knowledge-service.test.mjs +4 -0
  478. package/test/local-sessions.test.mjs +11 -2
  479. package/test/local-studio-deploy.test.mjs +1 -1
  480. package/test/model-catalog.test.mjs +28 -1
  481. package/test/models.test.mjs +159 -5
  482. package/test/openai-responses.test.mjs +60 -0
  483. package/test/provider-credentials.test.mjs +15 -5
  484. package/test/responses-runner.test.mjs +321 -6
  485. package/test/shell.test.mjs +149 -4
  486. package/test/smoke.mjs +2 -2
  487. package/test/tools-search.test.mjs +33 -0
  488. package/test/unit/website-assets-bindings.test.mjs +60 -0
  489. package/test/whoami-resume.test.mjs +82 -3
  490. package/examples/gorilla-shell/README.md +0 -15
  491. package/src/lib/gorilla-template.js +0 -54
  492. package/templates/gorilla-shell/App.tsx +0 -639
  493. package/templates/gorilla-shell/README.md +0 -34
  494. package/templates/gorilla-shell/index.html +0 -15
  495. package/templates/gorilla-shell/main.jsx +0 -9
  496. package/templates/gorilla-shell/package.json +0 -19
  497. package/templates/gorilla-shell/vite.config.js +0 -21
@@ -2,10 +2,60 @@ import pc from 'picocolors';
2
2
 
3
3
  const CLEAR_LINE = '\x1b[2K';
4
4
  const SPINNER = ['◐', '◓', '◑', '◒'];
5
+ export const INTERRUPT_HINT = 'ctrl-c to cancel';
5
6
 
6
7
  function elapsed(ms) {
7
8
  if (ms < 1000) return `${Math.max(0, Math.round(ms))}ms`;
8
- return `${(ms / 1000).toFixed(ms < 10_000 ? 1 : 0)}s`;
9
+ if (ms < 60_000) return `${(ms / 1000).toFixed(ms < 10_000 ? 1 : 0)}s`;
10
+ const m = Math.floor(ms / 60_000);
11
+ const s = Math.floor((ms % 60_000) / 1000);
12
+ return `${m}m ${String(s).padStart(2, '0')}s`;
13
+ }
14
+
15
+ function count(value) {
16
+ const n = Number(value || 0);
17
+ if (!Number.isFinite(n) || n <= 0) return null;
18
+ if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(n >= 10_000_000 ? 0 : 1)}m`;
19
+ if (n >= 1_000) return `${(n / 1_000).toFixed(n >= 100_000 ? 0 : 1)}k`;
20
+ return String(Math.round(n));
21
+ }
22
+
23
+ export function colorAllowed(env = process.env) {
24
+ if (!env || Object.hasOwn(env, 'NO_COLOR')) return false;
25
+ if (String(env.FORCE_COLOR || '') === '0') return false;
26
+ return true;
27
+ }
28
+
29
+ export function colorDepth(env = process.env) {
30
+ if (!colorAllowed(env)) return 0;
31
+ const colorterm = String(env.COLORTERM || '').toLowerCase();
32
+ if (colorterm.includes('truecolor') || colorterm.includes('24bit')) return 24;
33
+ if (String(env.TERM || '').includes('direct')) return 24;
34
+ return 8;
35
+ }
36
+
37
+ export function renderShimmer(text, tick = 0, options = {}) {
38
+ const env = options.env || process.env;
39
+ const source = String(text ?? '');
40
+ if (!source) return '';
41
+ const depth = colorDepth(env);
42
+ if (depth === 0) return source;
43
+ const chars = [...source];
44
+ const highlight = Math.max(3, Math.min(6, chars.length));
45
+ const origin = ((Number(tick) || 0) % (chars.length + highlight)) - highlight;
46
+ const painted = chars.map((ch, index) => {
47
+ const dist = index - origin;
48
+ const t = dist < 0 || dist > highlight ? 0 : 1 - Math.abs((dist / highlight) - 0.5) * 2;
49
+ if (depth >= 24) {
50
+ const r = Math.round(34 + t * 180);
51
+ const g = Math.round(180 + t * 75);
52
+ const b = Math.round(220 + t * 35);
53
+ return `\x1b[38;2;${r};${g};${b}m${ch}\x1b[39m`;
54
+ }
55
+ const code = t > 0.6 ? 159 : t > 0.2 ? 87 : 37;
56
+ return `\x1b[38;5;${code}m${ch}\x1b[39m`;
57
+ }).join('');
58
+ return `${painted}\x1b[0m`;
9
59
  }
10
60
 
11
61
  export function createInlineActivity(options = {}) {
@@ -15,17 +65,33 @@ export function createInlineActivity(options = {}) {
15
65
  const setTimer = options.setInterval || globalThis.setInterval;
16
66
  const clearTimer = options.clearInterval || globalThis.clearInterval;
17
67
  const intervalMs = Math.max(80, Number(options.intervalMs) || 120);
68
+ const interruptible = options.interruptible !== false;
69
+ const env = options.env || process.env;
18
70
 
19
- let label = String(options.label || 'Thinking');
71
+ let label = String(options.label || 'Running');
20
72
  let startedAt = 0;
21
73
  let tick = 0;
22
74
  let timer = null;
23
75
  let active = false;
76
+ let tokenTotal = Number(options.tokenTotal) || 0;
77
+
78
+ function paint(kind, value) {
79
+ if (!colorAllowed(env)) return value;
80
+ if (kind === 'cyan') return pc.cyan(value);
81
+ if (kind === 'red') return pc.red(value);
82
+ if (kind === 'green') return pc.green(value);
83
+ return pc.dim(value);
84
+ }
24
85
 
25
86
  function frame() {
26
87
  if (!active || !interactive) return;
27
- const icon = pc.cyan(SPINNER[tick % SPINNER.length]);
28
- write(`\r${CLEAR_LINE} ${icon} ${label} ${pc.dim('· ' + elapsed(now() - startedAt))}`);
88
+ const icon = paint('cyan', SPINNER[tick % SPINNER.length]);
89
+ const parts = [elapsed(now() - startedAt)];
90
+ const tokens = count(tokenTotal);
91
+ if (tokens) parts.unshift(`${tokens} tokens`);
92
+ if (interruptible) parts.push(INTERRUPT_HINT);
93
+ const paintedLabel = renderShimmer(label, tick, { env });
94
+ write(`\r${CLEAR_LINE} ${icon} ${paintedLabel} ${paint('dim', '· ' + parts.join(' · '))}`);
29
95
  tick += 1;
30
96
  }
31
97
 
@@ -43,8 +109,9 @@ export function createInlineActivity(options = {}) {
43
109
  }
44
110
  }
45
111
 
46
- function update(nextLabel) {
112
+ function update(nextLabel, nextTokens) {
47
113
  if (nextLabel) label = String(nextLabel);
114
+ if (Number.isFinite(Number(nextTokens))) tokenTotal = Number(nextTokens);
48
115
  if (!active) start(label);
49
116
  else frame();
50
117
  }
@@ -55,8 +122,9 @@ export function createInlineActivity(options = {}) {
55
122
  timer = null;
56
123
  const duration = elapsed(now() - startedAt);
57
124
  if (interactive) write(`\r${CLEAR_LINE}`);
58
- const icon = status === 'error' ? pc.red('✗') : pc.green('✓');
59
- write(` ${icon} ${finalLabel} ${pc.dim('· ' + duration)}\n`);
125
+ const icon = status === 'error' ? paint('red', '✗') : paint('green', '✓');
126
+ const tokens = count(tokenTotal);
127
+ write(` ${icon} ${finalLabel} ${paint('dim', '· ' + [tokens ? `${tokens} tokens` : null, duration].filter(Boolean).join(' · '))}\n`);
60
128
  active = false;
61
129
  }
62
130
 
@@ -64,6 +132,7 @@ export function createInlineActivity(options = {}) {
64
132
  get active() { return active; },
65
133
  start,
66
134
  update,
135
+ setTokens(value) { update(null, value); },
67
136
  succeed(labelText) { finish('success', labelText || label); },
68
137
  fail(labelText) { finish('error', labelText || 'Failed'); },
69
138
  clear() {
@@ -21,19 +21,120 @@ function ctxLabel(usage) {
21
21
  return `ctx ${Math.min(999, Math.round((active / window) * 100))}%`;
22
22
  }
23
23
 
24
+ function money(value) {
25
+ const n = Number(value);
26
+ if (!Number.isFinite(n)) return null;
27
+ return `$${n.toFixed(n >= 1 ? 2 : 3)}`;
28
+ }
29
+
30
+ export const FOOTER_HINTS = '/ commands · @ files · ! shell · ctrl-c to cancel';
31
+
24
32
  export function renderCliFooter(value = {}) {
25
33
  const usage = value.usage || value.usageSnapshot || {};
26
34
  const cumulative = usage.cumulative || {};
27
35
  const model = String(value.model || value.modelLabel || 'model');
36
+ const provider = String(value.provider || '').trim();
37
+ const effort = String(value.effort || value.reasoning || '').trim();
28
38
  const tier = String(value.tier || '').trim();
39
+ const projectName = String(value.projectName || value.identity || (value.cwd ? value.project : '') || '').trim();
40
+ const branch = String(value.branch || value.gitBranch || '').trim();
41
+ const cwd = String(value.cwd || (!value.projectName && !value.identity ? value.project : '') || '').trim();
42
+ const action = String(value.action || value.statusLabel || '').trim();
43
+ const filesEdited = Number(value.filesEdited || value.files_edited || 0);
29
44
  const elapsedMs = Number(value.elapsedMs);
30
- const parts = [
31
- model,
32
- ctxLabel(usage),
33
- `↑${count(cumulative.input_tokens)} ↓${count(cumulative.output_tokens)}`,
34
- ];
35
- if (Number(cumulative.cached_input_tokens) > 0) parts.push(`cache ${count(cumulative.cached_input_tokens)}`);
36
- if (tier && tier !== 'default') parts.push(tier);
37
- if (Number.isFinite(elapsedMs) && elapsedMs >= 0) parts.push(elapsedMs < 60_000 ? `${(elapsedMs / 1000).toFixed(1)}s` : `${Math.floor(elapsedMs / 60_000)}m${Math.floor((elapsedMs % 60_000) / 1000)}s`);
38
- return pc.dim(' ' + parts.join(' · '));
45
+ const cost = money(value.cost ?? cumulative.cost_usd ?? usage.cost_usd);
46
+
47
+ const primary = [];
48
+ if (projectName) primary.push(projectName);
49
+ if (branch) primary.push(branch);
50
+ if (cwd) primary.push(cwd.replace(String(process.env.HOME || ''), '~'));
51
+ if (action) primary.push(action);
52
+ primary.push([provider, model, effort].filter(Boolean).join(' ') || model);
53
+ primary.push(ctxLabel(usage));
54
+ primary.push(`↑${count(cumulative.input_tokens)} ↓${count(cumulative.output_tokens)}`);
55
+ if (Number(cumulative.cached_input_tokens) > 0) primary.push(`cache ${count(cumulative.cached_input_tokens)}`);
56
+ if (filesEdited > 0) primary.push(`${filesEdited} files edited`);
57
+ if (cost) primary.push(cost);
58
+ if (tier && tier !== 'default') primary.push(tier);
59
+ if (Number.isFinite(elapsedMs) && elapsedMs >= 0) {
60
+ primary.push(elapsedMs < 60_000 ? `${(elapsedMs / 1000).toFixed(1)}s` : `${Math.floor(elapsedMs / 60_000)}m${Math.floor((elapsedMs % 60_000) / 1000)}s`);
61
+ }
62
+
63
+ const hints = String(value.hints || FOOTER_HINTS);
64
+ return [
65
+ pc.dim(' ' + primary.join(' · ')),
66
+ pc.dim(' ' + hints),
67
+ ].join('\n');
68
+ }
69
+
70
+ export function renderDiffPreview(diffText, options = {}) {
71
+ const source = String(diffText || '');
72
+ const color = options.color ?? !Object.hasOwn(process.env, 'NO_COLOR');
73
+ const paint = (text, style) => {
74
+ if (!color) return text;
75
+ const code = style === 'add' ? '32' : style === 'del' ? '31' : style === 'hunk' ? '36' : style === 'meta' ? '1' : '2';
76
+ return `\x1b[${code}m${text}\x1b[0m`;
77
+ };
78
+ if (!source.trim()) return ` ${paint('no changes', 'dim')}\n`;
79
+ const maxLines = Math.max(20, Number(options.maxLines) || 200);
80
+ const lines = source.replace(/\r\n/g, '\n').replace(/\r/g, '\n').split('\n');
81
+ const truncated = lines.length > maxLines;
82
+ const shown = truncated ? lines.slice(0, maxLines) : lines;
83
+ const out = shown.map((line) => {
84
+ if (line.startsWith('diff ') || line.startsWith('index ') || line.startsWith('+++') || line.startsWith('---')) {
85
+ return ` ${paint(line, 'meta')}`;
86
+ }
87
+ if (line.startsWith('@@')) return ` ${paint(line, 'hunk')}`;
88
+ if (line.startsWith('+')) return ` ${paint(line, 'add')}`;
89
+ if (line.startsWith('-')) return ` ${paint(line, 'del')}`;
90
+ return ` ${line}`;
91
+ });
92
+ if (truncated) out.push(` ${paint(`… ${lines.length - maxLines} more lines`, 'dim')}`);
93
+ return `${out.join('\n')}\n`;
94
+ }
95
+
96
+ export function renderUsagePanel(value = {}) {
97
+ const session = value.session || {};
98
+ const usage = value.usage || value.usageSnapshot || session.usage_snapshot || {};
99
+ const cumulative = usage.cumulative || session.cumulative_usage || {};
100
+ const current = usage.current_context || {};
101
+ const lines = [];
102
+ const push = (label, text) => lines.push(` ${pc.dim(label.padEnd(12))} ${text}`);
103
+
104
+ lines.push('');
105
+ lines.push(` ${pc.bold('AgentSam · Usage')}`);
106
+ lines.push('');
107
+ push('session', session.id || session.session_id || 'unknown');
108
+ push('provider', value.provider || session.provider || (String(session.model_key || '').split(':')[0]) || 'unknown');
109
+ push('model', value.model || session.model || session.model_key || 'unknown');
110
+ push('reasoning', value.effort || session.reasoning_effort || 'unknown/unavailable');
111
+ push('tier', value.tier || session.service_tier || 'unknown/unavailable');
112
+ lines.push('');
113
+ const window = Number(current.window_tokens || 0);
114
+ const active = Number(current.input_tokens || 0);
115
+ push(
116
+ 'context',
117
+ window > 0
118
+ ? `${count(active)} / ${count(window)} · ${Math.round((active / window) * 1000) / 10}%`
119
+ : active > 0
120
+ ? `${count(active)} / unknown`
121
+ : 'unknown/unavailable',
122
+ );
123
+ push('input', count(cumulative.input_tokens));
124
+ push('output', count(cumulative.output_tokens));
125
+ push('cached', Number(cumulative.cached_input_tokens) > 0 ? count(cumulative.cached_input_tokens) : 'unknown/unavailable');
126
+ lines.push('');
127
+ push('cost', money(value.cost ?? cumulative.cost_usd ?? session.total_cost_usd) || 'unknown/unavailable');
128
+ push('elapsed', value.elapsedLabel || (Number.isFinite(Number(value.elapsedMs)) ? `${Math.round(Number(value.elapsedMs) / 1000)}s` : 'unknown/unavailable'));
129
+ push('tool calls', value.toolCalls != null ? String(value.toolCalls) : 'unknown/unavailable');
130
+ push('shell', value.shellCommands != null ? String(value.shellCommands) : 'unknown/unavailable');
131
+ push('files', value.filesEdited != null ? `${value.filesEdited} edited` : 'unknown/unavailable');
132
+ push('compactions', value.compactions != null ? String(value.compactions) : 'unknown/unavailable');
133
+ lines.push('');
134
+ push('accounting', usage.estimate_kind || value.estimateKind || 'unknown/unavailable');
135
+ if (session.id || session.session_id) {
136
+ push('resume', `agentsam resume ${session.id || session.session_id}`);
137
+ }
138
+ lines.push('');
139
+ return lines.join('\n');
39
140
  }
@@ -34,12 +34,15 @@ const HELP_TOPICS = Object.freeze([
34
34
  label: 'Runtime / terminal',
35
35
  summary: 'Local, remote, sandbox, and deployment controls.',
36
36
  rows: [
37
- ['agentsam status', 'Project, Git, DB, API, and PTY status'],
37
+ ['agentsam status', 'Honest awareness (account, models, terminal, live deploy) · -i menu'],
38
38
  ['agentsam start-local', 'Start the local PTY service'],
39
39
  ['agentsam connections', 'Inspect available execution connections'],
40
- ['agentsam tunnel', 'Expose local PTY only when remote access is wanted'],
40
+ ['agentsam tunnel', 'List, inspect, and run real Cloudflare Tunnels through Wrangler'],
41
+ ['agentsam mcp <add|status|doctor|list|remove>', 'Manage MCP connections, server catalogs, and client adapters'],
42
+ ['agentsam eval <context|live>', 'Deterministic context scoring or live agent evaluation telemetry'],
41
43
  ['agentsam deploy', 'Graduate intentionally to cloud infrastructure'],
42
44
  ['agentsam cloudflare', 'Wrangler and Cloudflare runtime diagnostics'],
45
+ ['agentsam go', 'Go runtime discovery, build, Cloudflare container deploy, D1 registry'],
43
46
  ],
44
47
  },
45
48
  {
@@ -53,7 +56,9 @@ const HELP_TOPICS = Object.freeze([
53
56
  ['/context', 'Show live context economics'],
54
57
  ['/usage', 'Show token/cost/session receipt'],
55
58
  ['/settings', 'Change runtime, terminal, and model policy'],
56
- ['/status', 'Show project/runtime health'],
59
+ ['/status', 'Honest project awareness + next-step tips'],
60
+ ['/connections', 'Inspect live account, terminal, Worker, and Cloudflare connection evidence'],
61
+ ['/tunnel', 'Choose an existing Cloudflare Tunnel and inspect or run it through Wrangler'],
57
62
  ['/help [topic]', 'Show in-session help'],
58
63
  ['/exit', 'Return to the host shell'],
59
64
  ],
@@ -68,6 +73,7 @@ const HELP_TOPICS = Object.freeze([
68
73
  ['agentsam capabilities [id]', 'Inspect capability contracts'],
69
74
  ['agentsam skills [id]', 'Inspect packaged skills'],
70
75
  ['agentsam identity init', 'Add reusable identity surfaces'],
76
+ ['agentsam scaffold <cms|worker-api>', 'Generate a Cloudflare starter project'],
71
77
  ['agentsam dockerize', 'Build supported container targets'],
72
78
  ],
73
79
  },
@@ -77,6 +83,7 @@ const TOPIC_ALIASES = new Map([
77
83
  ['models', 'start'], ['model', 'start'], ['provider', 'start'], ['providers', 'start'], ['resume', 'start'],
78
84
  ['repo', 'work'], ['repository', 'work'], ['inspect', 'work'], ['index', 'work'], ['security', 'work'],
79
85
  ['terminal', 'runtime'], ['connections', 'runtime'], ['remote', 'runtime'], ['sandbox', 'runtime'], ['deploy', 'runtime'],
86
+ ['mcp', 'runtime'], ['eval', 'runtime'],
80
87
  ['slash', 'inside'], ['commands', 'inside'], ['session', 'inside'], ['usage', 'inside'], ['context', 'inside'],
81
88
  ['create', 'create'], ['scaffold', 'create'], ['capabilities', 'create'], ['skills', 'create'],
82
89
  ]);
@@ -153,7 +160,7 @@ export async function runHelp(argv = [], options = {}) {
153
160
  const write = options.write || ((value) => process.stdout.write(value));
154
161
  const args = argv.filter((arg) => arg !== '--interactive');
155
162
 
156
- if (args.includes('--all')) {
163
+ if (args.includes('--all') || args.some((arg) => clean(arg) === 'all')) {
157
164
  write(renderAllHelp(version));
158
165
  return;
159
166
  }
@@ -0,0 +1,166 @@
1
+ import pc from 'picocolors';
2
+
3
+ const ANSI_RE = /\x1b\[[0-9;]*m/g;
4
+
5
+ export function visibleLength(value) {
6
+ return String(value ?? '').replace(ANSI_RE, '').length;
7
+ }
8
+
9
+ export function padVisible(value, width, align = 'left') {
10
+ const text = String(value ?? '');
11
+ const len = visibleLength(text);
12
+ const pad = Math.max(0, width - len);
13
+ if (align === 'right') return `${' '.repeat(pad)}${text}`;
14
+ if (align === 'center') {
15
+ const left = Math.floor(pad / 2);
16
+ return `${' '.repeat(left)}${text}${' '.repeat(pad - left)}`;
17
+ }
18
+ return `${text}${' '.repeat(pad)}`;
19
+ }
20
+
21
+ export function drawBox(rows, { width = 64, title = '', color = pc.cyan } = {}) {
22
+ const inner = Math.max(24, width - 2);
23
+ const titleText = title ? ` ${title} ` : '';
24
+ const titlePad = Math.max(0, inner - visibleLength(titleText));
25
+ const lines = [
26
+ `${color('┌')}${color(titleText)}${color('─'.repeat(titlePad))}${color('┐')}`,
27
+ ];
28
+ for (const row of rows) {
29
+ if (row === '─') {
30
+ lines.push(`${color('├')}${color('─'.repeat(inner))}${color('┤')}`);
31
+ continue;
32
+ }
33
+ lines.push(`${color('│')}${padVisible(row, inner)}${color('│')}`);
34
+ }
35
+ lines.push(`${color('└')}${color('─'.repeat(inner))}${color('┘')}`);
36
+ return lines.join('\n');
37
+ }
38
+
39
+ /**
40
+ * Architecture explorer — reasoning wireframe, not pixels.
41
+ * Left: tree. Right: package ownership + dependency map.
42
+ */
43
+ export function renderArchitectureExplorer(input = {}) {
44
+ const repo = input.repo || 'repository';
45
+ const git = input.git || { branch: 'main', dirty: false };
46
+ const tree = input.tree || ['apps/', 'packages/', 'protocol/', 'src/', 'tooling/'];
47
+ const focus = input.focus || {
48
+ package: 'protocol',
49
+ owns: 'wire contracts',
50
+ runtime: 'none / generated',
51
+ imported_by: 'client, server, runtime',
52
+ files: '.proto .ts .rs generated/...',
53
+ };
54
+ const deps = input.deps || ['protocol ── client ── app', ' ▲', ' └──── server'];
55
+ const tabs = input.tabs || ['contracts', 'runtime', 'persistence', 'commands', 'ownership'];
56
+ const leftW = 18;
57
+ const rightW = 40;
58
+ const width = leftW + rightW + 3;
59
+
60
+ const header = ` ${repo} ${git.branch || 'main'} ${git.dirty ? 'dirty' : 'clean'} `;
61
+ const rows = ['─'];
62
+ const maxRows = Math.max(tree.length, 6 + deps.length);
63
+ for (let i = 0; i < maxRows; i += 1) {
64
+ const left = padVisible(tree[i] ? ` ${tree[i]}` : '', leftW);
65
+ let right = '';
66
+ if (i === 0) right = ` package: ${focus.package}`;
67
+ else if (i === 1) right = ` ${'─'.repeat(Math.min(37, rightW - 2))}`;
68
+ else if (i === 2) right = ` owns: ${focus.owns}`;
69
+ else if (i === 3) right = ` runtime: ${focus.runtime}`;
70
+ else if (i === 4) right = ` imported by: ${focus.imported_by}`;
71
+ else if (i === 5) right = ' DEPENDENCY MAP';
72
+ else if (i >= 6 && deps[i - 6]) right = ` ${deps[i - 6]}`;
73
+ rows.push(`${left}${pc.dim('│')}${padVisible(right, rightW)}`);
74
+ }
75
+ rows.push('─');
76
+ rows.push(` Files: ${focus.files || ''}`);
77
+ rows.push('─');
78
+ rows.push(` ${tabs.map((t) => `[${t}]`).join(' ')}`);
79
+
80
+ return drawBox(rows, { width, title: header.trim(), color: pc.cyan });
81
+ }
82
+
83
+ /**
84
+ * Operation inspector — intent → validate → execute → persist → notify.
85
+ */
86
+ export function renderOperationInspector(input = {}) {
87
+ const op = input.operation || 'operation';
88
+ const opId = input.op_id || 'op_…';
89
+ const stages = input.stages || ['intent', 'validate', 'execute', 'persist', 'notify'];
90
+ const actors = input.actors || ['user/agent', 'policy', 'adapter', 'artifact', 'event bus'];
91
+ const active = Math.max(0, Math.min(stages.length - 1, Number(input.active_index) || 0));
92
+ const step = input.step || null;
93
+ const receipt = input.receipt || {};
94
+
95
+ const dots = stages.map((_, i) => (i <= active ? pc.green('●') : pc.dim('○'))).join(pc.dim('────────'));
96
+ const labels = stages.map((s) => padVisible(s, 10)).join(' ');
97
+ const actorLine = actors.map((a, i) => (i === active ? pc.bold(a) : pc.dim(a))).join(pc.dim(' │ '));
98
+
99
+ const rows = [
100
+ ` Operation: ${pc.bold(op)} ${pc.dim(opId)}`,
101
+ '─',
102
+ ` ${labels}`,
103
+ ` ${dots}`,
104
+ ` ${actorLine}`,
105
+ ];
106
+ if (step) {
107
+ rows.push('─');
108
+ rows.push(` STEP · ${step.name || 'step'}`);
109
+ if (step.detail) rows.push(` ${pc.dim(step.detail)}`);
110
+ if (step.artifact) rows.push(` → ${step.artifact}`);
111
+ }
112
+ rows.push('─');
113
+ rows.push(' Receipt:');
114
+ for (const [key, value] of Object.entries(receipt)) {
115
+ rows.push(` ${pc.dim(key + ':')} ${value}`);
116
+ }
117
+ return drawBox(rows, { width: 70, title: 'operation inspector', color: pc.magenta });
118
+ }
119
+
120
+ export function renderGoShipScenery({ product, discovery, deploy, build } = {}) {
121
+ const arch = renderArchitectureExplorer({
122
+ repo: 'agentsam-sdk',
123
+ git: discovery?.git || {},
124
+ tree: ['apps/', 'packages/', 'protocol/', 'src/go/', 'src/commands/', 'runtime/'],
125
+ focus: {
126
+ package: product || 'agentsam-go-worker',
127
+ owns: 'Go runtime + CF container edge',
128
+ runtime: 'go/native + worker',
129
+ imported_by: 'agentsam go, deploy adapter',
130
+ files: 'main.go wrangler.jsonc Dockerfile contracts/',
131
+ },
132
+ deps: [
133
+ 'protocol/go ── src/go ── commands/go',
134
+ ' ▲',
135
+ ' └──── apps/agentsam-go-worker',
136
+ ],
137
+ tabs: ['contracts', 'runtime', 'persistence', 'commands', 'ownership'],
138
+ });
139
+
140
+ const stages = ['intent', 'validate', 'execute', 'persist', 'notify'];
141
+ let active = 1;
142
+ if (build?.receipt) active = 2;
143
+ if (deploy?.deployed || deploy?.skipped_deploy || deploy?.receipt) active = 3;
144
+ if (deploy?.probes?.ok || deploy?.productPath) active = 4;
145
+
146
+ const op = renderOperationInspector({
147
+ operation: 'go.cloudflare.ship',
148
+ op_id: product || 'agentsam-go-worker',
149
+ stages,
150
+ actors: ['CLI', 'go test', 'container', 'D1/R2 receipts', 'status'],
151
+ active_index: active,
152
+ step: {
153
+ name: 'native Go capability',
154
+ detail: 'hash + inspect over Worker → Container',
155
+ artifact: deploy?.url || 'local binary',
156
+ },
157
+ receipt: {
158
+ 'source commit': build?.receipt?.source?.commit || discovery?.git?.commit || '—',
159
+ 'build tests': build?.receipt?.tests?.go_test ? 'pass' : '—',
160
+ 'live url': deploy?.url || '—',
161
+ health: deploy?.receipt?.health || (deploy?.probes?.ok ? 'healthy' : 'pending'),
162
+ },
163
+ });
164
+
165
+ return `${arch}\n\n${op}`;
166
+ }
@@ -12,6 +12,7 @@ import {
12
12
  resolveBrowserSessionCredential,
13
13
  saveAccountSession,
14
14
  } from '../src/lib/account-session.js';
15
+ import { resolveAccountAuthority } from '../src/lib/auth.js';
15
16
 
16
17
  function tempHome(t) {
17
18
  const home = fs.mkdtempSync(path.join(os.tmpdir(), 'agentsam-account-'));
@@ -64,6 +65,33 @@ test('explicit/environment aak_ API key outranks browser login while legacy SDK
64
65
  );
65
66
  });
66
67
 
68
+ test('invalid environment API key cannot shadow a valid browser login', t => {
69
+ const home = tempHome(t);
70
+ saveAccountSession({ access_token: 'browser_session_machine_test' }, { home });
71
+ const resolved = resolveAccountAuth({ env: { AGENTSAM_API_KEY: 'not-an-aak' }, home });
72
+ assert.equal(resolved.value, 'browser_session_machine_test');
73
+ assert.equal(resolved.kind, 'browser_oauth');
74
+ assert.equal(resolved.fallback_error, 'invalid_api_key_prefix');
75
+ });
76
+
77
+ test('async IAM authority also falls back from invalid environment key to browser OAuth', async t => {
78
+ const home = tempHome(t);
79
+ saveAccountSession({ access_token: 'browser_session_machine_test' }, { home });
80
+ const resolved = await resolveAccountAuthority({ env: { AGENTSAM_API_KEY: 'not-an-aak' }, home });
81
+ assert.equal(resolved.value, 'browser_session_machine_test');
82
+ assert.equal(resolved.kind, 'browser_oauth');
83
+ assert.equal(resolved.fallback_error, 'invalid_api_key_prefix');
84
+ });
85
+
86
+ test('invalid explicitly supplied API key remains authoritative and fails visibly', t => {
87
+ const home = tempHome(t);
88
+ saveAccountSession({ access_token: 'browser_session_machine_test' }, { home });
89
+ const resolved = resolveAccountAuth({ env: {}, explicit: 'not-an-aak', home });
90
+ assert.equal(resolved.value, '');
91
+ assert.equal(resolved.error, 'invalid_api_key_prefix');
92
+ assert.equal(resolved.source, 'explicit');
93
+ });
94
+
67
95
  test('browser session storage refuses reusable aak_ credentials', t => {
68
96
  const home = tempHome(t);
69
97
  assert.throws(
@@ -81,8 +81,23 @@ test('CAD creator app package is curated for third-party installation', () => {
81
81
  assert.equal(manifest.runtime.cloudflare, 'scaffold');
82
82
  });
83
83
 
84
+ test('client-cms-editor app manifest points to authoritative package name', () => {
85
+ const pkg = packageJson('apps', 'client-cms-editor');
86
+ const manifest = JSON.parse(read('apps', 'client-cms-editor', 'agentsam.app.json'));
87
+
88
+ assert.equal(pkg.name, '@inneranimalmedia/client-cms-editor');
89
+ assert.equal(manifest.schema, 'agentsam.app.v1');
90
+ assert.equal(manifest.id, 'client-cms-editor');
91
+ assert.equal(manifest.package, pkg.name);
92
+ assert.equal(manifest.runtime.local_preview, 'ready');
93
+ assert.equal(manifest.runtime.source_scaffold, 'ready');
94
+ assert.equal(manifest.runtime.cloudflare, 'ready');
95
+ });
96
+
84
97
  test('CAD creator keeps the robotics runtime lazy and the perception key server-side', () => {
85
- const app = read('apps', 'cad-creator', 'frontend', 'src', 'App.tsx');
98
+ const app = exists('apps', 'cad-creator', 'frontend', 'src', 'app', 'CadCreatorApp.tsx')
99
+ ? read('apps', 'cad-creator', 'frontend', 'src', 'app', 'CadCreatorApp.tsx')
100
+ : read('apps', 'cad-creator', 'frontend', 'src', 'App.tsx');
86
101
  const lazy = read('apps', 'cad-creator', 'frontend', 'src', 'workspaces', 'robotics', 'lazy.tsx');
87
102
  const httpProvider = read('apps', 'cad-creator', 'frontend', 'src', 'lib', 'robotics', 'perception', 'http-provider.ts');
88
103
  const perception = read('apps', 'cad-creator', 'backend', 'src', 'robotics', 'perception.ts');
@@ -109,7 +109,7 @@ test('product UX creates a preset project, adds a feature, and inspects before f
109
109
  assert.equal(config.schema_version, 2);
110
110
  assert.equal(config.project.name, 'demo');
111
111
  assert.equal(config.product.preset, 'cms');
112
- assert.deepEqual(config.product.features, ['cms', 'knowledge']);
112
+ assert.deepEqual(config.product.features, ['cms', 'knowledge', 'brand', 'theme']);
113
113
  assert.ok(config.product.capabilities.includes('repository.snapshot'));
114
114
  assert.match(config.repository.id, /^local:[0-9a-f-]{36}$/);
115
115
  assert.equal(config.defaults.runtime, 'local');