@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
@@ -0,0 +1,74 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { spawnSync } from 'node:child_process';
4
+
5
+ /**
6
+ * Cloudflare R2 storage via wrangler CLI.
7
+ * Optional — planning/deriving never requires this.
8
+ */
9
+ export class CloudflareR2StorageAdapter {
10
+ constructor({
11
+ bucket,
12
+ wranglerConfig,
13
+ cwd,
14
+ } = {}) {
15
+ this.kind = 'cloudflare-r2';
16
+ this.bucket = bucket;
17
+ this.wranglerConfig = wranglerConfig;
18
+ this.cwd = cwd || process.cwd();
19
+ }
20
+
21
+ async put(key, buffer, meta = {}) {
22
+ if (!this.bucket) throw new Error('r2_bucket_required');
23
+ const tmpDir = path.join(this.cwd, '.agentsam', 'tmp');
24
+ fs.mkdirSync(tmpDir, { recursive: true });
25
+ const tmp = path.join(tmpDir, `put-${Date.now()}-${Math.random().toString(16).slice(2)}`);
26
+ fs.writeFileSync(tmp, buffer);
27
+ try {
28
+ const args = [
29
+ 'wrangler', 'r2', 'object', 'put', `${this.bucket}/${key}`,
30
+ '--file', tmp,
31
+ '--content-type', meta.contentType || 'application/octet-stream',
32
+ ];
33
+ if (this.wranglerConfig) args.push('-c', this.wranglerConfig);
34
+ const r = spawnSync('npx', args, { cwd: this.cwd, encoding: 'utf8', env: process.env });
35
+ if (r.status !== 0) throw new Error(r.stderr || r.stdout || 'wrangler_r2_put_failed');
36
+ return { ok: true, key };
37
+ } finally {
38
+ try { fs.unlinkSync(tmp); } catch { /* ignore */ }
39
+ }
40
+ }
41
+
42
+ async head(key) {
43
+ if (!this.bucket) return { exists: false };
44
+ const tmp = path.join(this.cwd, '.agentsam', 'tmp', `get-${Date.now()}`);
45
+ fs.mkdirSync(path.dirname(tmp), { recursive: true });
46
+ try {
47
+ const args = [
48
+ 'wrangler', 'r2', 'object', 'get', `${this.bucket}/${key}`,
49
+ '--file', tmp,
50
+ ];
51
+ if (this.wranglerConfig) args.push('-c', this.wranglerConfig);
52
+ const r = spawnSync('npx', args, { cwd: this.cwd, encoding: 'utf8', env: process.env });
53
+ if (r.status !== 0) return { exists: false };
54
+ const buffer = fs.readFileSync(tmp);
55
+ return { exists: true, bytes: buffer.length, buffer };
56
+ } finally {
57
+ try { fs.unlinkSync(tmp); } catch { /* ignore */ }
58
+ }
59
+ }
60
+
61
+ async get(key) {
62
+ const h = await this.head(key);
63
+ if (!h.exists) return null;
64
+ return { key, buffer: h.buffer };
65
+ }
66
+
67
+ async exists(key) {
68
+ return (await this.head(key)).exists;
69
+ }
70
+
71
+ async list() {
72
+ throw new Error('r2_list_not_implemented');
73
+ }
74
+ }
@@ -0,0 +1,26 @@
1
+ /** Optional D1 registry adapter — not required for plan/derive. */
2
+ export class D1BrandRegistryAdapter {
3
+ constructor({ execute } = {}) {
4
+ this.kind = 'd1';
5
+ this.execute = execute; // async (sql) => ...
6
+ }
7
+
8
+ async register(row = {}) {
9
+ if (!this.execute) return { ok: false, skipped: true, reason: 'no_execute' };
10
+ // Caller supplies SQL dialect / schema — keep generic metadata insert hook
11
+ return this.execute({
12
+ op: 'register',
13
+ ...row,
14
+ });
15
+ }
16
+
17
+ async find(query = {}) {
18
+ if (!this.execute) return null;
19
+ return this.execute({ op: 'find', ...query });
20
+ }
21
+
22
+ async list(query = {}) {
23
+ if (!this.execute) return [];
24
+ return this.execute({ op: 'list', ...query });
25
+ }
26
+ }
@@ -0,0 +1,59 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+
4
+ /** Local filesystem storage adapter (offline planning/publish for tests & DIY). */
5
+ export class FilesystemStorageAdapter {
6
+ constructor({ rootDir } = {}) {
7
+ this.rootDir = path.resolve(rootDir || path.join(process.cwd(), '.agentsam', 'brand-store'));
8
+ this.kind = 'filesystem';
9
+ }
10
+
11
+ resolve(key) {
12
+ const safe = String(key || '').replace(/^\/+/, '');
13
+ if (safe.includes('..')) throw new Error('path_traversal');
14
+ return path.join(this.rootDir, safe);
15
+ }
16
+
17
+ async put(key, buffer, meta = {}) {
18
+ const file = this.resolve(key);
19
+ fs.mkdirSync(path.dirname(file), { recursive: true });
20
+ fs.writeFileSync(file, buffer);
21
+ if (meta && Object.keys(meta).length) {
22
+ fs.writeFileSync(`${file}.meta.json`, `${JSON.stringify(meta, null, 2)}\n`);
23
+ }
24
+ return { ok: true, key, path: file };
25
+ }
26
+
27
+ async get(key) {
28
+ const file = this.resolve(key);
29
+ if (!fs.existsSync(file)) return null;
30
+ return { key, buffer: fs.readFileSync(file), path: file };
31
+ }
32
+
33
+ async head(key) {
34
+ const file = this.resolve(key);
35
+ if (!fs.existsSync(file)) return { exists: false };
36
+ const buffer = fs.readFileSync(file);
37
+ return { exists: true, bytes: buffer.length, buffer, path: file };
38
+ }
39
+
40
+ async exists(key) {
41
+ return fs.existsSync(this.resolve(key));
42
+ }
43
+
44
+ async list(prefix = '') {
45
+ const out = [];
46
+ const walk = (dir, rel = '') => {
47
+ if (!fs.existsSync(dir)) return;
48
+ for (const name of fs.readdirSync(dir)) {
49
+ if (name.endsWith('.meta.json')) continue;
50
+ const full = path.join(dir, name);
51
+ const key = rel ? `${rel}/${name}` : name;
52
+ if (fs.statSync(full).isDirectory()) walk(full, key);
53
+ else if (!prefix || key.startsWith(prefix)) out.push(key);
54
+ }
55
+ };
56
+ walk(this.rootDir);
57
+ return out;
58
+ }
59
+ }
@@ -0,0 +1,31 @@
1
+ export class MemoryStorageAdapter {
2
+ constructor(store = new Map()) {
3
+ this.store = store;
4
+ this.kind = 'memory';
5
+ }
6
+
7
+ async put(key, buffer, meta = {}) {
8
+ this.store.set(key, { buffer: Buffer.from(buffer), meta, updated_at: Date.now() });
9
+ return { ok: true, key };
10
+ }
11
+
12
+ async get(key) {
13
+ const row = this.store.get(key);
14
+ if (!row) return null;
15
+ return { key, buffer: row.buffer, meta: row.meta };
16
+ }
17
+
18
+ async head(key) {
19
+ const row = this.store.get(key);
20
+ if (!row) return { exists: false };
21
+ return { exists: true, bytes: row.buffer.length, buffer: row.buffer, meta: row.meta };
22
+ }
23
+
24
+ async exists(key) {
25
+ return this.store.has(key);
26
+ }
27
+
28
+ async list(prefix = '') {
29
+ return [...this.store.keys()].filter((k) => k.startsWith(prefix));
30
+ }
31
+ }
@@ -0,0 +1,503 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { planBrandAssetPromotion } from '../core/plan.js';
4
+ import { promoteBrandAssets, publishBrandAssets, verifyBrandAssets } from '../core/promote.js';
5
+ import { inspectBrandAsset } from '../core/inspect.js';
6
+ import { deriveBrandAssets } from '../core/derivatives.js';
7
+ import { listBrandAssetReceipts, formatPublishReceipt } from '../core/receipts.js';
8
+ import { getDerivativePreset, listDerivativePresets } from '../presets/index.js';
9
+ import { normalizePromotionSpec, parseDeriveFlag } from '../core/plan.js';
10
+ import { resolveSourceInput } from '../core/ingest.js';
11
+ import { buildBrandPack } from '../core/pack.js';
12
+ import { previewBrandPack } from '../core/preview.js';
13
+ import { ingestBrandSources, loadBrandPack } from '../core/v2/ingest-graph.js';
14
+ import { buildBrandPackFromGraph } from '../core/v2/compile.js';
15
+ import { listBrandTemplates, createPackFromTemplate } from '../core/v2/templates.js';
16
+ import { listAssetRoles } from '../core/v2/roles.js';
17
+ import { MemoryStorageAdapter } from '../adapters/memory.js';
18
+ import { FilesystemStorageAdapter } from '../adapters/filesystem.js';
19
+ import { CloudflareImagesDeliveryAdapter } from '../adapters/cloudflare-images.js';
20
+ import { BrandAssetError } from '../core/errors.js';
21
+ import { optimizeBrandAsset } from '../core/optimize.js';
22
+ import { discoverProcessors } from '../core/processors/index.js';
23
+
24
+ function loadJson(file) {
25
+ return JSON.parse(fs.readFileSync(path.resolve(file), 'utf8'));
26
+ }
27
+
28
+ export function parseBrandCliArgs(argv = []) {
29
+ const out = {
30
+ json: false,
31
+ cwd: process.cwd(),
32
+ dryRun: false,
33
+ yes: false,
34
+ force: false,
35
+ interactive: null,
36
+ brand: '',
37
+ asset: '',
38
+ version: 'v1',
39
+ source: '',
40
+ mark: '',
41
+ icns: '',
42
+ png: '',
43
+ webp: '',
44
+ avif: '',
45
+ manifest: '',
46
+ storageBinding: '',
47
+ bucket: '',
48
+ images: false,
49
+ preset: '',
50
+ derive: [],
51
+ out: '',
52
+ from: '',
53
+ dropDir: '',
54
+ watch: false,
55
+ noOpen: false,
56
+ alt: '',
57
+ title: '',
58
+ description: '',
59
+ template: '',
60
+ noZip: false,
61
+ role: '',
62
+ target: 'web',
63
+ processor: '',
64
+ positionals: [],
65
+ };
66
+ for (let i = 0; i < argv.length; i += 1) {
67
+ const a = argv[i];
68
+ if (a === '--json') out.json = true;
69
+ else if (a === '--cwd') out.cwd = argv[++i] || out.cwd;
70
+ else if (a === '--dry-run') out.dryRun = true;
71
+ else if (a === '--yes' || a === '-y') out.yes = true;
72
+ else if (a === '--force') out.force = true;
73
+ else if (a === '--interactive' || a === '-i') out.interactive = true;
74
+ else if (a === '--no-interactive') out.interactive = false;
75
+ else if (a === '--brand') out.brand = argv[++i] || '';
76
+ else if (a === '--asset') out.asset = argv[++i] || '';
77
+ else if (a === '--version') out.version = argv[++i] || 'v1';
78
+ else if (a === '--source') out.source = argv[++i] || '';
79
+ else if (a === '--mark' || a === '--svg') out.mark = argv[++i] || '';
80
+ else if (a === '--icns') out.icns = argv[++i] || '';
81
+ else if (a === '--png' || a === '--icon') out.png = argv[++i] || '';
82
+ else if (a === '--webp') out.webp = argv[++i] || '';
83
+ else if (a === '--avif') out.avif = argv[++i] || '';
84
+ else if (a === '--manifest') out.manifest = argv[++i] || '';
85
+ else if (a === '--storage-binding') out.storageBinding = argv[++i] || '';
86
+ else if (a === '--bucket') out.bucket = argv[++i] || '';
87
+ else if (a === '--images' || a === '--cloudflare-images') out.images = true;
88
+ else if (a === '--preset') out.preset = argv[++i] || '';
89
+ else if (a === '--derive') out.derive.push(argv[++i] || '');
90
+ else if (a === '--out' || a === '-o') out.out = argv[++i] || '';
91
+ else if (a === '--from') out.from = argv[++i] || '';
92
+ else if (a === '--drop-dir') out.dropDir = argv[++i] || '';
93
+ else if (a === '--watch') out.watch = true;
94
+ else if (a === '--no-open') out.noOpen = true;
95
+ else if (a === '--alt') out.alt = argv[++i] || '';
96
+ else if (a === '--title') out.title = argv[++i] || '';
97
+ else if (a === '--description') out.description = argv[++i] || '';
98
+ else if (a === '--template') out.template = argv[++i] || '';
99
+ else if (a === '--no-zip') out.noZip = true;
100
+ else if (a === '--role') out.role = argv[++i] || '';
101
+ else if (a === '--target') out.target = argv[++i] || 'web';
102
+ else if (a === '--processor') out.processor = argv[++i] || '';
103
+ else out.positionals.push(a);
104
+ }
105
+ return out;
106
+ }
107
+
108
+ async function resolveSourceForSpec(opts) {
109
+ if (!opts.source && !opts.dropDir) return opts;
110
+ const ingested = await resolveSourceInput({
111
+ source: opts.source,
112
+ dropDir: opts.dropDir,
113
+ watch: opts.watch,
114
+ workDir: path.join(opts.cwd, '.agentsam', 'brand', 'work', 'stdin'),
115
+ cwd: opts.cwd,
116
+ });
117
+ if (!ingested) return opts;
118
+ return {
119
+ ...opts,
120
+ source: ingested.path,
121
+ mark: opts.mark || ingested.markPath || '',
122
+ };
123
+ }
124
+
125
+ function buildSpecFromArgs(opts) {
126
+ if (opts.manifest) return loadJson(opts.manifest);
127
+ const derivatives = [...opts.derive.map(parseDeriveFlag)];
128
+ if (opts.preset) {
129
+ const preset = getDerivativePreset(opts.preset);
130
+ if (!preset) throw new BrandAssetError('unknown_preset', `Unknown preset: ${opts.preset}`);
131
+ derivatives.push(...preset.derivatives);
132
+ }
133
+ const destinations = {};
134
+ if (opts.storageBinding || opts.bucket) {
135
+ destinations.storage = {
136
+ provider: 'cloudflare-r2',
137
+ binding: opts.storageBinding || null,
138
+ bucket: opts.bucket || null,
139
+ };
140
+ }
141
+ if (opts.images) {
142
+ destinations.delivery = { provider: 'cloudflare-images' };
143
+ }
144
+ return normalizePromotionSpec({
145
+ brand: opts.brand,
146
+ asset: opts.asset,
147
+ version: opts.version,
148
+ source: opts.source,
149
+ mark: opts.mark,
150
+ icns: opts.icns,
151
+ png: opts.png,
152
+ webp: opts.webp,
153
+ avif: opts.avif,
154
+ derivatives,
155
+ destinations: Object.keys(destinations).length ? destinations : undefined,
156
+ storageBinding: opts.storageBinding || undefined,
157
+ bucket: opts.bucket || undefined,
158
+ delivery: opts.images ? { provider: 'cloudflare-images' } : undefined,
159
+ seo: {
160
+ alt_text: opts.alt || null,
161
+ title: opts.title || null,
162
+ description: opts.description || null,
163
+ },
164
+ });
165
+ }
166
+
167
+ function writeResult(write, opts, value) {
168
+ if (opts.json) write(`${JSON.stringify(value, null, 2)}\n`);
169
+ else if (typeof value === 'string') write(`${value}\n`);
170
+ else if (value?.publish || value?.capability === 'brand.publish') {
171
+ write(`${formatPublishReceipt(value.publish || value)}\n`);
172
+ } else {
173
+ write(`${JSON.stringify(value, null, 2)}\n`);
174
+ }
175
+ }
176
+
177
+ /**
178
+ * Shared CLI controller for `agentsam brand` and `agentsam-brand`.
179
+ */
180
+ export async function runBrandAssetCommand(argv = [], options = {}) {
181
+ const write = options.write || ((s) => process.stdout.write(s));
182
+ const opts = parseBrandCliArgs(argv);
183
+ const [action = 'help', ...rest] = opts.positionals;
184
+
185
+ if (action === 'help' || action === '--help' || action === '-h') {
186
+ write(`usage: brand-assets <inspect|derive|optimize|processors|ingest|build|pack|preview|plan|promote|publish|verify|assets|presets|templates|roles> [options]
187
+
188
+ Brand compiler (v2 — brand.pack.json is source of truth):
189
+ ingest <path|zip|tar|folder> Classify assets → brand.pack.json
190
+ build --from <pack> Compile dist + studio + optional zip export
191
+ preview --from <dist|zip> Localhost gallery / studio
192
+ optimize <file> Role-aware encode (processor adapter — not Squoosh CLI)
193
+ processors List sharp / squoosh-binary / native / cloudflare
194
+ templates List uniform brand templates
195
+ roles List asset roles
196
+
197
+ Examples:
198
+ agentsam brand optimize ./hero.png --role hero.landscape --target web
199
+ agentsam brand optimize ./logo.png --role logo.primary --processor sharp
200
+ agentsam brand ingest ./exports --brand acme --template product-saas
201
+ agentsam brand build --from .agentsam/brand/packs/acme --out ./dist/acme
202
+ `);
203
+ return 0;
204
+ }
205
+
206
+ try {
207
+ if (action === 'presets') {
208
+ writeResult(write, opts, { presets: listDerivativePresets() });
209
+ return 0;
210
+ }
211
+
212
+ if (action === 'templates') {
213
+ writeResult(write, opts, { templates: listBrandTemplates() });
214
+ return 0;
215
+ }
216
+
217
+ if (action === 'roles') {
218
+ writeResult(write, opts, { roles: listAssetRoles() });
219
+ return 0;
220
+ }
221
+
222
+ if (action === 'processors') {
223
+ writeResult(write, opts, discoverProcessors());
224
+ return 0;
225
+ }
226
+
227
+ if (action === 'optimize') {
228
+ let file = rest[0] || opts.source;
229
+ if (file === '-' || opts.source === '-' || opts.dropDir) {
230
+ const resolved = await resolveSourceForSpec({ ...opts, source: file === '-' ? '-' : opts.source });
231
+ file = resolved.source;
232
+ }
233
+ if (!file) {
234
+ write('optimize requires a source path (or --source - / --drop-dir)\n');
235
+ return 2;
236
+ }
237
+ const result = await optimizeBrandAsset({
238
+ sourcePath: path.resolve(opts.cwd, file),
239
+ role: opts.role || opts.asset || 'asset.generic',
240
+ target: opts.target || 'web',
241
+ brandId: opts.brand || '',
242
+ outDir: opts.out || path.join(opts.cwd, '.agentsam', 'brand', 'work', 'optimize'),
243
+ processor: opts.processor || undefined,
244
+ dryRun: opts.dryRun,
245
+ semantic: {
246
+ subject: opts.title ? [opts.title] : [],
247
+ },
248
+ });
249
+ writeResult(write, opts, result);
250
+ return result.ok ? 0 : 1;
251
+ }
252
+
253
+ if (action === 'ingest') {
254
+ const input = rest[0] || opts.source || opts.dropDir;
255
+ if (!input) {
256
+ write('ingest requires a path, archive, or folder\n');
257
+ return 2;
258
+ }
259
+ let pack = null;
260
+ if (opts.template && opts.brand) {
261
+ pack = createPackFromTemplate(opts.template, { brandId: opts.brand });
262
+ }
263
+ const result = await ingestBrandSources(input, {
264
+ cwd: opts.cwd,
265
+ brandId: opts.brand || undefined,
266
+ brandName: opts.title || undefined,
267
+ pack,
268
+ template: opts.template || undefined,
269
+ });
270
+ if (opts.template) {
271
+ const { applyBrandTemplate } = await import('../core/v2/templates.js');
272
+ result.pack = applyBrandTemplate(result.pack, opts.template);
273
+ const { saveBrandPack } = await import('../core/v2/ingest-graph.js');
274
+ saveBrandPack(result.pack, path.dirname(result.pack_path));
275
+ }
276
+ writeResult(write, opts, result);
277
+ return 0;
278
+ }
279
+
280
+ if (action === 'build') {
281
+ const from = opts.from || rest[0];
282
+ if (!from && !opts.brand) {
283
+ write('build requires --from <brand.pack.json|dir> (or ingest first)\n');
284
+ return 2;
285
+ }
286
+ const result = await buildBrandPackFromGraph({
287
+ from: from || path.join(opts.cwd, '.agentsam', 'brand', 'packs', opts.brand),
288
+ cwd: opts.cwd,
289
+ outDir: opts.out || undefined,
290
+ template: opts.template || undefined,
291
+ zip: !opts.noZip,
292
+ zipPath: opts.out && String(opts.out).endsWith('.zip') ? opts.out : undefined,
293
+ });
294
+ writeResult(write, opts, result);
295
+ return 0;
296
+ }
297
+
298
+ if (action === 'assets') {
299
+ writeResult(write, opts, {
300
+ capability: 'brand.assets',
301
+ receipts: listBrandAssetReceipts(opts.cwd),
302
+ });
303
+ return 0;
304
+ }
305
+
306
+ if (action === 'inspect') {
307
+ const file = rest[0] || opts.source;
308
+ if (!file) {
309
+ write('inspect requires a path\n');
310
+ return 2;
311
+ }
312
+ writeResult(write, opts, inspectBrandAsset(file));
313
+ return 0;
314
+ }
315
+
316
+ if (action === 'derive') {
317
+ let file = rest[0] || opts.source;
318
+ if (file === '-' || opts.source === '-' || opts.dropDir) {
319
+ const resolved = await resolveSourceForSpec({ ...opts, source: file === '-' ? '-' : opts.source });
320
+ file = resolved.source;
321
+ }
322
+ if (!file) {
323
+ write('derive requires a source path (or --source - / --drop-dir)\n');
324
+ return 2;
325
+ }
326
+ const derivatives = opts.derive.length
327
+ ? opts.derive.map(parseDeriveFlag)
328
+ : (getDerivativePreset(opts.preset || 'app-icon')?.derivatives || []);
329
+ const outDir = path.join(opts.cwd, '.agentsam', 'brand', 'work', 'derive');
330
+ const result = await deriveBrandAssets({
331
+ sourcePath: file,
332
+ outDir,
333
+ derivatives,
334
+ asset: opts.asset || 'asset',
335
+ });
336
+ writeResult(write, opts, result);
337
+ return 0;
338
+ }
339
+
340
+ if (action === 'pack') {
341
+ const resolved = await resolveSourceForSpec(opts);
342
+ if (!resolved.brand || !resolved.asset || (!resolved.source && !resolved.mark)) {
343
+ write('pack requires --brand, --asset, and --source (path, -, or --drop-dir)\n');
344
+ return 2;
345
+ }
346
+ const zipPath = resolved.out
347
+ || path.join(
348
+ resolved.cwd,
349
+ '.agentsam',
350
+ 'brand',
351
+ 'packs',
352
+ `${resolved.brand}-${resolved.asset}-${resolved.version}.zip`,
353
+ );
354
+ const result = await buildBrandPack({
355
+ brand: resolved.brand,
356
+ asset: resolved.asset,
357
+ version: resolved.version,
358
+ sourcePath: resolved.source,
359
+ markPath: resolved.mark || null,
360
+ preset: resolved.preset || 'app-icon',
361
+ zipPath,
362
+ altText: resolved.alt,
363
+ title: resolved.title,
364
+ description: resolved.description,
365
+ cwd: resolved.cwd,
366
+ });
367
+ writeResult(write, opts, result);
368
+ return 0;
369
+ }
370
+
371
+ if (action === 'preview') {
372
+ const from = opts.from || rest[0];
373
+ if (!from) {
374
+ write('preview requires --from <pack-dir|zip>\n');
375
+ return 2;
376
+ }
377
+ const result = await previewBrandPack({
378
+ from,
379
+ cwd: opts.cwd,
380
+ open: !opts.noOpen,
381
+ waitForEnter: !opts.json && process.stdin.isTTY,
382
+ write,
383
+ });
384
+ if (opts.json) writeResult(write, opts, result);
385
+ return 0;
386
+ }
387
+
388
+ if (action === 'plan' || action === 'promote') {
389
+ const wantsInteractive =
390
+ opts.interactive === true
391
+ || (opts.interactive !== false
392
+ && !opts.manifest
393
+ && !opts.source
394
+ && !opts.dropDir
395
+ && !opts.brand
396
+ && process.stdin.isTTY
397
+ && process.stdout.isTTY
398
+ && typeof options.runWizard === 'function');
399
+
400
+ if (wantsInteractive) {
401
+ const wizard = await options.runWizard({ cwd: opts.cwd, prompts: options.prompts });
402
+ if (wizard?.cancelled) {
403
+ writeResult(write, opts, wizard);
404
+ return 1;
405
+ }
406
+ const result = await promoteBrandAssets(wizard.spec, {
407
+ cwd: opts.cwd,
408
+ dryRun: wizard.planOnly || opts.dryRun,
409
+ yes: !wizard.planOnly && (opts.yes || wizard.publish),
410
+ publish: !wizard.planOnly && (opts.yes || wizard.publish),
411
+ storageAdapter: wizard.storageAdapter,
412
+ deliveryAdapter: wizard.deliveryAdapter,
413
+ derive: true,
414
+ });
415
+ writeResult(write, opts, { ...result, inventory: wizard.inventory, pack: wizard.pack || null });
416
+ return 0;
417
+ }
418
+
419
+ const resolved = await resolveSourceForSpec(opts);
420
+ if (!resolved.manifest && (!resolved.brand || !resolved.asset || !resolved.source)) {
421
+ write('Missing --brand, --asset, and --source (or --manifest / --drop-dir). Use a TTY for interactive mode.\n');
422
+ return 2;
423
+ }
424
+
425
+ const spec = buildSpecFromArgs(resolved);
426
+ if (action === 'plan') {
427
+ const plan = await planBrandAssetPromotion(spec, {
428
+ deliveryAdapter: resolved.images ? new CloudflareImagesDeliveryAdapter() : null,
429
+ });
430
+ writeResult(write, opts, plan);
431
+ return 0;
432
+ }
433
+
434
+ const result = await promoteBrandAssets(spec, {
435
+ cwd: resolved.cwd,
436
+ dryRun: resolved.dryRun,
437
+ yes: resolved.yes,
438
+ publish: resolved.yes,
439
+ derive: true,
440
+ storageAdapter: resolved.bucket || resolved.storageBinding
441
+ ? undefined
442
+ : new MemoryStorageAdapter(),
443
+ deliveryAdapter: resolved.images ? new CloudflareImagesDeliveryAdapter() : null,
444
+ force: resolved.force,
445
+ });
446
+ writeResult(write, opts, result);
447
+ return 0;
448
+ }
449
+
450
+ if (action === 'publish') {
451
+ if (!opts.brand || !opts.asset) {
452
+ write('publish requires --brand and --asset\n');
453
+ return 2;
454
+ }
455
+ const storage = opts.bucket
456
+ ? new FilesystemStorageAdapter({ rootDir: path.join(opts.cwd, '.agentsam', 'brand-store', opts.bucket) })
457
+ : new FilesystemStorageAdapter({ rootDir: path.join(opts.cwd, '.agentsam', 'brand-store') });
458
+ const result = await publishBrandAssets({
459
+ cwd: opts.cwd,
460
+ brand: opts.brand,
461
+ asset: opts.asset,
462
+ version: opts.version,
463
+ dryRun: opts.dryRun,
464
+ force: opts.force,
465
+ storageAdapter: storage,
466
+ deliveryAdapter: opts.images ? new CloudflareImagesDeliveryAdapter() : null,
467
+ });
468
+ writeResult(write, opts, result);
469
+ return 0;
470
+ }
471
+
472
+ if (action === 'verify') {
473
+ if (!opts.brand || !opts.asset) {
474
+ write('verify requires --brand and --asset\n');
475
+ return 2;
476
+ }
477
+ const storage = new FilesystemStorageAdapter({
478
+ rootDir: path.join(opts.cwd, '.agentsam', 'brand-store', opts.bucket || ''),
479
+ });
480
+ const result = await verifyBrandAssets({
481
+ cwd: opts.cwd,
482
+ brand: opts.brand,
483
+ asset: opts.asset,
484
+ version: opts.version,
485
+ storageAdapter: storage,
486
+ });
487
+ writeResult(write, opts, result);
488
+ return result.ok ? 0 : 1;
489
+ }
490
+
491
+ write(`unknown action: ${action}\n`);
492
+ return 2;
493
+ } catch (err) {
494
+ const payload = {
495
+ ok: false,
496
+ error: err?.code || 'brand_command_failed',
497
+ message: err?.message || String(err),
498
+ details: err?.details || null,
499
+ };
500
+ writeResult(write, { json: true }, payload);
501
+ return 1;
502
+ }
503
+ }