@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
@@ -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
  }
@@ -12,7 +12,8 @@ const HELP_TOPICS = Object.freeze([
12
12
  ['agentsam resume [session]', 'Resume a saved Agent Sam session'],
13
13
  ['agentsam whoami', 'Show authenticated account and credential status'],
14
14
  ['agentsam models', 'Probe account-visible hosted/local models'],
15
- ['agentsam env init <provider>', 'Create a secure local provider profile'],
15
+ ['agentsam providers', 'Configure and verify machine provider credentials'],
16
+ ['agentsam env init <provider>', 'Low-level provider profile compatibility command'],
16
17
  ],
17
18
  },
18
19
  {
@@ -33,12 +34,15 @@ const HELP_TOPICS = Object.freeze([
33
34
  label: 'Runtime / terminal',
34
35
  summary: 'Local, remote, sandbox, and deployment controls.',
35
36
  rows: [
36
- ['agentsam status', 'Project, Git, DB, API, and PTY status'],
37
+ ['agentsam status', 'Honest awareness (account, models, terminal, live deploy) · -i menu'],
37
38
  ['agentsam start-local', 'Start the local PTY service'],
38
39
  ['agentsam connections', 'Inspect available execution connections'],
39
- ['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'],
40
43
  ['agentsam deploy', 'Graduate intentionally to cloud infrastructure'],
41
44
  ['agentsam cloudflare', 'Wrangler and Cloudflare runtime diagnostics'],
45
+ ['agentsam go', 'Go runtime discovery, build, Cloudflare container deploy, D1 registry'],
42
46
  ],
43
47
  },
44
48
  {
@@ -48,10 +52,13 @@ const HELP_TOPICS = Object.freeze([
48
52
  rows: [
49
53
  ['/', 'Open the keyboard command picker'],
50
54
  ['/model', 'Choose model, reasoning, and processing tier'],
55
+ ['/providers', 'Configure and verify machine provider credentials'],
51
56
  ['/context', 'Show live context economics'],
52
57
  ['/usage', 'Show token/cost/session receipt'],
53
58
  ['/settings', 'Change runtime, terminal, and model policy'],
54
- ['/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'],
55
62
  ['/help [topic]', 'Show in-session help'],
56
63
  ['/exit', 'Return to the host shell'],
57
64
  ],
@@ -66,6 +73,7 @@ const HELP_TOPICS = Object.freeze([
66
73
  ['agentsam capabilities [id]', 'Inspect capability contracts'],
67
74
  ['agentsam skills [id]', 'Inspect packaged skills'],
68
75
  ['agentsam identity init', 'Add reusable identity surfaces'],
76
+ ['agentsam scaffold <cms|worker-api>', 'Generate a Cloudflare starter project'],
69
77
  ['agentsam dockerize', 'Build supported container targets'],
70
78
  ],
71
79
  },
@@ -75,6 +83,7 @@ const TOPIC_ALIASES = new Map([
75
83
  ['models', 'start'], ['model', 'start'], ['provider', 'start'], ['providers', 'start'], ['resume', 'start'],
76
84
  ['repo', 'work'], ['repository', 'work'], ['inspect', 'work'], ['index', 'work'], ['security', 'work'],
77
85
  ['terminal', 'runtime'], ['connections', 'runtime'], ['remote', 'runtime'], ['sandbox', 'runtime'], ['deploy', 'runtime'],
86
+ ['mcp', 'runtime'], ['eval', 'runtime'],
78
87
  ['slash', 'inside'], ['commands', 'inside'], ['session', 'inside'], ['usage', 'inside'], ['context', 'inside'],
79
88
  ['create', 'create'], ['scaffold', 'create'], ['capabilities', 'create'], ['skills', 'create'],
80
89
  ]);
@@ -151,7 +160,7 @@ export async function runHelp(argv = [], options = {}) {
151
160
  const write = options.write || ((value) => process.stdout.write(value));
152
161
  const args = argv.filter((arg) => arg !== '--interactive');
153
162
 
154
- if (args.includes('--all')) {
163
+ if (args.includes('--all') || args.some((arg) => clean(arg) === 'all')) {
155
164
  write(renderAllHelp(version));
156
165
  return;
157
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
+ }
@@ -3,7 +3,16 @@ import fs from 'node:fs';
3
3
  import os from 'node:os';
4
4
  import path from 'node:path';
5
5
  import test from 'node:test';
6
- import { accountSessionPath, clearAccountSession, readAccountSession, resolveAccountSdkKey, saveAccountSession } from '../src/lib/account-session.js';
6
+ import {
7
+ accountSessionPath,
8
+ clearAccountSession,
9
+ readAccountSession,
10
+ resolveAccountApiKey,
11
+ resolveAccountAuth,
12
+ resolveBrowserSessionCredential,
13
+ saveAccountSession,
14
+ } from '../src/lib/account-session.js';
15
+ import { resolveAccountAuthority } from '../src/lib/auth.js';
7
16
 
8
17
  function tempHome(t) {
9
18
  const home = fs.mkdtempSync(path.join(os.tmpdir(), 'agentsam-account-'));
@@ -11,26 +20,82 @@ function tempHome(t) {
11
20
  return home;
12
21
  }
13
22
 
14
- test('browser-auth SDK bearer persists in machine-local storage, not project state', t => {
23
+ test('opaque browser login persists in machine-local storage and resolves independently from API keys', t => {
15
24
  const home = tempHome(t);
16
- const saved = saveAccountSession({ access_token: 'sdk_machine_session', user_id: 'au_test', account_id: 'acct_test', email: 'dev@example.test' }, { home });
25
+ const saved = saveAccountSession({
26
+ access_token: 'browser_session_machine_test',
27
+ user_id: 'au_test',
28
+ account_id: 'acct_test',
29
+ email: 'dev@example.test',
30
+ }, { home });
17
31
  assert.equal(saved.user_id, 'au_test');
32
+
18
33
  const filename = accountSessionPath({ home });
19
34
  assert.equal(fs.existsSync(filename), true);
20
35
  if (process.platform !== 'win32') assert.equal(fs.statSync(filename).mode & 0o077, 0);
21
36
 
22
37
  const loaded = readAccountSession({ home });
23
- assert.equal(loaded.sdk_key, 'sdk_machine_session');
24
- const resolved = resolveAccountSdkKey({ env: {}, home });
25
- assert.equal(resolved.source, 'agentsam_account_session');
26
- assert.equal(resolved.value, 'sdk_machine_session');
38
+ assert.equal(loaded.access_token, 'browser_session_machine_test');
39
+ const browser = resolveBrowserSessionCredential({ env: {}, home });
40
+ assert.equal(browser.source, 'agentsam_browser_oauth');
41
+ assert.equal(browser.kind, 'browser_oauth');
42
+ assert.equal(browser.value, 'browser_session_machine_test');
43
+ assert.equal(resolveAccountApiKey({ env: {}, home }).value, '');
44
+ assert.equal(resolveAccountAuth({ env: {}, home }).value, 'browser_session_machine_test');
45
+
27
46
  assert.equal(clearAccountSession({ home }), true);
28
47
  assert.equal(readAccountSession({ home }), null);
29
48
  });
30
49
 
31
- test('explicit/environment SDK bearer remains higher authority than local session fallback', t => {
50
+ test('explicit/environment aak_ API key outranks browser login while legacy SDK env names are ignored', t => {
51
+ const home = tempHome(t);
52
+ saveAccountSession({ access_token: 'browser_session_disk' }, { home });
53
+
54
+ assert.equal(
55
+ resolveAccountAuth({ env: { AGENTSAM_API_KEY: 'aak_env_test' }, home }).value,
56
+ 'aak_env_test',
57
+ );
58
+ assert.equal(
59
+ resolveAccountAuth({ env: { AGENTSAM_API_KEY: 'aak_env_test' }, explicit: 'aak_explicit_test', home }).value,
60
+ 'aak_explicit_test',
61
+ );
62
+ assert.equal(
63
+ resolveAccountAuth({ env: { AGENTSAM_SDK_KEY: 'legacy_ignored' }, home }).value,
64
+ 'browser_session_disk',
65
+ );
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
+
95
+ test('browser session storage refuses reusable aak_ credentials', t => {
32
96
  const home = tempHome(t);
33
- saveAccountSession({ access_token: 'sdk_disk' }, { home });
34
- assert.equal(resolveAccountSdkKey({ env: { AGENTSAM_SDK_KEY: 'sdk_env' }, home }).value, 'sdk_env');
35
- assert.equal(resolveAccountSdkKey({ env: { AGENTSAM_SDK_KEY: 'sdk_env' }, explicit: 'sdk_explicit', home }).value, 'sdk_explicit');
97
+ assert.throws(
98
+ () => saveAccountSession({ access_token: 'aak_should_not_be_browser_session' }, { home }),
99
+ /account_browser_oauth_session_required/,
100
+ );
36
101
  });