@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
@@ -1,13 +1,88 @@
1
- import { collectLocalStatus } from '../lib/local-status.js';
2
- import { renderLocalStatus } from '../ui/ansi.js';
1
+ import { collectRuntimeStatus } from './runtime-status.js';
2
+ import { renderRuntimeStatus } from '../ui/ansi.js';
3
+ import { buildStatusActionPlan } from '../status/actions.js';
4
+ import { openExternalUrl } from '../lib/open-url.js';
5
+ import readline from 'node:readline/promises';
6
+ import { stdin as input, stdout as output } from 'node:process';
7
+
8
+ function parseStatusArgs(argv = []) {
9
+ const opts = {
10
+ json: false,
11
+ offline: false,
12
+ discoverModels: true,
13
+ interactive: false,
14
+ };
15
+ for (const arg of argv) {
16
+ if (arg === '--json') opts.json = true;
17
+ else if (arg === '--offline') opts.offline = true;
18
+ else if (arg === '--no-discover') opts.discoverModels = false;
19
+ else if (arg === '--interactive' || arg === '-i') opts.interactive = true;
20
+ else throw new Error(`unknown status option: ${arg}`);
21
+ }
22
+ return opts;
23
+ }
24
+
25
+ async function runInteractiveMenu(status, write) {
26
+ const plan = buildStatusActionPlan(status);
27
+ write(`\n ${plan.headline}\n`);
28
+ if (plan.tips.length) {
29
+ for (const tip of plan.tips) write(` • ${tip}\n`);
30
+ write('\n');
31
+ }
32
+ plan.actions.forEach((action, index) => {
33
+ write(` ${String(index + 1).padStart(2)}. ${action.label}\n`);
34
+ write(` ${action.why}\n`);
35
+ });
36
+ write(` 0. Done\n\n`);
37
+
38
+ if (!input.isTTY || !output.isTTY) {
39
+ write(' (non-TTY — pick a command from the list above)\n\n');
40
+ return;
41
+ }
42
+
43
+ const rl = readline.createInterface({ input, output });
44
+ try {
45
+ while (true) {
46
+ const answer = (await rl.question(' Select [0-n]: ')).trim();
47
+ if (!answer || answer === '0' || /^q(uit)?$/i.test(answer)) break;
48
+ const index = Number(answer) - 1;
49
+ const action = plan.actions[index];
50
+ if (!action) {
51
+ write(' Invalid choice.\n');
52
+ continue;
53
+ }
54
+ if (action.id === 'open_health' && /^https?:\/\//i.test(action.command)) {
55
+ write(` Opening ${action.command}\n`);
56
+ openExternalUrl(action.command);
57
+ continue;
58
+ }
59
+ write(`\n → ${action.command}\n`);
60
+ write(` ${action.why}\n\n`);
61
+ write(' Copy/run that in this project root (awareness stays in-repo).\n');
62
+ write(' Or press Enter for another action, 0 to exit.\n\n');
63
+ }
64
+ } finally {
65
+ rl.close();
66
+ }
67
+ }
3
68
 
4
69
  export async function runStatus(argv = [], opts = {}) {
5
- const json = argv.includes('--json');
6
- const status = await collectLocalStatus(opts.cwd || process.cwd());
7
- if (json) {
8
- process.stdout.write(`${JSON.stringify(status, null, 2)}\n`);
70
+ const parsed = parseStatusArgs(argv);
71
+ const status = await (opts.collectRuntime || collectRuntimeStatus)({
72
+ ...opts,
73
+ cwd: opts.cwd || process.cwd(),
74
+ offline: parsed.offline,
75
+ discoverModels: parsed.discoverModels,
76
+ });
77
+ const write = opts.write || ((value) => process.stdout.write(value));
78
+ if (parsed.json) {
79
+ const plan = buildStatusActionPlan(status);
80
+ write(`${JSON.stringify({ ...status, next: plan }, null, 2)}\n`);
9
81
  } else {
10
- process.stdout.write(`\n${renderLocalStatus(status)}\n\n`);
82
+ write(`\n${renderRuntimeStatus(status)}\n\n`);
83
+ if (parsed.interactive || opts.interactive) {
84
+ await runInteractiveMenu(status, write);
85
+ }
11
86
  }
12
87
  return status;
13
88
  }
@@ -1,233 +1,266 @@
1
1
  /**
2
- * agentsam tunnel — expose local PTY (:3099) to the IAM platform.
2
+ * agentsam tunnel — guided access to Cloudflare's real Wrangler tunnel lifecycle.
3
3
  *
4
- * Default (--quick): cloudflared quick tunnel → register ws_url via SDK API.
5
- * Named (--named): platform provisions CF named tunnel + DNS; run with --token.
4
+ * AgentSam does not provision a parallel tunnel system. Wrangler owns tunnel
5
+ * discovery, creation, inspection, and connector execution.
6
6
  */
7
- import { spawn, spawnSync } from 'node:child_process';
8
- import { authenticateViaBrowser } from '../lib/auth.js';
9
- import { postJson } from '../lib/core-client.js';
10
- import { resolveAccountAuth } from '../lib/account-session.js';
11
-
12
- const DEFAULT_PORT = 3099;
13
-
14
- function parseArgs(argv) {
15
- const opts = {
16
- mode: 'quick',
17
- port: DEFAULT_PORT,
18
- tunnelName: '',
19
- hostname: '',
20
- zoneId: '',
21
- platform: process.platform === 'win32' ? 'windows' : process.platform === 'darwin' ? 'macos' : 'linux',
22
- shell: process.platform === 'win32' ? 'powershell' : process.env.SHELL || '/bin/zsh',
23
- skipAuth: false,
24
- };
25
- for (let i = 0; i < argv.length; i += 1) {
26
- const a = argv[i];
27
- if (a === '--quick') opts.mode = 'quick';
28
- else if (a === '--named') opts.mode = 'named';
29
- else if (a === '--port') opts.port = Number(argv[++i]) || DEFAULT_PORT;
30
- else if (a === '--tunnel-name') opts.tunnelName = argv[++i] || '';
31
- else if (a === '--hostname') opts.hostname = argv[++i] || '';
32
- else if (a === '--zone-id') opts.zoneId = argv[++i] || '';
33
- else if (a === '--platform') opts.platform = argv[++i] || opts.platform;
34
- else if (a === '--shell') opts.shell = argv[++i] || opts.shell;
35
- else if (a === '--token' && argv[i + 1]) {
36
- process.env.AGENTSAM_API_KEY = argv[++i];
37
- }
38
- }
39
- return opts;
40
- }
7
+ import { spawn } from 'node:child_process';
8
+ import path from 'node:path';
9
+ import { confirm, isCancel, select, text } from '@clack/prompts';
10
+ import { runWranglerNative } from '../cloudflare/index.js';
41
11
 
42
- function ensureCloudflared() {
43
- const which = spawnSync(process.platform === 'win32' ? 'where' : 'which', ['cloudflared'], {
44
- encoding: 'utf8',
45
- });
46
- if (which.status !== 0) {
47
- throw new Error(
48
- 'cloudflared not found. Install: https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/',
49
- );
50
- }
51
- }
12
+ const DEFAULT_QUICK_URL = 'http://127.0.0.1:3099';
13
+ const UUID_RE = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/i;
52
14
 
53
- async function resolveToken() {
54
- const existing = resolveAccountAuth({ env: process.env });
55
- if (existing.value) return existing.value;
56
- if (existing.error) throw new Error(existing.error);
57
- const session = await authenticateViaBrowser();
58
- const token = String(session?.access_token || '').trim();
59
- if (!token) throw new Error('IAM auth did not return a browser session credential');
60
- return token;
15
+ function stripAnsi(value = '') {
16
+ return String(value).replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, '');
61
17
  }
62
18
 
63
- async function assertLocalPty(port) {
64
- const url = `http://127.0.0.1:${port}/health`;
65
- try {
66
- const res = await fetch(url, { signal: AbortSignal.timeout(2500) });
67
- if (!res.ok) throw new Error(`health ${res.status}`);
68
- return true;
69
- } catch {
70
- throw new Error(
71
- `Local PTY not reachable at ${url}. In another terminal run: npx agentsam start-local`,
72
- );
19
+ export function parseWranglerTunnelList(value = '') {
20
+ const rows = [];
21
+ for (const rawLine of stripAnsi(value).split(/\r?\n/)) {
22
+ const match = rawLine.match(UUID_RE);
23
+ if (!match) continue;
24
+ const id = match[0];
25
+ const suffix = rawLine
26
+ .slice((match.index || 0) + id.length)
27
+ .replace(/[│|]/g, ' ')
28
+ .trim();
29
+ const columns = suffix.split(/\s{2,}/).map((item) => item.trim()).filter(Boolean);
30
+ rows.push({
31
+ id,
32
+ name: columns[0] || id,
33
+ status: columns[1] || 'unknown',
34
+ created_at: columns[2] || null,
35
+ tunnel_type: columns[3] || null,
36
+ });
73
37
  }
38
+ return rows;
74
39
  }
75
40
 
76
- function httpsToWss(url) {
77
- const u = String(url || '').trim();
78
- if (!u) return '';
79
- if (u.startsWith('wss://') || u.startsWith('ws://')) return u.replace(/\/$/, '');
80
- if (u.startsWith('https://')) return `wss://${u.slice(8)}`.replace(/\/$/, '');
81
- if (u.startsWith('http://')) return `ws://${u.slice(7)}`.replace(/\/$/, '');
82
- return `wss://${u.replace(/^\/+/, '')}`.replace(/\/$/, '');
41
+ function npxCommand() {
42
+ return process.platform === 'win32' ? 'npx.cmd' : 'npx';
83
43
  }
84
44
 
85
- /**
86
- * Parse trycloudflare.com URL from cloudflared stderr/stdout.
87
- * @param {import('node:child_process').ChildProcessWithoutNullStreams} child
88
- * @returns {Promise<string>}
89
- */
90
- function waitForQuickTunnelUrl(child) {
45
+ function runInteractiveWrangler(args, options = {}) {
46
+ const cwd = path.resolve(options.cwd || process.cwd());
91
47
  return new Promise((resolve, reject) => {
92
- let buf = '';
93
- const timer = setTimeout(() => {
94
- reject(new Error('Timed out waiting for cloudflared quick tunnel URL (60s)'));
95
- }, 60_000);
96
-
97
- const onData = (chunk) => {
98
- const text = chunk.toString();
99
- buf += text;
100
- process.stderr.write(text);
101
- const m =
102
- buf.match(/https:\/\/[a-z0-9-]+\.trycloudflare\.com/i) ||
103
- buf.match(/https:\/\/[a-z0-9.-]+\.cfargotunnel\.com/i);
104
- if (m) {
105
- clearTimeout(timer);
106
- child.stdout?.off('data', onData);
107
- child.stderr?.off('data', onData);
108
- resolve(m[0]);
109
- }
110
- };
111
-
112
- child.stdout?.on('data', onData);
113
- child.stderr?.on('data', onData);
114
- child.on('error', (e) => {
115
- clearTimeout(timer);
116
- reject(e);
48
+ const child = spawn(npxCommand(), ['--yes', 'wrangler', 'tunnel', ...args], {
49
+ cwd,
50
+ stdio: 'inherit',
51
+ env: options.env || process.env,
52
+ shell: process.platform === 'win32',
117
53
  });
118
- child.on('exit', (code) => {
119
- clearTimeout(timer);
120
- reject(new Error(`cloudflared exited early (code ${code})`));
54
+ child.once('error', reject);
55
+ child.once('exit', (code, signal) => {
56
+ if (signal) reject(new Error(`wrangler tunnel stopped by ${signal}`));
57
+ else if (code === 0) resolve(0);
58
+ else reject(new Error(`wrangler tunnel ${args[0] || ''} exited ${code ?? 1}`));
121
59
  });
122
60
  });
123
61
  }
124
62
 
125
- async function runQuick(opts, token) {
126
- await assertLocalPty(opts.port);
127
- ensureCloudflared();
128
-
129
- console.log(`
130
- Agent Sam — tunnel (quick)
131
- Local PTY http://127.0.0.1:${opts.port}
132
- Mode cloudflared quick tunnel → IAM register-local
133
- `);
134
-
135
- const child = spawn(
136
- 'cloudflared',
137
- ['tunnel', '--url', `http://127.0.0.1:${opts.port}`, '--no-autoupdate'],
138
- { stdio: ['ignore', 'pipe', 'pipe'] },
63
+ async function readTunnelList(options = {}) {
64
+ const result = await (options.runWrangler || runWranglerNative)(
65
+ 'tunnel.list',
66
+ { cwd: options.cwd || process.cwd() },
67
+ options,
139
68
  );
69
+ const raw = String(result?.stdout || '');
70
+ return { raw, rows: parseWranglerTunnelList(raw) };
71
+ }
140
72
 
141
- const publicUrl = await waitForQuickTunnelUrl(child);
142
- const wsUrl = httpsToWss(publicUrl);
143
- console.log(`\n ✓ Public URL ${publicUrl}`);
144
- console.log(` ✓ Registering ${wsUrl}\n`);
145
-
146
- const registered = await postJson(
147
- '/api/sdk/terminal/register-local',
148
- {
149
- ws_url: wsUrl,
150
- platform: opts.platform,
151
- shell: opts.shell,
152
- },
153
- token,
73
+ async function printTunnelInfo(tunnel, options = {}) {
74
+ const write = options.write || ((value) => process.stdout.write(value));
75
+ const result = await (options.runWrangler || runWranglerNative)(
76
+ 'tunnel.info',
77
+ { cwd: options.cwd || process.cwd(), tunnel },
78
+ options,
154
79
  );
80
+ write(String(result?.stdout || '').trimEnd() + '\n');
81
+ return result;
82
+ }
155
83
 
156
- console.log(` ✓ IAM local lane active`);
157
- if (registered?.connection?.id) {
158
- console.log(` ✓ connection ${registered.connection.id}`);
159
- }
160
- console.log(`
161
- Keep this process running. In the dashboard: Terminal → Local.
84
+ async function chooseExistingTunnel(options = {}) {
85
+ const { raw, rows } = await readTunnelList(options);
86
+ const write = options.write || ((value) => process.stdout.write(value));
162
87
 
163
- Ctrl+C stops the tunnel.
164
- `);
88
+ if (!rows.length) {
89
+ if (raw.trim()) write(raw.endsWith('\n') ? raw : raw + '\n');
90
+ return null;
91
+ }
165
92
 
166
- await new Promise((resolve) => {
167
- child.on('exit', resolve);
168
- process.on('SIGINT', () => {
169
- child.kill('SIGINT');
170
- });
171
- process.on('SIGTERM', () => {
172
- child.kill('SIGTERM');
173
- });
93
+ const choice = await select({
94
+ message: 'Cloudflare Tunnel',
95
+ options: [
96
+ ...rows.map((row) => ({
97
+ value: row.id,
98
+ label: row.name,
99
+ hint: `${row.status} · ${row.id.slice(0, 8)}`,
100
+ })),
101
+ { value: '__raw__', label: 'Show Wrangler tunnel list', hint: 'print Cloudflare CLI output' },
102
+ { value: '__create__', label: 'Create a new tunnel', hint: 'Wrangler-managed remote tunnel' },
103
+ { value: '__quick__', label: 'Quick tunnel', hint: 'temporary trycloudflare.com URL' },
104
+ { value: '__back__', label: 'Back' },
105
+ ],
174
106
  });
107
+
108
+ if (isCancel(choice) || choice === '__back__') return null;
109
+ if (choice === '__raw__') {
110
+ write(raw.endsWith('\n') ? raw : raw + '\n');
111
+ return null;
112
+ }
113
+ if (choice === '__create__' || choice === '__quick__') return { action: choice.slice(2, -2) };
114
+ return rows.find((row) => row.id === choice) || null;
175
115
  }
176
116
 
177
- async function runNamed(opts, token) {
178
- if (!opts.tunnelName || !opts.hostname || !opts.zoneId) {
179
- throw new Error(
180
- 'Named mode requires --tunnel-name, --hostname, and --zone-id (from your CF zone).',
181
- );
182
- }
183
- await assertLocalPty(opts.port);
184
- ensureCloudflared();
185
-
186
- console.log(`
187
- Agent Sam — tunnel (named)
188
- Provisioning Cloudflare tunnel ${opts.tunnelName} → ${opts.hostname}
189
- `);
190
-
191
- const provisioned = await postJson(
192
- '/api/sdk/terminal/tunnel/provision',
193
- {
194
- tunnel_name: opts.tunnelName,
195
- hostname: opts.hostname,
196
- zone_id: opts.zoneId,
197
- port: opts.port,
198
- platform: opts.platform,
199
- shell: opts.shell,
200
- },
201
- token,
202
- );
117
+ async function guidedTunnel(options = {}) {
118
+ const interactive = options.interactive ?? Boolean(process.stdin.isTTY && process.stdout.isTTY);
119
+ const write = options.write || ((value) => process.stdout.write(value));
203
120
 
204
- const runToken = String(provisioned?.run_token || '').trim();
205
- if (!runToken) throw new Error('Platform did not return a cloudflared run_token');
121
+ if (!interactive) {
122
+ const { raw } = await readTunnelList(options);
123
+ write(raw.endsWith('\n') ? raw : raw + '\n');
124
+ return;
125
+ }
206
126
 
207
- console.log(` ✓ ws_url ${provisioned.ws_url || `wss://${opts.hostname}`}`);
208
- console.log(` ✓ Starting cloudflared tunnel run --token …\n`);
127
+ const selected = await chooseExistingTunnel(options);
128
+ if (!selected) return;
209
129
 
210
- const child = spawn('cloudflared', ['tunnel', 'run', '--token', runToken, '--no-autoupdate'], {
211
- stdio: 'inherit',
130
+ if (selected.action === 'create') {
131
+ const name = await text({
132
+ message: 'New Cloudflare Tunnel name',
133
+ placeholder: 'my-machine',
134
+ validate(value) {
135
+ if (!String(value || '').trim()) return 'Tunnel name is required';
136
+ },
137
+ });
138
+ if (isCancel(name)) return;
139
+ const approved = await confirm({
140
+ message: `Create Cloudflare Tunnel "${String(name).trim()}" in your account?`,
141
+ initialValue: false,
142
+ });
143
+ if (isCancel(approved) || approved !== true) return;
144
+ await runInteractiveWrangler(['create', String(name).trim()], options);
145
+ return;
146
+ }
147
+
148
+ if (selected.action === 'quick') {
149
+ const url = await text({
150
+ message: 'Local URL to expose temporarily',
151
+ defaultValue: DEFAULT_QUICK_URL,
152
+ placeholder: DEFAULT_QUICK_URL,
153
+ });
154
+ if (isCancel(url)) return;
155
+ await runInteractiveWrangler(['quick-start', String(url || DEFAULT_QUICK_URL).trim()], options);
156
+ return;
157
+ }
158
+
159
+ const action = await select({
160
+ message: `${selected.name} · ${selected.status}`,
161
+ options: [
162
+ { value: 'info', label: 'Inspect tunnel', hint: 'wrangler tunnel info' },
163
+ {
164
+ value: 'run',
165
+ label: 'Run connector on this machine',
166
+ hint: 'wrangler tunnel run · persistent until Ctrl+C',
167
+ },
168
+ { value: 'back', label: 'Back' },
169
+ ],
212
170
  });
171
+ if (isCancel(action) || action === 'back') return;
172
+ if (action === 'info') {
173
+ await printTunnelInfo(selected.id, options);
174
+ return;
175
+ }
213
176
 
214
- await new Promise((resolve, reject) => {
215
- child.on('error', reject);
216
- child.on('exit', resolve);
217
- process.on('SIGINT', () => child.kill('SIGINT'));
177
+ const approved = await confirm({
178
+ message: `Run ${selected.name} on this machine? This starts/adds a live connector until Ctrl+C.`,
179
+ initialValue: false,
218
180
  });
181
+ if (isCancel(approved) || approved !== true) return;
182
+ await runInteractiveWrangler(['run', selected.id], options);
219
183
  }
220
184
 
221
- /**
222
- * @param {string[]} [argv]
223
- */
224
- export async function runTunnel(argv = []) {
225
- const opts = parseArgs(argv);
226
- const token = await resolveToken();
185
+ const HELP = `Agent Sam · Cloudflare Tunnel
186
+
187
+ agentsam tunnel
188
+ Guided picker over your real Cloudflare tunnels.
189
+
190
+ agentsam tunnel list
191
+ Run Wrangler's tunnel list.
192
+
193
+ agentsam tunnel info <name-or-id>
194
+ Inspect one tunnel through Wrangler.
195
+
196
+ agentsam tunnel run <name-or-id>
197
+ Start that tunnel's connector on this machine. Ctrl+C stops it.
198
+
199
+ agentsam tunnel create <name>
200
+ Create a remotely managed Cloudflare Tunnel through Wrangler.
201
+
202
+ agentsam tunnel quick-start [url]
203
+ Start a temporary Quick Tunnel. Default: ${DEFAULT_QUICK_URL}
204
+
205
+ AgentSam delegates tunnel lifecycle to Wrangler; it does not mint a parallel
206
+ named-tunnel system or copy tunnel credentials into project configuration.
207
+ `;
208
+
209
+ export async function runTunnel(argv = [], options = {}) {
210
+ const args = [...argv];
211
+ const write = options.write || ((value) => process.stdout.write(value));
212
+ const subcommand = args[0] || '';
213
+
214
+ if (subcommand === '--help' || subcommand === '-h' || subcommand === 'help') {
215
+ write(HELP);
216
+ return;
217
+ }
218
+
219
+ // Compatibility: old quick mode now delegates to Wrangler Quick Tunnel.
220
+ if (subcommand === '--quick') {
221
+ await runInteractiveWrangler(['quick-start', DEFAULT_QUICK_URL], options);
222
+ return;
223
+ }
224
+ if (subcommand === '--named') {
225
+ throw new Error('legacy --named provisioning was removed; run `agentsam tunnel` and select an existing Cloudflare Tunnel, or use `agentsam tunnel run <name-or-id>`');
226
+ }
227
+
228
+ if (!subcommand) {
229
+ await guidedTunnel(options);
230
+ return;
231
+ }
227
232
 
228
- if (opts.mode === 'named') {
229
- await runNamed(opts, token);
230
- } else {
231
- await runQuick(opts, token);
233
+ if (subcommand === 'list') {
234
+ const { raw } = await readTunnelList(options);
235
+ write(raw.endsWith('\n') ? raw : raw + '\n');
236
+ return;
232
237
  }
238
+
239
+ if (subcommand === 'info') {
240
+ const tunnel = String(args[1] || '').trim();
241
+ if (!tunnel) throw new Error('Usage: agentsam tunnel info <name-or-id>');
242
+ await printTunnelInfo(tunnel, options);
243
+ return;
244
+ }
245
+
246
+ if (subcommand === 'run') {
247
+ const tunnel = String(args[1] || '').trim();
248
+ if (!tunnel) throw new Error('Usage: agentsam tunnel run <name-or-id>');
249
+ await runInteractiveWrangler(['run', tunnel], options);
250
+ return;
251
+ }
252
+
253
+ if (subcommand === 'create') {
254
+ const name = String(args[1] || '').trim();
255
+ if (!name) throw new Error('Usage: agentsam tunnel create <name>');
256
+ await runInteractiveWrangler(['create', name], options);
257
+ return;
258
+ }
259
+
260
+ if (subcommand === 'quick-start') {
261
+ await runInteractiveWrangler(['quick-start', String(args[1] || DEFAULT_QUICK_URL)], options);
262
+ return;
263
+ }
264
+
265
+ throw new Error(`unknown tunnel option: ${subcommand}\n\n${HELP}`);
233
266
  }