@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
package/AGENTSAM.md CHANGED
@@ -76,6 +76,17 @@ conventional client variable for that machinery, never a human identity. Prefer
76
76
  See [Storage architecture](docs/architecture/STORAGE.md) for enforcement and
77
77
  the current compatibility boundary.
78
78
 
79
+ ## Application contract (APP identity)
80
+
81
+ Portable product apps follow [`docs/architecture/AGENTSAM_APPLICATION_CONTRACT.md`](docs/architecture/AGENTSAM_APPLICATION_CONTRACT.md).
82
+
83
+ - **APP** = installable product (`agentsam.app.json`, immutable kebab-case `APP.id`).
84
+ - **Not** an APP merely because it is under `apps/`, deployable, or an npm package.
85
+ - Runtime identity: `import APP from "./agentsam.app.json"` — never `const APP = "agentsam-…"`.
86
+ - `.agentsam/app.json` is host/install state (`app_id`), not a second product definition.
87
+ - Package, Worker, route, desktop, and service names are separate namespaces with explicit pointers.
88
+ - Gate: `agentsam app validate` / `npm run guard:apps`.
89
+
79
90
  ## Model and run policy
80
91
 
81
92
  - Model, reasoning effort, service tier, budget, and permissions are runtime configuration, not hidden prompt instructions.
package/README.md CHANGED
@@ -76,19 +76,24 @@ Without a global install, use `npx @inneranimalmedia/agentsam-sdk create my-agen
76
76
 
77
77
  ## MCP setup
78
78
 
79
- Cloudflare's API MCP server uses `https://mcp.cloudflare.com/mcp`. Add that URL
80
- to the agent client you use, then complete its Cloudflare OAuth flow. For Codex:
79
+ Register MCP servers into `~/.agentsam/mcp/` and sync IDE adapters:
81
80
 
82
81
  ```sh
83
- codex mcp add cloudflare-api --url https://mcp.cloudflare.com/mcp
84
- codex mcp login cloudflare-api
82
+ agentsam mcp add inneranimalmedia --client cursor
83
+ agentsam mcp add cloudflare-api --client cursor
84
+ agentsam mcp list --bundles # Cloudflare portal bundles + pack scopes
85
+ agentsam mcp scopes cloudflare-bindings
86
+ agentsam mcp doctor cloudflare-api
85
87
  ```
86
88
 
87
- `agentsam mcp add cloudflare-api --url https://mcp.cloudflare.com/mcp` is not
88
- currently an AgentSam CLI command. The repo's `.agentsam/config.json` is a
89
- portable project manifest, not an MCP client configuration; it cannot register
90
- this server for every agent tool on clone. Keep OAuth tokens in each client's
91
- credential store rather than committing them to the repository.
89
+ Cloudflare MCP portals (bindings, builds, browser, …) are **server bundles**, not
90
+ OAuth clients. AgentSam Cloudflare OAuth stays pack-scoped (`agentsam` pack includes
91
+ `mcp-portals.read` / `mcp-portals.write`). Never request the full ~315-scope catalog
92
+ at connect time — upgrade with `agentsam cloudflare permissions authorize --packs …`.
93
+
94
+ Portal-hosted OAuth (Cloudflare’s own consent on `*.mcp.cloudflare.com`) is separate
95
+ from AgentSam’s CF connection token. Keep tokens in each client’s credential store;
96
+ do not commit them.
92
97
 
93
98
  ## Index an existing repository
94
99
 
@@ -126,6 +131,7 @@ read-only `repository.snapshot` composition primitive. See [Capabilities and pre
126
131
  | File integrity | `agentsam merkle`; `/merkle` | [Merkle](docs/MERKLE.md) |
127
132
  | Security, trust-boundary scan, and repair | `agentsam security`; `/security` | [Security](docs/SECURITY.md) |
128
133
  | Mini prototypes | `agentsam mini`; `/mini` | [Mini](docs/MINI.md) |
134
+ | Machine Intelligence (MINI/APP/WORLD ladder) | world-state / maturity (in progress) | [Machine Intelligence](docs/MACHINE_INTELLIGENCE.md) · [Tomorrow briefing](docs/plans/TOMORROW-MACHINE-FIRST-BRIEFING.md) |
129
135
  | Recon bounded-worker packets | `agentsam recon pack\|validate` | [Recon](docs/RECON.md) |
130
136
  | Local containers | `agentsam dockerize`; `/dockerize` | [Dockerize](docs/DOCKERIZE.md) |
131
137
  | Background indexing service | Docker `knowledge_service`; `/knowledge-service-client` | [Knowledge service](docs/knowledge-service.md) |
@@ -0,0 +1,12 @@
1
+ # Client CMS Editor workspace law
2
+
3
+ - This app is an independent workspace root. Keep one active lockfile at `apps/client-cms-editor/package-lock.json`.
4
+ - Do not add its frontend/backend/shared packages to the SDK root workspace list.
5
+ - Product-neutral AgentSam contracts/UI live in `packages/agentsam-contracts` and `packages/agentsam-workbench`.
6
+ - Do not import from `apps/local-studio` or `apps/cad-creator`.
7
+ - `shared/cms` owns pure CMS editor/publication/config contracts only; no React and no vendor runtime SDKs.
8
+ - `backend/` is the portable host API/routing/preview bridge. Do not duplicate the canonical Inner Animal Media CMS server domain here.
9
+ - Public CMS runtime must remain smaller than the authoring app. Do not ship Monaco, terminal, browser automation, auth-admin, or the whole AgentSam workbench to anonymous visitors.
10
+ - `SESSION_CACHE` is never auth/session authority. `MY_CONTAINER` is never identity authority.
11
+ - CMS AgentSam context must be explicit. Never scrape editor/site state silently.
12
+ - Prefer structured/versioned section data for publication. Arbitrary executable editor HTML is not a public-content authority.
@@ -0,0 +1,8 @@
1
+ {
2
+ "source_repository": "SamPrimeaux/inneranimalmedia",
3
+ "source_path": "packages/client-cms-editor",
4
+ "source_commit": "5957af19dfb67e1551d0174b72141dd65acc4972",
5
+ "source_ref": "origin/main",
6
+ "imported_as": "apps/client-cms-editor",
7
+ "note": "Imported as real files, then normalized into an independent npm workspace root. Canonical platform CMS server/domain code remains in inneranimalmedia src/core/agentsam/cms until a dedicated agentsam-cms package extraction."
8
+ }
@@ -0,0 +1,72 @@
1
+ # AgentSam Client CMS Editor
2
+
3
+ Authoring/control application for AgentSam CMS. This directory is a self-contained npm workspace root inside the SDK repository and is intentionally **not** part of the SDK root workspace graph.
4
+
5
+ It was imported from `SamPrimeaux/inneranimalmedia` at the exact revision recorded in `IMPORT_PROVENANCE.json`. The donor browser editor is preserved, then normalized into explicit frontend/backend/shared package boundaries.
6
+
7
+ ```text
8
+ apps/client-cms-editor/
9
+ ├─ package.json
10
+ ├─ package-lock.json
11
+ ├─ frontend/ CMS authoring UI + shared AgentSam workbench adapter
12
+ │ ├─ package.json
13
+ │ └─ src/
14
+ ├─ backend/ host-neutral CMS API/routing/preview client bridge
15
+ │ ├─ package.json
16
+ │ └─ src/
17
+ ├─ shared/
18
+ │ └─ cms/ pure CMS editor/publication/binding/context contracts
19
+ │ ├─ package.json
20
+ │ └─ src/
21
+ └─ reference/ immutable donor docs/lock/config for comparison only
22
+ ```
23
+
24
+ ## Product boundary
25
+
26
+ CMS Studio is the authenticated authoring/control product. It is **not** the public website runtime.
27
+
28
+ ```text
29
+ CMS Studio
30
+ ├─ pages / sections / themes / assets
31
+ ├─ AgentSam through @inneranimalmedia/agentsam-workbench
32
+ ├─ preview
33
+ └─ publish
34
+ ↓
35
+ publication snapshot
36
+ ├─ D1 metadata
37
+ └─ WEBSITE_ASSETS (R2 content/media/theme artifacts)
38
+ ↓
39
+ small public CMS runtime
40
+ ↓
41
+ <public-host>/*
42
+ ```
43
+
44
+ The visitor-facing runtime should ship its normal frontend JavaScript through the normal static deployment bundle. R2 is for CMS-managed content/media and generated artifacts, not a replacement for the application bundle.
45
+
46
+ ## Shared AgentSam rule
47
+
48
+ CMS must not invent its own chat/browser/terminal/auth stack. `frontend/src/CmsAgentSurface.tsx` is a thin CMS adapter around `@inneranimalmedia/agentsam-workbench`; the host supplies an `AgentWorkbenchAdapter`, authenticated `AgentPrincipal`, and explicit CMS context. No fake AgentSam endpoint is provided by this app.
49
+
50
+ Identity remains outside the workbench. IAM establishes `accountId` / `authUserId`, application authorization resolves CMS access, and only then may optional browser/container execution be created.
51
+
52
+ ## Cloud binding contract
53
+
54
+ `shared/cms/src/cloudflare-bindings.ts` defines the capability-driven names. `DB` and `WEBSITE_ASSETS` are the CMS cloud baseline. `SESSION_CACHE` is cache-only and cannot be identity/session authority. `MY_CONTAINER` and `MYBROWSER` are optional execution capabilities and cannot establish identity.
55
+
56
+ ## Canonical CMS backend
57
+
58
+ This app's `backend/` is currently the portable API/routing/preview bridge that talks to `/api/cms/*`. The full canonical CMS domain still lives in the Inner Animal Media platform under `src/core/agentsam/cms/` at the donor revision. Do not copy that 166-file domain into this app and create a second authority. Its next extraction target is a product-neutral `packages/agentsam-cms/` family.
59
+
60
+ ## Development
61
+
62
+ From this directory:
63
+
64
+ ```bash
65
+ npm ci
66
+ npm run typecheck
67
+ npm test
68
+ npm run build
69
+ npm run dev
70
+ ```
71
+
72
+ Standalone dev requires explicit site context, for example `/?site=my-site`. In a real authenticated host, mount `CmsEditor` with the resolved site/project identity.
@@ -0,0 +1,57 @@
1
+ {
2
+ "schema": "agentsam.app.v1",
3
+ "id": "client-cms-editor",
4
+ "product_id": "cms",
5
+ "name": "AgentSam CMS Editor",
6
+ "kind": "app",
7
+ "package": "@inneranimalmedia/client-cms-editor",
8
+ "version": "0.1.0",
9
+ "entrypoints": {
10
+ "frontend": "./frontend",
11
+ "backend": "./backend",
12
+ "cli": "./bin/agentsam-cms.mjs"
13
+ },
14
+ "capabilities": [
15
+ "cms",
16
+ "media",
17
+ "templates",
18
+ "admin_content"
19
+ ],
20
+ "provides": [
21
+ "cms.editor",
22
+ "cms.templates",
23
+ "cms.media.library",
24
+ "workspace.panel"
25
+ ],
26
+ "surfaces": [
27
+ "store",
28
+ "theme-editor",
29
+ "cms-editor",
30
+ "templates",
31
+ "media-library",
32
+ "agentsam"
33
+ ],
34
+ "runtime": {
35
+ "local_preview": "ready",
36
+ "source_scaffold": "ready",
37
+ "cloudflare": "ready",
38
+ "github": "source-ready",
39
+ "browser": true,
40
+ "local": true
41
+ },
42
+ "commands": {
43
+ "preview": "agentsam-cms",
44
+ "doctor": "agentsam-cms doctor",
45
+ "scaffold": "agentsam-cms scaffold <directory>",
46
+ "info": "agentsam-cms info"
47
+ },
48
+ "bin": "bin/agentsam-cms.mjs",
49
+ "install": {
50
+ "command": "agentsam app scaffold client-cms-editor",
51
+ "selector": "client-cms-editor",
52
+ "paths": [
53
+ "/install/cms",
54
+ "/install/client-cms-editor"
55
+ ]
56
+ }
57
+ }
@@ -0,0 +1,5 @@
1
+ # CMS backend bridge
2
+
3
+ This workspace package is the portable CMS client/backend boundary: HTTP API calls, model mapping, routing, preview messages and storefront URL helpers. It does not own the platform CMS server implementation or identity authority.
4
+
5
+ The current platform implementation remains `inneranimalmedia/src/core/agentsam/cms/` until it is extracted into reusable `agentsam-cms-*` packages.
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "@inneranimalmedia/agentsam-cms-backend",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "exports": {
7
+ ".": "./src/index.ts",
8
+ "./api": "./src/api/client.ts",
9
+ "./model": "./src/model.ts",
10
+ "./preview": "./src/preview/bridge.ts",
11
+ "./routing": "./src/routing/index.js"
12
+ },
13
+ "scripts": {
14
+ "typecheck": "tsc --noEmit -p tsconfig.json"
15
+ },
16
+ "dependencies": {
17
+ "@inneranimalmedia/agentsam-cms-shared": "0.1.0"
18
+ },
19
+ "devDependencies": {
20
+ "typescript": "^5.9.3"
21
+ }
22
+ }
@@ -0,0 +1,200 @@
1
+ import { mapCmsEditorBlock, mapCmsEditorBootstrap, mapCmsEditorPage, mapCmsEditorSection } from '../model';
2
+ import type { CmsEditorBlock, CmsEditorPage, CmsEditorSection } from '@inneranimalmedia/agentsam-cms-shared';
3
+ import { buildDemoCmsBootstrap } from '../demo-bootstrap';
4
+
5
+ type Json = Record<string, any>;
6
+ type ApiInit = Omit<RequestInit, 'body'> & { body?: any };
7
+
8
+ function useDemoBootstrap(projectSlug?: string) {
9
+ const slug = String(projectSlug || '').trim().toLowerCase();
10
+ if (slug === 'demo' || slug === 'scaffold' || slug === 'preview' || slug === '') return true;
11
+ if (typeof window !== 'undefined') {
12
+ const host = window.location.hostname;
13
+ if (host === 'localhost' || host === '127.0.0.1') return true;
14
+ const params = new URLSearchParams(window.location.search);
15
+ if (params.get('demo') === '1' || params.get('preview') === '1') return true;
16
+ }
17
+ return false;
18
+ }
19
+
20
+ /** Offline first-run: never hit Worker APIs (avoids "Not Found" toasts). */
21
+ function demoOk<T extends Json = Json>(payload: T = {} as T): Promise<T> {
22
+ return Promise.resolve(payload);
23
+ }
24
+
25
+ async function api<T extends Json = Json>(path: string, init: ApiInit = {}): Promise<T> {
26
+ if (useDemoBootstrap()) {
27
+ return demoOk<T>({} as T);
28
+ }
29
+ const headers = new Headers(init.headers);
30
+ let body = init.body;
31
+ if (body != null && !(body instanceof FormData) && typeof body !== 'string') {
32
+ headers.set('Content-Type', 'application/json');
33
+ body = JSON.stringify(body);
34
+ }
35
+ const response = await fetch(path, { ...init, body, headers, credentials: 'include', cache: 'no-store' });
36
+ const payload = await response.json().catch(() => ({}));
37
+ if (!response.ok) {
38
+ const message = payload?.message || payload?.error || response.statusText || 'Request failed';
39
+ throw Object.assign(new Error(String(message)), { status: response.status, payload });
40
+ }
41
+ return payload as T;
42
+ }
43
+
44
+ export async function getCmsEditorBootstrap(projectSlug: string, focusPageId?: string | null) {
45
+ if (useDemoBootstrap(projectSlug)) {
46
+ return mapCmsEditorBootstrap(buildDemoCmsBootstrap(projectSlug || 'demo'), projectSlug || 'demo');
47
+ }
48
+ try {
49
+ const params = new URLSearchParams({ project_slug: projectSlug, site: projectSlug });
50
+ if (focusPageId) params.set('page_id', focusPageId);
51
+ return mapCmsEditorBootstrap(await api<Json>(`/api/cms/bootstrap?${params}`), projectSlug);
52
+ } catch (error) {
53
+ // Local first-run: fall back to the real editor shell with demo content.
54
+ if (typeof window !== 'undefined' && (location.hostname === 'localhost' || location.hostname === '127.0.0.1')) {
55
+ return mapCmsEditorBootstrap(buildDemoCmsBootstrap(projectSlug || 'demo'), projectSlug || 'demo');
56
+ }
57
+ throw error;
58
+ }
59
+ }
60
+
61
+ export async function getCmsEditorPagePreview(pageId: string, mode: 'draft' | 'published' = 'draft') {
62
+ if (useDemoBootstrap()) {
63
+ return demoOk({ id: pageId, preview: mode, html: null, _demo: true });
64
+ }
65
+ return api<Json>(`/api/cms/pages/${encodeURIComponent(pageId)}?preview=${encodeURIComponent(mode)}`);
66
+ }
67
+
68
+ export const saveCmsEditorSection = (sectionId: string, fields: Record<string, any>, css?: Record<string, any>) =>
69
+ api(`/api/cms/sections/${encodeURIComponent(sectionId)}`, { method: 'PUT', body: { section_data: { ...fields, ...(css && Object.keys(css).length ? { css_override: css } : {}) } } });
70
+ export const renameCmsEditorSection = (sectionId: string, sectionName: string) => api(`/api/cms/sections/${encodeURIComponent(sectionId)}`, { method: 'PUT', body: { section_name: sectionName } });
71
+ export const reorderCmsEditorSections = (pageId: string, sections: CmsEditorSection[]) => api('/api/cms/sections/reorder', { method: 'POST', body: { page_id: pageId, order: sections.map((section, index) => ({ id: section.id, sort_order: (index + 1) * 10 })) } });
72
+ export const setCmsEditorSectionVisibility = (sectionId: string, visible: boolean) => api(`/api/cms/sections/${encodeURIComponent(sectionId)}/visibility`, { method: 'POST', body: { is_visible: visible ? 1 : 0 } });
73
+ export async function createCmsEditorSection(pageId: string, name: string, fields: Record<string, any>, sortOrder: number) {
74
+ if (useDemoBootstrap()) {
75
+ return mapCmsEditorSection({
76
+ id: `sec_local_${Date.now()}`,
77
+ section_name: name,
78
+ section_type: name.toLowerCase().replace(/\s+/g, '-'),
79
+ section_data: fields,
80
+ is_visible: 1,
81
+ sort_order: sortOrder,
82
+ });
83
+ }
84
+ const result = await api<Json>('/api/cms/sections', { method: 'POST', body: { page_id: pageId, section_type: name.toLowerCase().replace(/\s+/g, '-'), section_name: name, section_data: fields, sort_order: sortOrder } });
85
+ return mapCmsEditorSection(result.section || { id: result.id, section_name: name, section_type: name, section_data: fields, is_visible: 1 });
86
+ }
87
+
88
+ export async function listCmsEditorBlocks(sectionId: string) {
89
+ if (useDemoBootstrap()) return [];
90
+ const result = await api<Json>(`/api/cms/blocks?section_id=${encodeURIComponent(sectionId)}`);
91
+ return (result.blocks || result.components || []).map((row: Json) => mapCmsEditorBlock(row, sectionId));
92
+ }
93
+ export async function createCmsEditorBlock(sectionId: string, type: string, data: Record<string, any>, sortOrder = 10) {
94
+ const blockType = String(type || 'text').trim() || 'text';
95
+ if (useDemoBootstrap()) {
96
+ return mapCmsEditorBlock({
97
+ id: `blk_local_${Date.now()}`,
98
+ section_id: sectionId,
99
+ type: blockType,
100
+ block_type: blockType,
101
+ data,
102
+ sort_order: sortOrder,
103
+ is_visible: 1,
104
+ }, sectionId);
105
+ }
106
+ const result = await api<Json>('/api/cms/blocks', {
107
+ method: 'POST',
108
+ body: {
109
+ section_id: sectionId,
110
+ type: blockType,
111
+ block_type: blockType,
112
+ component_type: blockType,
113
+ data,
114
+ sort_order: sortOrder,
115
+ },
116
+ });
117
+ return mapCmsEditorBlock(result.block || result.component || { id: result.id, section_id: sectionId, type: blockType, data }, sectionId);
118
+ }
119
+ export const saveCmsEditorBlock = (block: CmsEditorBlock) => api(`/api/cms/blocks/${encodeURIComponent(block.id)}`, { method: 'PUT', body: { block_data: block.data, block_type: block.type, type: block.type, component_type: block.type } });
120
+ export const setCmsEditorBlockVisibility = (blockId: string, visible: boolean) => api(`/api/cms/blocks/${encodeURIComponent(blockId)}/visibility`, { method: 'POST', body: { is_visible: visible ? 1 : 0 } });
121
+ export const reorderCmsEditorBlocks = (blocks: CmsEditorBlock[]) => api('/api/cms/blocks/reorder', { method: 'POST', body: { order: blocks.map((block, index) => ({ id: block.id, sort_order: (index + 1) * 10 })) } });
122
+
123
+ export async function createCmsEditorPage(projectSlug: string, input: { title: string; slug: string; type: string }) {
124
+ const slug = input.slug.replace(/^\/+/, '') || 'untitled';
125
+ if (useDemoBootstrap(projectSlug)) {
126
+ return mapCmsEditorPage({
127
+ id: `page_local_${Date.now()}`,
128
+ title: input.title || 'Untitled',
129
+ slug,
130
+ route_path: `/${slug}`,
131
+ page_type: input.type,
132
+ status: 'draft',
133
+ });
134
+ }
135
+ const result = await api<Json>('/api/cms/pages', { method: 'POST', body: { project_id: projectSlug, title: input.title || 'Untitled', slug, route_path: `/${slug}`, page_type: input.type, status: 'draft', content: '' } });
136
+ return mapCmsEditorPage({ ...result, id: result.id, title: input.title, slug, route_path: result.route_path || `/${slug}`, page_type: input.type, status: 'draft' });
137
+ }
138
+ export const saveCmsEditorPageMeta = (page: CmsEditorPage) => {
139
+ if (useDemoBootstrap()) return demoOk({ ok: true, id: page.id });
140
+ const route = page.slug.startsWith('/') ? page.slug : `/${String(page.slug || '').replace(/^\/+/, '')}`;
141
+ const normalizedRoute = route.length > 1 ? route.replace(/\/+$/, '') : route || '/';
142
+ const slug = normalizedRoute === '/' ? 'home' : normalizedRoute.replace(/^\/+/, '') || 'untitled';
143
+ return api(`/api/cms/pages/${encodeURIComponent(page.id)}`, {
144
+ method: 'PUT',
145
+ body: {
146
+ title: page.title,
147
+ route_path: normalizedRoute,
148
+ slug,
149
+ page_type: page.type,
150
+ seo_title: page.metaTitle,
151
+ meta_description: page.metaDescription,
152
+ },
153
+ });
154
+ };
155
+ export const publishCmsEditorPage = (pageId: string) => api(`/api/cms/pages/${encodeURIComponent(pageId)}/publish`, { method: 'POST', body: {} });
156
+ export const saveCmsEditorThemeVars = (projectSlug: string, vars: Record<string, string>) => api('/api/cms/theme-vars', { method: 'PATCH', body: { project_slug: projectSlug, vars } });
157
+
158
+ export async function getCmsEditorAssets() {
159
+ if (useDemoBootstrap()) return [];
160
+ const result = await api<Json>('/api/cms/assets');
161
+ return (result.assets || []).map((asset: Json, index: number) => ({ id: asset.id || index, name: asset.original_filename || asset.filename || asset.label || 'Asset', type: String(asset.mime_type || '').startsWith('video/') ? 'Video' : String(asset.mime_type || '').includes('font') ? 'Font' : String(asset.mime_type || '').includes('pdf') ? 'Document' : 'Image', size: asset.content_size_bytes ? `${(Number(asset.content_size_bytes) / 1e6).toFixed(1)} MB` : '—', color: ['#5346db', '#d2e9df', '#ebc59d', '#25302b', '#705cf0', '#e6e0d3'][index % 6], previewUrl: asset.thumbnail_url || asset.cdn_url || asset.public_url || null }));
162
+ }
163
+ export async function getCmsEditorTemplates() {
164
+ if (useDemoBootstrap()) {
165
+ return [
166
+ { id: 'tpl_baseline_landing', name: 'Landing page', type: 'page', category: 'Marketing', slug: 'landing', previewImageUrl: null, hasHtml: false },
167
+ { id: 'tpl_baseline_hero', name: 'Editorial hero', type: 'section', category: 'Portfolio', slug: 'hero', previewImageUrl: null, hasHtml: false },
168
+ { id: 'tpl_baseline_footer', name: 'Utility footer', type: 'section', category: 'Agency', slug: 'footer', previewImageUrl: null, hasHtml: false },
169
+ ];
170
+ }
171
+ const result = await api<Json>('/api/cms/templates');
172
+ return (result.templates || []).map((row: Json) => ({
173
+ id: String(row.id || ''),
174
+ name: String(row.template_name || row.iam_label || row.slug || 'Template'),
175
+ type: String(row.template_type || 'section'),
176
+ category: String(row.category || 'General'),
177
+ slug: row.slug ? String(row.slug) : null,
178
+ previewImageUrl: row.preview_image_url ? String(row.preview_image_url) : null,
179
+ hasHtml: Boolean(row.source_html_r2_key),
180
+ })).filter((row: { id: string }) => row.id);
181
+ }
182
+
183
+ export async function applyCmsEditorTemplate(templateId: string, input: { pageId?: string | null; projectSlug?: string | null } = {}) {
184
+ if (useDemoBootstrap(input.projectSlug || undefined)) {
185
+ return demoOk({ ok: true, template_id: templateId, page_id: input.pageId, _demo: true });
186
+ }
187
+ return api<Json>(`/api/cms/templates/${encodeURIComponent(templateId)}/apply`, {
188
+ method: 'POST',
189
+ body: {
190
+ page_id: input.pageId || undefined,
191
+ project_slug: input.projectSlug || undefined,
192
+ },
193
+ });
194
+ }
195
+ export async function getCmsEditorContacts() {
196
+ if (useDemoBootstrap()) return [];
197
+ const result = await api<Json>('/api/user/contacts');
198
+ return (result.contacts || []).map((row: Json, index: number) => ({ id:index,name:String(row.name||row.display_name||row.email||'Contact'),email:String(row.email||''),source:String(row.source||'Contact form'),date:String(row.updated_at||row.created_at||'Recently'),tag:Array.isArray(row.tags)?row.tags[0]||'Lead':row.tag||'Lead' }));
199
+ }
200
+ export const activateCmsEditorTheme = (themeSlug: string, accent?: string) => api('/api/cms/themes/activate', { method: 'POST', body: { slug: themeSlug, accent } });
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Offline first-run CMS site for localhost preview — feeds the real CmsEditor shell.
3
+ * Not a separate “scaffold UI”. Migrations/API stay authoritative in production.
4
+ */
5
+
6
+ export function buildDemoCmsBootstrap(projectSlug = 'demo') {
7
+ const pageId = 'page_home';
8
+ const heroId = 'sec_hero';
9
+ const gridId = 'sec_products';
10
+ const footerId = 'sec_footer';
11
+ const textBlockId = 'blk_join';
12
+
13
+ return {
14
+ tenant: {
15
+ name: 'Heuristic Theme',
16
+ domain: 'demo.localhost',
17
+ primary_color: '#1e6a6f',
18
+ },
19
+ public_domain: 'demo.localhost',
20
+ workspace_label: 'Heuristic Theme',
21
+ home_page: { id: pageId },
22
+ protocol_version: 1,
23
+ active_theme: {
24
+ css_vars: {
25
+ '--brand-primary': '#1e6a6f',
26
+ '--brand-secondary': '#123f42',
27
+ '--brand-accent': '#cfef5b',
28
+ '--color-bg': '#f5f2ea',
29
+ '--color-surface': '#ffffff',
30
+ '--color-text': '#101014',
31
+ '--color-text-muted': '#73737f',
32
+ '--font-heading': 'Inter',
33
+ '--font-body': 'Inter',
34
+ },
35
+ },
36
+ pages: [
37
+ {
38
+ id: pageId,
39
+ title: 'Home page',
40
+ slug: '/',
41
+ route_path: '/',
42
+ page_type: 'Home',
43
+ status: 'draft',
44
+ seo_title: 'Heuristic Theme',
45
+ meta_description: 'Stock CMS theme preview for AgentSam scaffolding.',
46
+ },
47
+ ],
48
+ sections_by_page: {
49
+ [pageId]: [
50
+ {
51
+ id: heroId,
52
+ section_name: 'Editorial hero',
53
+ section_type: 'hero',
54
+ is_visible: 1,
55
+ sort_order: 10,
56
+ section_data: {
57
+ headline: 'My Store',
58
+ subline: 'Stock heuristic-theme · first-run CMS surface',
59
+ cta_text: 'Shop collection',
60
+ eyebrow: 'Heuristic Theme',
61
+ bg_color: '#101014',
62
+ },
63
+ },
64
+ {
65
+ id: gridId,
66
+ section_name: 'Product grid',
67
+ section_type: 'product-grid',
68
+ is_visible: 1,
69
+ sort_order: 20,
70
+ section_data: {
71
+ title: 'Featured',
72
+ columns: 2,
73
+ },
74
+ },
75
+ {
76
+ id: footerId,
77
+ section_name: 'Footer',
78
+ section_type: 'footer',
79
+ is_visible: 1,
80
+ sort_order: 30,
81
+ section_data: {
82
+ zone: 'FOOTER',
83
+ bg_color: '#F3F0E8',
84
+ },
85
+ },
86
+ ],
87
+ },
88
+ blocks_by_section: {
89
+ [heroId]: [],
90
+ [gridId]: [
91
+ {
92
+ id: 'blk_card_1',
93
+ section_id: gridId,
94
+ block_type: 'product-card',
95
+ is_visible: 1,
96
+ sort_order: 10,
97
+ block_data: { title: 'Classic tee', price: '$19.99' },
98
+ },
99
+ {
100
+ id: 'blk_card_2',
101
+ section_id: gridId,
102
+ block_type: 'product-card',
103
+ is_visible: 1,
104
+ sort_order: 20,
105
+ block_data: { title: 'Soft tee', price: '$19.99' },
106
+ },
107
+ ],
108
+ [footerId]: [
109
+ {
110
+ id: textBlockId,
111
+ section_id: footerId,
112
+ block_type: 'text',
113
+ is_visible: 1,
114
+ sort_order: 10,
115
+ block_data: {
116
+ text: 'Join our email list',
117
+ typography_preset: 'Heading 4',
118
+ width: 'fit',
119
+ max_width: 'normal',
120
+ align: 'left',
121
+ },
122
+ },
123
+ ],
124
+ },
125
+ component_templates: [
126
+ { id: 'tpl_baseline_landing', template_name: 'Landing page', template_type: 'page', category: 'Marketing' },
127
+ { id: 'tpl_baseline_hero', template_name: 'Editorial hero', template_type: 'section', category: 'Portfolio' },
128
+ { id: 'tpl_baseline_footer', template_name: 'Utility footer', template_type: 'section', category: 'Agency' },
129
+ ],
130
+ schemas: {
131
+ protocol_version: 1,
132
+ sections: [
133
+ { key: 'hero', type: 'hero', version: 1, label: 'Editorial hero' },
134
+ { key: 'product-grid', type: 'product-grid', version: 1, label: 'Product grid' },
135
+ { key: 'footer', type: 'footer', version: 1, label: 'Footer' },
136
+ ],
137
+ blocks: [
138
+ { key: 'text', type: 'text', version: 1, label: 'Text' },
139
+ { key: 'product-card', type: 'product-card', version: 1, label: 'Product card' },
140
+ ],
141
+ },
142
+ _demo: true,
143
+ _project_slug: projectSlug,
144
+ };
145
+ }
@@ -0,0 +1,6 @@
1
+ export * from './api/client';
2
+ export * from '@inneranimalmedia/agentsam-cms-shared';
3
+ export * from './model';
4
+ export * from './preview/bridge';
5
+ export * from './preview/urls';
6
+ export * from './storefront';