@inneranimalmedia/agentsam-sdk 2.6.5 → 2.6.8

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 (400) hide show
  1. package/AGENTSAM.md +29 -0
  2. package/README.md +37 -0
  3. package/apps/README.md +5 -0
  4. package/apps/cad-creator/README.md +4 -4
  5. package/apps/cad-creator/shared/cad/package.json +1 -1
  6. package/apps/client-cms-editor/AGENTS.md +12 -7
  7. package/apps/client-cms-editor/README.md +76 -48
  8. package/apps/client-cms-editor/agentsam.app.json +26 -9
  9. package/apps/client-cms-editor/backend/package.json +20 -3
  10. package/apps/client-cms-editor/backend/src/api/client.ts +134 -101
  11. package/apps/client-cms-editor/backend/src/index.ts +1 -1
  12. package/apps/client-cms-editor/backend/src/model.ts +11 -115
  13. package/apps/client-cms-editor/backend/src/preview/bridge.ts +1 -1
  14. package/apps/client-cms-editor/backend/tsconfig.json +6 -1
  15. package/apps/client-cms-editor/bin/agentsam-cms.js +262 -0
  16. package/apps/client-cms-editor/bin/agentsam-cms.mjs +2 -228
  17. package/apps/client-cms-editor/frontend/package.json +16 -7
  18. package/apps/client-cms-editor/frontend/src/AgentSamDrawer.tsx +9 -41
  19. package/apps/client-cms-editor/frontend/src/CmsAgentSurface.tsx +19 -174
  20. package/apps/client-cms-editor/frontend/src/adapters/heuristic.ts +29 -0
  21. package/apps/client-cms-editor/frontend/src/adapters/http.ts +628 -0
  22. package/apps/client-cms-editor/frontend/src/adapters/memory.ts +510 -0
  23. package/apps/client-cms-editor/frontend/src/editor/CmsEditor.tsx +213 -0
  24. package/apps/client-cms-editor/frontend/src/editor/CmsEditorProvider.tsx +20 -0
  25. package/apps/client-cms-editor/frontend/src/editor/canvas/PreviewCanvas.tsx +53 -0
  26. package/apps/client-cms-editor/frontend/src/{CmsEditor.tsx → editor/legacy/CmsEditorPrototype.tsx} +52 -23
  27. package/apps/client-cms-editor/frontend/src/editor/useCmsEditorController.ts +218 -0
  28. package/apps/client-cms-editor/frontend/src/index.ts +19 -5
  29. package/apps/client-cms-editor/frontend/src/lib/agent-host.ts +24 -0
  30. package/apps/client-cms-editor/frontend/src/main.tsx +82 -8
  31. package/apps/client-cms-editor/frontend/src/mount.tsx +92 -30
  32. package/apps/client-cms-editor/frontend/src/styles/agentsam-drawer.css +1 -1
  33. package/apps/client-cms-editor/frontend/src/styles/cmsShell.css +8 -8
  34. package/apps/client-cms-editor/frontend/src/styles/studio.css +55 -3
  35. package/apps/client-cms-editor/frontend/tsconfig.json +12 -1
  36. package/apps/client-cms-editor/frontend/vite.config.ts +12 -0
  37. package/apps/client-cms-editor/package-lock.json +973 -134
  38. package/apps/client-cms-editor/package.json +118 -6
  39. package/apps/client-cms-editor/reference/harvest/HARVEST_RECEIPT.json +201 -0
  40. package/apps/client-cms-editor/reference/harvest/PROVENANCE_HISTORY.txt +10 -0
  41. package/apps/client-cms-editor/reference/harvest/README.md +8 -0
  42. package/apps/client-cms-editor/reference/harvest/plans/ARCHIVE-INTAKE.md +135 -0
  43. package/apps/client-cms-editor/reference/harvest/plans/CHATGPT-IDENTITY-HARVEST.md +83 -0
  44. package/apps/client-cms-editor/reference/harvest/plans/CMS-EDITOR-HARVEST.md +166 -0
  45. package/apps/client-cms-editor/reference/harvest/plans/HARVEST-INDEX.md +196 -0
  46. package/apps/client-cms-editor/reference/harvest/plans/INNERANIMALS-CONTENT-001.md +137 -0
  47. package/apps/client-cms-editor/reference/harvest/plans/NO-IMPLICIT-SIDE-EFFECTS.md +87 -0
  48. package/apps/client-cms-editor/reference/harvest/plans/STOREFRONT-SURFACE-MAP.md +140 -0
  49. package/apps/client-cms-editor/reference/harvest/plans/THEME-INNERANIMALS-HARVEST.md +137 -0
  50. package/apps/client-cms-editor/reference/harvest/plans/TOOLING-LAB.md +63 -0
  51. package/apps/client-cms-editor/reference/harvest/plans/harvest-manifest.json +97 -0
  52. package/apps/client-cms-editor/reference/harvest/plans/local-cms-harvest-schema.sql +328 -0
  53. package/apps/client-cms-editor/shared/cms/package.json +17 -7
  54. package/apps/client-cms-editor/shared/cms/src/adapter.ts +204 -0
  55. package/apps/client-cms-editor/shared/cms/src/agent-context.ts +7 -5
  56. package/apps/client-cms-editor/shared/cms/src/editor-types.ts +32 -0
  57. package/apps/client-cms-editor/shared/cms/src/host.ts +82 -0
  58. package/apps/client-cms-editor/shared/cms/src/index.ts +4 -0
  59. package/apps/client-cms-editor/shared/cms/src/map.ts +115 -0
  60. package/apps/client-cms-editor/shared/cms/src/starter-pack.ts +158 -0
  61. package/contracts/source-types.v1.json +353 -0
  62. package/docs/CMS_CONTEXTUAL_COMPOSER.md +1 -1
  63. package/docs/PRODUCT_LIFECYCLE.md +566 -0
  64. package/docs/REPO_FILE_MAP.txt +132 -0
  65. package/docs/THEME_REFINERY.md +2 -2
  66. package/docs/architecture/AGENTSAM_RUNTIME_PROTOCOL.md +40 -20
  67. package/docs/content-studio/REVISION_GATE_2026-09-27.md +1 -1
  68. package/docs/plans/LOCAL_STUDIO_DESKTOP_RELEASE_2026-09-29.md +150 -0
  69. package/migrations/d1/0017_identity_native_oauth.sql +21 -0
  70. package/migrations/d1/0018_goap_control_plane_remaster.sql +40 -0
  71. package/migrations/d1/0019_agentsam_agent_run_plan_todo.sql +14 -0
  72. package/migrations/d1/README_PORTABLE_CONTROL_PLANE.md +20 -9
  73. package/migrations/runtime/0002_goap_blackboard_v1.sql +15 -0
  74. package/migrations/runtime/0004_agent_run_plan_linkage.sql +8 -0
  75. package/native/agentsam-machine/Cargo.lock +426 -0
  76. package/native/agentsam-machine/Cargo.toml +9 -0
  77. package/native/agentsam-machine/cli/Cargo.toml +21 -0
  78. package/native/agentsam-machine/cli/README.md +21 -0
  79. package/native/agentsam-machine/cli/src/main.rs +77 -0
  80. package/native/agentsam-machine/core/Cargo.toml +22 -0
  81. package/native/agentsam-machine/core/README.md +14 -0
  82. package/native/agentsam-machine/core/build.rs +33 -0
  83. package/native/agentsam-machine/core/contracts/source-types.v1.json +353 -0
  84. package/native/agentsam-machine/core/src/assets.rs +790 -0
  85. package/native/agentsam-machine/core/src/bound.rs +298 -0
  86. package/native/agentsam-machine/core/src/enrich.rs +706 -0
  87. package/native/agentsam-machine/core/src/frontend.rs +442 -0
  88. package/native/agentsam-machine/core/src/lib.rs +1092 -0
  89. package/native/agentsam-machine/core/src/liquid.rs +528 -0
  90. package/native/agentsam-machine/core/src/source_types.rs +78 -0
  91. package/package.json +64 -24
  92. package/packages/agentsam-brand/README.md +1 -1
  93. package/packages/agentsam-brand/package.json +4 -4
  94. package/packages/agentsam-brand/src/index.js +1 -1
  95. package/packages/agentsam-contracts/package.json +13 -3
  96. package/packages/agentsam-contracts/src/tools.ts +22 -0
  97. package/packages/agentsam-errors/package.json +13 -3
  98. package/packages/agentsam-errors/src/index.js +1 -0
  99. package/packages/agentsam-errors/src/tool.js +56 -0
  100. package/packages/agentsam-errors/test/tool.test.mjs +58 -0
  101. package/packages/agentsam-goap/README.md +52 -0
  102. package/packages/agentsam-goap/package.json +37 -0
  103. package/packages/agentsam-goap/src/adapters/d1-sqlite.js +570 -0
  104. package/packages/agentsam-goap/src/adapters/memory.js +199 -0
  105. package/packages/agentsam-goap/src/contracts.js +226 -0
  106. package/packages/agentsam-goap/src/control-plane.js +112 -0
  107. package/packages/agentsam-goap/src/errors.js +157 -0
  108. package/packages/agentsam-goap/src/index.js +5 -0
  109. package/packages/agentsam-goap/src/world.js +202 -0
  110. package/packages/agentsam-goap/test/goap-control-plane.test.mjs +245 -0
  111. package/packages/agentsam-goap/test/world.test.mjs +79 -0
  112. package/packages/agentsam-knowledge/package.json +18 -4
  113. package/packages/agentsam-knowledge/src/autorag/index.js +10 -3
  114. package/packages/agentsam-knowledge/src/backends/index.js +33 -1
  115. package/packages/agentsam-knowledge/test/autorag.test.mjs +60 -1
  116. package/packages/agentsam-nav/dist/browser.global.js +21 -18
  117. package/packages/agentsam-nav/dist/browser.js +6807 -130
  118. package/packages/agentsam-nav/dist/index.js +6799 -122
  119. package/packages/agentsam-nav/package.json +24 -6
  120. package/packages/agentsam-queue-control/README.md +1 -1
  121. package/packages/agentsam-queue-control/package.json +7 -2
  122. package/packages/agentsam-rapid-rust/src/main.rs +1 -1
  123. package/packages/agentsam-repository/package.json +13 -3
  124. package/packages/agentsam-repository/src/goap.js +13 -14
  125. package/packages/agentsam-repository/src/source-types.js +8 -0
  126. package/packages/agentsam-repository/src/tickets.js +15 -22
  127. package/packages/agentsam-repository/test/goap-tickets-workspace-state.test.mjs +19 -8
  128. package/packages/agentsam-vault/package.json +14 -4
  129. package/packages/agentsam-workbench/package.json +15 -4
  130. package/packages/agentsam-workbench/src/agent/ToolPermissionRequest.tsx +94 -0
  131. package/packages/agentsam-workbench/src/agent/index.ts +2 -0
  132. package/packages/agentsam-workbench/src/agent/tool-permission.css +134 -0
  133. package/packages/connectors/cloudflare/package.json +15 -3
  134. package/packages/connectors/cloudflare/src/api-client.js +3 -2
  135. package/packages/connectors/cloudflare/src/families/vectorize.js +127 -0
  136. package/packages/connectors/cloudflare/src/index.js +1 -0
  137. package/packages/heuristic-theme/README.md +2 -2
  138. package/packages/heuristic-theme/package.json +8 -3
  139. package/packages/heuristic-theme/src/registry.js +2 -2
  140. package/packages/heuristic-theme/src/theme.js +1 -1
  141. package/packages/heuristic-theme/test/theme.test.mjs +1 -1
  142. package/packages/identity/.agentsam/features/oauth-login-portal/agentsam.feature.json +1 -1
  143. package/packages/identity/.agentsam/features/oauth-login-portal/providers.json +27 -7
  144. package/packages/identity/README.md +2 -2
  145. package/packages/identity/migrations/D1_SCHEMA_MAPPING.md +18 -15
  146. package/packages/identity/migrations/apply-portable.js +109 -0
  147. package/packages/identity/migrations/sqlite/004_identity_oauth_consent_catalog.sql +1 -1
  148. package/packages/identity/migrations/sqlite/005_identity_company_native.sql +52 -0
  149. package/packages/identity/package.json +27 -6
  150. package/packages/identity/schema/agentsam.identity/manifest.json +101 -0
  151. package/packages/identity/scripts/local-identity-bridge.mjs +13 -7
  152. package/packages/identity/scripts/preview-auth-portal.mjs +6 -6
  153. package/packages/identity/src/adapters/cloudflare-d1/index.js +8 -401
  154. package/packages/identity/src/adapters/iam-compat/index.js +540 -0
  155. package/packages/identity/src/adapters/portable-d1/index.js +18 -0
  156. package/packages/identity/src/adapters/portable-store.js +479 -0
  157. package/packages/identity/src/adapters/sqlite/index.js +13 -312
  158. package/packages/identity/src/contracts/auth-config.js +0 -1
  159. package/packages/identity/src/contracts/identity-store.js +56 -5
  160. package/packages/identity/src/contracts/provider.js +1 -0
  161. package/packages/identity/src/contracts/sign-in-options.js +104 -0
  162. package/packages/identity/src/core/constants.js +1 -1
  163. package/packages/identity/src/core/session-policy.js +31 -0
  164. package/packages/identity/src/frontend/auth-portal/pages/login.html +6 -6
  165. package/packages/identity/src/frontend/auth-portal/pages/reset.html +5 -5
  166. package/packages/identity/src/frontend/auth-portal/pages/signup.html +5 -5
  167. package/packages/identity/src/frontend/auth-portal/shared/company-branding.js +1 -1
  168. package/packages/identity/src/frontend/auth-portal/shared/desktop-identity-bridge.js +6 -37
  169. package/packages/identity/src/index.js +28 -1
  170. package/packages/identity/src/migrations/README.md +23 -23
  171. package/packages/identity/src/oauth/README.md +1 -1
  172. package/packages/identity/src/oauth/credentials.js +10 -11
  173. package/packages/identity/src/oauth/google-desktop-exchange.js +195 -27
  174. package/packages/identity/src/oauth/iam-platform.js +21 -9
  175. package/packages/identity/src/oauth/native-handoff.js +136 -0
  176. package/packages/identity/src/providers/chatgpt/headers.js +65 -0
  177. package/packages/identity/src/providers/chatgpt/index.js +86 -0
  178. package/packages/identity/src/providers/chatgpt/mapper.js +43 -0
  179. package/packages/identity/src/providers/chatgpt/paths.js +45 -0
  180. package/packages/identity/src/providers/github/oauth.js +1 -2
  181. package/packages/identity/src/providers/github/profile.js +16 -2
  182. package/packages/identity/src/providers/index.js +11 -3
  183. package/packages/identity/src/server/identity-service.js +2 -1
  184. package/packages/identity/src/server/worker-router.js +71 -18
  185. package/packages/identity/tests/chatgpt-provider.test.mjs +75 -0
  186. package/packages/identity/tests/google-desktop-identity-login.test.mjs +210 -0
  187. package/packages/identity/tests/identity-init-scaffold.test.mjs +15 -4
  188. package/packages/identity/tests/lane1-identity-store-parity.test.mjs +527 -0
  189. package/packages/identity/tests/lane1-packed-consumer.test.mjs +175 -0
  190. package/packages/identity/tests/native-oauth-handoff.test.mjs +292 -0
  191. package/packages/identity/tests/oauth-credentials.test.mjs +4 -4
  192. package/packages/identity/tests/preview-auth-portal.test.mjs +4 -2
  193. package/packages/identity/tests/session-routes-policy.test.mjs +13 -1
  194. package/packages/identity/tests/worker-runtime-boundary.test.mjs +11 -0
  195. package/packages/providers/completeful/package.json +7 -2
  196. package/packages/theme-church-site/package.json +17 -6
  197. package/packages/theme-church-site/src/harvest.json +4 -2
  198. package/packages/theme-church-site/src/index.js +7 -3
  199. package/packages/theme-church-site/test/theme.test.mjs +4 -2
  200. package/packages/theme-companions-site/package.json +17 -6
  201. package/packages/theme-companions-site/src/harvest.json +4 -2
  202. package/packages/theme-companions-site/src/index.js +7 -3
  203. package/packages/theme-companions-site/test/theme.test.mjs +4 -2
  204. package/packages/theme-floors-site/package.json +17 -6
  205. package/packages/theme-floors-site/src/harvest.json +4 -2
  206. package/packages/theme-floors-site/src/index.js +7 -3
  207. package/packages/theme-floors-site/test/theme.test.mjs +4 -2
  208. package/packages/theme-fuelnfree-site/package.json +17 -6
  209. package/packages/theme-fuelnfree-site/src/harvest.json +4 -2
  210. package/packages/theme-fuelnfree-site/src/index.js +7 -3
  211. package/packages/theme-fuelnfree-site/test/theme.test.mjs +4 -2
  212. package/packages/theme-handyman-site/package.json +17 -6
  213. package/packages/theme-handyman-site/src/harvest.json +4 -2
  214. package/packages/theme-handyman-site/src/index.js +7 -3
  215. package/packages/theme-handyman-site/test/theme.test.mjs +4 -2
  216. package/packages/theme-insurance-site/package.json +17 -6
  217. package/packages/theme-insurance-site/src/harvest.json +4 -2
  218. package/packages/theme-insurance-site/src/index.js +7 -3
  219. package/packages/theme-insurance-site/test/theme.test.mjs +4 -2
  220. package/packages/theme-scenes/README.md +1 -1
  221. package/packages/theme-scenes/package.json +4 -3
  222. package/packages/theme-scenes/src/registry.js +187 -0
  223. package/packages/theme-shinshu-site/package.json +17 -6
  224. package/packages/theme-shinshu-site/src/harvest.json +4 -2
  225. package/packages/theme-shinshu-site/src/index.js +7 -3
  226. package/packages/theme-shinshu-site/test/theme.test.mjs +4 -2
  227. package/packages/work-graph/package.json +14 -4
  228. package/protocol/FILEMETA_V1.md +2 -2
  229. package/protocol/capabilities/manifest.json +1 -1
  230. package/protocol/database/agentsam.schema-pack.v1.schema.json +72 -0
  231. package/protocol/presets/catalog.json +2 -2
  232. package/protocol/theme-refinery/lineage-registry.json +105 -0
  233. package/protocol/theme-refinery/product-metadata.schema.json +21 -1
  234. package/python/agentsam_sdk/repository/intelligence/discovery.py +27 -2
  235. package/python/agentsam_sdk/repository/intelligence/git.py +4 -0
  236. package/python/tests/test_repository_intelligence.py +30 -0
  237. package/src/cli/command-catalog.js +48 -5
  238. package/src/cli/dispatch.js +1 -0
  239. package/src/cli.js +20 -1
  240. package/src/cloudflare/runtime-status.js +2 -1
  241. package/src/commands/autorag.js +67 -13
  242. package/src/commands/cheat-sheet.js +29 -4
  243. package/src/commands/codebaseindex.js +45 -2
  244. package/src/commands/goap-world.js +134 -0
  245. package/src/commands/goap.js +11 -4
  246. package/src/commands/knowledge.js +59 -2
  247. package/src/commands/machine-binary.js +109 -0
  248. package/src/commands/machine-runtime.js +266 -0
  249. package/src/commands/machine.js +208 -0
  250. package/src/commands/package.js +530 -0
  251. package/src/commands/plan-ledger.js +370 -0
  252. package/src/commands/plan.js +183 -0
  253. package/src/commands/security.js +67 -4
  254. package/src/commands/setup.js +33 -16
  255. package/src/commands/skill.js +78 -17
  256. package/src/commands/status.js +8 -1
  257. package/src/features/resolve.js +1 -0
  258. package/src/knowledge/engine.js +21 -2
  259. package/src/knowledge/runtime-discovery.js +127 -0
  260. package/src/knowledge/source.js +1 -1
  261. package/src/lib/identity-scaffold.js +53 -13
  262. package/src/lib/setup/recipes.js +1 -1
  263. package/src/lib/slash-commands.js +1 -1
  264. package/src/local/runtime-store.js +24 -2
  265. package/src/local/sqlite.js +17 -0
  266. package/src/models/discovery.js +40 -22
  267. package/src/models/inventory-core.d.ts +105 -0
  268. package/src/models/inventory-core.js +54 -6
  269. package/src/sam/operations/package-audit.js +41 -0
  270. package/src/sam/seed.js +2 -0
  271. package/src/security/logs.js +3 -0
  272. package/src/ui/cli/help.js +41 -0
  273. package/apps/client-cms-editor/backend/src/demo-bootstrap.ts +0 -145
  274. package/test/account-session.test.mjs +0 -101
  275. package/test/agent-capabilities.test.mjs +0 -67
  276. package/test/app-authority-context.test.mjs +0 -32
  277. package/test/app-building-skills.test.mjs +0 -61
  278. package/test/apps-scaffold-contract.test.mjs +0 -114
  279. package/test/blender-cad.test.mjs +0 -146
  280. package/test/cad-docker.test.mjs +0 -96
  281. package/test/capabilities.test.mjs +0 -133
  282. package/test/cli/api-key-env-whoami.test.mjs +0 -129
  283. package/test/cli/codebaseindex-plan-ux.test.mjs +0 -37
  284. package/test/cli/eval-live.test.mjs +0 -219
  285. package/test/cli/go.test.mjs +0 -128
  286. package/test/cli/local-vault-and-provider-setup.test.mjs +0 -268
  287. package/test/cli/mcp-client.test.mjs +0 -256
  288. package/test/cli/preferences-runtime.test.mjs +0 -11
  289. package/test/cli/runtime-persist.test.mjs +0 -56
  290. package/test/cli/runtime-ui.test.mjs +0 -141
  291. package/test/cli/rust-command.test.mjs +0 -21
  292. package/test/cli/skill-npm-and-env.test.mjs +0 -52
  293. package/test/cli/status-actions.test.mjs +0 -88
  294. package/test/cli/wireframes-go-registry.test.mjs +0 -139
  295. package/test/cli-preferences.test.mjs +0 -46
  296. package/test/cloudflare-connector.test.mjs +0 -93
  297. package/test/cloudflare-runtime.test.mjs +0 -82
  298. package/test/context.test.mjs +0 -159
  299. package/test/credentials-audit.test.mjs +0 -113
  300. package/test/deploy-health-scan.test.mjs +0 -95
  301. package/test/deploy-receipt.test.mjs +0 -91
  302. package/test/dockerize.test.mjs +0 -93
  303. package/test/error-diagnostics.test.mjs +0 -124
  304. package/test/eval-context.test.mjs +0 -37
  305. package/test/execution-approvals.test.mjs +0 -27
  306. package/test/fixtures/cad/courtyard-house.json +0 -208
  307. package/test/fixtures/knowledge-rpc-worker.mjs +0 -16
  308. package/test/gcloud-auth.test.mjs +0 -111
  309. package/test/go/build-source-identity.test.mjs +0 -31
  310. package/test/go/cloudflare-probe.test.mjs +0 -317
  311. package/test/go/distribution.test.mjs +0 -28
  312. package/test/google-cloud-connection.test.mjs +0 -83
  313. package/test/google-cloud-inventory.test.mjs +0 -64
  314. package/test/indexing-provider.test.mjs +0 -29
  315. package/test/init-options.test.mjs +0 -35
  316. package/test/integration/ai-access-onboarding.test.mjs +0 -47
  317. package/test/integration/app-command.test.mjs +0 -85
  318. package/test/integration/cad-discovery.test.mjs +0 -158
  319. package/test/integration/cad-docker-executor.test.mjs +0 -249
  320. package/test/integration/cad-execution.test.mjs +0 -184
  321. package/test/integration/cad-project-app.test.mjs +0 -31
  322. package/test/integration/cad-project-d1.test.mjs +0 -25
  323. package/test/integration/cad-project-native.test.mjs +0 -24
  324. package/test/integration/cad-project-workflow.test.mjs +0 -9
  325. package/test/integration/cad-project.test.mjs +0 -85
  326. package/test/integration/cli-help.test.mjs +0 -41
  327. package/test/integration/cms-app-scaffold.test.mjs +0 -71
  328. package/test/integration/cms-site-tenancy-contract.test.mjs +0 -257
  329. package/test/integration/codebaseindex-ingest.test.mjs +0 -214
  330. package/test/integration/core-client.integration.test.mjs +0 -55
  331. package/test/integration/error-runtime-rpc.test.mjs +0 -71
  332. package/test/integration/features-resolve.test.mjs +0 -147
  333. package/test/integration/icon-registry.test.mjs +0 -67
  334. package/test/integration/ingest-discover-models.test.mjs +0 -30
  335. package/test/integration/inspect-path-cli.test.mjs +0 -46
  336. package/test/integration/install-script.test.mjs +0 -110
  337. package/test/integration/inventory-core.test.mjs +0 -53
  338. package/test/integration/inventory-evidence.test.mjs +0 -125
  339. package/test/integration/knowledge-rpc.test.mjs +0 -112
  340. package/test/integration/local-fs.test.mjs +0 -113
  341. package/test/integration/merkle-cli.test.mjs +0 -61
  342. package/test/integration/merkle-persistence-identity.test.mjs +0 -48
  343. package/test/integration/plugins-cloudflare.integration.test.mjs +0 -28
  344. package/test/integration/provider-env-cli.test.mjs +0 -50
  345. package/test/integration/provider-factory.test.mjs +0 -197
  346. package/test/integration/repository-company-graph.test.mjs +0 -90
  347. package/test/integration/runtime-migrations.test.mjs +0 -87
  348. package/test/integration/runtime-status.integration.test.mjs +0 -212
  349. package/test/integration/sam-activity-recovery.test.mjs +0 -147
  350. package/test/integration/sam-decision.test.mjs +0 -584
  351. package/test/integration/sam-kernel.test.mjs +0 -99
  352. package/test/integration/sam-planning-astar.test.mjs +0 -279
  353. package/test/integration/scaffold-cloudflare.test.mjs +0 -46
  354. package/test/integration/skill-runtime.test.mjs +0 -240
  355. package/test/integration/storage-architecture.test.mjs +0 -154
  356. package/test/integration/store-discovery.test.mjs +0 -44
  357. package/test/integration/studio-fs-pty-e2e.test.mjs +0 -294
  358. package/test/integration/terminal-exec.integration.test.mjs +0 -86
  359. package/test/integration/tool-runtime.test.mjs +0 -124
  360. package/test/integration/tool-schema.test.mjs +0 -59
  361. package/test/jr-dev-skill.test.mjs +0 -26
  362. package/test/knowledge-context-pack.test.mjs +0 -19
  363. package/test/knowledge-postgres.test.mjs +0 -40
  364. package/test/knowledge-service.test.mjs +0 -110
  365. package/test/knowledge.test.mjs +0 -206
  366. package/test/live/terminal-transport.live.test.mjs +0 -24
  367. package/test/local-sessions.test.mjs +0 -57
  368. package/test/local-studio-deploy.test.mjs +0 -83
  369. package/test/loopback-oauth.test.mjs +0 -53
  370. package/test/merkle-render.test.mjs +0 -31
  371. package/test/mini.test.mjs +0 -140
  372. package/test/model-catalog.test.mjs +0 -70
  373. package/test/models.test.mjs +0 -309
  374. package/test/npm10-lock.test.mjs +0 -29
  375. package/test/ollama.test.mjs +0 -137
  376. package/test/open-url.test.mjs +0 -64
  377. package/test/openai-responses.test.mjs +0 -155
  378. package/test/portable-context.test.mjs +0 -94
  379. package/test/project-config.test.mjs +0 -81
  380. package/test/project-rules.test.mjs +0 -44
  381. package/test/provider-credentials.test.mjs +0 -106
  382. package/test/rehydrate.test.mjs +0 -25
  383. package/test/release-hygiene.test.mjs +0 -42
  384. package/test/repository-snapshot-view.test.mjs +0 -112
  385. package/test/responses-runner.test.mjs +0 -465
  386. package/test/runtime-activity.test.mjs +0 -98
  387. package/test/sdk-worker-contract.test.mjs +0 -72
  388. package/test/security.test.mjs +0 -252
  389. package/test/setup-planner.test.mjs +0 -74
  390. package/test/setup-runtime.test.mjs +0 -51
  391. package/test/shell.test.mjs +0 -281
  392. package/test/skills.test.mjs +0 -22
  393. package/test/smoke.mjs +0 -122
  394. package/test/telemetry.test.mjs +0 -79
  395. package/test/terminal/local-pty.mock.test.mjs +0 -153
  396. package/test/terminal-machine-identity.test.mjs +0 -88
  397. package/test/theme-portability.test.mjs +0 -14
  398. package/test/tools-search.test.mjs +0 -73
  399. package/test/unit/website-assets-bindings.test.mjs +0 -60
  400. package/test/whoami-resume.test.mjs +0 -157
@@ -1,31 +1,14 @@
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';
1
+ /**
2
+ * HTTP CMS API client — real fetch only.
3
+ * Never fabricates success, never falls back to demo fixtures on localhost.
4
+ */
5
+ import { mapCmsEditorBlock, mapCmsEditorBootstrap, mapCmsEditorPage, mapCmsEditorSection } from '../../../shared/cms/src/map';
6
+ import type { CmsEditorBlock, CmsEditorPage, CmsEditorSection } from '../../../shared/cms/src/editor-types';
4
7
 
5
8
  type Json = Record<string, any>;
6
9
  type ApiInit = Omit<RequestInit, 'body'> & { body?: any };
7
10
 
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
11
  async function api<T extends Json = Json>(path: string, init: ApiInit = {}): Promise<T> {
26
- if (useDemoBootstrap()) {
27
- return demoOk<T>({} as T);
28
- }
29
12
  const headers = new Headers(init.headers);
30
13
  let body = init.body;
31
14
  if (body != null && !(body instanceof FormData) && typeof body !== 'string') {
@@ -42,67 +25,64 @@ async function api<T extends Json = Json>(path: string, init: ApiInit = {}): Pro
42
25
  }
43
26
 
44
27
  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;
28
+ if (!String(projectSlug || '').trim()) {
29
+ throw new Error('project_slug_required');
58
30
  }
31
+ const params = new URLSearchParams({ project_slug: projectSlug, site: projectSlug });
32
+ if (focusPageId) params.set('page_id', focusPageId);
33
+ return mapCmsEditorBootstrap(await api<Json>(`/api/cms/bootstrap?${params}`), projectSlug);
59
34
  }
60
35
 
61
36
  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
37
  return api<Json>(`/api/cms/pages/${encodeURIComponent(pageId)}?preview=${encodeURIComponent(mode)}`);
66
38
  }
67
39
 
68
40
  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 } });
41
+ api(`/api/cms/sections/${encodeURIComponent(sectionId)}`, {
42
+ method: 'PUT',
43
+ body: { section_data: { ...fields, ...(css && Object.keys(css).length ? { css_override: css } : {}) } },
44
+ });
45
+
46
+ export const renameCmsEditorSection = (sectionId: string, sectionName: string) =>
47
+ api(`/api/cms/sections/${encodeURIComponent(sectionId)}`, { method: 'PUT', body: { section_name: sectionName } });
48
+
49
+ export const reorderCmsEditorSections = (pageId: string, sections: CmsEditorSection[]) =>
50
+ api('/api/cms/sections/reorder', {
51
+ method: 'POST',
52
+ body: { page_id: pageId, order: sections.map((section, index) => ({ id: section.id, sort_order: (index + 1) * 10 })) },
53
+ });
54
+
55
+ export const setCmsEditorSectionVisibility = (sectionId: string, visible: boolean) =>
56
+ api(`/api/cms/sections/${encodeURIComponent(sectionId)}/visibility`, {
57
+ method: 'POST',
58
+ body: { is_visible: visible ? 1 : 0 },
59
+ });
60
+
73
61
  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,
62
+ const result = await api<Json>('/api/cms/sections', {
63
+ method: 'POST',
64
+ body: {
65
+ page_id: pageId,
78
66
  section_type: name.toLowerCase().replace(/\s+/g, '-'),
67
+ section_name: name,
79
68
  section_data: fields,
80
- is_visible: 1,
81
69
  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 } });
70
+ },
71
+ });
85
72
  return mapCmsEditorSection(result.section || { id: result.id, section_name: name, section_type: name, section_data: fields, is_visible: 1 });
86
73
  }
87
74
 
75
+ export async function deleteCmsEditorSection(sectionId: string) {
76
+ return api(`/api/cms/sections/${encodeURIComponent(sectionId)}`, { method: 'DELETE' });
77
+ }
78
+
88
79
  export async function listCmsEditorBlocks(sectionId: string) {
89
- if (useDemoBootstrap()) return [];
90
80
  const result = await api<Json>(`/api/cms/blocks?section_id=${encodeURIComponent(sectionId)}`);
91
81
  return (result.blocks || result.components || []).map((row: Json) => mapCmsEditorBlock(row, sectionId));
92
82
  }
83
+
93
84
  export async function createCmsEditorBlock(sectionId: string, type: string, data: Record<string, any>, sortOrder = 10) {
94
85
  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
86
  const result = await api<Json>('/api/cms/blocks', {
107
87
  method: 'POST',
108
88
  body: {
@@ -116,27 +96,59 @@ export async function createCmsEditorBlock(sectionId: string, type: string, data
116
96
  });
117
97
  return mapCmsEditorBlock(result.block || result.component || { id: result.id, section_id: sectionId, type: blockType, data }, sectionId);
118
98
  }
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 })) } });
99
+
100
+ export const saveCmsEditorBlock = (block: CmsEditorBlock) =>
101
+ api(`/api/cms/blocks/${encodeURIComponent(block.id)}`, {
102
+ method: 'PUT',
103
+ body: { block_data: block.data, block_type: block.type, type: block.type, component_type: block.type },
104
+ });
105
+
106
+ export const setCmsEditorBlockVisibility = (blockId: string, visible: boolean) =>
107
+ api(`/api/cms/blocks/${encodeURIComponent(blockId)}/visibility`, {
108
+ method: 'POST',
109
+ body: { is_visible: visible ? 1 : 0 },
110
+ });
111
+
112
+ export const reorderCmsEditorBlocks = (blocks: CmsEditorBlock[]) =>
113
+ api('/api/cms/blocks/reorder', {
114
+ method: 'POST',
115
+ body: { order: blocks.map((block, index) => ({ id: block.id, sort_order: (index + 1) * 10 })) },
116
+ });
117
+
118
+ export async function deleteCmsEditorBlock(blockId: string) {
119
+ return api(`/api/cms/blocks/${encodeURIComponent(blockId)}`, { method: 'DELETE' });
120
+ }
122
121
 
123
122
  export async function createCmsEditorPage(projectSlug: string, input: { title: string; slug: string; type: string }) {
124
123
  const slug = input.slug.replace(/^\/+/, '') || 'untitled';
125
- if (useDemoBootstrap(projectSlug)) {
126
- return mapCmsEditorPage({
127
- id: `page_local_${Date.now()}`,
124
+ const result = await api<Json>('/api/cms/pages', {
125
+ method: 'POST',
126
+ body: {
127
+ project_id: projectSlug,
128
128
  title: input.title || 'Untitled',
129
129
  slug,
130
130
  route_path: `/${slug}`,
131
131
  page_type: input.type,
132
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' });
133
+ content: '',
134
+ },
135
+ });
136
+ return mapCmsEditorPage({
137
+ ...result,
138
+ id: result.id,
139
+ title: input.title,
140
+ slug,
141
+ route_path: result.route_path || `/${slug}`,
142
+ page_type: input.type,
143
+ status: 'draft',
144
+ });
145
+ }
146
+
147
+ export async function deleteCmsEditorPage(pageId: string) {
148
+ return api(`/api/cms/pages/${encodeURIComponent(pageId)}`, { method: 'DELETE' });
137
149
  }
150
+
138
151
  export const saveCmsEditorPageMeta = (page: CmsEditorPage) => {
139
- if (useDemoBootstrap()) return demoOk({ ok: true, id: page.id });
140
152
  const route = page.slug.startsWith('/') ? page.slug : `/${String(page.slug || '').replace(/^\/+/, '')}`;
141
153
  const normalizedRoute = route.length > 1 ? route.replace(/\/+$/, '') : route || '/';
142
154
  const slug = normalizedRoute === '/' ? 'home' : normalizedRoute.replace(/^\/+/, '') || 'untitled';
@@ -152,38 +164,50 @@ export const saveCmsEditorPageMeta = (page: CmsEditorPage) => {
152
164
  },
153
165
  });
154
166
  };
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 } });
167
+
168
+ export const publishCmsEditorPage = (pageId: string) =>
169
+ api(`/api/cms/pages/${encodeURIComponent(pageId)}/publish`, { method: 'POST', body: {} });
170
+
171
+ export const saveCmsEditorThemeVars = (projectSlug: string, vars: Record<string, string>) =>
172
+ api('/api/cms/theme-vars', { method: 'PATCH', body: { project_slug: projectSlug, vars } });
157
173
 
158
174
  export async function getCmsEditorAssets() {
159
- if (useDemoBootstrap()) return [];
160
175
  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 }));
176
+ return (result.assets || []).map((asset: Json, index: number) => ({
177
+ id: asset.id || index,
178
+ name: asset.original_filename || asset.filename || asset.label || 'Asset',
179
+ type: String(asset.mime_type || '').startsWith('video/')
180
+ ? 'Video'
181
+ : String(asset.mime_type || '').includes('font')
182
+ ? 'Font'
183
+ : String(asset.mime_type || '').includes('pdf')
184
+ ? 'Document'
185
+ : 'Image',
186
+ size: asset.content_size_bytes ? `${(Number(asset.content_size_bytes) / 1e6).toFixed(1)} MB` : '—',
187
+ color: ['#5346db', '#d2e9df', '#ebc59d', '#25302b', '#705cf0', '#e6e0d3'][index % 6],
188
+ previewUrl: asset.thumbnail_url || asset.cdn_url || asset.public_url || null,
189
+ }));
162
190
  }
191
+
163
192
  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
193
  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);
194
+ return (result.templates || [])
195
+ .map((row: Json) => ({
196
+ id: String(row.id || ''),
197
+ name: String(row.template_name || row.iam_label || row.slug || 'Template'),
198
+ type: String(row.template_type || 'section'),
199
+ category: String(row.category || 'General'),
200
+ slug: row.slug ? String(row.slug) : null,
201
+ previewImageUrl: row.preview_image_url ? String(row.preview_image_url) : null,
202
+ hasHtml: Boolean(row.source_html_r2_key),
203
+ }))
204
+ .filter((row: { id: string }) => row.id);
181
205
  }
182
206
 
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
- }
207
+ export async function applyCmsEditorTemplate(
208
+ templateId: string,
209
+ input: { pageId?: string | null; projectSlug?: string | null } = {},
210
+ ) {
187
211
  return api<Json>(`/api/cms/templates/${encodeURIComponent(templateId)}/apply`, {
188
212
  method: 'POST',
189
213
  body: {
@@ -192,9 +216,18 @@ export async function applyCmsEditorTemplate(templateId: string, input: { pageId
192
216
  },
193
217
  });
194
218
  }
219
+
195
220
  export async function getCmsEditorContacts() {
196
- if (useDemoBootstrap()) return [];
197
221
  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' }));
222
+ return (result.contacts || []).map((row: Json, index: number) => ({
223
+ id: index,
224
+ name: String(row.name || row.display_name || row.email || 'Contact'),
225
+ email: String(row.email || ''),
226
+ source: String(row.source || 'Contact form'),
227
+ date: String(row.updated_at || row.created_at || 'Recently'),
228
+ tag: Array.isArray(row.tags) ? row.tags[0] || 'Lead' : row.tag || 'Lead',
229
+ }));
199
230
  }
200
- export const activateCmsEditorTheme = (themeSlug: string, accent?: string) => api('/api/cms/themes/activate', { method: 'POST', body: { slug: themeSlug, accent } });
231
+
232
+ export const activateCmsEditorTheme = (themeSlug: string, accent?: string) =>
233
+ api('/api/cms/themes/activate', { method: 'POST', body: { slug: themeSlug, accent } });
@@ -1,5 +1,5 @@
1
1
  export * from './api/client';
2
- export * from '@inneranimalmedia/agentsam-cms-shared';
2
+ export * from '../../shared/cms/src/index';
3
3
  export * from './model';
4
4
  export * from './preview/bridge';
5
5
  export * from './preview/urls';
@@ -1,115 +1,11 @@
1
- import type { CmsEditorBlock, CmsEditorPage, CmsEditorSection, CmsEditorSelection, CmsEditorSite } from '@inneranimalmedia/agentsam-cms-shared';
2
-
3
- type Json = Record<string, any>;
4
-
5
- export function parseCmsEditorObject(value: unknown): Record<string, any> {
6
- if (!value) return {};
7
- if (typeof value === 'object') return value as Record<string, any>;
8
- try { return JSON.parse(String(value)); } catch { return {}; }
9
- }
10
-
11
- export function cmsEditorInitials(name: string) {
12
- return name.split(/\s+/).filter(Boolean).slice(0, 2).map((part) => part[0]).join('').toUpperCase() || 'CMS';
13
- }
14
-
15
- function zoneFor(row: Json): CmsEditorSection['zone'] {
16
- const fields = parseCmsEditorObject(row.section_data ?? row.data ?? row.fields);
17
- const explicit = String(row.zone || fields.zone || '').toUpperCase();
18
- if (explicit === 'HEADER' || explicit === 'FOOTER' || explicit === 'TEMPLATE') return explicit;
19
- const type = String(row.section_type || row.type || '').toLowerCase();
20
- if (type.includes('nav') || type.includes('header')) return 'HEADER';
21
- if (type.includes('footer')) return 'FOOTER';
22
- return 'BODY';
23
- }
24
-
25
- export function mapCmsEditorBlock(row: Json, sectionId = ''): CmsEditorBlock {
26
- const data = parseCmsEditorObject(row.block_data ?? row.component_data ?? row.data);
27
- return {
28
- id: String(row.id || ''),
29
- sectionId: String(row.section_id || row.sectionId || sectionId || ''),
30
- type: String(row.block_type || row.component_type || row.type || 'block'),
31
- visible: row.is_visible === undefined ? row.visible !== false : Boolean(Number(row.is_visible)),
32
- data,
33
- sortOrder: Number(row.sort_order || 0),
34
- };
35
- }
36
-
37
- export function mapCmsEditorSection(row: Json, blocks: CmsEditorBlock[] = []): CmsEditorSection {
38
- const fields = parseCmsEditorObject(row.section_data ?? row.data ?? row.fields);
39
- return {
40
- id: String(row.id || ''),
41
- name: String(row.section_name || row.name || row.section_type || row.type || 'Section'),
42
- type: String(row.section_type || row.type || fields.section_type || 'section'),
43
- zone: zoneFor({ ...row, section_data: fields }),
44
- visible: row.is_visible === undefined ? row.visible !== false : Boolean(Number(row.is_visible)),
45
- color: String(fields.bg_color || fields.background_color || row.color || '#111115'),
46
- fields,
47
- css: parseCmsEditorObject(fields.css_override || row.css),
48
- blocks,
49
- };
50
- }
51
-
52
- export function mapCmsEditorPage(row: Json, sections: CmsEditorSection[] = []): CmsEditorPage {
53
- const route = String(row.route_path || row.slug || '/');
54
- return {
55
- id: String(row.id || ''),
56
- title: String(row.title || row.slug || 'Untitled'),
57
- slug: route.startsWith('/') ? route : `/${route}`,
58
- status: row.status === 'published' || row.is_published ? 'live' : row.status === 'new' ? 'new' : 'draft',
59
- type: String(row.page_type || row.type || (route === '/' ? 'Home' : 'Interior')),
60
- parent: row.parent_id || undefined,
61
- sections,
62
- metaTitle: String(row.seo_title || row.meta_title || row.title || ''),
63
- metaDescription: String(row.meta_description || ''),
64
- };
65
- }
66
-
67
- export function mapCmsEditorBootstrap(raw: Json, projectSlug: string) {
68
- const sectionsByPage = raw.sections_by_page || {};
69
- const blocksBySection = raw.blocks_by_section || raw.components_by_section || {};
70
- const pages = (raw.pages || []).map((page: Json) => {
71
- const sections = (sectionsByPage[page.id] || []).map((section: Json) => {
72
- const blocks = (blocksBySection[section.id] || []).map((row: Json) => mapCmsEditorBlock(row, section.id));
73
- return mapCmsEditorSection(section, blocks);
74
- });
75
- return mapCmsEditorPage(page, sections);
76
- });
77
- const tenant = raw.tenant || {};
78
- const name = String(tenant.name || raw.workspace_label || projectSlug || 'CMS Site');
79
- const themeVars = parseCmsEditorObject(raw.active_theme?.css_vars || raw.active_theme?.css_vars_json);
80
- const site: CmsEditorSite = {
81
- id: projectSlug,
82
- name,
83
- initials: cmsEditorInitials(name),
84
- domain: String(raw.public_domain || tenant.domain || ''),
85
- edited: 'Just now',
86
- color: String(themeVars['--brand-primary'] || tenant.primary_color || '#6358ff'),
87
- pages,
88
- };
89
- return {
90
- site,
91
- themeVars,
92
- templates: raw.component_templates || [],
93
- imports: raw.liquid_imports || [],
94
- homePageId: raw.home_page?.id || pages[0]?.id || null,
95
- schemas: {
96
- protocol_version: Number(raw.protocol_version || raw.schemas?.protocol_version || 1),
97
- sections: Array.isArray(raw.schemas?.sections) ? raw.schemas.sections : [],
98
- blocks: Array.isArray(raw.schemas?.blocks) ? raw.schemas.blocks : [],
99
- fields: Array.isArray(raw.schemas?.fields) ? raw.schemas.fields : [],
100
- },
101
- };
102
- }
103
-
104
- export function selectCmsEditorTarget(input: Partial<CmsEditorSelection> & { kind?: CmsEditorSelection['kind'] }): CmsEditorSelection {
105
- const sectionId = String(input.sectionId || '').trim() || null;
106
- const blockId = String(input.blockId || '').trim() || null;
107
- const pageId = String(input.pageId || '').trim() || null;
108
- return {
109
- kind: input.kind || (blockId ? 'block' : sectionId ? 'section' : 'page'),
110
- pageId,
111
- sectionId,
112
- blockId,
113
- fieldPath: String(input.fieldPath || '').trim() || null,
114
- };
115
- }
1
+ /** @deprecated Prefer shared/cms map helpers — kept as re-export for transitional imports. */
2
+ export {
3
+ parseCmsEditorObject,
4
+ cmsEditorInitials,
5
+ mapCmsEditorBlock,
6
+ mapCmsEditorSection,
7
+ mapCmsEditorPage,
8
+ mapCmsEditorBootstrap,
9
+ selectCmsEditorTarget,
10
+ } from '../../shared/cms/src/map';
11
+ export { emptyCmsEditorSelection } from '../../shared/cms/src/editor-types';
@@ -1,5 +1,5 @@
1
1
  import { selectCmsEditorTarget } from '../model';
2
- import type { CmsEditorSelection } from '@inneranimalmedia/agentsam-cms-shared';
2
+ import type { CmsEditorSelection } from '../../../shared/cms/src/index';
3
3
 
4
4
  export const CMS_EDITOR_PREVIEW_TYPES = {
5
5
  READY: 'cms:ready', SELECT: 'cms:select', SECTION_CLICK: 'cms:section-click', HIGHLIGHT: 'cms:highlight',
@@ -9,7 +9,12 @@
9
9
  "noEmit": true,
10
10
  "isolatedModules": true,
11
11
  "allowJs": true,
12
- "checkJs": false
12
+ "checkJs": false,
13
+ "baseUrl": ".",
14
+ "paths": {
15
+ "@inneranimalmedia/agentsam-cms-shared": ["../shared/cms/src/index.ts"],
16
+ "@inneranimalmedia/agentsam-cms-shared/*": ["../shared/cms/src/*"]
17
+ }
13
18
  },
14
19
  "include": ["src"]
15
20
  }