@inneranimalmedia/agentsam-sdk 2.6.5 → 2.6.7

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 (371) hide show
  1. package/AGENTSAM.md +29 -0
  2. package/apps/README.md +5 -0
  3. package/apps/cad-creator/README.md +4 -4
  4. package/apps/cad-creator/shared/cad/package.json +1 -1
  5. package/apps/client-cms-editor/AGENTS.md +12 -7
  6. package/apps/client-cms-editor/README.md +76 -48
  7. package/apps/client-cms-editor/agentsam.app.json +26 -9
  8. package/apps/client-cms-editor/backend/package.json +20 -3
  9. package/apps/client-cms-editor/backend/src/api/client.ts +134 -101
  10. package/apps/client-cms-editor/backend/src/index.ts +1 -1
  11. package/apps/client-cms-editor/backend/src/model.ts +11 -115
  12. package/apps/client-cms-editor/backend/src/preview/bridge.ts +1 -1
  13. package/apps/client-cms-editor/backend/tsconfig.json +6 -1
  14. package/apps/client-cms-editor/bin/agentsam-cms.js +262 -0
  15. package/apps/client-cms-editor/bin/agentsam-cms.mjs +2 -228
  16. package/apps/client-cms-editor/frontend/package.json +16 -7
  17. package/apps/client-cms-editor/frontend/src/AgentSamDrawer.tsx +9 -41
  18. package/apps/client-cms-editor/frontend/src/CmsAgentSurface.tsx +19 -174
  19. package/apps/client-cms-editor/frontend/src/adapters/heuristic.ts +29 -0
  20. package/apps/client-cms-editor/frontend/src/adapters/http.ts +628 -0
  21. package/apps/client-cms-editor/frontend/src/adapters/memory.ts +510 -0
  22. package/apps/client-cms-editor/frontend/src/editor/CmsEditor.tsx +213 -0
  23. package/apps/client-cms-editor/frontend/src/editor/CmsEditorProvider.tsx +20 -0
  24. package/apps/client-cms-editor/frontend/src/editor/canvas/PreviewCanvas.tsx +53 -0
  25. package/apps/client-cms-editor/frontend/src/{CmsEditor.tsx → editor/legacy/CmsEditorPrototype.tsx} +52 -23
  26. package/apps/client-cms-editor/frontend/src/editor/useCmsEditorController.ts +218 -0
  27. package/apps/client-cms-editor/frontend/src/index.ts +19 -5
  28. package/apps/client-cms-editor/frontend/src/lib/agent-host.ts +24 -0
  29. package/apps/client-cms-editor/frontend/src/main.tsx +82 -8
  30. package/apps/client-cms-editor/frontend/src/mount.tsx +92 -30
  31. package/apps/client-cms-editor/frontend/src/styles/agentsam-drawer.css +1 -1
  32. package/apps/client-cms-editor/frontend/src/styles/cmsShell.css +8 -8
  33. package/apps/client-cms-editor/frontend/src/styles/studio.css +55 -3
  34. package/apps/client-cms-editor/frontend/tsconfig.json +12 -1
  35. package/apps/client-cms-editor/frontend/vite.config.ts +12 -0
  36. package/apps/client-cms-editor/package-lock.json +973 -134
  37. package/apps/client-cms-editor/package.json +118 -6
  38. package/apps/client-cms-editor/reference/harvest/HARVEST_RECEIPT.json +201 -0
  39. package/apps/client-cms-editor/reference/harvest/PROVENANCE_HISTORY.txt +10 -0
  40. package/apps/client-cms-editor/reference/harvest/README.md +8 -0
  41. package/apps/client-cms-editor/reference/harvest/plans/ARCHIVE-INTAKE.md +135 -0
  42. package/apps/client-cms-editor/reference/harvest/plans/CHATGPT-IDENTITY-HARVEST.md +83 -0
  43. package/apps/client-cms-editor/reference/harvest/plans/CMS-EDITOR-HARVEST.md +166 -0
  44. package/apps/client-cms-editor/reference/harvest/plans/HARVEST-INDEX.md +196 -0
  45. package/apps/client-cms-editor/reference/harvest/plans/INNERANIMALS-CONTENT-001.md +137 -0
  46. package/apps/client-cms-editor/reference/harvest/plans/NO-IMPLICIT-SIDE-EFFECTS.md +87 -0
  47. package/apps/client-cms-editor/reference/harvest/plans/STOREFRONT-SURFACE-MAP.md +140 -0
  48. package/apps/client-cms-editor/reference/harvest/plans/THEME-INNERANIMALS-HARVEST.md +137 -0
  49. package/apps/client-cms-editor/reference/harvest/plans/TOOLING-LAB.md +63 -0
  50. package/apps/client-cms-editor/reference/harvest/plans/harvest-manifest.json +97 -0
  51. package/apps/client-cms-editor/reference/harvest/plans/local-cms-harvest-schema.sql +328 -0
  52. package/apps/client-cms-editor/shared/cms/package.json +17 -7
  53. package/apps/client-cms-editor/shared/cms/src/adapter.ts +204 -0
  54. package/apps/client-cms-editor/shared/cms/src/agent-context.ts +7 -5
  55. package/apps/client-cms-editor/shared/cms/src/editor-types.ts +32 -0
  56. package/apps/client-cms-editor/shared/cms/src/host.ts +82 -0
  57. package/apps/client-cms-editor/shared/cms/src/index.ts +4 -0
  58. package/apps/client-cms-editor/shared/cms/src/map.ts +115 -0
  59. package/apps/client-cms-editor/shared/cms/src/starter-pack.ts +158 -0
  60. package/contracts/source-types.v1.json +353 -0
  61. package/docs/CMS_CONTEXTUAL_COMPOSER.md +1 -1
  62. package/docs/PRODUCT_LIFECYCLE.md +566 -0
  63. package/docs/THEME_REFINERY.md +2 -2
  64. package/docs/architecture/AGENTSAM_RUNTIME_PROTOCOL.md +40 -20
  65. package/docs/content-studio/REVISION_GATE_2026-09-27.md +1 -1
  66. package/docs/plans/LOCAL_STUDIO_DESKTOP_RELEASE_2026-09-29.md +150 -0
  67. package/migrations/d1/0017_identity_native_oauth.sql +21 -0
  68. package/native/agentsam-machine/Cargo.lock +426 -0
  69. package/native/agentsam-machine/Cargo.toml +9 -0
  70. package/native/agentsam-machine/cli/Cargo.toml +14 -0
  71. package/native/agentsam-machine/cli/src/main.rs +77 -0
  72. package/native/agentsam-machine/core/Cargo.toml +15 -0
  73. package/native/agentsam-machine/core/src/assets.rs +790 -0
  74. package/native/agentsam-machine/core/src/bound.rs +298 -0
  75. package/native/agentsam-machine/core/src/enrich.rs +706 -0
  76. package/native/agentsam-machine/core/src/frontend.rs +442 -0
  77. package/native/agentsam-machine/core/src/lib.rs +1086 -0
  78. package/native/agentsam-machine/core/src/liquid.rs +528 -0
  79. package/native/agentsam-machine/core/src/source_types.rs +78 -0
  80. package/package.json +51 -21
  81. package/packages/agentsam-brand/README.md +1 -1
  82. package/packages/agentsam-brand/package.json +4 -4
  83. package/packages/agentsam-brand/src/index.js +1 -1
  84. package/packages/agentsam-contracts/package.json +13 -3
  85. package/packages/agentsam-contracts/src/tools.ts +22 -0
  86. package/packages/agentsam-errors/package.json +13 -3
  87. package/packages/agentsam-knowledge/package.json +18 -4
  88. package/packages/agentsam-knowledge/src/autorag/index.js +10 -3
  89. package/packages/agentsam-knowledge/src/backends/index.js +33 -1
  90. package/packages/agentsam-knowledge/test/autorag.test.mjs +60 -1
  91. package/packages/agentsam-nav/package.json +24 -6
  92. package/packages/agentsam-queue-control/README.md +1 -1
  93. package/packages/agentsam-queue-control/package.json +7 -2
  94. package/packages/agentsam-rapid-rust/src/main.rs +1 -1
  95. package/packages/agentsam-repository/package.json +13 -3
  96. package/packages/agentsam-repository/src/source-types.js +8 -0
  97. package/packages/agentsam-vault/package.json +14 -4
  98. package/packages/agentsam-workbench/package.json +15 -4
  99. package/packages/agentsam-workbench/src/agent/ToolPermissionRequest.tsx +94 -0
  100. package/packages/agentsam-workbench/src/agent/index.ts +2 -0
  101. package/packages/agentsam-workbench/src/agent/tool-permission.css +134 -0
  102. package/packages/connectors/cloudflare/package.json +13 -3
  103. package/packages/connectors/cloudflare/src/api-client.js +3 -2
  104. package/packages/connectors/cloudflare/src/families/vectorize.js +127 -0
  105. package/packages/connectors/cloudflare/src/index.js +1 -0
  106. package/packages/heuristic-theme/README.md +2 -2
  107. package/packages/heuristic-theme/package.json +8 -3
  108. package/packages/heuristic-theme/src/registry.js +2 -2
  109. package/packages/heuristic-theme/src/theme.js +1 -1
  110. package/packages/heuristic-theme/test/theme.test.mjs +1 -1
  111. package/packages/identity/.agentsam/features/oauth-login-portal/agentsam.feature.json +1 -1
  112. package/packages/identity/.agentsam/features/oauth-login-portal/providers.json +27 -7
  113. package/packages/identity/README.md +2 -2
  114. package/packages/identity/migrations/D1_SCHEMA_MAPPING.md +18 -15
  115. package/packages/identity/migrations/apply-portable.js +109 -0
  116. package/packages/identity/migrations/sqlite/004_identity_oauth_consent_catalog.sql +1 -1
  117. package/packages/identity/migrations/sqlite/005_identity_company_native.sql +52 -0
  118. package/packages/identity/package.json +27 -6
  119. package/packages/identity/schema/agentsam.identity/manifest.json +101 -0
  120. package/packages/identity/scripts/local-identity-bridge.mjs +13 -7
  121. package/packages/identity/scripts/preview-auth-portal.mjs +6 -6
  122. package/packages/identity/src/adapters/cloudflare-d1/index.js +8 -401
  123. package/packages/identity/src/adapters/iam-compat/index.js +540 -0
  124. package/packages/identity/src/adapters/portable-d1/index.js +18 -0
  125. package/packages/identity/src/adapters/portable-store.js +479 -0
  126. package/packages/identity/src/adapters/sqlite/index.js +13 -312
  127. package/packages/identity/src/contracts/auth-config.js +0 -1
  128. package/packages/identity/src/contracts/identity-store.js +56 -5
  129. package/packages/identity/src/contracts/provider.js +1 -0
  130. package/packages/identity/src/contracts/sign-in-options.js +104 -0
  131. package/packages/identity/src/core/constants.js +1 -1
  132. package/packages/identity/src/core/session-policy.js +31 -0
  133. package/packages/identity/src/frontend/auth-portal/pages/login.html +6 -6
  134. package/packages/identity/src/frontend/auth-portal/pages/reset.html +5 -5
  135. package/packages/identity/src/frontend/auth-portal/pages/signup.html +5 -5
  136. package/packages/identity/src/frontend/auth-portal/shared/company-branding.js +1 -1
  137. package/packages/identity/src/frontend/auth-portal/shared/desktop-identity-bridge.js +6 -37
  138. package/packages/identity/src/index.js +28 -1
  139. package/packages/identity/src/migrations/README.md +23 -23
  140. package/packages/identity/src/oauth/README.md +1 -1
  141. package/packages/identity/src/oauth/credentials.js +10 -11
  142. package/packages/identity/src/oauth/google-desktop-exchange.js +195 -27
  143. package/packages/identity/src/oauth/iam-platform.js +21 -9
  144. package/packages/identity/src/oauth/native-handoff.js +136 -0
  145. package/packages/identity/src/providers/chatgpt/headers.js +65 -0
  146. package/packages/identity/src/providers/chatgpt/index.js +86 -0
  147. package/packages/identity/src/providers/chatgpt/mapper.js +43 -0
  148. package/packages/identity/src/providers/chatgpt/paths.js +45 -0
  149. package/packages/identity/src/providers/github/oauth.js +1 -2
  150. package/packages/identity/src/providers/github/profile.js +16 -2
  151. package/packages/identity/src/providers/index.js +11 -3
  152. package/packages/identity/src/server/identity-service.js +2 -1
  153. package/packages/identity/src/server/worker-router.js +71 -18
  154. package/packages/identity/tests/chatgpt-provider.test.mjs +75 -0
  155. package/packages/identity/tests/google-desktop-identity-login.test.mjs +210 -0
  156. package/packages/identity/tests/identity-init-scaffold.test.mjs +15 -4
  157. package/packages/identity/tests/lane1-identity-store-parity.test.mjs +527 -0
  158. package/packages/identity/tests/lane1-packed-consumer.test.mjs +175 -0
  159. package/packages/identity/tests/native-oauth-handoff.test.mjs +292 -0
  160. package/packages/identity/tests/oauth-credentials.test.mjs +4 -4
  161. package/packages/identity/tests/preview-auth-portal.test.mjs +4 -2
  162. package/packages/identity/tests/session-routes-policy.test.mjs +13 -1
  163. package/packages/identity/tests/worker-runtime-boundary.test.mjs +11 -0
  164. package/packages/providers/completeful/package.json +7 -2
  165. package/packages/theme-church-site/package.json +17 -6
  166. package/packages/theme-church-site/src/harvest.json +4 -2
  167. package/packages/theme-church-site/src/index.js +7 -3
  168. package/packages/theme-church-site/test/theme.test.mjs +4 -2
  169. package/packages/theme-companions-site/package.json +17 -6
  170. package/packages/theme-companions-site/src/harvest.json +4 -2
  171. package/packages/theme-companions-site/src/index.js +7 -3
  172. package/packages/theme-companions-site/test/theme.test.mjs +4 -2
  173. package/packages/theme-floors-site/package.json +17 -6
  174. package/packages/theme-floors-site/src/harvest.json +4 -2
  175. package/packages/theme-floors-site/src/index.js +7 -3
  176. package/packages/theme-floors-site/test/theme.test.mjs +4 -2
  177. package/packages/theme-fuelnfree-site/package.json +17 -6
  178. package/packages/theme-fuelnfree-site/src/harvest.json +4 -2
  179. package/packages/theme-fuelnfree-site/src/index.js +7 -3
  180. package/packages/theme-fuelnfree-site/test/theme.test.mjs +4 -2
  181. package/packages/theme-handyman-site/package.json +17 -6
  182. package/packages/theme-handyman-site/src/harvest.json +4 -2
  183. package/packages/theme-handyman-site/src/index.js +7 -3
  184. package/packages/theme-handyman-site/test/theme.test.mjs +4 -2
  185. package/packages/theme-insurance-site/package.json +17 -6
  186. package/packages/theme-insurance-site/src/harvest.json +4 -2
  187. package/packages/theme-insurance-site/src/index.js +7 -3
  188. package/packages/theme-insurance-site/test/theme.test.mjs +4 -2
  189. package/packages/theme-scenes/README.md +1 -1
  190. package/packages/theme-scenes/package.json +4 -3
  191. package/packages/theme-scenes/src/registry.js +187 -0
  192. package/packages/theme-shinshu-site/package.json +17 -6
  193. package/packages/theme-shinshu-site/src/harvest.json +4 -2
  194. package/packages/theme-shinshu-site/src/index.js +7 -3
  195. package/packages/theme-shinshu-site/test/theme.test.mjs +4 -2
  196. package/packages/work-graph/package.json +14 -4
  197. package/protocol/FILEMETA_V1.md +2 -2
  198. package/protocol/capabilities/manifest.json +1 -1
  199. package/protocol/database/agentsam.schema-pack.v1.schema.json +72 -0
  200. package/protocol/presets/catalog.json +2 -2
  201. package/protocol/theme-refinery/lineage-registry.json +105 -0
  202. package/protocol/theme-refinery/product-metadata.schema.json +21 -1
  203. package/skills/grok-auth/SKILL.md +110 -0
  204. package/skills/grok-auth/agentsam.skill.json +25 -0
  205. package/skills/grok-auth/references/grok-identity.md +64 -0
  206. package/skills/grok-auth/references/per-user-data.md +49 -0
  207. package/skills/grok-auth/references/prewired-and-env.md +54 -0
  208. package/skills/grok-auth/references/session-ui.md +133 -0
  209. package/skills/grok-auth/references/sign-in-methods.md +55 -0
  210. package/skills/grok-auth/references/wiring.md +71 -0
  211. package/skills/grok-building-games/SKILL.md +213 -0
  212. package/skills/grok-building-games/agentsam.skill.json +25 -0
  213. package/skills/grok-building-games/references/3d-libs.md +64 -0
  214. package/skills/grok-building-games/references/ai-pathfinding.md +122 -0
  215. package/skills/grok-building-games/references/audio.md +129 -0
  216. package/skills/grok-building-games/references/babylon.md +202 -0
  217. package/skills/grok-building-games/references/collision-physics.md +122 -0
  218. package/skills/grok-building-games/references/ecs-architecture.md +111 -0
  219. package/skills/grok-building-games/references/game-feel-juice.md +110 -0
  220. package/skills/grok-building-games/references/genres/board-card-chess.md +89 -0
  221. package/skills/grok-building-games/references/genres/endless-runner.md +83 -0
  222. package/skills/grok-building-games/references/genres/fps.md +105 -0
  223. package/skills/grok-building-games/references/genres/platformer-2d.md +97 -0
  224. package/skills/grok-building-games/references/genres/puzzle-match3-tetris.md +131 -0
  225. package/skills/grok-building-games/references/genres/racing-kart.md +106 -0
  226. package/skills/grok-building-games/references/genres/topdown-twin-stick.md +97 -0
  227. package/skills/grok-building-games/references/genres/tower-defense.md +84 -0
  228. package/skills/grok-building-games/references/genres/voxel-minecraft.md +89 -0
  229. package/skills/grok-building-games/references/input.md +139 -0
  230. package/skills/grok-building-games/references/phaser.md +277 -0
  231. package/skills/grok-building-games/references/procedural-generation.md +141 -0
  232. package/skills/grok-building-games/references/save-persistence.md +108 -0
  233. package/skills/grok-building-games/references/threejs-foundational.md +148 -0
  234. package/skills/grok-controls/SKILL.md +274 -0
  235. package/skills/grok-controls/agentsam.skill.json +25 -0
  236. package/skills/grok-design-ui/SKILL.md +122 -0
  237. package/skills/grok-design-ui/agentsam.skill.json +25 -0
  238. package/skills/grok-design-ui/references/animations.md +379 -0
  239. package/skills/grok-design-ui/references/performance.md +88 -0
  240. package/skills/grok-design-ui/references/refined-ui.md +384 -0
  241. package/skills/grok-design-ui/references/surfaces.md +247 -0
  242. package/skills/grok-design-ui/references/typography.md +123 -0
  243. package/skills/grok-game-animation-frames/SKILL.md +84 -0
  244. package/skills/grok-game-animation-frames/agentsam.skill.json +25 -0
  245. package/skills/grok-game-asset-core/SKILL.md +69 -0
  246. package/skills/grok-game-asset-core/agentsam.skill.json +25 -0
  247. package/skills/grok-game-character-consistency/SKILL.md +69 -0
  248. package/skills/grok-game-character-consistency/agentsam.skill.json +25 -0
  249. package/skills/grok-game-tilesets/SKILL.md +65 -0
  250. package/skills/grok-game-tilesets/agentsam.skill.json +25 -0
  251. package/skills/grok-game-ui-icons/SKILL.md +56 -0
  252. package/skills/grok-game-ui-icons/agentsam.skill.json +25 -0
  253. package/skills/grok-generate2dmap/LICENSE +21 -0
  254. package/skills/grok-generate2dmap/SKILL.md +120 -0
  255. package/skills/grok-generate2dmap/SOURCE.md +6 -0
  256. package/skills/grok-generate2dmap/agentsam.skill.json +25 -0
  257. package/skills/grok-generate2dmap/references/deliverables.md +101 -0
  258. package/skills/grok-generate2dmap/references/layered-map-contract.md +209 -0
  259. package/skills/grok-generate2dmap/references/map-strategies.md +341 -0
  260. package/skills/grok-generate2dmap/references/object-production-gate.md +24 -0
  261. package/skills/grok-generate2dmap/references/pipeline.md +149 -0
  262. package/skills/grok-generate2dmap/references/prop-pack-contract.md +174 -0
  263. package/skills/grok-generate2dmap/references/side-scroll-stages.md +29 -0
  264. package/skills/grok-generate2dmap/scripts/compose_layered_preview.py +157 -0
  265. package/skills/grok-generate2dmap/scripts/extract_prop_pack.py +369 -0
  266. package/skills/grok-generate2dsprite/LICENSE +21 -0
  267. package/skills/grok-generate2dsprite/SKILL.md +313 -0
  268. package/skills/grok-generate2dsprite/SOURCE.md +6 -0
  269. package/skills/grok-generate2dsprite/agentsam.skill.json +25 -0
  270. package/skills/grok-generate2dsprite/references/modes.md +124 -0
  271. package/skills/grok-generate2dsprite/references/prompt-rules.md +315 -0
  272. package/skills/grok-generate2dsprite/scripts/generate2dsprite.py +1031 -0
  273. package/skills/grok-generate2dsprite/scripts/make_layout_guide.py +109 -0
  274. package/skills/grok-imagine/SKILL.md +201 -0
  275. package/skills/grok-imagine/agentsam.skill.json +25 -0
  276. package/skills/grok-multiplayer-p2p/SKILL.md +111 -0
  277. package/skills/grok-multiplayer-p2p/agentsam.skill.json +25 -0
  278. package/skills/grok-multiplayer-p2p/references/react-binding.md +144 -0
  279. package/skills/grok-multiplayer-p2p/references/signaling-relay.md +269 -0
  280. package/skills/grok-neon/SKILL.md +157 -0
  281. package/skills/grok-neon/agentsam.skill.json +25 -0
  282. package/skills/grok-og/SKILL.md +102 -0
  283. package/skills/grok-og/agentsam.skill.json +25 -0
  284. package/skills/grok-og/references/brand-pass.md +53 -0
  285. package/skills/grok-og/references/custom-card.md +107 -0
  286. package/skills/grok-og/references/favicon-and-icons.md +48 -0
  287. package/skills/grok-og/references/og-type-contract.md +18 -0
  288. package/skills/grok-og/references/placeholder-card.md +21 -0
  289. package/skills/grok-og/references/x-banner.md +41 -0
  290. package/skills/grok-threejs/SKILL.md +67 -0
  291. package/skills/grok-threejs/agentsam.skill.json +25 -0
  292. package/skills/grok-threejs/references/llms-full.txt +2780 -0
  293. package/skills/grok-video2dsprite/LICENSE +21 -0
  294. package/skills/grok-video2dsprite/SKILL.md +236 -0
  295. package/skills/grok-video2dsprite/SOURCE.md +6 -0
  296. package/skills/grok-video2dsprite/agentsam.skill.json +25 -0
  297. package/skills/grok-video2dsprite/references/pipeline.md +90 -0
  298. package/skills/grok-video2dsprite/references/prompt-rules.md +63 -0
  299. package/skills/grok-video2dsprite/scripts/video2dsprite.py +490 -0
  300. package/skills/grok-xai-api/SKILL.md +152 -0
  301. package/skills/grok-xai-api/agentsam.skill.json +25 -0
  302. package/src/cli/command-catalog.js +46 -4
  303. package/src/cli/dispatch.js +1 -0
  304. package/src/cli.js +10 -0
  305. package/src/cloudflare/runtime-status.js +2 -1
  306. package/src/commands/autorag.js +67 -13
  307. package/src/commands/cheat-sheet.js +29 -4
  308. package/src/commands/codebaseindex.js +45 -2
  309. package/src/commands/knowledge.js +59 -2
  310. package/src/commands/machine-binary.js +103 -0
  311. package/src/commands/machine.js +137 -0
  312. package/src/commands/security.js +67 -4
  313. package/src/commands/setup.js +33 -16
  314. package/src/commands/status.js +8 -1
  315. package/src/features/resolve.js +1 -0
  316. package/src/knowledge/engine.js +21 -2
  317. package/src/knowledge/runtime-discovery.js +127 -0
  318. package/src/lib/identity-scaffold.js +53 -13
  319. package/src/lib/setup/recipes.js +1 -1
  320. package/src/models/discovery.js +40 -22
  321. package/src/models/inventory-core.d.ts +105 -0
  322. package/src/models/inventory-core.js +54 -6
  323. package/src/security/logs.js +3 -0
  324. package/src/ui/cli/help.js +41 -0
  325. package/test/apps-scaffold-contract.test.mjs +3 -2
  326. package/test/cli/api-key-env-whoami.test.mjs +2 -2
  327. package/test/cli/catalog-authority.test.mjs +64 -0
  328. package/test/cli/machine-command.test.mjs +34 -0
  329. package/test/fixtures/project-authority/customer-app/.agentsam/app.json +5 -0
  330. package/test/fixtures/project-authority/customer-app/apps/my-product/index.ts +1 -0
  331. package/test/fixtures/project-authority/customer-app/wrangler.toml +17 -0
  332. package/test/integration/autorag-project-authority.integration.test.mjs +51 -0
  333. package/test/integration/autorag-runtime-discovery.test.mjs +107 -0
  334. package/test/integration/cms-app-scaffold.test.mjs +37 -31
  335. package/test/integration/cms-site-tenancy-contract.test.mjs +28 -17
  336. package/test/integration/codebaseindex-ingest.test.mjs +41 -0
  337. package/test/integration/database-hosted-honesty.test.mjs +49 -0
  338. package/test/integration/desktop-keychain-boundary.test.mjs +45 -0
  339. package/test/integration/hosted-work-host-authority.test.mjs +47 -0
  340. package/test/integration/inventory-eligibility.test.mjs +59 -0
  341. package/test/integration/local-provider-bridge.test.mjs +65 -0
  342. package/test/integration/local-studio-settings-production.test.mjs +40 -0
  343. package/test/integration/lockfile-sync.test.mjs +26 -0
  344. package/test/integration/provider-env-cli.test.mjs +13 -3
  345. package/test/integration/runtime-status.integration.test.mjs +16 -1
  346. package/test/integration/theme-package-registry.test.mjs +31 -0
  347. package/test/repository-snapshot-view.test.mjs +2 -2
  348. package/test/security.test.mjs +14 -0
  349. package/test/terminal-machine-identity.test.mjs +2 -2
  350. package/apps/client-cms-editor/backend/src/demo-bootstrap.ts +0 -145
  351. package/packages/agentsam-nav/dist/Nav.d.ts +0 -43
  352. package/packages/agentsam-nav/dist/NavCollapsible.d.ts +0 -10
  353. package/packages/agentsam-nav/dist/NavContent.d.ts +0 -2
  354. package/packages/agentsam-nav/dist/NavFooter.d.ts +0 -2
  355. package/packages/agentsam-nav/dist/NavGroup.d.ts +0 -3
  356. package/packages/agentsam-nav/dist/NavHeader.d.ts +0 -2
  357. package/packages/agentsam-nav/dist/NavMenu.d.ts +0 -22
  358. package/packages/agentsam-nav/dist/NavProvider.d.ts +0 -35
  359. package/packages/agentsam-nav/dist/NavTrigger.d.ts +0 -2
  360. package/packages/agentsam-nav/dist/Surfaces.d.ts +0 -41
  361. package/packages/agentsam-nav/dist/browser.d.ts +0 -11
  362. package/packages/agentsam-nav/dist/browser.global.js +0 -132
  363. package/packages/agentsam-nav/dist/browser.js +0 -613
  364. package/packages/agentsam-nav/dist/contracts.d.ts +0 -76
  365. package/packages/agentsam-nav/dist/index.d.ts +0 -11
  366. package/packages/agentsam-nav/dist/index.js +0 -614
  367. package/packages/agentsam-nav/dist/legacy.css +0 -83
  368. package/packages/agentsam-nav/dist/shell.css +0 -113
  369. package/packages/agentsam-nav/dist/theme.css +0 -113
  370. package/packages/agentsam-nav/dist/utils.d.ts +0 -1
  371. package/packages/agentsam-repository/src/goap.js.bak-20260922011251 +0 -670
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Optional AgentSam / workbench host slot (React render props).
3
+ * Defined in the frontend package so shared/cms stays React-free.
4
+ */
5
+ import type { ReactNode } from 'react';
6
+ import type {
7
+ CmsAgentDrawerSlotProps,
8
+ CmsAgentMiniSlotProps,
9
+ CmsHostPrincipal,
10
+ } from '../../../shared/cms/src/host';
11
+
12
+ export type CmsAgentHost = {
13
+ principal?: CmsHostPrincipal | null;
14
+ conversationId?: string;
15
+ renderDrawer?: (props: CmsAgentDrawerSlotProps) => ReactNode;
16
+ renderMini?: (props: CmsAgentMiniSlotProps) => ReactNode;
17
+ };
18
+
19
+ export type {
20
+ CmsAgentDrawerSlotProps,
21
+ CmsAgentMiniSlotProps,
22
+ CmsAnnotationSelection,
23
+ CmsHostPrincipal,
24
+ } from '../../../shared/cms/src/host';
@@ -1,17 +1,91 @@
1
1
  import { createRoot } from 'react-dom/client';
2
- import { StrictMode } from 'react';
3
- import CmsEditor from './CmsEditor';
2
+ import { StrictMode, useEffect, useState } from 'react';
3
+ import CmsEditor from './editor/CmsEditor';
4
+ import { previewHeuristicStarter } from './adapters/heuristic';
5
+ import type { CmsEditorAdapter } from '../../shared/cms/src/adapter';
4
6
  import './styles/studio.css';
5
7
 
6
8
  const root = document.getElementById('root');
7
9
  if (!root) throw new Error('cms_studio_root_missing');
8
10
 
9
11
  const params = new URLSearchParams(window.location.search);
10
- const projectSlug = (params.get('site') || params.get('project') || 'demo').trim() || 'demo';
12
+ const starter = (params.get('starter') || params.get('example') || '').trim();
13
+ const siteParam = (params.get('site') || params.get('project') || '').trim();
11
14
  const pageId = (params.get('page') || '').trim() || null;
12
15
 
13
- createRoot(root).render(
14
- <StrictMode>
15
- <CmsEditor projectSlug={projectSlug} initialPageId={pageId} />
16
- </StrictMode>,
17
- );
16
+ function HeuristicBoot() {
17
+ const [state, setState] = useState<{
18
+ adapter: CmsEditorAdapter;
19
+ siteId: string;
20
+ pageId: string | null;
21
+ } | null>(null);
22
+ const [error, setError] = useState<string | null>(null);
23
+
24
+ useEffect(() => {
25
+ previewHeuristicStarter(siteParam || undefined)
26
+ .then((seeded) =>
27
+ setState({
28
+ adapter: seeded.adapter,
29
+ siteId: seeded.siteId,
30
+ pageId: pageId || seeded.pageId,
31
+ }),
32
+ )
33
+ .catch((err) => setError(err?.message || String(err)));
34
+ }, []);
35
+
36
+ if (error) {
37
+ return (
38
+ <main className="cms-shell cms-shell--error">
39
+ <h1>Starter install failed</h1>
40
+ <p>{error}</p>
41
+ </main>
42
+ );
43
+ }
44
+ if (!state) {
45
+ return (
46
+ <main className="cms-shell cms-shell--loading">
47
+ <p>Installing Heuristic starter into temporary adapter…</p>
48
+ </main>
49
+ );
50
+ }
51
+
52
+ return (
53
+ <CmsEditor
54
+ adapter={state.adapter}
55
+ siteId={state.siteId}
56
+ initialPageId={state.pageId}
57
+ temporaryAdapter
58
+ />
59
+ );
60
+ }
61
+
62
+ function boot() {
63
+ if (starter === 'heuristic' || starter === 'heuristic-theme') {
64
+ return <HeuristicBoot />;
65
+ }
66
+
67
+ if (!siteParam) {
68
+ return (
69
+ <main className="cms-shell cms-shell--error">
70
+ <h1>CMS site required</h1>
71
+ <p>
72
+ Pass <code>?site=your-site</code> with a host-provided CmsEditorAdapter, or start the
73
+ stock Heuristic pack with <code>?starter=heuristic</code> (temporary in-memory adapter
74
+ until a durable adapter is attached).
75
+ </p>
76
+ </main>
77
+ );
78
+ }
79
+
80
+ return (
81
+ <main className="cms-shell cms-shell--error">
82
+ <h1>CmsEditorAdapter required</h1>
83
+ <p>
84
+ Site <code>{siteParam}</code> needs a host-provided CmsEditorAdapter. This package does not
85
+ invent persistence from hostname or empty site ids.
86
+ </p>
87
+ </main>
88
+ );
89
+ }
90
+
91
+ createRoot(root).render(<StrictMode>{boot()}</StrictMode>);
@@ -1,51 +1,113 @@
1
- import { StrictMode } from 'react';
1
+ import { StrictMode, useEffect, useState } from 'react';
2
2
  import { createRoot } from 'react-dom/client';
3
- import CmsEditor from './CmsEditor';
4
- import studioCss from './styles/studio.css?raw';
3
+ import CmsEditor from './editor/CmsEditor';
4
+ import { previewHeuristicStarter } from './adapters/heuristic';
5
+ import type { CmsEditorAdapter } from '../../shared/cms/src/adapter';
5
6
 
6
7
  export type ClientCmsEditorBoot = {
7
8
  projectSlug: string;
8
9
  pageId?: string | null;
9
10
  panel?: 'pages' | 'sections' | 'templates' | 'imports' | 'theme';
11
+ /**
12
+ * Explicit stock starter. Never implied by localhost alone.
13
+ * Installs Heuristic into a temporary in-memory adapter for preview.
14
+ * Durable hosts should call installStarterPack(adapter, heuristicStarterPack) themselves.
15
+ */
16
+ starter?: 'heuristic';
17
+ /** @deprecated Use starter: 'heuristic' */
18
+ example?: 'heuristic-theme';
10
19
  };
11
20
 
12
- function injectStudioCss() {
13
- if (document.querySelector('style[data-client-cms-editor]')) return;
14
- const style = document.createElement('style');
15
- style.dataset.clientCmsEditor = 'true';
16
- style.textContent = String(studioCss || '');
17
- document.head.appendChild(style);
21
+ function HeuristicMount({
22
+ projectSlug,
23
+ pageId,
24
+ onSiteChange,
25
+ }: {
26
+ projectSlug: string;
27
+ pageId?: string | null;
28
+ onSiteChange?: (slug: string) => void;
29
+ }) {
30
+ const [state, setState] = useState<{
31
+ adapter: CmsEditorAdapter;
32
+ siteId: string;
33
+ pageId: string | null;
34
+ } | null>(null);
35
+ const [error, setError] = useState<string | null>(null);
36
+
37
+ useEffect(() => {
38
+ previewHeuristicStarter(projectSlug || undefined)
39
+ .then((seeded) => {
40
+ setState({
41
+ adapter: seeded.adapter,
42
+ siteId: seeded.siteId,
43
+ pageId: pageId || seeded.pageId,
44
+ });
45
+ onSiteChange?.(seeded.siteId);
46
+ })
47
+ .catch((err) => setError(err?.message || String(err)));
48
+ }, [projectSlug, pageId, onSiteChange]);
49
+
50
+ if (error) {
51
+ return (
52
+ <main className="cms-shell cms-shell--error">
53
+ <h1>Starter install failed</h1>
54
+ <p>{error}</p>
55
+ </main>
56
+ );
57
+ }
58
+ if (!state) {
59
+ return (
60
+ <main className="cms-shell cms-shell--loading">
61
+ <p>Installing Heuristic starter…</p>
62
+ </main>
63
+ );
64
+ }
65
+ return (
66
+ <CmsEditor
67
+ adapter={state.adapter}
68
+ siteId={state.siteId}
69
+ initialPageId={state.pageId}
70
+ temporaryAdapter
71
+ />
72
+ );
18
73
  }
19
74
 
75
+ /**
76
+ * Imperative mount helper for hosts.
77
+ * Import styles separately:
78
+ * import '@inneranimalmedia/client-cms-editor/styles/studio.css'
79
+ *
80
+ * Hosts should prefer passing their own CmsEditorAdapter + installStarterPack.
81
+ */
20
82
  export function mountClientCmsEditor(
21
83
  mountEl: HTMLElement,
22
84
  boot: ClientCmsEditorBoot,
23
85
  onSiteChange?: (slug: string) => void,
24
86
  ) {
25
- injectStudioCss();
26
- const panelRaw = boot.panel || 'pages';
27
- const panel =
28
- panelRaw === 'sections' ||
29
- panelRaw === 'templates' ||
30
- panelRaw === 'imports' ||
31
- panelRaw === 'theme'
32
- ? panelRaw
33
- : 'pages';
87
+ if (boot.starter === 'heuristic' || boot.example === 'heuristic-theme') {
88
+ createRoot(mountEl).render(
89
+ <StrictMode>
90
+ <HeuristicMount
91
+ projectSlug={boot.projectSlug}
92
+ pageId={boot.pageId}
93
+ onSiteChange={onSiteChange}
94
+ />
95
+ </StrictMode>,
96
+ );
97
+ return;
98
+ }
34
99
 
35
100
  createRoot(mountEl).render(
36
101
  <StrictMode>
37
- <CmsEditor
38
- projectSlug={boot.projectSlug}
39
- initialPageId={boot.pageId || null}
40
- initialPanel={panel}
41
- siteCatalog={[]}
42
- onSiteChange={(slug) => {
43
- const url = new URL(window.location.href);
44
- url.searchParams.set('site', slug);
45
- window.history.replaceState({}, '', url.toString());
46
- onSiteChange?.(slug);
47
- }}
48
- />
102
+ <main className="cms-shell cms-shell--error">
103
+ <h1>CmsEditorAdapter required</h1>
104
+ <p>
105
+ mountClientCmsEditor no longer invents persistence. Pass a host adapter via{' '}
106
+ <code>&lt;CmsEditor adapter=&#123;...&#125; /&gt;</code> and optionally{' '}
107
+ <code>installStarterPack(adapter, heuristicStarterPack)</code>, or set{' '}
108
+ <code>starter: &apos;heuristic&apos;</code> for an explicit temporary preview.
109
+ </p>
110
+ </main>
49
111
  </StrictMode>,
50
112
  );
51
113
  }
@@ -1,4 +1,4 @@
1
- /* FnF AgentSam Side Assistant — docked drawer (from fuelnfreetime admin) */
1
+ /* Agent host side drawer */
2
2
 
3
3
  .agentsam-dock {
4
4
  flex: none;
@@ -1,13 +1,13 @@
1
1
  /* AgentSam CMS shell — mobile-first, warm command center + editor chrome */
2
2
  .iam-cms-shell {
3
- --cms-bg: #f9f7f2;
4
- --cms-panel: #ffffff;
5
- --cms-border: #e8e4dc;
6
- --cms-text: #1a1a1a;
7
- --cms-muted: #6b6560;
8
- --cms-teal: #0d9488;
9
- --cms-teal-soft: rgba(13, 148, 136, 0.12);
10
- --cms-shadow: 0 1px 0 rgba(26, 26, 26, 0.04), 0 12px 40px rgba(26, 26, 26, 0.06);
3
+ --cms-bg: var(--color-background, #f9f7f2);
4
+ --cms-panel: var(--color-card, #ffffff);
5
+ --cms-border: var(--color-border, #e8e4dc);
6
+ --cms-text: var(--color-foreground, #1a1a1a);
7
+ --cms-muted: var(--color-muted-foreground, #6b6560);
8
+ --cms-teal: var(--color-accent, #0d9488);
9
+ --cms-teal-soft: color-mix(in srgb, var(--cms-teal) 14%, transparent);
10
+ --cms-shadow: 0 1px 0 color-mix(in srgb, var(--cms-text) 5%, transparent), 0 12px 40px color-mix(in srgb, var(--cms-text) 7%, transparent);
11
11
  display: flex;
12
12
  flex-direction: column;
13
13
  flex: 1;
@@ -1,5 +1,5 @@
1
- :root{--shell-bg:#F9F7F2;--topbar-bg:#ffffff;--topbar-border:rgba(43,39,31,.1);--rail-bg:#F3F0E8;--rail-active:rgba(30,106,111,.15);--sidebar-bg:#ffffff;--sidebar-border:rgba(43,39,31,.1);--canvas-bg:#F3F0E8;--canvas-dot-color:rgba(43,39,31,.05);--panel-bg:#ffffff;--panel-border:rgba(43,39,31,.1);--accent:#1e6a6f;--accent-hover:#22797f;--accent-muted:rgba(30,106,111,.12);--accent-border:rgba(30,106,111,.3);--success:#22c55e;--success-muted:rgba(34,197,94,.12);--warning:#f59e0b;--warning-muted:rgba(245,158,11,.12);--danger:#ef4444;--danger-muted:rgba(239,68,68,.12);--info:#3b82f6;--info-muted:rgba(59,130,246,.12);--text-1:#1a1a1a;--text-2:#4b4b57;--text-3:#8a8a95;--text-4:#c7c3b5;--border-1:rgba(43,39,31,.18);--border-2:rgba(43,39,31,.1);--border-3:rgba(43,39,31,.06);--surface-1:#F3F0E8;--surface-2:#EFEBDD;--surface-3:#E8E2D2;--surface-4:#DCD5C2;--r-xs:3px;--r-sm:5px;--r-md:8px;--r-lg:12px;--r-xl:16px;--r-full:9999px;--font-ui:Inter,ui-sans-serif,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;--font-mono:"SFMono-Regular",Consolas,"Liberation Mono",monospace;--ease-out:cubic-bezier(.16,1,.3,1);--dur-fast:120ms;--dur-normal:200ms;--dur-slow:350ms}
2
- *{box-sizing:border-box}html,body{margin:0;width:100%;height:100%;overflow:hidden;background:var(--shell-bg);color:var(--text-1);font-family:var(--font-ui);font-size:13px}button,input,textarea,select{font:inherit}button{color:inherit}button:focus-visible,input:focus-visible,textarea:focus-visible,select:focus-visible,[contenteditable]:focus-visible{outline:2px solid var(--accent);outline-offset:1px}button:disabled{opacity:.34;cursor:not-allowed!important}::-webkit-scrollbar{width:7px;height:7px}::-webkit-scrollbar-thumb{background:rgba(43,39,31,.18);border-radius:20px}::-webkit-scrollbar-track{background:transparent}
1
+ :root{--shell-bg:#F9F7F2;--topbar-bg:#ffffff;--topbar-border:rgba(43,39,31,.1);--rail-bg:#F3F0E8;--rail-active:rgba(30,106,111,.15);--sidebar-bg:#ffffff;--sidebar-border:rgba(43,39,31,.1);--canvas-bg:#F3F0E8;--canvas-dot-color:rgba(43,39,31,.05);--panel-bg:#ffffff;--panel-border:rgba(43,39,31,.1);--accent:#1e6a6f;--accent-hover:#22797f;--accent-muted:rgba(30,106,111,.12);--accent-border:rgba(30,106,111,.3);--success:#22c55e;--success-muted:rgba(34,197,94,.12);--warning:#f59e0b;--warning-muted:rgba(245,158,11,.12);--danger:#ef4444;--danger-muted:rgba(239,68,68,.12);--info:#3b82f6;--info-muted:rgba(59,130,246,.12);--text-1:#1a1a1a;--text-2:#4b4b57;--text-3:#8a8a95;--text-4:#c7c3b5;--border-1:rgba(43,39,31,.18);--border-2:rgba(43,39,31,.1);--border-3:rgba(43,39,31,.06);--surface-1:#F3F0E8;--surface-2:#EFEBDD;--surface-3:#E8E2D2;--surface-4:#DCD5C2;--r-xs:3px;--r-sm:5px;--r-md:8px;--r-lg:12px;--r-xl:16px;--r-full:9999px;--font-ui:var(--font-sans,"Instrument Sans",ui-sans-serif,system-ui,-apple-system,sans-serif);--font-mono:"SFMono-Regular",Consolas,"Liberation Mono",monospace;--ease-out:cubic-bezier(.16,1,.3,1);--dur-fast:120ms;--dur-normal:200ms;--dur-slow:350ms}
2
+ /* Hosted AgentSam: never style bare html/body — that nukes Instrument host tokens. Scope under .cms-shell. */*{box-sizing:border-box}.cms-shell{font-family:var(--font-ui);font-size:13px;color:var(--text-1)}.cms-shell button,.cms-shell input,.cms-shell textarea,.cms-shell select{font:inherit}.cms-shell button{color:inherit}button:focus-visible,input:focus-visible,textarea:focus-visible,select:focus-visible,[contenteditable]:focus-visible{outline:2px solid var(--accent);outline-offset:1px}button:disabled{opacity:.34;cursor:not-allowed!important}::-webkit-scrollbar{width:7px;height:7px}::-webkit-scrollbar-thumb{background:rgba(43,39,31,.18);border-radius:20px}::-webkit-scrollbar-track{background:transparent}
3
3
  .cms-shell{height:100vh;display:grid;grid-template-rows:48px minmax(0,1fr) 24px;background:var(--shell-bg);overflow:hidden}.topbar{grid-row:1;display:grid;grid-template-columns:300px minmax(110px,1fr) auto minmax(380px,1fr);align-items:center;height:48px;border-bottom:1px solid var(--topbar-border);background:var(--topbar-bg);padding:0 8px 0 10px;position:relative;z-index:30}.site-trigger-wrap,.publish-wrap{position:relative}.topbar-left{display:flex;align-items:center;gap:6px;min-width:0}.hub-exit{flex:none}.site-trigger{border:0;background:none;display:flex;align-items:center;gap:9px;min-width:0;padding:4px 6px;border-radius:7px;cursor:pointer}.site-trigger:hover{background:var(--surface-2)}.site-trigger>span:nth-child(2){display:flex;flex-direction:column;align-items:flex-start;min-width:0}.site-trigger b{font-size:12px;line-height:15px;white-space:nowrap}.site-trigger small{font-size:10px;color:var(--text-3);white-space:nowrap}.site-avatar{width:28px;height:28px;border-radius:8px;display:grid;place-items:center;font-weight:700;font-size:10px;color:white;box-shadow:inset 0 0 0 1px rgba(255,255,255,.15)}.breadcrumb{display:flex;align-items:center;gap:6px;color:var(--text-3);font-size:11px;min-width:0;overflow:hidden}.breadcrumb span,.breadcrumb b{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.breadcrumb b{color:var(--text-1);font-weight:500}.viewport-switcher{height:30px;display:flex;align-items:center;padding:3px;border:1px solid var(--border-2);border-radius:7px;background:#ffffff}.viewport-switcher button{width:33px;height:23px;border:0;border-radius:4px;background:transparent;color:var(--text-3);display:grid;place-items:center;cursor:pointer}.viewport-switcher button:hover{color:var(--text-1)}.viewport-switcher button.active{background:var(--surface-3);color:var(--text-1);box-shadow:0 1px 3px rgba(43,39,31,.35)}.top-actions{display:flex;align-items:center;justify-content:flex-end;gap:4px}.collab{display:flex;align-items:center;margin-right:7px}.collab>span{width:24px;height:24px;border-radius:50%;background:#E8E2D2;border:2px solid var(--topbar-bg);display:grid;place-items:center;font-size:8px;font-weight:700;margin-left:-5px}.collab>span:first-child{background:#1e6a6f}.collab small{color:var(--text-3);font-size:10px;margin-left:6px}.user-avatar{width:28px;height:28px;border:1px solid #D8D2C0;border-radius:50%;background:linear-gradient(135deg,#1e6a6f,#123f42);font-size:9px;font-weight:700;cursor:pointer;margin-left:3px}.button{min-height:30px;border:1px solid transparent;border-radius:6px;padding:0 9px;display:inline-flex;align-items:center;justify-content:center;gap:6px;background:transparent;color:var(--text-2);cursor:pointer;font-size:11px;white-space:nowrap;transition:background var(--dur-fast),border-color var(--dur-fast),color var(--dur-fast),transform var(--dur-fast)}.button:hover{color:var(--text-1);background:var(--surface-2)}.button.secondary{background:var(--surface-2);border-color:var(--border-1);color:var(--text-1)}.button.secondary:hover{background:var(--surface-3)}.button.accent{background:var(--accent);border-color:#155a5e;color:white;font-weight:600;box-shadow:0 1px 8px rgba(30,106,111,.25)}.button.accent:hover{background:var(--accent-hover);transform:translateY(-1px)}.button.wide-action{width:calc(100% - 16px);margin:10px 8px}.mobile-top,.mobile-tabs,.mobile-fab{display:none}
4
4
  .workspace{grid-row:2;display:grid;grid-template-columns:52px auto minmax(0,1fr) auto;min-height:0}.rail{grid-column:1;background:var(--rail-bg);border-right:1px solid var(--border-3);display:flex;flex-direction:column;align-items:center;padding-top:4px;z-index:12}.rail button{width:44px;height:44px;border:0;background:transparent;color:var(--text-3);display:grid;place-items:center;border-radius:8px;cursor:pointer;position:relative;transition:all var(--dur-fast)}.rail button:hover{color:var(--text-1);background:var(--surface-1)}.rail button.active{color:#1e6a6f;background:var(--rail-active)}.rail button.active:before{content:"";width:2px;height:18px;background:var(--accent);position:absolute;left:-4px;border-radius:0 3px 3px 0}.rail button[data-tip]:after{content:attr(data-tip);position:absolute;left:50px;background:#292934;color:white;border:1px solid #3a3a48;border-radius:5px;padding:6px 8px;font-size:10px;white-space:nowrap;opacity:0;pointer-events:none;transform:translateX(-4px);transition:opacity 150ms .15s,transform 150ms .15s;z-index:400;box-shadow:0 8px 24px rgba(43,39,31,.35)}.rail button[data-tip]:hover:after{opacity:1;transform:none}.rail .rail-collapse{margin-top:auto;margin-bottom:4px}
5
5
  .sidebar{grid-column:2;min-width:0;background:var(--sidebar-bg);border-right:1px solid var(--sidebar-border);display:grid;grid-template-rows:91px minmax(0,1fr);overflow:hidden;transition:width var(--dur-normal) var(--ease-out),opacity var(--dur-fast);width:260px;z-index:11}.sidebar.collapsed{width:0;border:0;opacity:0}.sidebar-head{padding:12px 10px 8px;display:grid;grid-template-columns:1fr auto;gap:8px;border-bottom:1px solid var(--border-3)}.sidebar-head>div:first-child{min-width:0}.eyebrow{font-size:8px;letter-spacing:.16em;text-transform:uppercase;color:var(--text-3);font-weight:700}.sidebar-head h2{font-size:15px;margin:2px 0 0;letter-spacing:-.02em}.search{height:30px;position:relative;display:flex;align-items:center;gap:6px;border:1px solid var(--border-2);background:#ffffff;border-radius:6px;padding:0 7px;grid-column:1/-1;transition:border-color var(--dur-fast)}.search:focus-within{border-color:var(--accent-border);box-shadow:0 0 0 2px var(--accent-muted)}.search svg{color:var(--text-3);flex:none}.search input{border:0;background:transparent;color:var(--text-1);outline:0;min-width:0;width:100%;font-size:11px}.search input::placeholder{color:var(--text-4)}.search button{border:0;background:none;padding:0;color:var(--text-3);display:grid;cursor:pointer}.search kbd{font-size:8px;color:var(--text-4);border:1px solid var(--border-2);border-radius:3px;padding:1px 3px}.sidebar-scroll{overflow-y:auto;overflow-x:hidden}.sidebar-section{padding:5px 0 12px}.group-title{height:31px;display:flex;align-items:center;gap:6px;padding:0 10px;color:var(--text-3);text-transform:uppercase;letter-spacing:.09em;font-size:8px;font-weight:700;margin-top:3px}.group-title span{flex:1}.group-title b{font-size:8px;background:var(--surface-2);border:1px solid var(--border-2);border-radius:8px;min-width:18px;text-align:center;padding:2px 4px;color:var(--text-3)}.group-title.zone-title{width:100%;background:none;border:0;cursor:pointer}.page-row,.section-row{height:47px;margin:0 5px;border-radius:5px;display:flex;align-items:center;gap:8px;padding:0 6px;cursor:pointer;position:relative;border-left:2px solid transparent}.page-row:hover,.section-row:hover{background:var(--surface-1)}.page-row.selected,.section-row.selected{border-left-color:var(--accent);background:var(--accent-muted)}.page-row .status,.publish-status .status{width:6px;height:6px;border-radius:50%;flex:none}.status.live{background:var(--success);box-shadow:0 0 0 3px var(--success-muted)}.status.draft{background:var(--warning);box-shadow:0 0 0 3px var(--warning-muted)}.status.new{background:var(--text-4)}.page-row>span:nth-of-type(1),.section-row>span:nth-of-type(2){min-width:0;flex:1;display:flex;flex-direction:column}.page-row b,.section-row>span b{font-size:11px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.page-row small,.section-row small{font-size:9px;color:var(--text-3);margin-top:2px}.page-row>button,.section-row>button{border:0;background:none;color:var(--text-3);padding:4px;display:grid;place-items:center;opacity:0;cursor:pointer}.page-row:hover>button,.section-row:hover>button,.section-row.selected>button{opacity:1}.page-row.nested{padding-left:22px}.drag{font-size:13px;color:var(--text-4);cursor:grab}.swatch{width:7px;height:18px;border-radius:2px;box-shadow:inset 0 0 0 1px rgba(255,255,255,.14)}
@@ -30,7 +30,7 @@
30
30
  .cms-agent-workbench [data-agent-composer]>div{display:flex;align-items:center;gap:6px;margin-top:6px}
31
31
  .cms-agent-workbench [data-agent-composer] button,.cms-agent-workbench [data-agent-composer] select{min-height:29px;border:1px solid var(--border-2);border-radius:6px;background:var(--surface-1);color:var(--text-2);padding:0 9px;font-size:9px}
32
32
 
33
- /* FnF theme-editor shell — rail | library | inspector+canvas | AgentSam dock */
33
+ /* Theme-editor shell — rail | library | inspector+canvas | agent dock */
34
34
  .cms-shell--fnf{grid-template-rows:48px minmax(0,1fr) 24px;background:#f4f4f5}
35
35
  .fnf-topbar{grid-row:1;height:48px;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:0 12px;background:#1f1f1f;color:#e8e8e8;position:relative;z-index:40;border-bottom:1px solid #2a2a2a}
36
36
  .fnf-topbar-left{display:flex;align-items:center;gap:8px;min-width:0;flex:none}
@@ -104,3 +104,55 @@
104
104
  .statusbar{display:none}
105
105
  .mobile-tabs{display:grid}
106
106
  }
107
+
108
+ /* Product shell — adapter-driven CmsEditor (not donor prototype chrome) */
109
+ .cms-shell--product,.cms-shell--loading,.cms-shell--error{display:flex;flex-direction:column;min-height:100vh;background:var(--shell-bg);color:var(--text-1)}
110
+ .cms-shell--loading,.cms-shell--error{align-items:center;justify-content:center;gap:12px;padding:32px;text-align:center}
111
+ .cms-shell--error h1{margin:0;font-size:22px;letter-spacing:-.02em}
112
+ .cms-shell--error p,.cms-shell--loading p{margin:0;max-width:420px;color:var(--text-2);line-height:1.55}
113
+ .cms-shell--error code{font-family:var(--font-mono);font-size:11px;background:var(--surface-2);padding:2px 6px;border-radius:4px}
114
+ .cms-ephemeral-banner{background:var(--warning-muted);color:#7a5a12;padding:8px 14px;font-size:12px;border-bottom:1px solid rgba(245,158,11,.35);text-align:center}
115
+ .cms-topbar{height:48px;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:0 14px;background:var(--topbar-bg);border-bottom:1px solid var(--topbar-border)}
116
+ .cms-topbar>div:first-child{display:flex;flex-direction:column;min-width:0}
117
+ .cms-topbar strong{font-size:13px}
118
+ .cms-topbar span{font-size:10px;color:var(--text-3)}
119
+ .cms-topbar-actions{display:flex;align-items:center;gap:6px}
120
+ .cms-topbar-actions button{min-height:30px;border:1px solid var(--border-2);border-radius:6px;background:var(--surface-1);padding:0 10px;cursor:pointer;font-size:11px}
121
+ .cms-topbar-actions button:hover{background:var(--surface-2)}
122
+ .cms-topbar-actions .badge{font-size:10px;text-transform:uppercase;letter-spacing:.04em;border-radius:999px;padding:4px 8px;font-weight:700}
123
+ .cms-topbar-actions .badge.draft{background:var(--warning-muted);color:#7a5a12}
124
+ .cms-topbar-actions .badge.saved{background:var(--success-muted);color:#0a7a3e}
125
+ .cms-workspace{flex:1;min-height:0;display:grid;grid-template-columns:52px 220px minmax(0,1fr) 300px}
126
+ .cms-rail{background:var(--rail-bg);border-right:1px solid var(--border-3);display:flex;flex-direction:column;align-items:stretch;padding:6px;gap:4px}
127
+ .cms-rail button{border:0;background:transparent;color:var(--text-3);padding:10px 6px;border-radius:8px;cursor:pointer;text-transform:capitalize;font-size:10px}
128
+ .cms-rail button:hover,.cms-rail button.active{background:var(--rail-active);color:var(--accent)}
129
+ .cms-sidebar,.cms-inspector{background:var(--sidebar-bg);overflow:auto;padding:10px}
130
+ .cms-sidebar{border-right:1px solid var(--sidebar-border)}
131
+ .cms-inspector{border-left:1px solid var(--panel-border)}
132
+ .cms-sidebar ul,.cms-inspector ul{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:4px}
133
+ .cms-sidebar li button{width:100%;border:0;background:transparent;text-align:left;padding:8px 10px;border-radius:6px;cursor:pointer;display:flex;flex-direction:column;gap:2px}
134
+ .cms-sidebar li button:hover,.cms-sidebar li button.active{background:var(--accent-muted)}
135
+ .cms-sidebar small,.cms-inspector p{color:var(--text-3);font-size:10px}
136
+ .cms-inspector h2{margin:0 0 4px;font-size:14px}
137
+ .cms-inspector label{display:flex;flex-direction:column;gap:4px;margin:10px 0;font-size:11px}
138
+ .cms-inspector input{border:1px solid var(--border-2);border-radius:5px;padding:8px;background:#fff}
139
+ .cms-error{color:var(--danger);font-size:11px}
140
+ .cms-canvas-wrap{min-width:0;min-height:0;display:flex;flex-direction:column;background:var(--canvas-bg);background-image:radial-gradient(var(--canvas-dot-color) 1px,transparent 1px);background-size:16px 16px}
141
+ .cms-viewport-switch{display:flex;gap:4px;padding:8px 12px;border-bottom:1px solid var(--border-3);background:rgba(255,255,255,.7)}
142
+ .cms-viewport-switch button{border:1px solid var(--border-2);background:#fff;border-radius:5px;padding:4px 10px;font-size:10px;text-transform:capitalize;cursor:pointer}
143
+ .cms-viewport-switch button.active{background:var(--accent-muted);border-color:var(--accent-border);color:var(--accent)}
144
+ .cms-canvas{flex:1;overflow:auto;padding:16px;max-width:100%}
145
+ .cms-canvas--phone{max-width:420px;margin:0 auto}
146
+ .cms-canvas--tablet{max-width:780px;margin:0 auto}
147
+ .cms-canvas-meta{display:flex;gap:10px;align-items:baseline;margin-bottom:12px}
148
+ .cms-canvas-meta em{margin-left:auto;font-size:10px;color:var(--text-3);font-style:normal}
149
+ .cms-canvas-sections{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}
150
+ .cms-canvas-sections>li{background:#fff;border:1px solid var(--border-2);border-radius:8px;overflow:hidden}
151
+ .cms-canvas-sections button{width:100%;border:0;background:transparent;text-align:left;padding:12px 14px;cursor:pointer;display:flex;gap:8px;align-items:center}
152
+ .cms-canvas-sections button.is-selected{background:var(--accent-muted)}
153
+ .cms-canvas-sections small{color:var(--text-3);font-size:10px}
154
+ .cms-canvas-sections em{margin-left:auto;font-size:9px;color:var(--warning);font-style:normal}
155
+ .cms-canvas-sections dl{margin:0;padding:0 14px 12px;display:grid;grid-template-columns:120px 1fr;gap:6px 10px;font-size:11px}
156
+ .cms-canvas-sections dt{color:var(--text-3)}
157
+ .cms-canvas-empty{padding:40px;text-align:center;color:var(--text-3)}
158
+ .cms-settings{display:flex;flex-direction:column;gap:8px;font-size:12px;color:var(--text-2)}
@@ -17,7 +17,18 @@
17
17
  "types": [
18
18
  "vite/client"
19
19
  ],
20
- "preserveSymlinks": true
20
+ "preserveSymlinks": true,
21
+ "baseUrl": ".",
22
+ "paths": {
23
+ "@inneranimalmedia/agentsam-cms-shared": ["../shared/cms/src/index.ts"],
24
+ "@inneranimalmedia/agentsam-cms-shared/*": ["../shared/cms/src/*"],
25
+ "@inneranimalmedia/agentsam-cms-backend/api": ["../backend/src/api/client.ts"],
26
+ "@inneranimalmedia/agentsam-cms-backend/model": ["../backend/src/model.ts"],
27
+ "@inneranimalmedia/agentsam-cms-backend/preview": ["../backend/src/preview/bridge.ts"],
28
+ "@inneranimalmedia/agentsam-cms-backend/routing": ["../backend/src/routing/index.js"],
29
+ "@inneranimalmedia/agentsam-cms-backend": ["../backend/src/index.ts"],
30
+ "@inneranimalmedia/agentsam-cms-backend/*": ["../backend/src/*"]
31
+ }
21
32
  },
22
33
  "include": [
23
34
  "src"
@@ -1,10 +1,22 @@
1
1
  import react from '@vitejs/plugin-react';
2
+ import path from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
2
4
  import { defineConfig } from 'vite';
3
5
 
6
+ const root = path.dirname(fileURLToPath(import.meta.url));
7
+
4
8
  export default defineConfig({
5
9
  plugins: [react()],
6
10
  resolve: {
7
11
  preserveSymlinks: true,
12
+ alias: {
13
+ '@inneranimalmedia/agentsam-cms-shared': path.join(root, '../shared/cms/src/index.ts'),
14
+ '@inneranimalmedia/agentsam-cms-backend/api': path.join(root, '../backend/src/api/client.ts'),
15
+ '@inneranimalmedia/agentsam-cms-backend/model': path.join(root, '../backend/src/model.ts'),
16
+ '@inneranimalmedia/agentsam-cms-backend/preview': path.join(root, '../backend/src/preview/bridge.ts'),
17
+ '@inneranimalmedia/agentsam-cms-backend/routing': path.join(root, '../backend/src/routing/index.js'),
18
+ '@inneranimalmedia/agentsam-cms-backend': path.join(root, '../backend/src/index.ts'),
19
+ },
8
20
  },
9
21
  build: {
10
22
  outDir: 'dist',