@aphexcms/cms-core 9.7.0 → 9.8.1

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 (330) hide show
  1. package/dist/agent-chat-state.svelte.d.ts +38 -0
  2. package/dist/agent-chat-state.svelte.d.ts.map +1 -0
  3. package/dist/agent-chat-state.svelte.js +86 -0
  4. package/dist/ai/content-workspace-tools.d.ts +3 -0
  5. package/dist/ai/content-workspace-tools.d.ts.map +1 -0
  6. package/dist/ai/content-workspace-tools.js +50 -0
  7. package/dist/ai/default-system-prompt.d.ts +2 -0
  8. package/dist/ai/default-system-prompt.d.ts.map +1 -0
  9. package/dist/ai/default-system-prompt.js +15 -0
  10. package/dist/ai/index.d.ts +2 -0
  11. package/dist/ai/index.d.ts.map +1 -0
  12. package/dist/ai/index.js +4 -0
  13. package/dist/ai/interfaces/ai-provider.d.ts +67 -0
  14. package/dist/ai/interfaces/ai-provider.d.ts.map +1 -0
  15. package/dist/ai/interfaces/ai-provider.js +16 -0
  16. package/dist/ai/run-agent-turn.d.ts +29 -0
  17. package/dist/ai/run-agent-turn.d.ts.map +1 -0
  18. package/dist/ai/run-agent-turn.js +166 -0
  19. package/dist/api/agent-chat.d.ts +27 -0
  20. package/dist/api/agent-chat.d.ts.map +1 -0
  21. package/dist/api/agent-chat.js +64 -0
  22. package/dist/api/documents.d.ts +8 -3
  23. package/dist/api/documents.d.ts.map +1 -1
  24. package/dist/api/documents.js +6 -6
  25. package/dist/api/schemas/agent-chat.d.ts +45 -0
  26. package/dist/api/schemas/agent-chat.d.ts.map +1 -0
  27. package/dist/api/schemas/agent-chat.js +35 -0
  28. package/dist/api/schemas/agent-operations.d.ts +13 -0
  29. package/dist/api/schemas/agent-operations.d.ts.map +1 -0
  30. package/dist/api/schemas/agent-operations.js +15 -0
  31. package/dist/api/schemas/documents.d.ts +22 -0
  32. package/dist/api/schemas/documents.d.ts.map +1 -1
  33. package/dist/api/schemas/documents.js +20 -2
  34. package/dist/chunk-recovery.d.ts +33 -0
  35. package/dist/chunk-recovery.d.ts.map +1 -0
  36. package/dist/chunk-recovery.js +131 -0
  37. package/dist/client/index.d.ts +1 -0
  38. package/dist/client/index.d.ts.map +1 -1
  39. package/dist/client/index.js +1 -0
  40. package/dist/client/ui.d.ts +1 -0
  41. package/dist/client/ui.d.ts.map +1 -1
  42. package/dist/client/ui.js +1 -0
  43. package/dist/components/AdminApp.svelte +37 -3
  44. package/dist/components/AdminApp.svelte.d.ts.map +1 -1
  45. package/dist/components/admin/ActivityView.svelte +251 -42
  46. package/dist/components/admin/ActivityView.svelte.d.ts.map +1 -1
  47. package/dist/components/admin/AgentChat.svelte +977 -0
  48. package/dist/components/admin/AgentChat.svelte.d.ts +17 -0
  49. package/dist/components/admin/AgentChat.svelte.d.ts.map +1 -0
  50. package/dist/components/admin/DocumentEditor.svelte +273 -60
  51. package/dist/components/admin/DocumentEditor.svelte.d.ts +6 -0
  52. package/dist/components/admin/DocumentEditor.svelte.d.ts.map +1 -1
  53. package/dist/components/admin/ObjectModal.svelte +4 -2
  54. package/dist/components/admin/fields/ArrayField.svelte +4 -1
  55. package/dist/components/admin/fields/ReferenceField.svelte +12 -1
  56. package/dist/components/admin/fields/ReferenceField.svelte.d.ts.map +1 -1
  57. package/dist/components/index.d.ts +1 -0
  58. package/dist/components/index.d.ts.map +1 -1
  59. package/dist/components/index.js +1 -0
  60. package/dist/components/layout/Sidebar.svelte +26 -2
  61. package/dist/components/layout/Sidebar.svelte.d.ts +1 -0
  62. package/dist/components/layout/Sidebar.svelte.d.ts.map +1 -1
  63. package/dist/db/interfaces/agent-change-sets.d.ts +17 -0
  64. package/dist/db/interfaces/agent-change-sets.d.ts.map +1 -0
  65. package/dist/db/interfaces/agent-change-sets.js +1 -0
  66. package/dist/db/interfaces/document.d.ts +25 -3
  67. package/dist/db/interfaces/document.d.ts.map +1 -1
  68. package/dist/db/interfaces/document.js +19 -1
  69. package/dist/db/interfaces/index.d.ts +4 -1
  70. package/dist/db/interfaces/index.d.ts.map +1 -1
  71. package/dist/db/interfaces/index.js +1 -1
  72. package/dist/document-refresh.svelte.d.ts +2 -0
  73. package/dist/document-refresh.svelte.d.ts.map +1 -1
  74. package/dist/document-refresh.svelte.js +15 -0
  75. package/dist/document-workspace-registry.svelte.d.ts +15 -0
  76. package/dist/document-workspace-registry.svelte.d.ts.map +1 -0
  77. package/dist/document-workspace-registry.svelte.js +30 -0
  78. package/dist/field-validation/utils.d.ts.map +1 -1
  79. package/dist/field-validation/utils.js +211 -29
  80. package/dist/hooks.d.ts +2 -0
  81. package/dist/hooks.d.ts.map +1 -1
  82. package/dist/hooks.js +2 -0
  83. package/dist/lib/agent-chat-state.svelte.d.ts +38 -0
  84. package/dist/lib/agent-chat-state.svelte.d.ts.map +1 -0
  85. package/dist/lib/agent-chat-state.svelte.js +87 -0
  86. package/dist/lib/agent-chat-state.svelte.js.map +1 -0
  87. package/dist/lib/ai/content-workspace-tools.d.ts +3 -0
  88. package/dist/lib/ai/content-workspace-tools.d.ts.map +1 -0
  89. package/dist/lib/ai/content-workspace-tools.js +51 -0
  90. package/dist/lib/ai/content-workspace-tools.js.map +1 -0
  91. package/dist/lib/ai/default-system-prompt.d.ts +2 -0
  92. package/dist/lib/ai/default-system-prompt.d.ts.map +1 -0
  93. package/dist/lib/ai/default-system-prompt.js +16 -0
  94. package/dist/lib/ai/default-system-prompt.js.map +1 -0
  95. package/dist/lib/ai/index.d.ts +2 -0
  96. package/dist/lib/ai/index.d.ts.map +1 -0
  97. package/dist/lib/ai/index.js +5 -0
  98. package/dist/lib/ai/index.js.map +1 -0
  99. package/dist/lib/ai/interfaces/ai-provider.d.ts +67 -0
  100. package/dist/lib/ai/interfaces/ai-provider.d.ts.map +1 -0
  101. package/dist/lib/ai/interfaces/ai-provider.js +17 -0
  102. package/dist/lib/ai/interfaces/ai-provider.js.map +1 -0
  103. package/dist/lib/ai/run-agent-turn.d.ts +29 -0
  104. package/dist/lib/ai/run-agent-turn.d.ts.map +1 -0
  105. package/dist/lib/ai/run-agent-turn.js +167 -0
  106. package/dist/lib/ai/run-agent-turn.js.map +1 -0
  107. package/dist/lib/api/agent-chat.d.ts +27 -0
  108. package/dist/lib/api/agent-chat.d.ts.map +1 -0
  109. package/dist/lib/api/agent-chat.js +65 -0
  110. package/dist/lib/api/agent-chat.js.map +1 -0
  111. package/dist/lib/api/documents.d.ts +8 -3
  112. package/dist/lib/api/documents.d.ts.map +1 -1
  113. package/dist/lib/api/documents.js +6 -6
  114. package/dist/lib/api/documents.js.map +1 -1
  115. package/dist/lib/api/schemas/agent-chat.d.ts +45 -0
  116. package/dist/lib/api/schemas/agent-chat.d.ts.map +1 -0
  117. package/dist/lib/api/schemas/agent-chat.js +36 -0
  118. package/dist/lib/api/schemas/agent-chat.js.map +1 -0
  119. package/dist/lib/api/schemas/agent-operations.d.ts +13 -0
  120. package/dist/lib/api/schemas/agent-operations.d.ts.map +1 -0
  121. package/dist/lib/api/schemas/agent-operations.js +16 -0
  122. package/dist/lib/api/schemas/agent-operations.js.map +1 -0
  123. package/dist/lib/api/schemas/documents.d.ts +22 -0
  124. package/dist/lib/api/schemas/documents.d.ts.map +1 -1
  125. package/dist/lib/api/schemas/documents.js +20 -2
  126. package/dist/lib/api/schemas/documents.js.map +1 -1
  127. package/dist/lib/chunk-recovery.d.ts +33 -0
  128. package/dist/lib/chunk-recovery.d.ts.map +1 -0
  129. package/dist/lib/chunk-recovery.js +132 -0
  130. package/dist/lib/chunk-recovery.js.map +1 -0
  131. package/dist/lib/client/index.d.ts +1 -0
  132. package/dist/lib/client/index.d.ts.map +1 -1
  133. package/dist/lib/client/index.js +1 -0
  134. package/dist/lib/client/index.js.map +1 -1
  135. package/dist/lib/client/ui.d.ts +1 -0
  136. package/dist/lib/client/ui.d.ts.map +1 -1
  137. package/dist/lib/client/ui.js +1 -0
  138. package/dist/lib/client/ui.js.map +1 -1
  139. package/dist/lib/components/index.d.ts +1 -0
  140. package/dist/lib/components/index.d.ts.map +1 -1
  141. package/dist/lib/components/index.js +1 -0
  142. package/dist/lib/components/index.js.map +1 -1
  143. package/dist/lib/db/interfaces/agent-change-sets.d.ts +17 -0
  144. package/dist/lib/db/interfaces/agent-change-sets.d.ts.map +1 -0
  145. package/dist/lib/db/interfaces/agent-change-sets.js +2 -0
  146. package/dist/lib/db/interfaces/agent-change-sets.js.map +1 -0
  147. package/dist/lib/db/interfaces/document.d.ts +25 -3
  148. package/dist/lib/db/interfaces/document.d.ts.map +1 -1
  149. package/dist/lib/db/interfaces/document.js +19 -1
  150. package/dist/lib/db/interfaces/document.js.map +1 -1
  151. package/dist/lib/db/interfaces/index.d.ts +4 -1
  152. package/dist/lib/db/interfaces/index.d.ts.map +1 -1
  153. package/dist/lib/db/interfaces/index.js +1 -1
  154. package/dist/lib/db/interfaces/index.js.map +1 -1
  155. package/dist/lib/document-refresh.svelte.d.ts +2 -0
  156. package/dist/lib/document-refresh.svelte.d.ts.map +1 -1
  157. package/dist/lib/document-refresh.svelte.js +15 -0
  158. package/dist/lib/document-refresh.svelte.js.map +1 -1
  159. package/dist/lib/document-workspace-registry.svelte.d.ts +15 -0
  160. package/dist/lib/document-workspace-registry.svelte.d.ts.map +1 -0
  161. package/dist/lib/document-workspace-registry.svelte.js +31 -0
  162. package/dist/lib/document-workspace-registry.svelte.js.map +1 -0
  163. package/dist/lib/field-validation/utils.d.ts.map +1 -1
  164. package/dist/lib/field-validation/utils.js +211 -29
  165. package/dist/lib/field-validation/utils.js.map +1 -1
  166. package/dist/lib/hooks.d.ts +2 -0
  167. package/dist/lib/hooks.d.ts.map +1 -1
  168. package/dist/lib/hooks.js +2 -0
  169. package/dist/lib/hooks.js.map +1 -1
  170. package/dist/lib/local-api/collection-api.d.ts +7 -2
  171. package/dist/lib/local-api/collection-api.d.ts.map +1 -1
  172. package/dist/lib/local-api/collection-api.js +17 -10
  173. package/dist/lib/local-api/collection-api.js.map +1 -1
  174. package/dist/lib/mcp/tools.d.ts +39 -4
  175. package/dist/lib/mcp/tools.d.ts.map +1 -1
  176. package/dist/lib/mcp/tools.js +546 -362
  177. package/dist/lib/mcp/tools.js.map +1 -1
  178. package/dist/lib/plugins/resolver.d.ts +8 -1
  179. package/dist/lib/plugins/resolver.d.ts.map +1 -1
  180. package/dist/lib/plugins/resolver.js +14 -1
  181. package/dist/lib/plugins/resolver.js.map +1 -1
  182. package/dist/lib/plugins/types.d.ts +23 -2
  183. package/dist/lib/plugins/types.d.ts.map +1 -1
  184. package/dist/lib/plugins/types.js.map +1 -1
  185. package/dist/lib/preview/stega.d.ts +2 -2
  186. package/dist/lib/preview/stega.d.ts.map +1 -1
  187. package/dist/lib/preview/stega.js +52 -29
  188. package/dist/lib/preview/stega.js.map +1 -1
  189. package/dist/lib/schema-utils/validator.d.ts.map +1 -1
  190. package/dist/lib/schema-utils/validator.js +5 -2
  191. package/dist/lib/schema-utils/validator.js.map +1 -1
  192. package/dist/lib/server/api/index.d.ts.map +1 -1
  193. package/dist/lib/server/api/index.js +8 -0
  194. package/dist/lib/server/api/index.js.map +1 -1
  195. package/dist/lib/server/api/routes/agent-change-sets.d.ts +4 -0
  196. package/dist/lib/server/api/routes/agent-change-sets.d.ts.map +1 -0
  197. package/dist/lib/server/api/routes/agent-change-sets.js +132 -0
  198. package/dist/lib/server/api/routes/agent-change-sets.js.map +1 -0
  199. package/dist/lib/server/api/routes/agent-chat.d.ts +14 -0
  200. package/dist/lib/server/api/routes/agent-chat.d.ts.map +1 -0
  201. package/dist/lib/server/api/routes/agent-chat.js +224 -0
  202. package/dist/lib/server/api/routes/agent-chat.js.map +1 -0
  203. package/dist/lib/server/api/routes/document-versions.d.ts.map +1 -1
  204. package/dist/lib/server/api/routes/document-versions.js +16 -2
  205. package/dist/lib/server/api/routes/document-versions.js.map +1 -1
  206. package/dist/lib/server/api/routes/documents-by-id.d.ts.map +1 -1
  207. package/dist/lib/server/api/routes/documents-by-id.js +11 -1
  208. package/dist/lib/server/api/routes/documents-by-id.js.map +1 -1
  209. package/dist/lib/server/api/routes/documents-publish.d.ts.map +1 -1
  210. package/dist/lib/server/api/routes/documents-publish.js +36 -3
  211. package/dist/lib/server/api/routes/documents-publish.js.map +1 -1
  212. package/dist/lib/server/api/routes/jobs.d.ts.map +1 -1
  213. package/dist/lib/server/api/routes/jobs.js +4 -2
  214. package/dist/lib/server/api/routes/jobs.js.map +1 -1
  215. package/dist/lib/server/api/routes/resolve-created-by.d.ts +13 -0
  216. package/dist/lib/server/api/routes/resolve-created-by.d.ts.map +1 -0
  217. package/dist/lib/server/api/routes/resolve-created-by.js +31 -0
  218. package/dist/lib/server/api/routes/resolve-created-by.js.map +1 -0
  219. package/dist/lib/server/index.d.ts +1 -0
  220. package/dist/lib/server/index.d.ts.map +1 -1
  221. package/dist/lib/server/index.js +1 -0
  222. package/dist/lib/server/index.js.map +1 -1
  223. package/dist/lib/services/references-service.d.ts +1 -1
  224. package/dist/lib/services/references-service.d.ts.map +1 -1
  225. package/dist/lib/services/version-service.d.ts +4 -4
  226. package/dist/lib/services/version-service.d.ts.map +1 -1
  227. package/dist/lib/services/version-service.js +15 -11
  228. package/dist/lib/services/version-service.js.map +1 -1
  229. package/dist/lib/type-gen.d.ts.map +1 -1
  230. package/dist/lib/type-gen.js +11 -0
  231. package/dist/lib/type-gen.js.map +1 -1
  232. package/dist/lib/types/agent-change-sets.d.ts +70 -0
  233. package/dist/lib/types/agent-change-sets.d.ts.map +1 -0
  234. package/dist/lib/types/agent-change-sets.js +7 -0
  235. package/dist/lib/types/agent-change-sets.js.map +1 -0
  236. package/dist/lib/types/agent-stream.d.ts +60 -0
  237. package/dist/lib/types/agent-stream.d.ts.map +1 -0
  238. package/dist/lib/types/agent-stream.js +12 -0
  239. package/dist/lib/types/agent-stream.js.map +1 -0
  240. package/dist/lib/types/agent-tools.d.ts +65 -0
  241. package/dist/lib/types/agent-tools.d.ts.map +1 -0
  242. package/dist/lib/types/agent-tools.js +2 -0
  243. package/dist/lib/types/agent-tools.js.map +1 -0
  244. package/dist/lib/types/config.d.ts +19 -0
  245. package/dist/lib/types/config.d.ts.map +1 -1
  246. package/dist/lib/types/document-workspace.d.ts +53 -0
  247. package/dist/lib/types/document-workspace.d.ts.map +1 -0
  248. package/dist/lib/types/document-workspace.js +15 -0
  249. package/dist/lib/types/document-workspace.js.map +1 -0
  250. package/dist/lib/types/document.d.ts +5 -0
  251. package/dist/lib/types/document.d.ts.map +1 -1
  252. package/dist/lib/types/index.d.ts +2 -0
  253. package/dist/lib/types/index.d.ts.map +1 -1
  254. package/dist/lib/types/index.js +2 -0
  255. package/dist/lib/types/index.js.map +1 -1
  256. package/dist/lib/types/schemas.js +1 -1
  257. package/dist/lib/types/schemas.js.map +1 -1
  258. package/dist/lib/utils/fetch-remote-file.d.ts +11 -0
  259. package/dist/lib/utils/fetch-remote-file.d.ts.map +1 -0
  260. package/dist/lib/utils/fetch-remote-file.js +169 -0
  261. package/dist/lib/utils/fetch-remote-file.js.map +1 -0
  262. package/dist/local-api/collection-api.d.ts +7 -2
  263. package/dist/local-api/collection-api.d.ts.map +1 -1
  264. package/dist/local-api/collection-api.js +17 -10
  265. package/dist/mcp/tools.d.ts +39 -4
  266. package/dist/mcp/tools.d.ts.map +1 -1
  267. package/dist/mcp/tools.js +546 -362
  268. package/dist/plugins/resolver.d.ts +8 -1
  269. package/dist/plugins/resolver.d.ts.map +1 -1
  270. package/dist/plugins/resolver.js +14 -1
  271. package/dist/plugins/types.d.ts +23 -2
  272. package/dist/plugins/types.d.ts.map +1 -1
  273. package/dist/preview/stega.d.ts +2 -2
  274. package/dist/preview/stega.d.ts.map +1 -1
  275. package/dist/preview/stega.js +52 -29
  276. package/dist/schema-utils/validator.d.ts.map +1 -1
  277. package/dist/schema-utils/validator.js +5 -2
  278. package/dist/server/api/index.d.ts.map +1 -1
  279. package/dist/server/api/index.js +8 -0
  280. package/dist/server/api/routes/agent-change-sets.d.ts +4 -0
  281. package/dist/server/api/routes/agent-change-sets.d.ts.map +1 -0
  282. package/dist/server/api/routes/agent-change-sets.js +131 -0
  283. package/dist/server/api/routes/agent-chat.d.ts +14 -0
  284. package/dist/server/api/routes/agent-chat.d.ts.map +1 -0
  285. package/dist/server/api/routes/agent-chat.js +223 -0
  286. package/dist/server/api/routes/document-versions.d.ts.map +1 -1
  287. package/dist/server/api/routes/document-versions.js +16 -2
  288. package/dist/server/api/routes/documents-by-id.d.ts.map +1 -1
  289. package/dist/server/api/routes/documents-by-id.js +11 -1
  290. package/dist/server/api/routes/documents-publish.d.ts.map +1 -1
  291. package/dist/server/api/routes/documents-publish.js +36 -3
  292. package/dist/server/api/routes/jobs.d.ts.map +1 -1
  293. package/dist/server/api/routes/jobs.js +4 -2
  294. package/dist/server/api/routes/resolve-created-by.d.ts +13 -0
  295. package/dist/server/api/routes/resolve-created-by.d.ts.map +1 -0
  296. package/dist/server/api/routes/resolve-created-by.js +30 -0
  297. package/dist/server/index.d.ts +1 -0
  298. package/dist/server/index.d.ts.map +1 -1
  299. package/dist/server/index.js +1 -0
  300. package/dist/services/references-service.d.ts +1 -1
  301. package/dist/services/references-service.d.ts.map +1 -1
  302. package/dist/services/version-service.d.ts +4 -4
  303. package/dist/services/version-service.d.ts.map +1 -1
  304. package/dist/services/version-service.js +15 -11
  305. package/dist/type-gen.d.ts.map +1 -1
  306. package/dist/type-gen.js +11 -0
  307. package/dist/types/agent-change-sets.d.ts +70 -0
  308. package/dist/types/agent-change-sets.d.ts.map +1 -0
  309. package/dist/types/agent-change-sets.js +6 -0
  310. package/dist/types/agent-stream.d.ts +60 -0
  311. package/dist/types/agent-stream.d.ts.map +1 -0
  312. package/dist/types/agent-stream.js +11 -0
  313. package/dist/types/agent-tools.d.ts +65 -0
  314. package/dist/types/agent-tools.d.ts.map +1 -0
  315. package/dist/types/agent-tools.js +1 -0
  316. package/dist/types/config.d.ts +19 -0
  317. package/dist/types/config.d.ts.map +1 -1
  318. package/dist/types/document-workspace.d.ts +53 -0
  319. package/dist/types/document-workspace.d.ts.map +1 -0
  320. package/dist/types/document-workspace.js +14 -0
  321. package/dist/types/document.d.ts +5 -0
  322. package/dist/types/document.d.ts.map +1 -1
  323. package/dist/types/index.d.ts +2 -0
  324. package/dist/types/index.d.ts.map +1 -1
  325. package/dist/types/index.js +2 -0
  326. package/dist/types/schemas.js +1 -1
  327. package/dist/utils/fetch-remote-file.d.ts +11 -0
  328. package/dist/utils/fetch-remote-file.d.ts.map +1 -0
  329. package/dist/utils/fetch-remote-file.js +168 -0
  330. package/package.json +5 -2
@@ -0,0 +1,17 @@
1
+ import type { Component } from 'svelte';
2
+ /** A suggestion can be a bare string, or `{ text, icon }` for a leading icon — the plain
3
+ * string form stays the common case so existing callers don't need to change anything. */
4
+ type Suggestion = string | {
5
+ text: string;
6
+ icon?: Component;
7
+ };
8
+ type $$ComponentProps = {
9
+ embedded?: boolean;
10
+ title?: string;
11
+ subtitle?: string;
12
+ suggestions?: Suggestion[];
13
+ };
14
+ declare const AgentChat: Component<$$ComponentProps, {}, "">;
15
+ type AgentChat = ReturnType<typeof AgentChat>;
16
+ export default AgentChat;
17
+ //# sourceMappingURL=AgentChat.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentChat.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/admin/AgentChat.svelte.ts"],"names":[],"mappings":"AA4CA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAiBvC;0FAC0F;AAC1F,KAAK,UAAU,GAAG,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,SAAS,CAAA;CAAE,CAAC;AAU9D,KAAK,gBAAgB,GAAI;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;CAC3B,CAAC;AAivBH,QAAA,MAAM,SAAS,qCAAwC,CAAC;AACxD,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;AAC9C,eAAe,SAAS,CAAC"}
@@ -46,6 +46,11 @@
46
46
  import { stegaEncodeDocument } from '../../preview/stega.js';
47
47
  import { collectAssetRefs, injectAssetData, type ResolvedAsset } from '../../preview/assets.js';
48
48
  import { setRichtextEditorRegistry } from '../../richtext-context.svelte.js';
49
+ import { documentWorkspaceRegistry } from '../../document-workspace-registry.svelte';
50
+ import type {
51
+ DocumentWorkspace,
52
+ DocumentWorkspaceOperation
53
+ } from '../../types/document-workspace';
49
54
 
50
55
  interface Props {
51
56
  schemas: SchemaType[];
@@ -72,6 +77,12 @@
72
77
  createdAt?: string;
73
78
  } | null;
74
79
  isReadOnly?: boolean;
80
+ /** Suppresses the bottom action bar (Publish / Schedule / Unpublish / Delete).
81
+ * Set by the host when another editor is stacked on top of this one and owns
82
+ * the actions instead — two action bars in the same corner give no clue which
83
+ * document each one publishes. This hides the bar only; the document keeps
84
+ * auto-saving and its status stays visible in the header. */
85
+ hideActionBar?: boolean;
75
86
  /** When true, the host has hidden side panels — show a Minimize toggle. */
76
87
  focusMode?: boolean;
77
88
  /** Toggle host-driven focus mode. Omit to hide the focus button entirely. */
@@ -109,6 +120,7 @@
109
120
  onOpenVersionHistory,
110
121
  externalVersionPreview = null,
111
122
  isReadOnly = false,
123
+ hideActionBar = false,
112
124
  focusMode = false,
113
125
  onToggleFocus,
114
126
  presentationMode = false,
@@ -210,6 +222,80 @@
210
222
  : null
211
223
  );
212
224
 
225
+ // A live handle onto this document's editable state — the seam an external caller (today:
226
+ // the agent's content_patch_fields/content_save_draft bridge tools) plugs into instead of
227
+ // reaching into this component's internals directly. See types/document-workspace.ts for
228
+ // why this is shaped generically rather than as an AI-specific bridge.
229
+ const documentWorkspace: DocumentWorkspace = {
230
+ getSnapshot() {
231
+ return {
232
+ documentId: documentId ?? fullDocument?.id ?? null,
233
+ collection: documentType,
234
+ data: $state.snapshot(documentData),
235
+ status: !documentId
236
+ ? 'new'
237
+ : fullDocument?._meta?.status === 'published'
238
+ ? 'published'
239
+ : fullDocument?._meta?.status === 'unpublished'
240
+ ? 'unpublished'
241
+ : 'draft',
242
+ revision: (fullDocument?._meta?.revision as number | undefined) ?? null
243
+ };
244
+ },
245
+ getSelection() {
246
+ return { fieldName: focusedFieldName };
247
+ },
248
+ apply(operation: DocumentWorkspaceOperation) {
249
+ if (operation.type === 'patchFields') {
250
+ documentData = { ...documentData, ...operation.fields };
251
+ hasUnsavedChanges = true;
252
+ }
253
+ },
254
+ async validate() {
255
+ const invalid = await validateAllFields();
256
+ return {
257
+ isValid: invalid.length === 0,
258
+ errors: invalid.map((f) => ({ field: f.name, errors: f.messages }))
259
+ };
260
+ },
261
+ async flushSave(_expectedRevision) {
262
+ return await saveDocument(false);
263
+ },
264
+ async publish(_expectedRevision) {
265
+ await publishDocument();
266
+ if (saveError) {
267
+ return { success: false, conflict: saveError.startsWith('Conflict'), error: saveError };
268
+ }
269
+ return {
270
+ success: true,
271
+ revision: (fullDocument?._meta?.revision as number | undefined) ?? undefined
272
+ };
273
+ },
274
+ beginBatch(_source) {
275
+ batchActive = true;
276
+ },
277
+ endBatch() {
278
+ batchActive = false;
279
+ }
280
+ };
281
+
282
+ // Registers/clears this document's workspace handle in the shared registry
283
+ // (document-workspace-registry.svelte.ts) whenever the active document id changes —
284
+ // covers create→save (id appears), navigating between two open documents, and unmount.
285
+ $effect(() => {
286
+ const activeId = documentId ?? fullDocument?.id ?? null;
287
+ if (activeId) {
288
+ documentWorkspaceRegistry.register({
289
+ documentId: activeId,
290
+ collection: documentType,
291
+ workspace: documentWorkspace
292
+ });
293
+ }
294
+ return () => {
295
+ if (activeId) documentWorkspaceRegistry.clear(activeId);
296
+ };
297
+ });
298
+
213
299
  // Field-level access: mirrors the server's strip/drop logic so the form
214
300
  // only shows fields the user can see and disables fields they can't write.
215
301
  function fieldRoleAllowed(list: string[] | undefined): boolean {
@@ -311,7 +397,9 @@
311
397
  type: 'aphex:data',
312
398
  documentType,
313
399
  documentId: documentId ?? undefined,
314
- document: iframeStega ? stegaEncodeDocument(snapshot, schema?.fields ?? []) : snapshot
400
+ document: iframeStega
401
+ ? stegaEncodeDocument(snapshot, schema?.fields ?? [], schemas)
402
+ : snapshot
315
403
  },
316
404
  '*'
317
405
  );
@@ -632,6 +720,39 @@
632
720
  return;
633
721
  }
634
722
 
723
+ // 2a. Object array item — objectPath like "[0].heading" (or "[0]" alone). The
724
+ // item's fields live behind ObjectModal, so open that item's modal, then focus
725
+ // the subfield by the remaining dotted path (the modal renders subfields with
726
+ // bare data-field-path, e.g. "heading" or "seo.title").
727
+ if (objectPath) {
728
+ const itemMatch = objectPath.match(/^\[(\d+)\](?:\.(.*))?$/);
729
+ if (itemMatch) {
730
+ const itemIndex = Number(itemMatch[1]);
731
+ const subPath = itemMatch[2] ?? '';
732
+ const card = container.querySelector<HTMLElement>(`[data-array-item-index="${itemIndex}"]`);
733
+ if (card) {
734
+ card.click(); // opens the item's ObjectModal
735
+ if (subPath) {
736
+ // The modal mounts/animates in; poll a few frames for the subfield.
737
+ for (let attempt = 0; attempt < 20; attempt++) {
738
+ await tick();
739
+ const target = document.querySelector<HTMLElement>(`[data-field-path="${subPath}"]`);
740
+ if (target) {
741
+ target.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
742
+ const focusable = target.querySelector<HTMLElement>(
743
+ 'input:not([disabled]):not([readonly]), textarea:not([disabled]):not([readonly])'
744
+ );
745
+ focusable?.focus();
746
+ break;
747
+ }
748
+ await new Promise((r) => requestAnimationFrame(r));
749
+ }
750
+ }
751
+ return;
752
+ }
753
+ }
754
+ }
755
+
635
756
  // 2. Nested object subfield — find the subfield container by its dotted path
636
757
  if (objectPath) {
637
758
  const subContainer = container.querySelector<HTMLElement>(
@@ -647,7 +768,30 @@
647
768
  }
648
769
  }
649
770
 
650
- // 3. Primitive array — focus the Nth input inside the array field
771
+ // 3a. Object / reference array — reveal the Nth *row* rather than opening it.
772
+ // These rows are the drag-to-reorder handles, so surfacing the row in place is
773
+ // what lets an author act on it (reorder, remove, or click in themselves);
774
+ // auto-opening the row's editor would take that away and, for a reference row,
775
+ // navigate off the document entirely.
776
+ if (arrayIndex != null) {
777
+ const row = container.querySelector<HTMLElement>(`[data-array-index="${arrayIndex}"]`);
778
+ if (row) {
779
+ row.scrollIntoView({ behavior: 'smooth', block: 'center' });
780
+ // Animated directly rather than via `focusedFieldName` state: that ring is
781
+ // field-wide, and plumbing a per-row index down through SchemaField →
782
+ // ArrayField would add a prop to every array just for a 1.2s flash.
783
+ row.animate(
784
+ [
785
+ { outline: '2px solid var(--primary)', outlineOffset: '3px', borderRadius: '6px' },
786
+ { outline: '2px solid transparent', outlineOffset: '8px', borderRadius: '6px' }
787
+ ],
788
+ { duration: 1200, easing: 'ease-out', fill: 'none' }
789
+ );
790
+ return;
791
+ }
792
+ }
793
+
794
+ // 3b. Primitive array — focus the Nth input inside the array field
651
795
  if (arrayIndex != null) {
652
796
  const inputs = container.querySelectorAll<HTMLElement>(
653
797
  'input:not([disabled]):not([readonly]), textarea:not([disabled]):not([readonly])'
@@ -864,6 +1008,10 @@
864
1008
  // Auto-save functionality (every 2 seconds when there are changes)
865
1009
  let hasUnsavedChanges = $state(false);
866
1010
  let autoSaveTimer: ReturnType<typeof setTimeout> | null = null;
1011
+ // Set while a `DocumentWorkspace` batch (currently: one agent turn) is applying a burst of
1012
+ // `apply()` patches — suppresses autosave so N patches don't produce N separate CAS writes;
1013
+ // the batch's caller is responsible for one explicit `flushSave` before/at `endBatch()`.
1014
+ let batchActive = $state(false);
867
1015
  let hasValidationErrors = $state(false);
868
1016
  // Snapshot of the default-initialized data for a brand-new (unsaved) document.
869
1017
  // Used to detect real user edits without relying on "is the value truthy" heuristics,
@@ -1186,7 +1334,7 @@
1186
1334
  // Debounced auto-save. Comparing against the initial-defaults snapshot (for new
1187
1335
  // docs) or the saved draft (for existing docs) means any real user edit triggers
1188
1336
  // save — including unchecking a boolean or clearing a field.
1189
- if (hasChanges && schema && canWriteCurrentDoc) {
1337
+ if (hasChanges && schema && canWriteCurrentDoc && !batchActive) {
1190
1338
  autoSaveTimer = setTimeout(() => {
1191
1339
  cmsLogger.debug(
1192
1340
  '[Document Editor]',
@@ -1208,12 +1356,15 @@
1208
1356
  };
1209
1357
  });
1210
1358
 
1211
- async function saveDocument(isAutoSave = false) {
1212
- if (saving) return;
1213
-
1214
- saving = true;
1215
- saveError = null;
1216
-
1359
+ /** The actual persist no toasts, no side-effect UI updates, just the write + CAS-conflict
1360
+ * detection, returning a result `DocumentWorkspace.flushSave` can also consume directly.
1361
+ * `saveDocument` (below) is the UI-facing wrapper that adds toasts/state-sync around this. */
1362
+ async function performSave(): Promise<{
1363
+ success: boolean;
1364
+ revision?: number;
1365
+ conflict?: boolean;
1366
+ error?: string;
1367
+ }> {
1217
1368
  try {
1218
1369
  let response;
1219
1370
 
@@ -1244,12 +1395,15 @@
1244
1395
  // Always call onSaved to switch to edit mode after creation
1245
1396
  onSaved?.(response.data.id);
1246
1397
  } else {
1247
- toast.error(response?.error || 'Failed to create document');
1398
+ return { success: false, error: response?.error || 'Failed to create document' };
1248
1399
  }
1249
1400
  } else if (documentId) {
1250
- // Update existing document
1401
+ // Update existing document. Send the revision we last read so a stale
1402
+ // write (another tab, an AI agent) surfaces as a 409 conflict below
1403
+ // instead of silently overwriting whatever changed in between.
1251
1404
  response = await documents.updateById(documentId, {
1252
- data: documentData
1405
+ data: documentData,
1406
+ expectedRevision: fullDocument?._meta?.revision as number | undefined
1253
1407
  });
1254
1408
 
1255
1409
  // Update fullDocument with the response to keep saved data in sync
@@ -1269,47 +1423,84 @@
1269
1423
  }
1270
1424
 
1271
1425
  if (response?.success) {
1272
- lastSaved = new Date();
1273
- hasUnsavedChanges = false;
1274
- if (response.data?.id) notifyDocumentChanged(response.data.id);
1275
- if (presentationMode && iframeRef?.contentWindow) {
1276
- iframeRef.contentWindow.postMessage({ type: 'aphex:refresh' }, '*');
1277
- }
1278
- if (isAutoSave) {
1279
- // Trigger validation on all fields after auto-save
1280
- validateAllFields(); // Update validation status
1281
- schemaFields.forEach((fieldComponent, index) => {
1282
- const field = schema?.fields[index];
1283
- if (fieldComponent && field) {
1284
- fieldComponent.performValidation(documentData[field.name], {});
1285
- }
1286
- }); // Notify parent of autosave with current title
1287
- if (onAutoSaved && documentId) {
1288
- onAutoSaved(documentId, getPreviewTitle());
1289
- }
1290
- }
1291
- if (showVersionHistory) {
1292
- loadVersions();
1293
- }
1294
- } else {
1295
- throw new Error(response?.error || 'Failed to save document');
1426
+ return { success: true, revision: fullDocument?._meta?.revision as number | undefined };
1296
1427
  }
1428
+ return { success: false, error: response?.error || 'Failed to save document' };
1297
1429
  } catch (err) {
1298
- toast.error(err instanceof ApiError ? err.message : 'Failed to save document');
1299
-
1300
- // Extract validation errors if present
1430
+ // A 409 means someone else (another tab, an AI agent) saved this document
1431
+ // since we last read it — surface that distinctly rather than a generic
1432
+ // error, and never retry with a blind overwrite. The caller must reload to
1433
+ // see the other writer's change before saving again.
1434
+ if (err instanceof ApiError && err.status === 409) {
1435
+ return {
1436
+ success: false,
1437
+ conflict: true,
1438
+ error:
1439
+ 'Conflict: this document was updated by someone else. Reload the page to continue editing.'
1440
+ };
1441
+ }
1301
1442
  if (err instanceof ApiError && err.response?.validationErrors) {
1302
1443
  const validationErrors = err.response.validationErrors;
1303
1444
  const errorMessages = validationErrors
1304
1445
  .map((ve: any) => `${ve.field}: ${ve.errors.join(', ')}`)
1305
1446
  .join('; ');
1306
- saveError = `Validation failed: ${errorMessages}`;
1447
+ return { success: false, error: `Validation failed: ${errorMessages}` };
1448
+ }
1449
+ return {
1450
+ success: false,
1451
+ error: err instanceof ApiError ? err.message : 'Failed to save document'
1452
+ };
1453
+ }
1454
+ }
1455
+
1456
+ async function saveDocument(isAutoSave = false) {
1457
+ if (saving)
1458
+ return { success: false, error: 'Already saving' } as {
1459
+ success: boolean;
1460
+ revision?: number;
1461
+ conflict?: boolean;
1462
+ error?: string;
1463
+ };
1464
+
1465
+ saving = true;
1466
+ saveError = null;
1467
+
1468
+ const result = await performSave();
1469
+
1470
+ if (result.success) {
1471
+ lastSaved = new Date();
1472
+ hasUnsavedChanges = false;
1473
+ if (fullDocument?.id) notifyDocumentChanged(fullDocument.id);
1474
+ if (presentationMode && iframeRef?.contentWindow) {
1475
+ iframeRef.contentWindow.postMessage({ type: 'aphex:refresh' }, '*');
1476
+ }
1477
+ if (isAutoSave) {
1478
+ // Trigger validation on all fields after auto-save
1479
+ validateAllFields(); // Update validation status
1480
+ schemaFields.forEach((fieldComponent, index) => {
1481
+ const field = schema?.fields[index];
1482
+ if (fieldComponent && field) {
1483
+ fieldComponent.performValidation(documentData[field.name], {});
1484
+ }
1485
+ }); // Notify parent of autosave with current title
1486
+ if (onAutoSaved && documentId) {
1487
+ onAutoSaved(documentId, getPreviewTitle());
1488
+ }
1489
+ }
1490
+ if (showVersionHistory) {
1491
+ loadVersions();
1492
+ }
1493
+ } else {
1494
+ if (result.conflict) {
1495
+ toast.error('This document was changed elsewhere. Reload to see the latest version.');
1307
1496
  } else {
1308
- saveError = err instanceof ApiError ? err.message : 'Failed to save document';
1497
+ toast.error(result.error ?? 'Failed to save document');
1309
1498
  }
1310
- } finally {
1311
- saving = false;
1499
+ saveError = result.error ?? 'Failed to save document';
1312
1500
  }
1501
+
1502
+ saving = false;
1503
+ return result;
1313
1504
  }
1314
1505
 
1315
1506
  async function publishDocument() {
@@ -1389,7 +1580,9 @@
1389
1580
  saveError = null;
1390
1581
 
1391
1582
  try {
1392
- const response = await documents.publish(documentId);
1583
+ const response = await documents.publish(documentId, {
1584
+ expectedRevision: fullDocument?._meta?.revision as number | undefined
1585
+ });
1393
1586
 
1394
1587
  if (response.success && response.data) {
1395
1588
  // Update local state with new published hash. Sync documentData from
@@ -1417,17 +1610,23 @@
1417
1610
  throw new Error(response.error || 'Failed to publish document');
1418
1611
  }
1419
1612
  } catch (err) {
1420
- toast.error(err instanceof ApiError ? err.message : 'Failed to publish document');
1421
-
1422
- // Extract validation errors if present
1423
- if (err instanceof ApiError && err.response?.validationErrors) {
1424
- const validationErrors = err.response.validationErrors;
1425
- const errorMessages = validationErrors
1426
- .map((ve: any) => `${ve.field}: ${ve.errors.join(', ')}`)
1427
- .join('; ');
1428
- saveError = `Cannot publish - Validation failed: ${errorMessages}`;
1613
+ if (err instanceof ApiError && err.status === 409) {
1614
+ toast.error('This document was changed elsewhere. Reload to see the latest version.');
1615
+ saveError =
1616
+ 'Conflict: this document was updated by someone else. Reload the page to continue editing.';
1429
1617
  } else {
1430
- saveError = err instanceof ApiError ? err.message : 'Failed to publish document';
1618
+ toast.error(err instanceof ApiError ? err.message : 'Failed to publish document');
1619
+
1620
+ // Extract validation errors if present
1621
+ if (err instanceof ApiError && err.response?.validationErrors) {
1622
+ const validationErrors = err.response.validationErrors;
1623
+ const errorMessages = validationErrors
1624
+ .map((ve: any) => `${ve.field}: ${ve.errors.join(', ')}`)
1625
+ .join('; ');
1626
+ saveError = `Cannot publish - Validation failed: ${errorMessages}`;
1627
+ } else {
1628
+ saveError = err instanceof ApiError ? err.message : 'Failed to publish document';
1629
+ }
1431
1630
  }
1432
1631
  } finally {
1433
1632
  saving = false;
@@ -1490,7 +1689,9 @@
1490
1689
  saveError = null;
1491
1690
 
1492
1691
  try {
1493
- const response = await documents.unpublish(documentId);
1692
+ const response = await documents.unpublish(documentId, {
1693
+ expectedRevision: fullDocument?._meta?.revision as number | undefined
1694
+ });
1494
1695
  if (response.success) {
1495
1696
  fullDocument = {
1496
1697
  ...fullDocument,
@@ -1505,7 +1706,11 @@
1505
1706
  throw new Error(response.error || 'Failed to unpublish');
1506
1707
  }
1507
1708
  } catch (err) {
1508
- toast.error(err instanceof ApiError ? err.message : 'Failed to unpublish document');
1709
+ if (err instanceof ApiError && err.status === 409) {
1710
+ toast.error('This document was changed elsewhere. Reload to see the latest version.');
1711
+ } else {
1712
+ toast.error(err instanceof ApiError ? err.message : 'Failed to unpublish document');
1713
+ }
1509
1714
  } finally {
1510
1715
  saving = false;
1511
1716
  }
@@ -2342,7 +2547,7 @@
2342
2547
  </div>
2343
2548
 
2344
2549
  <!-- Sanity-style bottom bar -->
2345
- {#if documentId}
2550
+ {#if documentId && !hideActionBar}
2346
2551
  <div class="border-rule bg-background relative z-50 border-t p-4">
2347
2552
  {#if isPreviewingVersion && activePreview}
2348
2553
  <!-- Version preview footer -->
@@ -2358,7 +2563,9 @@
2358
2563
  onclick={async () => {
2359
2564
  if (!documentId || !activePreview) return;
2360
2565
  try {
2361
- await documents.restoreVersion(documentId, activePreview.versionNumber);
2566
+ await documents.restoreVersion(documentId, activePreview.versionNumber, {
2567
+ expectedRevision: fullDocument?._meta?.revision as number | undefined
2568
+ });
2362
2569
  const docRes = await documents.getById(documentId);
2363
2570
  if (docRes.success && docRes.data) {
2364
2571
  const doc = docRes.data as Record<string, any>;
@@ -2382,8 +2589,14 @@
2382
2589
  if (onRestored && documentId) {
2383
2590
  onRestored(documentId);
2384
2591
  }
2385
- } catch {
2386
- toast.error('Failed to restore revision');
2592
+ } catch (err) {
2593
+ if (err instanceof ApiError && err.status === 409) {
2594
+ toast.error(
2595
+ 'This document was changed elsewhere. Reload to see the latest version.'
2596
+ );
2597
+ } else {
2598
+ toast.error('Failed to restore revision');
2599
+ }
2387
2600
  }
2388
2601
  }}
2389
2602
  >
@@ -25,6 +25,12 @@ interface Props {
25
25
  createdAt?: string;
26
26
  } | null;
27
27
  isReadOnly?: boolean;
28
+ /** Suppresses the bottom action bar (Publish / Schedule / Unpublish / Delete).
29
+ * Set by the host when another editor is stacked on top of this one and owns
30
+ * the actions instead — two action bars in the same corner give no clue which
31
+ * document each one publishes. This hides the bar only; the document keeps
32
+ * auto-saving and its status stays visible in the header. */
33
+ hideActionBar?: boolean;
28
34
  /** When true, the host has hidden side panels — show a Minimize toggle. */
29
35
  focusMode?: boolean;
30
36
  /** Toggle host-driven focus mode. Omit to hide the focus button entirely. */
@@ -1 +1 @@
1
- {"version":3,"file":"DocumentEditor.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/admin/DocumentEditor.svelte.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AASzD,OAAO,KAAK,EAAE,SAAS,EAAuB,MAAM,qBAAqB,CAAC;AAgCzE,UAAU,KAAK;IACd,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB;;kDAE8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,oBAAoB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,sBAAsB,CAAC,EAAE;QACxB,aAAa,EAAE,MAAM,CAAC;QACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC1B,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,IAAI,CAAC;IACT,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,6EAA6E;IAC7E,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,2EAA2E;IAC3E,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,8EAA8E;IAC9E,oBAAoB,CAAC,EAAE,MAAM,IAAI,CAAC;IAClC,yGAAyG;IACzG,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,6EAA6E;IAC7E,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;CACtB;AAq1EF,QAAA,MAAM,cAAc,2CAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"DocumentEditor.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/admin/DocumentEditor.svelte.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AASzD,OAAO,KAAK,EAAE,SAAS,EAAuB,MAAM,qBAAqB,CAAC;AAqCzE,UAAU,KAAK;IACd,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB;;kDAE8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,oBAAoB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,sBAAsB,CAAC,EAAE;QACxB,aAAa,EAAE,MAAM,CAAC;QACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC1B,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,IAAI,CAAC;IACT,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;kEAI8D;IAC9D,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,6EAA6E;IAC7E,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,2EAA2E;IAC3E,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,8EAA8E;IAC9E,oBAAoB,CAAC,EAAE,MAAM,IAAI,CAAC;IAClC,yGAAyG;IACzG,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,6EAA6E;IAC7E,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;CACtB;AAiiFF,QAAA,MAAM,cAAc,2CAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
@@ -81,7 +81,7 @@
81
81
  >
82
82
  <!-- svelte-ignore a11y_no_static_element_interactions -->
83
83
  <div
84
- class="border-border bg-background max-h-full w-full max-w-3xl overflow-auto rounded-lg border shadow-lg"
84
+ class="border-border bg-background max-h-full w-full max-w-3xl cursor-default overflow-auto rounded-lg border shadow-lg"
85
85
  style="z-index: {panelZ}"
86
86
  onclick={(e) => e.stopPropagation()}
87
87
  onkeydown={(e) => e.stopPropagation()}
@@ -89,7 +89,9 @@
89
89
  <div
90
90
  class="border-border bg-background sticky top-0 z-10 flex items-center justify-between gap-3 border-b px-4 py-2"
91
91
  >
92
- <span class="text-sm font-medium">Edit {schema.title}</span>
92
+ <span class="text-sm font-medium"
93
+ >Edit {schema.title ?? schema.name.charAt(0).toUpperCase() + schema.name.slice(1)}</span
94
+ >
93
95
  <div class="flex items-center gap-2">
94
96
  {#if saveState}
95
97
  {#if saveState.saving}
@@ -74,7 +74,7 @@
74
74
  return getSchemaByName(schemas, typeName);
75
75
  }
76
76
 
77
- const isBlockArray = $derived(field.of.some((ref) => ref.type === 'block'));
77
+ const isBlockArray = $derived(field.of?.some((ref) => ref.type === 'block') ?? false);
78
78
  // Rich text (TipTap) is by far the largest field dependency. Load it only when
79
79
  // the array actually holds block content, so document editors without a
80
80
  // rich-text field — and every admin page that never renders one — stay off
@@ -534,6 +534,7 @@
534
534
  {@const sortable = createSortable({ id: item._key, index, disabled: readonly })}
535
535
  <div
536
536
  {@attach sortable.attach}
537
+ data-array-index={index}
537
538
  class="flex items-center gap-1"
538
539
  class:opacity-50={sortable.isDragging}
539
540
  >
@@ -942,6 +943,7 @@
942
943
  {@const sortable = createSortable({ id: item._key, index, disabled: readonly })}
943
944
  <div
944
945
  {@attach sortable.attach}
946
+ data-array-index={index}
945
947
  class="border-border/50 bg-background hover:bg-muted/50 flex min-h-11 items-center gap-1 rounded border pl-1 transition-colors"
946
948
  class:opacity-50={sortable.isDragging}
947
949
  >
@@ -961,6 +963,7 @@
961
963
  supplies a `subtitle` field, render it on a second line. -->
962
964
  <button
963
965
  class="flex flex-1 cursor-pointer items-center gap-2 self-stretch truncate px-1 py-2 text-left text-sm"
966
+ data-array-item-index={index}
964
967
  onclick={() => handleEditItem(index)}
965
968
  >
966
969
  <span
@@ -104,11 +104,22 @@
104
104
  let allDocs = $state<any[]>([]);
105
105
  let allDocsFetched = $state(false);
106
106
 
107
+ /**
108
+ * The picker filters CLIENT-SIDE over this cache, so the fetch limit is also the
109
+ * search limit: anything beyond it can never be found by typing. At 20 that made
110
+ * documents silently unreachable in any collection larger than a screenful (a menu
111
+ * of 36 dishes could only ever surface the first 20). Fetch the API maximum instead.
112
+ *
113
+ * This raises the ceiling rather than removing it — collections beyond `PICKER_LIMIT`
114
+ * still need server-side search, which the list endpoint doesn't expose today.
115
+ */
116
+ const PICKER_LIMIT = 200;
117
+
107
118
  async function fetchAllDocs() {
108
119
  if (allDocsFetched || !targetType) return;
109
120
  loading = true;
110
121
  try {
111
- const result = await documents.list({ docType: targetType, limit: 20 });
122
+ const result = await documents.list({ docType: targetType, limit: PICKER_LIMIT });
112
123
  if (result.success && result.data) {
113
124
  allDocs = result.data;
114
125
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ReferenceField.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/admin/fields/ReferenceField.svelte.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,KAAK,EAAwC,MAAM,wBAAwB,CAAC;AAUzF,KAAK,cAAc,GAAG;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1E,UAAU,KAAK;IACd,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,KAAK,IAAI,CAAC;IACjD,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;CACvB;AA4VF,QAAA,MAAM,cAAc,2CAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"ReferenceField.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/admin/fields/ReferenceField.svelte.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,KAAK,EAAwC,MAAM,wBAAwB,CAAC;AAUzF,KAAK,cAAc,GAAG;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1E,UAAU,KAAK;IACd,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,KAAK,IAAI,CAAC;IACjD,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;CACvB;AAuWF,QAAA,MAAM,cAAc,2CAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
@@ -1,6 +1,7 @@
1
1
  export { default as AdminApp } from './AdminApp.svelte';
2
2
  export { default as Sidebar } from './layout/Sidebar.svelte';
3
3
  export { default as DocumentEditor } from './admin/DocumentEditor.svelte';
4
+ export { default as AgentChat } from './admin/AgentChat.svelte';
4
5
  export { default as SchemaField } from './admin/SchemaField.svelte';
5
6
  export { default as MediaBrowser } from './admin/MediaBrowser.svelte';
6
7
  export { default as AssetBrowserModal } from './admin/AssetBrowserModal.svelte';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/components/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAGxD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAG7D,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAChF,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAGtF,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/components/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAGxD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAG7D,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAChF,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAGtF,cAAc,gBAAgB,CAAC"}
@@ -6,6 +6,7 @@ export { default as AdminApp } from './AdminApp.svelte';
6
6
  export { default as Sidebar } from './layout/Sidebar.svelte';
7
7
  // Admin components (will be migrated from your current structure)
8
8
  export { default as DocumentEditor } from './admin/DocumentEditor.svelte';
9
+ export { default as AgentChat } from './admin/AgentChat.svelte';
9
10
  export { default as SchemaField } from './admin/SchemaField.svelte';
10
11
  export { default as MediaBrowser } from './admin/MediaBrowser.svelte';
11
12
  export { default as AssetBrowserModal } from './admin/AssetBrowserModal.svelte';