@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.
- package/dist/agent-chat-state.svelte.d.ts +38 -0
- package/dist/agent-chat-state.svelte.d.ts.map +1 -0
- package/dist/agent-chat-state.svelte.js +86 -0
- package/dist/ai/content-workspace-tools.d.ts +3 -0
- package/dist/ai/content-workspace-tools.d.ts.map +1 -0
- package/dist/ai/content-workspace-tools.js +50 -0
- package/dist/ai/default-system-prompt.d.ts +2 -0
- package/dist/ai/default-system-prompt.d.ts.map +1 -0
- package/dist/ai/default-system-prompt.js +15 -0
- package/dist/ai/index.d.ts +2 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +4 -0
- package/dist/ai/interfaces/ai-provider.d.ts +67 -0
- package/dist/ai/interfaces/ai-provider.d.ts.map +1 -0
- package/dist/ai/interfaces/ai-provider.js +16 -0
- package/dist/ai/run-agent-turn.d.ts +29 -0
- package/dist/ai/run-agent-turn.d.ts.map +1 -0
- package/dist/ai/run-agent-turn.js +166 -0
- package/dist/api/agent-chat.d.ts +27 -0
- package/dist/api/agent-chat.d.ts.map +1 -0
- package/dist/api/agent-chat.js +64 -0
- package/dist/api/documents.d.ts +8 -3
- package/dist/api/documents.d.ts.map +1 -1
- package/dist/api/documents.js +6 -6
- package/dist/api/schemas/agent-chat.d.ts +45 -0
- package/dist/api/schemas/agent-chat.d.ts.map +1 -0
- package/dist/api/schemas/agent-chat.js +35 -0
- package/dist/api/schemas/agent-operations.d.ts +13 -0
- package/dist/api/schemas/agent-operations.d.ts.map +1 -0
- package/dist/api/schemas/agent-operations.js +15 -0
- package/dist/api/schemas/documents.d.ts +22 -0
- package/dist/api/schemas/documents.d.ts.map +1 -1
- package/dist/api/schemas/documents.js +20 -2
- package/dist/chunk-recovery.d.ts +33 -0
- package/dist/chunk-recovery.d.ts.map +1 -0
- package/dist/chunk-recovery.js +131 -0
- package/dist/client/index.d.ts +1 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +1 -0
- package/dist/client/ui.d.ts +1 -0
- package/dist/client/ui.d.ts.map +1 -1
- package/dist/client/ui.js +1 -0
- package/dist/components/AdminApp.svelte +37 -3
- package/dist/components/AdminApp.svelte.d.ts.map +1 -1
- package/dist/components/admin/ActivityView.svelte +251 -42
- package/dist/components/admin/ActivityView.svelte.d.ts.map +1 -1
- package/dist/components/admin/AgentChat.svelte +977 -0
- package/dist/components/admin/AgentChat.svelte.d.ts +17 -0
- package/dist/components/admin/AgentChat.svelte.d.ts.map +1 -0
- package/dist/components/admin/DocumentEditor.svelte +273 -60
- package/dist/components/admin/DocumentEditor.svelte.d.ts +6 -0
- package/dist/components/admin/DocumentEditor.svelte.d.ts.map +1 -1
- package/dist/components/admin/ObjectModal.svelte +4 -2
- package/dist/components/admin/fields/ArrayField.svelte +4 -1
- package/dist/components/admin/fields/ReferenceField.svelte +12 -1
- package/dist/components/admin/fields/ReferenceField.svelte.d.ts.map +1 -1
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +1 -0
- package/dist/components/layout/Sidebar.svelte +26 -2
- package/dist/components/layout/Sidebar.svelte.d.ts +1 -0
- package/dist/components/layout/Sidebar.svelte.d.ts.map +1 -1
- package/dist/db/interfaces/agent-change-sets.d.ts +17 -0
- package/dist/db/interfaces/agent-change-sets.d.ts.map +1 -0
- package/dist/db/interfaces/agent-change-sets.js +1 -0
- package/dist/db/interfaces/document.d.ts +25 -3
- package/dist/db/interfaces/document.d.ts.map +1 -1
- package/dist/db/interfaces/document.js +19 -1
- package/dist/db/interfaces/index.d.ts +4 -1
- package/dist/db/interfaces/index.d.ts.map +1 -1
- package/dist/db/interfaces/index.js +1 -1
- package/dist/document-refresh.svelte.d.ts +2 -0
- package/dist/document-refresh.svelte.d.ts.map +1 -1
- package/dist/document-refresh.svelte.js +15 -0
- package/dist/document-workspace-registry.svelte.d.ts +15 -0
- package/dist/document-workspace-registry.svelte.d.ts.map +1 -0
- package/dist/document-workspace-registry.svelte.js +30 -0
- package/dist/field-validation/utils.d.ts.map +1 -1
- package/dist/field-validation/utils.js +211 -29
- package/dist/hooks.d.ts +2 -0
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +2 -0
- package/dist/lib/agent-chat-state.svelte.d.ts +38 -0
- package/dist/lib/agent-chat-state.svelte.d.ts.map +1 -0
- package/dist/lib/agent-chat-state.svelte.js +87 -0
- package/dist/lib/agent-chat-state.svelte.js.map +1 -0
- package/dist/lib/ai/content-workspace-tools.d.ts +3 -0
- package/dist/lib/ai/content-workspace-tools.d.ts.map +1 -0
- package/dist/lib/ai/content-workspace-tools.js +51 -0
- package/dist/lib/ai/content-workspace-tools.js.map +1 -0
- package/dist/lib/ai/default-system-prompt.d.ts +2 -0
- package/dist/lib/ai/default-system-prompt.d.ts.map +1 -0
- package/dist/lib/ai/default-system-prompt.js +16 -0
- package/dist/lib/ai/default-system-prompt.js.map +1 -0
- package/dist/lib/ai/index.d.ts +2 -0
- package/dist/lib/ai/index.d.ts.map +1 -0
- package/dist/lib/ai/index.js +5 -0
- package/dist/lib/ai/index.js.map +1 -0
- package/dist/lib/ai/interfaces/ai-provider.d.ts +67 -0
- package/dist/lib/ai/interfaces/ai-provider.d.ts.map +1 -0
- package/dist/lib/ai/interfaces/ai-provider.js +17 -0
- package/dist/lib/ai/interfaces/ai-provider.js.map +1 -0
- package/dist/lib/ai/run-agent-turn.d.ts +29 -0
- package/dist/lib/ai/run-agent-turn.d.ts.map +1 -0
- package/dist/lib/ai/run-agent-turn.js +167 -0
- package/dist/lib/ai/run-agent-turn.js.map +1 -0
- package/dist/lib/api/agent-chat.d.ts +27 -0
- package/dist/lib/api/agent-chat.d.ts.map +1 -0
- package/dist/lib/api/agent-chat.js +65 -0
- package/dist/lib/api/agent-chat.js.map +1 -0
- package/dist/lib/api/documents.d.ts +8 -3
- package/dist/lib/api/documents.d.ts.map +1 -1
- package/dist/lib/api/documents.js +6 -6
- package/dist/lib/api/documents.js.map +1 -1
- package/dist/lib/api/schemas/agent-chat.d.ts +45 -0
- package/dist/lib/api/schemas/agent-chat.d.ts.map +1 -0
- package/dist/lib/api/schemas/agent-chat.js +36 -0
- package/dist/lib/api/schemas/agent-chat.js.map +1 -0
- package/dist/lib/api/schemas/agent-operations.d.ts +13 -0
- package/dist/lib/api/schemas/agent-operations.d.ts.map +1 -0
- package/dist/lib/api/schemas/agent-operations.js +16 -0
- package/dist/lib/api/schemas/agent-operations.js.map +1 -0
- package/dist/lib/api/schemas/documents.d.ts +22 -0
- package/dist/lib/api/schemas/documents.d.ts.map +1 -1
- package/dist/lib/api/schemas/documents.js +20 -2
- package/dist/lib/api/schemas/documents.js.map +1 -1
- package/dist/lib/chunk-recovery.d.ts +33 -0
- package/dist/lib/chunk-recovery.d.ts.map +1 -0
- package/dist/lib/chunk-recovery.js +132 -0
- package/dist/lib/chunk-recovery.js.map +1 -0
- package/dist/lib/client/index.d.ts +1 -0
- package/dist/lib/client/index.d.ts.map +1 -1
- package/dist/lib/client/index.js +1 -0
- package/dist/lib/client/index.js.map +1 -1
- package/dist/lib/client/ui.d.ts +1 -0
- package/dist/lib/client/ui.d.ts.map +1 -1
- package/dist/lib/client/ui.js +1 -0
- package/dist/lib/client/ui.js.map +1 -1
- package/dist/lib/components/index.d.ts +1 -0
- package/dist/lib/components/index.d.ts.map +1 -1
- package/dist/lib/components/index.js +1 -0
- package/dist/lib/components/index.js.map +1 -1
- package/dist/lib/db/interfaces/agent-change-sets.d.ts +17 -0
- package/dist/lib/db/interfaces/agent-change-sets.d.ts.map +1 -0
- package/dist/lib/db/interfaces/agent-change-sets.js +2 -0
- package/dist/lib/db/interfaces/agent-change-sets.js.map +1 -0
- package/dist/lib/db/interfaces/document.d.ts +25 -3
- package/dist/lib/db/interfaces/document.d.ts.map +1 -1
- package/dist/lib/db/interfaces/document.js +19 -1
- package/dist/lib/db/interfaces/document.js.map +1 -1
- package/dist/lib/db/interfaces/index.d.ts +4 -1
- package/dist/lib/db/interfaces/index.d.ts.map +1 -1
- package/dist/lib/db/interfaces/index.js +1 -1
- package/dist/lib/db/interfaces/index.js.map +1 -1
- package/dist/lib/document-refresh.svelte.d.ts +2 -0
- package/dist/lib/document-refresh.svelte.d.ts.map +1 -1
- package/dist/lib/document-refresh.svelte.js +15 -0
- package/dist/lib/document-refresh.svelte.js.map +1 -1
- package/dist/lib/document-workspace-registry.svelte.d.ts +15 -0
- package/dist/lib/document-workspace-registry.svelte.d.ts.map +1 -0
- package/dist/lib/document-workspace-registry.svelte.js +31 -0
- package/dist/lib/document-workspace-registry.svelte.js.map +1 -0
- package/dist/lib/field-validation/utils.d.ts.map +1 -1
- package/dist/lib/field-validation/utils.js +211 -29
- package/dist/lib/field-validation/utils.js.map +1 -1
- package/dist/lib/hooks.d.ts +2 -0
- package/dist/lib/hooks.d.ts.map +1 -1
- package/dist/lib/hooks.js +2 -0
- package/dist/lib/hooks.js.map +1 -1
- package/dist/lib/local-api/collection-api.d.ts +7 -2
- package/dist/lib/local-api/collection-api.d.ts.map +1 -1
- package/dist/lib/local-api/collection-api.js +17 -10
- package/dist/lib/local-api/collection-api.js.map +1 -1
- package/dist/lib/mcp/tools.d.ts +39 -4
- package/dist/lib/mcp/tools.d.ts.map +1 -1
- package/dist/lib/mcp/tools.js +546 -362
- package/dist/lib/mcp/tools.js.map +1 -1
- package/dist/lib/plugins/resolver.d.ts +8 -1
- package/dist/lib/plugins/resolver.d.ts.map +1 -1
- package/dist/lib/plugins/resolver.js +14 -1
- package/dist/lib/plugins/resolver.js.map +1 -1
- package/dist/lib/plugins/types.d.ts +23 -2
- package/dist/lib/plugins/types.d.ts.map +1 -1
- package/dist/lib/plugins/types.js.map +1 -1
- package/dist/lib/preview/stega.d.ts +2 -2
- package/dist/lib/preview/stega.d.ts.map +1 -1
- package/dist/lib/preview/stega.js +52 -29
- package/dist/lib/preview/stega.js.map +1 -1
- package/dist/lib/schema-utils/validator.d.ts.map +1 -1
- package/dist/lib/schema-utils/validator.js +5 -2
- package/dist/lib/schema-utils/validator.js.map +1 -1
- package/dist/lib/server/api/index.d.ts.map +1 -1
- package/dist/lib/server/api/index.js +8 -0
- package/dist/lib/server/api/index.js.map +1 -1
- package/dist/lib/server/api/routes/agent-change-sets.d.ts +4 -0
- package/dist/lib/server/api/routes/agent-change-sets.d.ts.map +1 -0
- package/dist/lib/server/api/routes/agent-change-sets.js +132 -0
- package/dist/lib/server/api/routes/agent-change-sets.js.map +1 -0
- package/dist/lib/server/api/routes/agent-chat.d.ts +14 -0
- package/dist/lib/server/api/routes/agent-chat.d.ts.map +1 -0
- package/dist/lib/server/api/routes/agent-chat.js +224 -0
- package/dist/lib/server/api/routes/agent-chat.js.map +1 -0
- package/dist/lib/server/api/routes/document-versions.d.ts.map +1 -1
- package/dist/lib/server/api/routes/document-versions.js +16 -2
- package/dist/lib/server/api/routes/document-versions.js.map +1 -1
- package/dist/lib/server/api/routes/documents-by-id.d.ts.map +1 -1
- package/dist/lib/server/api/routes/documents-by-id.js +11 -1
- package/dist/lib/server/api/routes/documents-by-id.js.map +1 -1
- package/dist/lib/server/api/routes/documents-publish.d.ts.map +1 -1
- package/dist/lib/server/api/routes/documents-publish.js +36 -3
- package/dist/lib/server/api/routes/documents-publish.js.map +1 -1
- package/dist/lib/server/api/routes/jobs.d.ts.map +1 -1
- package/dist/lib/server/api/routes/jobs.js +4 -2
- package/dist/lib/server/api/routes/jobs.js.map +1 -1
- package/dist/lib/server/api/routes/resolve-created-by.d.ts +13 -0
- package/dist/lib/server/api/routes/resolve-created-by.d.ts.map +1 -0
- package/dist/lib/server/api/routes/resolve-created-by.js +31 -0
- package/dist/lib/server/api/routes/resolve-created-by.js.map +1 -0
- package/dist/lib/server/index.d.ts +1 -0
- package/dist/lib/server/index.d.ts.map +1 -1
- package/dist/lib/server/index.js +1 -0
- package/dist/lib/server/index.js.map +1 -1
- package/dist/lib/services/references-service.d.ts +1 -1
- package/dist/lib/services/references-service.d.ts.map +1 -1
- package/dist/lib/services/version-service.d.ts +4 -4
- package/dist/lib/services/version-service.d.ts.map +1 -1
- package/dist/lib/services/version-service.js +15 -11
- package/dist/lib/services/version-service.js.map +1 -1
- package/dist/lib/type-gen.d.ts.map +1 -1
- package/dist/lib/type-gen.js +11 -0
- package/dist/lib/type-gen.js.map +1 -1
- package/dist/lib/types/agent-change-sets.d.ts +70 -0
- package/dist/lib/types/agent-change-sets.d.ts.map +1 -0
- package/dist/lib/types/agent-change-sets.js +7 -0
- package/dist/lib/types/agent-change-sets.js.map +1 -0
- package/dist/lib/types/agent-stream.d.ts +60 -0
- package/dist/lib/types/agent-stream.d.ts.map +1 -0
- package/dist/lib/types/agent-stream.js +12 -0
- package/dist/lib/types/agent-stream.js.map +1 -0
- package/dist/lib/types/agent-tools.d.ts +65 -0
- package/dist/lib/types/agent-tools.d.ts.map +1 -0
- package/dist/lib/types/agent-tools.js +2 -0
- package/dist/lib/types/agent-tools.js.map +1 -0
- package/dist/lib/types/config.d.ts +19 -0
- package/dist/lib/types/config.d.ts.map +1 -1
- package/dist/lib/types/document-workspace.d.ts +53 -0
- package/dist/lib/types/document-workspace.d.ts.map +1 -0
- package/dist/lib/types/document-workspace.js +15 -0
- package/dist/lib/types/document-workspace.js.map +1 -0
- package/dist/lib/types/document.d.ts +5 -0
- package/dist/lib/types/document.d.ts.map +1 -1
- package/dist/lib/types/index.d.ts +2 -0
- package/dist/lib/types/index.d.ts.map +1 -1
- package/dist/lib/types/index.js +2 -0
- package/dist/lib/types/index.js.map +1 -1
- package/dist/lib/types/schemas.js +1 -1
- package/dist/lib/types/schemas.js.map +1 -1
- package/dist/lib/utils/fetch-remote-file.d.ts +11 -0
- package/dist/lib/utils/fetch-remote-file.d.ts.map +1 -0
- package/dist/lib/utils/fetch-remote-file.js +169 -0
- package/dist/lib/utils/fetch-remote-file.js.map +1 -0
- package/dist/local-api/collection-api.d.ts +7 -2
- package/dist/local-api/collection-api.d.ts.map +1 -1
- package/dist/local-api/collection-api.js +17 -10
- package/dist/mcp/tools.d.ts +39 -4
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +546 -362
- package/dist/plugins/resolver.d.ts +8 -1
- package/dist/plugins/resolver.d.ts.map +1 -1
- package/dist/plugins/resolver.js +14 -1
- package/dist/plugins/types.d.ts +23 -2
- package/dist/plugins/types.d.ts.map +1 -1
- package/dist/preview/stega.d.ts +2 -2
- package/dist/preview/stega.d.ts.map +1 -1
- package/dist/preview/stega.js +52 -29
- package/dist/schema-utils/validator.d.ts.map +1 -1
- package/dist/schema-utils/validator.js +5 -2
- package/dist/server/api/index.d.ts.map +1 -1
- package/dist/server/api/index.js +8 -0
- package/dist/server/api/routes/agent-change-sets.d.ts +4 -0
- package/dist/server/api/routes/agent-change-sets.d.ts.map +1 -0
- package/dist/server/api/routes/agent-change-sets.js +131 -0
- package/dist/server/api/routes/agent-chat.d.ts +14 -0
- package/dist/server/api/routes/agent-chat.d.ts.map +1 -0
- package/dist/server/api/routes/agent-chat.js +223 -0
- package/dist/server/api/routes/document-versions.d.ts.map +1 -1
- package/dist/server/api/routes/document-versions.js +16 -2
- package/dist/server/api/routes/documents-by-id.d.ts.map +1 -1
- package/dist/server/api/routes/documents-by-id.js +11 -1
- package/dist/server/api/routes/documents-publish.d.ts.map +1 -1
- package/dist/server/api/routes/documents-publish.js +36 -3
- package/dist/server/api/routes/jobs.d.ts.map +1 -1
- package/dist/server/api/routes/jobs.js +4 -2
- package/dist/server/api/routes/resolve-created-by.d.ts +13 -0
- package/dist/server/api/routes/resolve-created-by.d.ts.map +1 -0
- package/dist/server/api/routes/resolve-created-by.js +30 -0
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -0
- package/dist/services/references-service.d.ts +1 -1
- package/dist/services/references-service.d.ts.map +1 -1
- package/dist/services/version-service.d.ts +4 -4
- package/dist/services/version-service.d.ts.map +1 -1
- package/dist/services/version-service.js +15 -11
- package/dist/type-gen.d.ts.map +1 -1
- package/dist/type-gen.js +11 -0
- package/dist/types/agent-change-sets.d.ts +70 -0
- package/dist/types/agent-change-sets.d.ts.map +1 -0
- package/dist/types/agent-change-sets.js +6 -0
- package/dist/types/agent-stream.d.ts +60 -0
- package/dist/types/agent-stream.d.ts.map +1 -0
- package/dist/types/agent-stream.js +11 -0
- package/dist/types/agent-tools.d.ts +65 -0
- package/dist/types/agent-tools.d.ts.map +1 -0
- package/dist/types/agent-tools.js +1 -0
- package/dist/types/config.d.ts +19 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/document-workspace.d.ts +53 -0
- package/dist/types/document-workspace.d.ts.map +1 -0
- package/dist/types/document-workspace.js +14 -0
- package/dist/types/document.d.ts +5 -0
- package/dist/types/document.d.ts.map +1 -1
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +2 -0
- package/dist/types/schemas.js +1 -1
- package/dist/utils/fetch-remote-file.d.ts +11 -0
- package/dist/utils/fetch-remote-file.d.ts.map +1 -0
- package/dist/utils/fetch-remote-file.js +168 -0
- 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
|
|
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
|
-
//
|
|
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
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1299
|
-
|
|
1300
|
-
//
|
|
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
|
-
|
|
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
|
-
|
|
1497
|
+
toast.error(result.error ?? 'Failed to save document');
|
|
1309
1498
|
}
|
|
1310
|
-
|
|
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
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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;
|
|
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"
|
|
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
|
|
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:
|
|
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;
|
|
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"}
|
package/dist/components/index.js
CHANGED
|
@@ -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';
|