@inneranimalmedia/agentsam-sdk 2.6.4 → 2.6.5

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 (418) hide show
  1. package/AGENTSAM.md +11 -0
  2. package/README.md +15 -9
  3. package/apps/client-cms-editor/AGENTS.md +12 -0
  4. package/apps/client-cms-editor/IMPORT_PROVENANCE.json +8 -0
  5. package/apps/client-cms-editor/README.md +72 -0
  6. package/apps/client-cms-editor/agentsam.app.json +57 -0
  7. package/apps/client-cms-editor/backend/README.md +5 -0
  8. package/apps/client-cms-editor/backend/package.json +22 -0
  9. package/apps/client-cms-editor/backend/src/api/client.ts +200 -0
  10. package/apps/client-cms-editor/backend/src/demo-bootstrap.ts +145 -0
  11. package/apps/client-cms-editor/backend/src/index.ts +6 -0
  12. package/apps/client-cms-editor/backend/src/model.ts +115 -0
  13. package/apps/client-cms-editor/backend/src/preview/bridge.ts +79 -0
  14. package/apps/client-cms-editor/backend/src/preview/urls.ts +55 -0
  15. package/apps/client-cms-editor/backend/src/routing/cms-route.js +293 -0
  16. package/apps/client-cms-editor/backend/src/routing/index.js +10 -0
  17. package/apps/client-cms-editor/backend/src/storefront.ts +52 -0
  18. package/apps/client-cms-editor/backend/tsconfig.json +15 -0
  19. package/apps/client-cms-editor/backend/worker/index.js +34 -0
  20. package/apps/client-cms-editor/backend/wrangler.jsonc +11 -0
  21. package/apps/client-cms-editor/bin/agentsam-cms.mjs +229 -0
  22. package/apps/client-cms-editor/frontend/index.html +12 -0
  23. package/apps/client-cms-editor/frontend/package.json +33 -0
  24. package/apps/client-cms-editor/frontend/src/AgentSamDrawer.tsx +188 -0
  25. package/apps/client-cms-editor/frontend/src/CmsAgentSurface.tsx +191 -0
  26. package/apps/client-cms-editor/frontend/src/CmsEditor.tsx +1345 -0
  27. package/apps/client-cms-editor/frontend/src/env.d.ts +14 -0
  28. package/apps/client-cms-editor/frontend/src/index.ts +8 -0
  29. package/apps/client-cms-editor/frontend/src/lib/content-safety.ts +63 -0
  30. package/apps/client-cms-editor/frontend/src/main.tsx +17 -0
  31. package/apps/client-cms-editor/frontend/src/mount.tsx +51 -0
  32. package/apps/client-cms-editor/frontend/src/styles/agentsam-drawer.css +214 -0
  33. package/apps/client-cms-editor/frontend/src/styles/cmsShell.css +1739 -0
  34. package/apps/client-cms-editor/frontend/src/styles/studio.css +106 -0
  35. package/apps/client-cms-editor/frontend/src/surfaces/CmsDashboard.tsx +313 -0
  36. package/apps/client-cms-editor/frontend/src/surfaces/CmsGuidedChatHero.tsx +121 -0
  37. package/apps/client-cms-editor/frontend/src/surfaces/CmsHubPage.tsx +132 -0
  38. package/apps/client-cms-editor/frontend/src/surfaces/CmsSiteSwitcher.tsx +176 -0
  39. package/apps/client-cms-editor/frontend/src/surfaces/index.ts +5 -0
  40. package/apps/client-cms-editor/frontend/src/surfaces/types.ts +48 -0
  41. package/apps/client-cms-editor/frontend/tsconfig.json +25 -0
  42. package/apps/client-cms-editor/frontend/vite.config.ts +13 -0
  43. package/apps/client-cms-editor/package-lock.json +3832 -0
  44. package/apps/client-cms-editor/package.json +23 -0
  45. package/apps/client-cms-editor/reference/DONOR_README.md +52 -0
  46. package/apps/client-cms-editor/reference/DONOR_package-lock.json +1253 -0
  47. package/apps/client-cms-editor/reference/DONOR_tsconfig.json +15 -0
  48. package/apps/client-cms-editor/shared/cms/package.json +21 -0
  49. package/apps/client-cms-editor/shared/cms/src/agent-context.ts +35 -0
  50. package/apps/client-cms-editor/shared/cms/src/cloudflare-bindings.ts +51 -0
  51. package/apps/client-cms-editor/shared/cms/src/editor-types.ts +58 -0
  52. package/apps/client-cms-editor/shared/cms/src/index.ts +5 -0
  53. package/apps/client-cms-editor/shared/cms/src/publication.ts +24 -0
  54. package/apps/client-cms-editor/shared/cms/src/routes.ts +11 -0
  55. package/apps/client-cms-editor/shared/cms/tsconfig.json +12 -0
  56. package/bin/agentsam-rapid-rust +36 -0
  57. package/docs/AUTH_IDENTITY_CONTRACT.md +2 -0
  58. package/docs/MACHINE_INTELLIGENCE.md +120 -0
  59. package/docs/WINDOWS_RUNTIME_INSTALL.md +30 -0
  60. package/docs/architecture/AGENTSAM_APPLICATION_CONTRACT.md +188 -0
  61. package/docs/architecture/AGENTSAM_RUNTIME_PROTOCOL.md +151 -0
  62. package/docs/architecture/LOCAL_STUDIO_CLOUDFLARE_OAUTH.md +12 -4
  63. package/docs/architecture/R2_SLUG_NAMESPACE.md +20 -0
  64. package/docs/architecture/WORK_PRODUCT_EXTRACTION.md +97 -0
  65. package/docs/brand/AGENT_SAM_ICON_GRAMMAR.md +70 -0
  66. package/docs/content-studio/HOST_MOUNT_CHECKLIST.md +71 -0
  67. package/docs/content-studio/REVISION_GATE_2026-09-27.md +501 -0
  68. package/docs/contracts/capability-install-planner.md +67 -0
  69. package/docs/contracts/environment-vocabulary.md +195 -0
  70. package/docs/contracts/google-cloud-oauth-setup.md +199 -0
  71. package/docs/local-studio/WORKMODE_DONOR_NOTES.md +1 -1
  72. package/docs/plans/LOCAL-STUDIO-GRADUATION-2026-09-26.md +290 -0
  73. package/docs/plans/LOCAL-STUDIO-REAL-APP-CONTRACT-ADDENDUM-2026-09-27.md +394 -0
  74. package/docs/plans/MACHINE-FIRST-APPS-TUI-2026-09-24.md +227 -0
  75. package/docs/plans/TOMORROW-EXTENSIVE-TODO-2026-09-26.md +221 -0
  76. package/docs/plans/TOMORROW-MACHINE-FIRST-BRIEFING.md +145 -0
  77. package/docs/plans/UNIVERSAL-INGEST-MACHINE-FIRST-2026-09-24.md +215 -0
  78. package/docs/plugins.md +2 -2
  79. package/docs/product/AGENTSAM_PRODUCT_EXPERIENCE_STANDARD.md +280 -0
  80. package/docs/product/LOCAL_STUDIO_DESKTOP_EXPERIENCE.md +139 -0
  81. package/docs/product/README.md +8 -0
  82. package/docs/rapid-rust-wasm.md +35 -0
  83. package/migrations/d1/0016_cloudflare_oauth_user_oauth_tokens_ssot.sql +14 -0
  84. package/package.json +73 -14
  85. package/packages/agentsam-brand/README.md +106 -11
  86. package/packages/agentsam-brand/bin/agentsam-brand.mjs +9 -0
  87. package/packages/agentsam-brand/package.json +39 -7
  88. package/packages/agentsam-brand/src/adapters/cloudflare-images.js +453 -0
  89. package/packages/agentsam-brand/src/adapters/cloudflare-r2.js +74 -0
  90. package/packages/agentsam-brand/src/adapters/d1-registry.js +26 -0
  91. package/packages/agentsam-brand/src/adapters/filesystem.js +59 -0
  92. package/packages/agentsam-brand/src/adapters/memory.js +31 -0
  93. package/packages/agentsam-brand/src/cli/controller.js +503 -0
  94. package/packages/agentsam-brand/src/cli/wizard.js +526 -0
  95. package/packages/agentsam-brand/src/core/capabilities.js +201 -0
  96. package/packages/agentsam-brand/src/core/derivatives.js +211 -0
  97. package/packages/agentsam-brand/src/core/errors.js +12 -0
  98. package/packages/agentsam-brand/src/core/ingest.js +195 -0
  99. package/packages/agentsam-brand/src/core/inspect.js +109 -0
  100. package/packages/agentsam-brand/src/core/keys.js +83 -0
  101. package/packages/agentsam-brand/src/core/naming.js +142 -0
  102. package/packages/agentsam-brand/src/core/optimize.js +316 -0
  103. package/packages/agentsam-brand/src/core/pack.js +305 -0
  104. package/packages/agentsam-brand/src/core/plan.js +276 -0
  105. package/packages/agentsam-brand/src/core/preview.js +159 -0
  106. package/packages/agentsam-brand/src/core/processors/cloudflare.js +68 -0
  107. package/packages/agentsam-brand/src/core/processors/contract.js +203 -0
  108. package/packages/agentsam-brand/src/core/processors/index.js +148 -0
  109. package/packages/agentsam-brand/src/core/processors/native.js +82 -0
  110. package/packages/agentsam-brand/src/core/processors/sharp.js +113 -0
  111. package/packages/agentsam-brand/src/core/processors/squoosh-binary.js +195 -0
  112. package/packages/agentsam-brand/src/core/promote.js +288 -0
  113. package/packages/agentsam-brand/src/core/receipts.js +155 -0
  114. package/packages/agentsam-brand/src/core/v2/compile.js +280 -0
  115. package/packages/agentsam-brand/src/core/v2/derivatives-semantic.js +207 -0
  116. package/packages/agentsam-brand/src/core/v2/ingest-graph.js +387 -0
  117. package/packages/agentsam-brand/src/core/v2/roles.js +180 -0
  118. package/packages/agentsam-brand/src/core/v2/schema.js +209 -0
  119. package/packages/agentsam-brand/src/core/v2/templates.js +114 -0
  120. package/packages/agentsam-brand/src/index.js +193 -36
  121. package/packages/agentsam-brand/src/presets/app-icon.json +16 -0
  122. package/packages/agentsam-brand/src/presets/favicon.json +17 -0
  123. package/packages/agentsam-brand/src/presets/hero.json +12 -0
  124. package/packages/agentsam-brand/src/presets/index.js +40 -0
  125. package/packages/agentsam-brand/src/presets/logo.json +12 -0
  126. package/packages/agentsam-brand/src/presets/model.json +8 -0
  127. package/packages/agentsam-brand/src/presets/og-image.json +10 -0
  128. package/packages/agentsam-brand/src/presets/product-shot.json +11 -0
  129. package/packages/agentsam-brand/src/presets/social-image.json +10 -0
  130. package/packages/agentsam-brand/src/presets/web-image.json +10 -0
  131. package/packages/agentsam-contracts/src/artifacts.ts +41 -0
  132. package/packages/agentsam-knowledge/src/autorag/index.js +1 -1
  133. package/packages/agentsam-knowledge/src/providers/index.js +6 -4
  134. package/packages/agentsam-knowledge/src/providers/ollama-endpoint.js +31 -0
  135. package/packages/agentsam-knowledge/test/autorag.test.mjs +22 -1
  136. package/packages/agentsam-nav/package.json +2 -2
  137. package/packages/agentsam-rapid-rust/Cargo.lock +344 -0
  138. package/packages/agentsam-rapid-rust/Cargo.toml +18 -0
  139. package/packages/agentsam-rapid-rust/README.md +5 -0
  140. package/packages/agentsam-rapid-rust/src/main.rs +718 -0
  141. package/packages/agentsam-rapid-rust/templates/api/Cargo.toml.tmpl +18 -0
  142. package/packages/agentsam-rapid-rust/templates/api/src/lib.rs.tmpl +17 -0
  143. package/packages/agentsam-rapid-rust/templates/common/README.md.tmpl +22 -0
  144. package/packages/agentsam-rapid-rust/templates/common/package.json.tmpl +12 -0
  145. package/packages/agentsam-rapid-rust/templates/common/wrangler.toml.tmpl +6 -0
  146. package/packages/agentsam-rapid-rust/templates/crypto-auth/Cargo.toml.tmpl +21 -0
  147. package/packages/agentsam-rapid-rust/templates/crypto-auth/src/lib.rs.tmpl +32 -0
  148. package/packages/agentsam-rapid-rust/templates/data-processor/Cargo.toml.tmpl +18 -0
  149. package/packages/agentsam-rapid-rust/templates/data-processor/src/lib.rs.tmpl +41 -0
  150. package/packages/agentsam-rapid-rust/templates/shared-core/Cargo.toml.tmpl +9 -0
  151. package/packages/agentsam-rapid-rust/templates/shared-core/core/Cargo.toml.tmpl +7 -0
  152. package/packages/agentsam-rapid-rust/templates/shared-core/core/src/lib.rs.tmpl +23 -0
  153. package/packages/agentsam-rapid-rust/templates/shared-core/worker/Cargo.toml.tmpl +12 -0
  154. package/packages/agentsam-rapid-rust/templates/shared-core/worker/src/lib.rs.tmpl +16 -0
  155. package/packages/agentsam-rapid-rust/templates/shared-core/wrangler.toml.tmpl +6 -0
  156. package/packages/agentsam-repository/src/index.js +1 -0
  157. package/packages/agentsam-repository/src/merkle/semantic.js +3 -10
  158. package/packages/agentsam-repository/src/source-types.js +85 -0
  159. package/packages/agentsam-vault/README.md +96 -0
  160. package/packages/agentsam-vault/package.json +32 -0
  161. package/packages/agentsam-vault/src/contracts/credential.d.ts +78 -0
  162. package/packages/agentsam-vault/src/contracts/credential.js +132 -0
  163. package/packages/agentsam-vault/src/crypto/aes-gcm.d.ts +30 -0
  164. package/packages/agentsam-vault/src/crypto/aes-gcm.js +107 -0
  165. package/packages/agentsam-vault/src/crypto/oauth-envelope.js +150 -0
  166. package/packages/agentsam-vault/src/index.d.ts +9 -0
  167. package/packages/agentsam-vault/src/index.js +27 -0
  168. package/packages/agentsam-vault/src/providers/registry.js +90 -0
  169. package/packages/agentsam-vault/src/runtime/resolver.js +77 -0
  170. package/packages/agentsam-workbench/README.md +24 -0
  171. package/packages/agentsam-workbench/package.json +38 -0
  172. package/packages/agentsam-workbench/src/agent/AgentPanel.tsx +41 -0
  173. package/packages/agentsam-workbench/src/agent/ArtifactCard.tsx +9 -0
  174. package/packages/agentsam-workbench/src/agent/Composer.tsx +102 -0
  175. package/packages/agentsam-workbench/src/agent/ConnectedAgentPanel.tsx +194 -0
  176. package/packages/agentsam-workbench/src/agent/ContextualComposer.tsx +788 -0
  177. package/packages/agentsam-workbench/src/agent/GoalStatusStrip.tsx +38 -0
  178. package/packages/agentsam-workbench/src/agent/MiniAgentSam.tsx +86 -0
  179. package/packages/agentsam-workbench/src/agent/ModelSelect.tsx +19 -0
  180. package/packages/agentsam-workbench/src/agent/Thread.tsx +56 -0
  181. package/packages/agentsam-workbench/src/agent/ToolReceipt.tsx +11 -0
  182. package/packages/agentsam-workbench/src/agent/contextual-composer.css +611 -0
  183. package/packages/agentsam-workbench/src/agent/index.ts +10 -0
  184. package/packages/agentsam-workbench/src/agent/mini-agentsam.css +12 -0
  185. package/packages/agentsam-workbench/src/browser/BrowserFrame.tsx +37 -0
  186. package/packages/agentsam-workbench/src/browser/index.ts +1 -0
  187. package/packages/agentsam-workbench/src/index.ts +6 -0
  188. package/packages/agentsam-workbench/src/project-control.css +160 -0
  189. package/packages/agentsam-workbench/src/projects/ProjectsSurface.tsx +131 -0
  190. package/packages/agentsam-workbench/src/projects/index.ts +1 -0
  191. package/packages/agentsam-workbench/src/shell/Breadcrumb.tsx +35 -0
  192. package/packages/agentsam-workbench/src/shell/ResizableStage.tsx +99 -0
  193. package/packages/agentsam-workbench/src/shell/SidePanel.tsx +5 -0
  194. package/packages/agentsam-workbench/src/shell/index.ts +4 -0
  195. package/packages/agentsam-workbench/src/shell/surfaceRegistry.ts +29 -0
  196. package/packages/agentsam-workbench/src/terminal/TerminalSurface.tsx +5 -0
  197. package/packages/agentsam-workbench/src/terminal/index.ts +1 -0
  198. package/packages/agentsam-workbench/src/timeline/GanttBoard.tsx +258 -0
  199. package/packages/agentsam-workbench/src/timeline/index.ts +1 -0
  200. package/packages/agentsam-workbench/tsconfig.json +13 -0
  201. package/packages/connectors/cloudflare/OAUTH_STORAGE_AUDIT.md +53 -0
  202. package/packages/connectors/cloudflare/package.json +3 -1
  203. package/packages/connectors/cloudflare/src/api-client.js +279 -0
  204. package/packages/connectors/cloudflare/src/capabilities.js +585 -0
  205. package/packages/connectors/cloudflare/src/credential.js +318 -0
  206. package/packages/connectors/cloudflare/src/families/brand-protection.js +123 -0
  207. package/packages/connectors/cloudflare/src/families/keyless.js +114 -0
  208. package/packages/connectors/cloudflare/src/families/pages.js +151 -0
  209. package/packages/connectors/cloudflare/src/families/scanner.js +123 -0
  210. package/packages/connectors/cloudflare/src/families/snippets.js +207 -0
  211. package/packages/connectors/cloudflare/src/families/tag-gateway.js +46 -0
  212. package/packages/connectors/cloudflare/src/families/tags.js +124 -0
  213. package/packages/connectors/cloudflare/src/families/token-validation.js +95 -0
  214. package/packages/connectors/cloudflare/src/families/workflows.js +156 -0
  215. package/packages/connectors/cloudflare/src/index.js +102 -265
  216. package/packages/connectors/cloudflare/src/oauth-persist.js +336 -0
  217. package/packages/connectors/cloudflare/src/owner.js +42 -12
  218. package/packages/connectors/cloudflare/src/permission-options.js +1064 -0
  219. package/packages/connectors/cloudflare/src/routes.js +309 -144
  220. package/packages/connectors/cloudflare/src/scope-catalog.js +345 -0
  221. package/packages/connectors/cloudflare/src/vault.js +2 -2
  222. package/packages/connectors/cloudflare/tests/capabilities.test.mjs +276 -0
  223. package/packages/connectors/cloudflare/tests/connector.test.mjs +26 -30
  224. package/packages/connectors/cloudflare/tests/oauth-persist.test.mjs +125 -0
  225. package/packages/identity/.agentsam/features/oauth-login-portal/providers.json +22 -2
  226. package/packages/identity/.agentsam/features/oauth-login-portal/resources.json +10 -4
  227. package/packages/identity/.agentsam/features/oauth-login-portal/routes.json +20 -0
  228. package/packages/identity/README.md +1 -1
  229. package/packages/identity/backend/README.md +1 -1
  230. package/packages/identity/migrations/D1_SCHEMA_MAPPING.md +3 -2
  231. package/packages/identity/migrations/sqlite/004_identity_oauth_consent_catalog.sql +48 -0
  232. package/packages/identity/package.json +4 -3
  233. package/packages/identity/scripts/local-identity-bridge.mjs +184 -0
  234. package/packages/identity/scripts/preview-auth-portal.mjs +7 -7
  235. package/packages/identity/src/adapters/cloudflare-d1/index.js +31 -2
  236. package/packages/identity/src/adapters/sqlite/index.js +4 -1
  237. package/packages/identity/src/contracts/auth-config.js +28 -8
  238. package/packages/identity/src/contracts/external-identity.js +1 -1
  239. package/packages/identity/src/contracts/provider.js +1 -0
  240. package/packages/identity/src/frontend/auth-portal/README.md +2 -1
  241. package/packages/identity/src/frontend/auth-portal/pages/login.html +6 -5
  242. package/packages/identity/src/frontend/auth-portal/pages/reset.html +6 -5
  243. package/packages/identity/src/frontend/auth-portal/pages/signup.html +6 -5
  244. package/packages/identity/src/frontend/auth-portal/shared/company-branding.js +1 -1
  245. package/packages/identity/src/frontend/auth-portal/shared/desktop-identity-bridge.js +207 -0
  246. package/packages/identity/src/index.js +16 -0
  247. package/packages/identity/src/migrations/0001_identity_core.sql +19 -2
  248. package/packages/identity/src/migrations/0003_accounts_ssot.sql +20 -0
  249. package/packages/identity/src/migrations/README.md +5 -2
  250. package/packages/identity/src/oauth/README.md +10 -5
  251. package/packages/identity/src/oauth/consent-view.js +388 -0
  252. package/packages/identity/src/oauth/credentials.js +31 -11
  253. package/packages/identity/src/oauth/google-desktop-exchange.js +173 -0
  254. package/packages/identity/src/providers/cloudflare/oauth.js +3 -4
  255. package/packages/identity/src/providers/cloudflare/profile.js +49 -14
  256. package/packages/identity/src/providers/iam/index.js +27 -5
  257. package/packages/identity/src/server/identity-service.js +31 -2
  258. package/packages/identity/src/server/worker-router.js +111 -81
  259. package/packages/identity/tests/auth-config.test.mjs +3 -2
  260. package/packages/identity/tests/identity-init-scaffold.test.mjs +3 -0
  261. package/packages/identity/tests/identity-service.test.mjs +16 -0
  262. package/packages/identity/tests/native-session-worker.test.mjs +64 -0
  263. package/packages/identity/tests/oauth-consent-view.test.mjs +106 -0
  264. package/packages/identity/tests/oauth-credentials.test.mjs +17 -4
  265. package/packages/identity/tests/oauth-presets-accounts-ssot.test.mjs +58 -0
  266. package/packages/identity/tests/preview-auth-portal.test.mjs +3 -3
  267. package/packages/runtime-protocol/src/index.js +154 -0
  268. package/packages/theme-scenes/README.md +164 -0
  269. package/packages/theme-scenes/package.json +53 -0
  270. package/packages/theme-scenes/src/blocks/index.js +30 -0
  271. package/packages/theme-scenes/src/contracts/index.js +286 -0
  272. package/packages/theme-scenes/src/demos/index.js +65 -0
  273. package/packages/theme-scenes/src/index.js +75 -0
  274. package/packages/theme-scenes/src/presets/index.js +263 -0
  275. package/packages/theme-scenes/src/runtime/compile.js +119 -0
  276. package/packages/theme-scenes/src/scenes/index.js +146 -0
  277. package/packages/theme-scenes/src/shell/index.js +47 -0
  278. package/packages/theme-scenes/src/themes/index.js +129 -0
  279. package/packages/theme-scenes/src/visuals/index.js +41 -0
  280. package/packages/theme-scenes/test/theme-scenes.test.mjs +179 -0
  281. package/packages/work-graph/src/index.js +34 -1
  282. package/packages/work-graph/src/renderers/gantt-model.js +24 -0
  283. package/packages/work-graph/test/work-graph.test.mjs +27 -7
  284. package/protocol/README.md +15 -7
  285. package/protocol/apps/agentsam.app.v1.schema.json +89 -7
  286. package/protocol/apps/agentsam.host-install.v1.schema.json +36 -0
  287. package/protocol/assets/README.md +9 -0
  288. package/protocol/assets/asset-record.v1.schema.json +64 -0
  289. package/protocol/runtime/agentsam.runtime.v1.schema.json +75 -0
  290. package/protocol/scoring/README.md +10 -0
  291. package/protocol/scoring/scorecard.v1.schema.json +65 -0
  292. package/protocol/ui/icon-registry.mjs +1 -0
  293. package/registry/cms-rust-machine-20260928/installable-products.json +31 -0
  294. package/registry/cms-rust-machine-20260928/manifest.json +22 -0
  295. package/registry/cms-rust-machine-20260928/migration.sql +237 -0
  296. package/registry/cms-rust-machine-20260928/receipt.json +21 -0
  297. package/registry/cms-rust-machine-20260928/receipt.sql +27 -0
  298. package/scripts/build_rapid_rust_cli.py +83 -0
  299. package/src/attachments/index.js +6 -0
  300. package/src/attachments/intake.js +235 -0
  301. package/src/capabilities/repository-snapshot.js +19 -2
  302. package/src/cli/command-catalog.js +8 -0
  303. package/src/cli.js +182 -26
  304. package/src/commands/account-auth.js +94 -8
  305. package/src/commands/app.js +307 -3
  306. package/src/commands/billing.js +127 -0
  307. package/src/commands/brand.js +74 -60
  308. package/src/commands/cheat-sheet.js +154 -0
  309. package/src/commands/cloudflare-login.js +222 -0
  310. package/src/commands/cloudflare.js +453 -23
  311. package/src/commands/codebaseindex.js +6 -1
  312. package/src/commands/compute.js +4 -0
  313. package/src/commands/connections.js +11 -5
  314. package/src/commands/credentials.js +116 -0
  315. package/src/commands/gcloud-auth.js +427 -0
  316. package/src/commands/google-cloud.js +375 -0
  317. package/src/commands/identity-init.js +2 -2
  318. package/src/commands/mcp.js +226 -33
  319. package/src/commands/ollama.js +3 -2
  320. package/src/commands/plugins.js +7 -2
  321. package/src/commands/product.js +36 -0
  322. package/src/commands/runtime-status.js +28 -9
  323. package/src/commands/runtime.js +313 -0
  324. package/src/commands/rust.js +24 -0
  325. package/src/commands/setup.js +279 -0
  326. package/src/commands/shell.js +16 -3
  327. package/src/commands/start-local.js +2 -2
  328. package/src/commands/terminal.js +171 -0
  329. package/src/commands/update.js +140 -0
  330. package/src/commands/whoami.js +329 -65
  331. package/src/features/resolve.js +1 -0
  332. package/src/index.js +4 -0
  333. package/src/indexing/ingest/inventory.js +254 -19
  334. package/src/indexing/ingest/materials.js +3 -9
  335. package/src/indexing/ingest/style-evidence.js +181 -0
  336. package/src/knowledge/source.js +3 -3
  337. package/src/lib/account-session.js +11 -4
  338. package/src/lib/app-authority.js +172 -0
  339. package/src/lib/auth.js +94 -21
  340. package/src/lib/core-client.js +5 -6
  341. package/src/lib/credentials-audit.js +451 -0
  342. package/src/lib/deploy/health.js +24 -6
  343. package/src/lib/detect-context.js +7 -1
  344. package/src/lib/google-cloud-connection.js +270 -0
  345. package/src/lib/google-cloud-inventory.js +385 -0
  346. package/src/lib/google-desktop-oauth.js +372 -0
  347. package/src/lib/google-studio-brokered-oauth.js +158 -0
  348. package/src/lib/identity-scaffold.js +24 -6
  349. package/src/lib/init-options.js +192 -0
  350. package/src/lib/local-scaffold.js +48 -16
  351. package/src/lib/provider-command-remediation.js +308 -0
  352. package/src/lib/provider-credentials.js +8 -0
  353. package/src/lib/scaffold/index.js +8 -2
  354. package/src/lib/scaffold/mcp-server.js +43 -0
  355. package/src/lib/scaffold/templates/mcp-server/index.js +397 -0
  356. package/src/lib/scaffold/templates/mcp-server/presets.js +39 -0
  357. package/src/lib/scaffold/wizards/cms.js +93 -0
  358. package/src/lib/scaffold/wizards/mcp-server.js +61 -0
  359. package/src/lib/setup/contract.js +26 -0
  360. package/src/lib/setup/discover.js +116 -0
  361. package/src/lib/setup/execute.js +205 -0
  362. package/src/lib/setup/planner.js +134 -0
  363. package/src/lib/setup/recipes.js +235 -0
  364. package/src/lib/setup/runtime-persist.js +197 -0
  365. package/src/lib/setup/runtime.js +394 -0
  366. package/src/lib/slash-commands.js +2 -0
  367. package/src/lib/terminal/machine-identity.js +95 -0
  368. package/src/lib/terminal-local.js +164 -0
  369. package/src/lib/terminal-scopes.js +52 -0
  370. package/src/lib/whoami-capabilities.js +184 -0
  371. package/src/local-pty/server.js +34 -5
  372. package/src/mcp/authority.js +58 -108
  373. package/src/mcp/client-adapters.js +68 -144
  374. package/src/mcp/client.js +142 -122
  375. package/src/mcp/cloudflare-bundles.js +225 -0
  376. package/src/mcp/index.js +12 -0
  377. package/src/plugins/cloudflare.js +1 -1
  378. package/src/providers/ollama-chat.js +2 -1
  379. package/src/sam/types.js +27 -2
  380. package/src/security/inventory.js +12 -2
  381. package/src/security/local-vault.js +2 -0
  382. package/src/security/scan.js +1 -1
  383. package/test/account-session.test.mjs +3 -3
  384. package/test/app-authority-context.test.mjs +32 -0
  385. package/test/cli/codebaseindex-plan-ux.test.mjs +1 -1
  386. package/test/cli/mcp-client.test.mjs +21 -10
  387. package/test/cli/runtime-persist.test.mjs +56 -0
  388. package/test/cli/rust-command.test.mjs +21 -0
  389. package/test/credentials-audit.test.mjs +113 -0
  390. package/test/deploy-health-scan.test.mjs +29 -1
  391. package/test/gcloud-auth.test.mjs +111 -0
  392. package/test/google-cloud-connection.test.mjs +83 -0
  393. package/test/google-cloud-inventory.test.mjs +64 -0
  394. package/test/init-options.test.mjs +35 -0
  395. package/test/integration/app-command.test.mjs +30 -0
  396. package/test/integration/cad-project.test.mjs +4 -1
  397. package/test/integration/cms-app-scaffold.test.mjs +71 -0
  398. package/test/integration/cms-site-tenancy-contract.test.mjs +3 -2
  399. package/test/integration/codebaseindex-ingest.test.mjs +48 -0
  400. package/test/integration/features-resolve.test.mjs +30 -11
  401. package/test/integration/inspect-path-cli.test.mjs +46 -0
  402. package/test/integration/inventory-evidence.test.mjs +125 -0
  403. package/test/integration/runtime-status.integration.test.mjs +2 -1
  404. package/test/knowledge.test.mjs +35 -1
  405. package/test/loopback-oauth.test.mjs +53 -0
  406. package/test/ollama.test.mjs +22 -0
  407. package/test/security.test.mjs +23 -0
  408. package/test/setup-planner.test.mjs +74 -0
  409. package/test/setup-runtime.test.mjs +51 -0
  410. package/test/terminal/local-pty.mock.test.mjs +3 -1
  411. package/test/terminal-machine-identity.test.mjs +88 -0
  412. package/test/whoami-resume.test.mjs +27 -6
  413. package/packages/agentsam-brand/test/brand-scan.test.mjs +0 -106
  414. package/packages/work-graph/prototype/README.md +0 -32
  415. package/packages/work-graph/prototype/data/demo-workgraph.js +0 -47
  416. package/packages/work-graph/prototype/renderers/timeline-model.js +0 -21
  417. package/packages/work-graph/prototype/renderers/workgraph-runtime.js +0 -38
  418. package/packages/work-graph/prototype-gnantt.html +0 -655
@@ -1,56 +1,486 @@
1
1
  import path from 'node:path';
2
+ import fs from 'node:fs';
2
3
  import { listWranglerNativeCommands, runWranglerNative, summarizeCloudflareCpuProfileFile, WRANGLER_OPERATION_FAMILIES } from '../cloudflare/index.js';
3
4
  import { renderDiagnosticError } from '../errors/index.js';
5
+ import {
6
+ CloudflareApiClient,
7
+ CloudflareApiError,
8
+ listCloudflareCapabilities,
9
+ listCloudflareFeaturePacks,
10
+ assessCapabilityAuthorization,
11
+ capabilityAuthorizationMatrix,
12
+ scopesForCapabilities,
13
+ scopesForFeaturePacks,
14
+ requestedCloudflareScopes,
15
+ workflows,
16
+ scanner,
17
+ tags,
18
+ tagGateway,
19
+ brandProtection,
20
+ keyless,
21
+ tokenValidation,
22
+ pages,
23
+ snippets,
24
+ } from '../../packages/connectors/cloudflare/src/index.js';
25
+ import { AGENTSAM_TAG_VOCABULARY as TAG_VOCAB } from '../../packages/connectors/cloudflare/src/families/tags.js';
26
+ import {
27
+ isCloudflareLoginFamily,
28
+ runCloudflareBrowserOAuthLogin,
29
+ } from './cloudflare-login.js';
4
30
 
5
31
  function parse(argv = []) {
6
- const subcommand = argv[0] || 'status';
7
- const takesAction = subcommand === 'run' || subcommand === 'cpu';
8
- const out = { subcommand, action: takesAction ? (argv[1] || '') : '', cwd: process.cwd(), json: false, name: '', account: '', config: '', env: '', profile: '', path: '', page: null, file: '' };
9
- for (let i = takesAction ? 2 : 1; i < argv.length; i += 1) {
32
+ const out = {
33
+ family: argv[0] || 'status',
34
+ // Never seed action from argv[1] — flags like `--json` would become the action
35
+ // and `agentsam cloudflare status --json` would fall through to the help menu.
36
+ action: '',
37
+ rest: [],
38
+ cwd: process.cwd(),
39
+ json: false,
40
+ name: '',
41
+ account: '',
42
+ config: '',
43
+ env: '',
44
+ profile: '',
45
+ path: '',
46
+ page: null,
47
+ file: '',
48
+ zone: '',
49
+ url: '',
50
+ id: '',
51
+ version: '',
52
+ instance: '',
53
+ event: '',
54
+ measurementId: '',
55
+ endpoint: '/metrics',
56
+ hideOriginalIp: true,
57
+ setUpTag: true,
58
+ capability: '',
59
+ resource: '',
60
+ tag: '',
61
+ status: '',
62
+ help: false,
63
+ pack: '',
64
+ };
65
+
66
+ // Legacy: cloudflare run <id> / cloudflare cpu analyze
67
+ if (out.family === 'run' || out.family === 'cpu') {
68
+ const maybeAction = argv[1] || '';
69
+ out.action = maybeAction.startsWith('-') ? '' : maybeAction;
70
+ let i = out.action ? 2 : 1;
71
+ for (; i < argv.length; i += 1) {
72
+ const arg = argv[i];
73
+ if (arg === '--json') out.json = true;
74
+ else if (arg === '--cwd') out.cwd = argv[++i] || out.cwd;
75
+ else if (arg === '--name') out.name = argv[++i] || '';
76
+ else if (arg === '--account') out.account = argv[++i] || '';
77
+ else if (arg === '--config') out.config = argv[++i] || '';
78
+ else if (arg === '--env') out.env = argv[++i] || '';
79
+ else if (arg === '--profile') out.profile = argv[++i] || '';
80
+ else if (arg === '--path') out.path = argv[++i] || '';
81
+ else if (arg === '--page') out.page = Number(argv[++i] || 1);
82
+ else if (arg === '--file') out.file = argv[++i] || '';
83
+ else if (arg === '--help' || arg === '-h') out.help = true;
84
+ else if (!out.action && !arg.startsWith('-')) out.action = arg;
85
+ else if (out.family === 'cpu' && out.action === 'analyze' && !out.file && !arg.startsWith('-')) out.file = arg;
86
+ else out.rest.push(arg);
87
+ }
88
+ return out;
89
+ }
90
+
91
+ for (let i = 1; i < argv.length; i += 1) {
10
92
  const arg = argv[i];
11
93
  if (arg === '--json') out.json = true;
12
94
  else if (arg === '--cwd') out.cwd = argv[++i] || out.cwd;
13
- else if (arg === '--name') out.name = argv[++i] || '';
14
95
  else if (arg === '--account') out.account = argv[++i] || '';
15
- else if (arg === '--config') out.config = argv[++i] || '';
16
- else if (arg === '--env') out.env = argv[++i] || '';
17
- else if (arg === '--profile') out.profile = argv[++i] || '';
18
- else if (arg === '--path') out.path = argv[++i] || '';
19
- else if (arg === '--page') out.page = Number(argv[++i] || 1);
96
+ else if (arg === '--zone') out.zone = argv[++i] || '';
97
+ else if (arg === '--name') out.name = argv[++i] || '';
98
+ else if (arg === '--url') out.url = argv[++i] || '';
99
+ else if (arg === '--id') out.id = argv[++i] || '';
100
+ else if (arg === '--version') out.version = argv[++i] || '';
101
+ else if (arg === '--instance') out.instance = argv[++i] || '';
102
+ else if (arg === '--event') out.event = argv[++i] || '';
103
+ else if (arg === '--measurement-id') out.measurementId = argv[++i] || '';
104
+ else if (arg === '--endpoint') out.endpoint = argv[++i] || '/metrics';
105
+ else if (arg === '--hide-original-ip') out.hideOriginalIp = true;
106
+ else if (arg === '--forward-original-ip') out.hideOriginalIp = false;
107
+ else if (arg === '--no-setup-tag') out.setUpTag = false;
108
+ else if (arg === '--capability') out.capability = argv[++i] || '';
109
+ else if (arg === '--pack' || arg === '--packs') out.pack = argv[++i] || '';
110
+ else if (arg === '--resource') out.resource = argv[++i] || '';
111
+ else if (arg === '--tag') out.tag = argv[++i] || '';
112
+ else if (arg === '--status') out.status = argv[++i] || '';
20
113
  else if (arg === '--file') out.file = argv[++i] || '';
114
+ else if (arg === '--page') out.page = Number(argv[++i] || 1);
21
115
  else if (arg === '--help' || arg === '-h') out.help = true;
22
- else if (out.subcommand === 'cpu' && out.action === 'analyze' && !out.file) out.file = arg;
116
+ else if (!out.action && !arg.startsWith('-')) out.action = arg;
117
+ else if (!arg.startsWith('-')) out.rest.push(arg);
23
118
  else throw new Error(`unknown cloudflare option: ${arg}`);
24
119
  }
25
120
  return out;
26
121
  }
27
122
 
28
- const help = `Agent Sam · Cloudflare\n\n agentsam cloudflare status [--cwd PATH] [--json]\n agentsam cloudflare commands [--json]\n agentsam cloudflare run <whoami|deployments.list|versions.list|types.check|queues.list> [options] [--json]\n agentsam cloudflare cpu analyze <profile.cpuprofile> [--cwd PATH] [--json]\n\nSafe native runner is read-only. Deploy, rollback, secret reads, D1 mutation, R2 writes, and long-running tail/dev sessions remain explicit operator actions.\n`;
123
+ const help = `Agent Sam · Cloudflare
124
+
125
+ Account & access
126
+ agentsam cloudflare status [--json]
127
+ agentsam cloudflare login --pack agentsam # agentsam_cf_browser_oauth (ENTER to open)
128
+ agentsam cloudflare login --list-packs
129
+ agentsam cloudflare authorize --pack data # alias of login
130
+ agentsam cloudflare permissions [--capability ID] [--json]
131
+ agentsam cloudflare capabilities [--json]
132
+ agentsam cloudflare commands [--json]
133
+
134
+ Compute
135
+ agentsam cloudflare workflows status|list|inspect|versions|graph|run|instances|instance|step|pause|resume|terminate|event|delete …
136
+
137
+ Web & delivery
138
+ agentsam cloudflare tag-gateway status|configure|disable --zone ZONE_ID …
139
+ agentsam cloudflare scanner status|scan|result|search|har|dom|screenshot|bulk …
140
+
141
+ Organization
142
+ agentsam cloudflare tags status|keys|values|summary|resources|list|vocabulary …
143
+
144
+ agentsam cloudflare pages status|list|inspect|deployments|deployment|logs|domains …
145
+ agentsam cloudflare snippets status|list|inspect|content|rules … --zone ZONE_ID
146
+
147
+ Security (eligibility-first)
148
+ agentsam cloudflare brand status|queries|matches|logos|scan …
149
+ agentsam cloudflare keyless status|list|inspect|enable|disable --zone ZONE_ID …
150
+ agentsam cloudflare token-validation status|configs|rules --zone ZONE_ID …
151
+
152
+ Native (Wrangler reads)
153
+ agentsam cloudflare run <whoami|…> [--json]
154
+ agentsam cloudflare cpu analyze <profile.cpuprofile> [--json]
155
+
156
+ Auth lanes
157
+ agentsam_api_key / agentsam_browser_oauth → Inner Animal Media identity
158
+ agentsam_cf_browser_oauth → Cloudflare API scopes via feature packs
159
+ CLOUDFLARE_API_TOKEN → optional direct token (still supported)
160
+
161
+ Scope mitigation: never dump 300+ CF permissions — authorize by pack
162
+ (data | compute | ai | web | media | security | agentsam).
163
+ `;
164
+
165
+ function clientFromArgs(args, options = {}) {
166
+ return new CloudflareApiClient({
167
+ apiToken: options.apiToken || process.env.CLOUDFLARE_API_TOKEN,
168
+ accountId: args.account || options.accountId || process.env.CLOUDFLARE_ACCOUNT_ID,
169
+ fetchImpl: options.fetchImpl || globalThis.fetch,
170
+ });
171
+ }
172
+
173
+ function formatHuman(result) {
174
+ if (result == null) return '';
175
+ if (typeof result === 'string') return result;
176
+ const lines = [];
177
+ if (result.capability_label || result.capability_id) {
178
+ lines.push(`Agent Sam · ${result.capability_label || result.capability_id}`);
179
+ lines.push('');
180
+ }
181
+ if (result.availability != null) {
182
+ const mark = result.availability === 'available' || result.availability === 'generally_available'
183
+ ? (result.authorized === false ? '○' : '✓')
184
+ : '○';
185
+ lines.push(`availability ${mark} ${result.availability}`);
186
+ }
187
+ if (result.authorized === false && result.permission_required) {
188
+ lines.push(`permission ${result.permission_required}`);
189
+ }
190
+ if (result.remediation?.authorize_hint) {
191
+ lines.push('');
192
+ lines.push(`[Authorize] ${result.remediation.authorize_hint}`);
193
+ }
194
+ if (result.learn) {
195
+ lines.push('');
196
+ lines.push(`Learn: ${result.learn}`);
197
+ }
198
+ if (result.message && result.ok === false) lines.push(result.message);
199
+ if (lines.length <= 2) return `${JSON.stringify(result, null, 2)}\n`;
200
+ return `${lines.join('\n')}\n\n${JSON.stringify(result, null, 2)}\n`;
201
+ }
202
+
203
+ async function dispatchFamily(args, options) {
204
+ const client = clientFromArgs(args, options);
205
+ const family = args.family;
206
+ const action = args.action || 'status';
207
+ const name = args.name || args.rest[0] || '';
208
+ const id = args.id || args.rest[1] || args.rest[0] || '';
209
+
210
+ if (family === 'permissions' || family === 'capabilities') {
211
+ if (family === 'capabilities' || action === 'list' || (!args.capability && !args.pack)) {
212
+ return {
213
+ schema: 'agentsam.cloudflare.capabilities.v1',
214
+ baseline_scopes: requestedCloudflareScopes(),
215
+ feature_packs: listCloudflareFeaturePacks().map((pack) => ({
216
+ id: pack.id,
217
+ label: pack.label,
218
+ description: pack.description,
219
+ capabilities: pack.capabilities,
220
+ scope_count: scopesForFeaturePacks([pack.id]).length,
221
+ authorize: `agentsam cloudflare login --pack ${pack.id}`,
222
+ })),
223
+ mitigation: 'Use feature packs for consent UX — never present the full Cloudflare scope catalog.',
224
+ capabilities: listCloudflareCapabilities().map((c) => ({
225
+ id: c.id,
226
+ label: c.label,
227
+ domain: c.domain,
228
+ availability: c.availability,
229
+ permission: c.permissionLabel,
230
+ oauth_scopes: c.oauthScopes,
231
+ note: c.availabilityNote || null,
232
+ })),
233
+ tag_vocabulary: TAG_VOCAB,
234
+ };
235
+ }
236
+ if (args.pack) {
237
+ const scopes = scopesForFeaturePacks(args.pack.split(','));
238
+ return {
239
+ pack: args.pack,
240
+ scopes_to_request: scopes,
241
+ scope_count: scopes.length,
242
+ authorize: `agentsam cloudflare login --pack ${args.pack}`,
243
+ authorize_url_hint: `/api/connections/cloudflare/start?packs=${encodeURIComponent(args.pack)}`,
244
+ };
245
+ }
246
+ const assessment = assessCapabilityAuthorization(args.capability, []);
247
+ return {
248
+ ...assessment,
249
+ scopes_to_request: scopesForCapabilities({ capabilities: [args.capability] }),
250
+ authorize: `agentsam cloudflare login --capability ${args.capability}`,
251
+ authorize_url_hint: `/api/connections/cloudflare/start?capabilities=${encodeURIComponent(args.capability)}`,
252
+ };
253
+ }
254
+
255
+ if (family === 'workflows' || family === 'workflow') {
256
+ if (action === 'status') return workflows.workflowsStatus(client);
257
+ if (action === 'list') return workflows.workflowsList(client, { page: args.page });
258
+ if (action === 'inspect') return workflows.workflowsInspect(client, name);
259
+ if (action === 'versions') return workflows.workflowsVersions(client, name);
260
+ if (action === 'graph') return workflows.workflowsGraph(client, name, args.version || args.rest[1]);
261
+ if (action === 'run') {
262
+ let params;
263
+ if (args.file) params = JSON.parse(fs.readFileSync(args.file, 'utf8'));
264
+ return workflows.workflowsRun(client, name, { params });
265
+ }
266
+ if (action === 'instances') return workflows.workflowsInstances(client, name);
267
+ if (action === 'instance') return workflows.workflowsInstance(client, name, args.instance || args.rest[1]);
268
+ if (action === 'step') return workflows.workflowsStep(client, name, args.instance || args.rest[1]);
269
+ if (action === 'pause') return workflows.workflowsSetStatus(client, name, args.instance || args.rest[1], 'paused');
270
+ if (action === 'resume') return workflows.workflowsSetStatus(client, name, args.instance || args.rest[1], 'running');
271
+ if (action === 'terminate') return workflows.workflowsSetStatus(client, name, args.instance || args.rest[1], 'terminated');
272
+ if (action === 'event') {
273
+ return workflows.workflowsEvent(client, name, args.instance || args.rest[1], args.event || args.rest[2], {});
274
+ }
275
+ if (action === 'delete') return workflows.workflowsDelete(client, name);
276
+ throw new Error(`unknown workflows action: ${action}`);
277
+ }
278
+
279
+ if (family === 'scanner') {
280
+ if (action === 'status') return scanner.scannerStatus(client);
281
+ if (action === 'scan') return scanner.scannerScan(client, args.url || args.rest[0]);
282
+ if (action === 'result' || action === 'status-scan') return scanner.scannerResult(client, args.id || args.rest[0]);
283
+ if (action === 'search') return scanner.scannerSearch(client, { q: args.url || args.rest[0] });
284
+ if (action === 'har') return scanner.scannerHar(client, args.id || args.rest[0]);
285
+ if (action === 'dom') return scanner.scannerDom(client, args.id || args.rest[0]);
286
+ if (action === 'screenshot') return scanner.scannerScreenshot(client, args.id || args.rest[0]);
287
+ if (action === 'bulk') {
288
+ const urls = args.file
289
+ ? fs.readFileSync(args.file, 'utf8').split(/\r?\n/).map((l) => l.trim()).filter(Boolean)
290
+ : args.rest;
291
+ return scanner.scannerBulk(client, urls);
292
+ }
293
+ throw new Error(`unknown scanner action: ${action}`);
294
+ }
295
+
296
+ if (family === 'tags') {
297
+ if (action === 'status') return tags.tagsStatus(client);
298
+ if (action === 'keys') return tags.tagsKeys(client);
299
+ if (action === 'values') return tags.tagsValues(client, args.tag || args.rest[0]);
300
+ if (action === 'summary') return tags.tagsSummary(client);
301
+ if (action === 'resources') return tags.tagsResources(client, args.tag ? { tag: args.tag } : {});
302
+ if (action === 'list') return tags.tagsGet(client, args.resource || args.rest[0]);
303
+ if (action === 'vocabulary') return { ok: true, vocabulary: TAG_VOCAB };
304
+ throw new Error(`unknown tags action: ${action}`);
305
+ }
306
+
307
+ if (family === 'tag-gateway' || family === 'tag_gateway') {
308
+ const zone = args.zone;
309
+ if (!zone) throw new Error('--zone required');
310
+ if (action === 'status') return tagGateway.tagGatewayStatus(client, zone);
311
+ if (action === 'configure') {
312
+ return tagGateway.tagGatewayConfigure(client, zone, {
313
+ measurementId: args.measurementId,
314
+ endpoint: args.endpoint,
315
+ hideOriginalIp: args.hideOriginalIp,
316
+ setUpTag: args.setUpTag,
317
+ enabled: true,
318
+ });
319
+ }
320
+ if (action === 'disable') return tagGateway.tagGatewayDisable(client, zone);
321
+ throw new Error(`unknown tag-gateway action: ${action}`);
322
+ }
323
+
324
+ if (family === 'brand') {
325
+ if (action === 'status') return brandProtection.brandProtectionStatus(client);
326
+ if (action === 'queries') return brandProtection.brandQueries(client);
327
+ if (action === 'matches') return brandProtection.brandMatches(client, args.id ? { query_id: args.id } : {});
328
+ if (action === 'logos') return brandProtection.brandLogos(client);
329
+ if (action === 'logo-matches') return brandProtection.brandLogoMatches(client, args.id || args.rest[0]);
330
+ if (action === 'scan') return brandProtection.brandScanPage(client, args.url || args.rest[0]);
331
+ if (action === 'query' && args.rest[0] === 'add') {
332
+ return brandProtection.brandQueryAdd(client, { query: args.rest[1] || args.name });
333
+ }
334
+ throw new Error(`unknown brand action: ${action}`);
335
+ }
336
+
337
+ if (family === 'keyless') {
338
+ const zone = args.zone;
339
+ if (action === 'status') return keyless.keylessStatus(client, zone);
340
+ if (!zone) throw new Error('--zone required');
341
+ if (action === 'list') return keyless.keylessList(client, zone);
342
+ if (action === 'inspect') return keyless.keylessInspect(client, zone, args.id || args.rest[0]);
343
+ if (action === 'enable') return keyless.keylessEnable(client, zone, args.id || args.rest[0]);
344
+ if (action === 'disable') return keyless.keylessDisable(client, zone, args.id || args.rest[0]);
345
+ if (action === 'doctor') return keyless.keylessStatus(client, zone);
346
+ throw new Error(`unknown keyless action: ${action}`);
347
+ }
348
+
349
+ if (family === 'pages') {
350
+ const project = args.name || args.rest[0] || '';
351
+ if (action === 'status') return pages.pagesStatus(client);
352
+ if (action === 'list') return pages.pagesList(client, { page: args.page });
353
+ if (action === 'inspect') return pages.pagesInspect(client, project);
354
+ if (action === 'deployments') return pages.pagesDeployments(client, project);
355
+ if (action === 'deployment') return pages.pagesDeployment(client, project, args.id || args.rest[1]);
356
+ if (action === 'logs') return pages.pagesDeploymentLogs(client, project, args.id || args.rest[1]);
357
+ if (action === 'domains') return pages.pagesDomains(client, project);
358
+ if (action === 'purge-cache') return pages.pagesPurgeBuildCache(client, project);
359
+ if (action === 'retry') return pages.pagesRetryDeployment(client, project, args.id || args.rest[1]);
360
+ if (action === 'rollback') return pages.pagesRollbackDeployment(client, project, args.id || args.rest[1]);
361
+ throw new Error(`unknown pages action: ${action}`);
362
+ }
363
+
364
+ if (family === 'snippets') {
365
+ const zone = args.zone;
366
+ if (!zone) throw new Error('--zone required');
367
+ const name = args.name || args.rest[0] || '';
368
+ const yes = args.rest.includes('--yes') || false;
369
+ if (action === 'status') return snippets.snippetsStatus(client, zone);
370
+ if (action === 'list') return snippets.snippetsList(client, zone);
371
+ if (action === 'inspect') return snippets.snippetsInspect(client, zone, name);
372
+ if (action === 'content') return snippets.snippetsContent(client, zone, name);
373
+ if (action === 'rules' && (!args.rest[0] || args.rest[0] === 'list')) {
374
+ return snippets.snippetsRulesList(client, zone);
375
+ }
376
+ if (action === 'rules' && args.rest[0] === 'plan') {
377
+ return snippets.snippetsRulesPlan(client, zone, []);
378
+ }
379
+ throw new Error(`unknown snippets action: ${action}`);
380
+ }
381
+
382
+ if (family === 'token-validation' || family === 'token_validation') {
383
+ const zone = args.zone;
384
+ if (!zone) throw new Error('--zone required');
385
+ if (action === 'status') return tokenValidation.tokenValidationStatus(client, zone);
386
+ if (action === 'configs') return tokenValidation.tokenValidationListConfigs(client, zone);
387
+ if (action === 'config') return tokenValidation.tokenValidationGetConfig(client, zone, args.id || args.rest[0]);
388
+ if (action === 'rules') return tokenValidation.tokenValidationListRules(client, zone);
389
+ throw new Error(`unknown token-validation action: ${action}`);
390
+ }
391
+
392
+ return null;
393
+ }
29
394
 
30
395
  export async function runCloudflare(argv = [], options = {}) {
396
+ const familyPeek = String(argv[0] || 'status').trim().toLowerCase();
397
+ if (isCloudflareLoginFamily(familyPeek)) {
398
+ const loginArgv = familyPeek === 'packs'
399
+ ? ['--list-packs', ...argv.slice(1)]
400
+ : argv.slice(1);
401
+ return runCloudflareBrowserOAuthLogin(loginArgv, options);
402
+ }
403
+
31
404
  const args = parse(argv);
32
405
  if (options.cwd && !argv.includes('--cwd')) args.cwd = path.resolve(options.cwd);
33
406
  const write = options.write || ((value) => process.stdout.write(value));
34
- if (args.help) { write(help); return null; }
407
+ if (args.help || args.family === 'help') {
408
+ write(help);
409
+ return null;
410
+ }
411
+
35
412
  try {
36
413
  let result;
37
- if (args.subcommand === 'status') {
38
- result = await runWranglerNative('whoami', args, options);
39
- } else if (args.subcommand === 'commands') {
40
- result = { schema_version: 1, native: listWranglerNativeCommands(), families: WRANGLER_OPERATION_FAMILIES };
41
- } else if (args.subcommand === 'run') {
414
+
415
+ if (args.family === 'status' && !args.action) {
416
+ // Prefer API token probe when present; else Wrangler whoami
417
+ if (process.env.CLOUDFLARE_API_TOKEN || options.apiToken) {
418
+ const client = clientFromArgs(args, options);
419
+ const matrix = capabilityAuthorizationMatrix([]);
420
+ result = {
421
+ schema: 'agentsam.cloudflare.status.v1',
422
+ provider: 'cloudflare',
423
+ auth: {
424
+ mode: 'api_token',
425
+ token_configured: Boolean(client.apiToken),
426
+ account_id: client.accountId || null,
427
+ },
428
+ capabilities: matrix,
429
+ feature_packs: listCloudflareFeaturePacks().map((p) => ({
430
+ id: p.id,
431
+ label: p.label,
432
+ authorize: `agentsam cloudflare login --pack ${p.id}`,
433
+ })),
434
+ note: 'OAuth scope matrix unknown for raw API tokens — use family status probes for live authorization. Prefer agentsam_cf_browser_oauth packs for scoped consent.',
435
+ };
436
+ // Live probes for key families when account present
437
+ if (client.accountId) {
438
+ result.probes = {};
439
+ for (const [key, fn] of [
440
+ ['workflows', () => workflows.workflowsStatus(client)],
441
+ ['scanner', () => scanner.scannerStatus(client)],
442
+ ]) {
443
+ try {
444
+ result.probes[key] = await fn();
445
+ } catch (err) {
446
+ result.probes[key] = err instanceof CloudflareApiError ? err.toJSON() : { ok: false, error: String(err.message || err) };
447
+ }
448
+ }
449
+ }
450
+ } else {
451
+ result = await runWranglerNative('whoami', args, options);
452
+ }
453
+ } else if (args.family === 'commands') {
454
+ result = {
455
+ schema_version: 1,
456
+ native: listWranglerNativeCommands(),
457
+ families: WRANGLER_OPERATION_FAMILIES,
458
+ semantic: [
459
+ 'login', 'authorize', 'permissions', 'capabilities', 'workflows', 'scanner', 'tags',
460
+ 'tag-gateway', 'brand', 'keyless', 'token-validation', 'pages', 'snippets',
461
+ ],
462
+ };
463
+ } else if (args.family === 'run') {
42
464
  if (!args.action) throw new Error('cloudflare native command id required');
43
465
  result = await runWranglerNative(args.action, args, options);
44
- } else if (args.subcommand === 'cpu' && args.action === 'analyze') {
466
+ } else if (args.family === 'cpu' && args.action === 'analyze') {
45
467
  result = summarizeCloudflareCpuProfileFile({ cwd: path.resolve(args.cwd), file: args.file });
46
468
  } else {
47
- write(help);
48
- return null;
469
+ result = await dispatchFamily(args, options);
470
+ if (result == null) {
471
+ write(help);
472
+ return null;
473
+ }
49
474
  }
50
- write(args.json ? `${JSON.stringify(result)}\n` : `${JSON.stringify(result, null, 2)}\n`);
475
+
476
+ write(args.json ? `${JSON.stringify(result)}\n` : formatHuman(result));
51
477
  return result;
52
478
  } catch (error) {
53
- if (args.json) write(`${JSON.stringify({ ok: false, error: error?.diagnostic || { code: error?.code || 'cloudflare_operation_failed', message: error?.message || String(error) } })}\n`);
479
+ const payload = error instanceof CloudflareApiError
480
+ ? error.toJSON()
481
+ : { ok: false, error: error?.diagnostic || { code: error?.code || 'cloudflare_operation_failed', message: error?.message || String(error) } };
482
+ if (args.json) write(`${JSON.stringify(payload)}\n`);
483
+ else if (error?.remediation) write(`${formatHuman(payload)}`);
54
484
  else write(`${renderDiagnosticError(error)}\n`);
55
485
  error.reported = true;
56
486
  throw error;
@@ -465,7 +465,12 @@ async function runWizard(root, opts) {
465
465
  }
466
466
 
467
467
  // Default scope from categorized inventory (not "include everything")
468
- let include = opts.include ? splitList(opts.include) : [...(inventory.suggested.include || [])];
468
+ let include = opts.include
469
+ ? splitList(opts.include)
470
+ : [...new Set([
471
+ ...(inventory.suggested.include || []),
472
+ ...(inventory.suggested.include_files || []),
473
+ ])];
469
474
  let exclude = opts.exclude ? splitList(opts.exclude) : [...(inventory.suggested.exclude || [])];
470
475
 
471
476
  if (discovered.assistModels.length) {
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Compatibility shim — prefer `agentsam google-cloud`.
3
+ */
4
+ export { runCompute, runGoogleCloud, normalizeGoogleCloudArgv } from './google-cloud.js';
@@ -11,11 +11,15 @@ import {
11
11
  import { resolveIamIssuer } from '../../packages/identity/src/contracts/auth-config.js';
12
12
  import { collectRuntimeStatus } from './runtime-status.js';
13
13
 
14
- const PRODUCTION_CALLBACK = `https://agentsam.inneranimalmedia.com${CLOUDFLARE_CALLBACK_PATH}`;
15
-
16
14
  function doctor(env = process.env) {
17
15
  const iam = {
18
- issuer: resolveIamIssuer(env),
16
+ issuer: (() => {
17
+ try {
18
+ return resolveIamIssuer(env);
19
+ } catch {
20
+ return null;
21
+ }
22
+ })(),
19
23
  clientId: Boolean(String(env.IAM_CLIENT_ID || '').trim()),
20
24
  serverSecret: Boolean(String(env.IAM_CLIENT_SECRET || '').trim()),
21
25
  originAlias: Boolean(String(env.IAM_ORIGIN || '').trim()),
@@ -29,7 +33,9 @@ function printSetup(env = process.env) {
29
33
  const client = resolveCloudflareOAuthClient(env);
30
34
  console.log('Cloudflare connector setup');
31
35
  console.log('');
32
- console.log(` callback: ${PRODUCTION_CALLBACK}`);
36
+ console.log(` callback path: ${CLOUDFLARE_CALLBACK_PATH}`);
37
+ console.log(' Register full https://<local-studio-host>' + CLOUDFLARE_CALLBACK_PATH);
38
+ console.log(' on the Cloudflare OAuth client (CLOUDFLARE_OAUTH_CLIENT_ID).');
33
39
  console.log(' authorize: https://dash.cloudflare.com/oauth2/auth');
34
40
  console.log(' token: https://dash.cloudflare.com/oauth2/token');
35
41
  console.log(' revoke: https://dash.cloudflare.com/oauth2/revoke');
@@ -39,7 +45,7 @@ function printSetup(env = process.env) {
39
45
  if (client.fixture) {
40
46
  console.log('STOP: fixture credentials are loaded. OAuth start will return 503.');
41
47
  } else if (client.status === 'not_configured') {
42
- console.log('status: not_configured — production may deploy; connector stays optional.');
48
+ console.log('status: not_configured — set CLOUDFLARE_OAUTH_CLIENT_ID on the Local Studio Worker.');
43
49
  } else {
44
50
  console.log(`status: ${client.status}`);
45
51
  }