@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
|
@@ -29,6 +29,7 @@
|
|
|
29
29
|
import MediaBrowser from './admin/MediaBrowser.svelte';
|
|
30
30
|
import ConfirmDialogHost from './admin/confirm-dialog/ConfirmDialogHost.svelte';
|
|
31
31
|
import { documents, organizations } from '../api/index';
|
|
32
|
+
import { getCollectionVersion } from '../document-refresh.svelte';
|
|
32
33
|
import {
|
|
33
34
|
FileText,
|
|
34
35
|
Ellipsis,
|
|
@@ -729,6 +730,27 @@
|
|
|
729
730
|
}
|
|
730
731
|
});
|
|
731
732
|
|
|
733
|
+
// Refetch the current list when a document of this type was created/updated/deleted
|
|
734
|
+
// elsewhere in the session — typically the agent chat, which has no UI of its own to keep
|
|
735
|
+
// this list in sync. See document-refresh.svelte.ts. Keyed per type (not a single scalar)
|
|
736
|
+
// so switching types doesn't cause a redundant fetch on top of the one the type-switch
|
|
737
|
+
// handler already does.
|
|
738
|
+
const lastSeenCollectionVersions = new Map<string, number>();
|
|
739
|
+
// Debounced — a bulk agent operation (e.g. "create 50 posts") fires one notify per document,
|
|
740
|
+
// each its own SSE round trip, so without this a refetch would fire 50 times in a row.
|
|
741
|
+
let collectionRefetchTimer: ReturnType<typeof setTimeout> | undefined;
|
|
742
|
+
$effect(() => {
|
|
743
|
+
if (!selectedDocumentType) return;
|
|
744
|
+
const docType = selectedDocumentType;
|
|
745
|
+
const version = getCollectionVersion(docType);
|
|
746
|
+
const lastSeen = lastSeenCollectionVersions.get(docType);
|
|
747
|
+
lastSeenCollectionVersions.set(docType, version);
|
|
748
|
+
if (lastSeen !== undefined && version !== lastSeen) {
|
|
749
|
+
clearTimeout(collectionRefetchTimer);
|
|
750
|
+
collectionRefetchTimer = setTimeout(() => fetchDocuments(docType), 300);
|
|
751
|
+
}
|
|
752
|
+
});
|
|
753
|
+
|
|
732
754
|
async function navigateToDocumentType(docType: string) {
|
|
733
755
|
if (activeTab.value !== 'structure') {
|
|
734
756
|
handleTabChange('structure');
|
|
@@ -1602,12 +1624,23 @@
|
|
|
1602
1624
|
|
|
1603
1625
|
<!-- Primary Editor Panel -->
|
|
1604
1626
|
{#if primaryEditorState.visible}
|
|
1627
|
+
<!-- `overflow-y` is `auto` normally but `hidden` in presentation mode, and that
|
|
1628
|
+
is load-bearing rather than cosmetic. The stacked reference panel below is
|
|
1629
|
+
an `absolute inset-y-0` sibling inside this box, and for a *scroll
|
|
1630
|
+
container* the containing block of an absolute child is the padding box —
|
|
1631
|
+
the whole scrollable extent, not the visible height. With `auto` the panel
|
|
1632
|
+
therefore stretched to the scroll height and pinned its footer (Publish,
|
|
1633
|
+
Schedule, Unpublish) below the fold, so a referenced document opened in
|
|
1634
|
+
presentation mode looked like it had no publish controls at all; the bar
|
|
1635
|
+
visible at the bottom of the window was the base editor's showing through.
|
|
1636
|
+
Nothing is lost by disabling it here: in presentation mode DocumentEditor is
|
|
1637
|
+
`h-full overflow-hidden` and scrolls its own field column internally. -->
|
|
1605
1638
|
<div
|
|
1606
1639
|
class="relative transition-all duration-200 {windowWidth < 620
|
|
1607
1640
|
? 'w-screen'
|
|
1608
|
-
: 'flex-1'} h-full overflow-x-hidden
|
|
1609
|
-
? ''
|
|
1610
|
-
: 'hidden'}"
|
|
1641
|
+
: 'flex-1'} h-full overflow-x-hidden {presentationModeOn
|
|
1642
|
+
? 'overflow-y-hidden'
|
|
1643
|
+
: 'overflow-y-auto'} {primaryEditorState.expanded ? '' : 'hidden'}"
|
|
1611
1644
|
style={windowWidth >= 620 ? 'min-width: 0;' : ''}
|
|
1612
1645
|
>
|
|
1613
1646
|
<DocumentEditor
|
|
@@ -1620,6 +1653,7 @@
|
|
|
1620
1653
|
onToggleFocus={toggleFocusMode}
|
|
1621
1654
|
presentationMode={presentationModeOn}
|
|
1622
1655
|
onTogglePresentation={togglePresentationMode}
|
|
1656
|
+
hideActionBar={presentationModeOn && editorStack.length > 0}
|
|
1623
1657
|
refreshToken={baseRefreshToken}
|
|
1624
1658
|
organizationId={currentOrgId}
|
|
1625
1659
|
onBack={navigateBack}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminApp.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/components/AdminApp.svelte.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAkB,MAAM,kBAAkB,CAAC;AAElE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAExC,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAE1F,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"AdminApp.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/components/AdminApp.svelte.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAkB,MAAM,kBAAkB,CAAC;AAElE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAExC,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAE1F,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AA4BnE,UAAU,KAAK;IACd,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,aAAa,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5E,WAAW,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IACvE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE;QAAE,KAAK,EAAE,SAAS,CAAA;KAAE,CAAC;IACjC,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,eAAe,CAAC,EAAE,sBAAsB,GAAG,IAAI,CAAC;IAChD;;;OAGG;IACH,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;IACtB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,iBAAiB,CAAC,CAAC,CAAC;CAC7D;AA+mDF,QAAA,MAAM,QAAQ,0BAAwC,CAAC;AACvD,KAAK,QAAQ,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC;AAC5C,eAAe,QAAQ,CAAC"}
|
|
@@ -1,24 +1,51 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
// Read-only operational history for the durable spine — the queryability Sanity's old
|
|
3
3
|
// out-of-dataset scheduling lacked. Jobs tab = scheduled/queued work and its outcome;
|
|
4
|
-
// Events tab = the append-only domain-event log
|
|
5
|
-
// (gated on document.read
|
|
4
|
+
// Events tab = the append-only domain-event log; Agent Changes tab = the AI assistant's
|
|
5
|
+
// audit/undo trail (GET /api/agent/change-sets, gated on document.read like the others —
|
|
6
|
+
// undo itself is the one mutation here, gated separately on document.update server-side).
|
|
6
7
|
import { onMount } from 'svelte';
|
|
7
8
|
import { Button } from '@aphexcms/ui/shadcn/button';
|
|
8
9
|
import { Badge } from '@aphexcms/ui/shadcn/badge';
|
|
9
|
-
import { RefreshCw, CalendarClock, Radio } from '@lucide/svelte';
|
|
10
|
+
import { RefreshCw, CalendarClock, Radio, Sparkles, Undo2, ChevronDown } from '@lucide/svelte';
|
|
11
|
+
import { toast } from 'svelte-sonner';
|
|
10
12
|
import { apiClient } from '../../api/client';
|
|
11
13
|
import type { Job, DomainEvent, JobStatus } from '../../types/events';
|
|
14
|
+
import type {
|
|
15
|
+
AgentChangeSet,
|
|
16
|
+
AgentChangeSetWithOperations,
|
|
17
|
+
AgentChangeSetStatus
|
|
18
|
+
} from '../../types/agent-change-sets';
|
|
12
19
|
|
|
13
|
-
|
|
20
|
+
// The server resolves `createdBy` (a raw user id) to a display name — see
|
|
21
|
+
// `resolve-created-by.ts`, shared by GET /api/events and GET /api/agent/change-sets.
|
|
22
|
+
type WithCreatedByName<T> = T & { createdByName: string | null };
|
|
23
|
+
|
|
24
|
+
type Tab = 'jobs' | 'events' | 'agent';
|
|
14
25
|
let tab = $state<Tab>('jobs');
|
|
15
26
|
|
|
16
27
|
let jobs = $state<Job[]>([]);
|
|
17
|
-
let events = $state<DomainEvent[]>([]);
|
|
28
|
+
let events = $state<WithCreatedByName<DomainEvent>[]>([]);
|
|
29
|
+
let changeSets = $state<WithCreatedByName<AgentChangeSetWithOperations>[]>([]);
|
|
18
30
|
let loading = $state(false);
|
|
19
31
|
let error = $state<string | null>(null);
|
|
20
32
|
let total = $state(0);
|
|
21
33
|
|
|
34
|
+
// Agent-changes tab: which row is expanded (fetches its operations lazily), and the
|
|
35
|
+
// per-change-set expanded detail + undo-in-flight state.
|
|
36
|
+
let expandedChangeSetId = $state<string | null>(null);
|
|
37
|
+
let expandedDetail = $state<WithCreatedByName<AgentChangeSetWithOperations> | null>(null);
|
|
38
|
+
let undoingId = $state<string | null>(null);
|
|
39
|
+
|
|
40
|
+
const changeSetStatusVariant: Record<
|
|
41
|
+
AgentChangeSetStatus,
|
|
42
|
+
'default' | 'secondary' | 'destructive'
|
|
43
|
+
> = {
|
|
44
|
+
in_progress: 'secondary',
|
|
45
|
+
completed: 'default',
|
|
46
|
+
failed: 'destructive'
|
|
47
|
+
};
|
|
48
|
+
|
|
22
49
|
const statuses: Array<JobStatus | 'all'> = [
|
|
23
50
|
'all',
|
|
24
51
|
'pending',
|
|
@@ -38,6 +65,24 @@
|
|
|
38
65
|
cancelled: 'outline'
|
|
39
66
|
};
|
|
40
67
|
|
|
68
|
+
// The row's headline: what the turn actually did, not who ran it (createdBy is secondary
|
|
69
|
+
// metadata, shown further along the row) — unique tool names in first-use order, e.g.
|
|
70
|
+
// "create_document" or "create_document, update_document". A pure Q&A turn (no operations)
|
|
71
|
+
// falls back to its truncated first message, since there's no action to name.
|
|
72
|
+
function changeSetHeadline(changeSet: AgentChangeSetWithOperations): string {
|
|
73
|
+
if (changeSet.operations.length === 0) {
|
|
74
|
+
return changeSet.summary ?? 'No document changes';
|
|
75
|
+
}
|
|
76
|
+
const seen = new Set<string>();
|
|
77
|
+
const names: string[] = [];
|
|
78
|
+
for (const op of changeSet.operations) {
|
|
79
|
+
if (seen.has(op.toolName)) continue;
|
|
80
|
+
seen.add(op.toolName);
|
|
81
|
+
names.push(op.toolName);
|
|
82
|
+
}
|
|
83
|
+
return names.join(', ');
|
|
84
|
+
}
|
|
85
|
+
|
|
41
86
|
function fmt(d: string | Date | null | undefined): string {
|
|
42
87
|
if (!d) return '—';
|
|
43
88
|
const date = typeof d === 'string' ? new Date(d) : d;
|
|
@@ -58,14 +103,27 @@
|
|
|
58
103
|
} else {
|
|
59
104
|
error = res.error ?? 'Failed to load jobs';
|
|
60
105
|
}
|
|
61
|
-
} else {
|
|
62
|
-
const res = await apiClient.get<DomainEvent[]>('/events', {
|
|
106
|
+
} else if (tab === 'events') {
|
|
107
|
+
const res = await apiClient.get<WithCreatedByName<DomainEvent>[]>('/events', {
|
|
108
|
+
limit: '100'
|
|
109
|
+
});
|
|
63
110
|
if (res.success) {
|
|
64
111
|
events = res.data ?? [];
|
|
65
112
|
total = res.pagination?.total ?? events.length;
|
|
66
113
|
} else {
|
|
67
114
|
error = res.error ?? 'Failed to load events';
|
|
68
115
|
}
|
|
116
|
+
} else {
|
|
117
|
+
const res = await apiClient.get<WithCreatedByName<AgentChangeSetWithOperations>[]>(
|
|
118
|
+
'/agent/change-sets',
|
|
119
|
+
{ limit: '100' }
|
|
120
|
+
);
|
|
121
|
+
if (res.success) {
|
|
122
|
+
changeSets = res.data ?? [];
|
|
123
|
+
total = res.pagination?.total ?? changeSets.length;
|
|
124
|
+
} else {
|
|
125
|
+
error = res.error ?? 'Failed to load agent changes';
|
|
126
|
+
}
|
|
69
127
|
}
|
|
70
128
|
} catch (err) {
|
|
71
129
|
error = err instanceof Error ? err.message : 'Failed to load';
|
|
@@ -80,6 +138,57 @@
|
|
|
80
138
|
load();
|
|
81
139
|
}
|
|
82
140
|
|
|
141
|
+
async function toggleExpand(changeSet: AgentChangeSet) {
|
|
142
|
+
if (expandedChangeSetId === changeSet.id) {
|
|
143
|
+
expandedChangeSetId = null;
|
|
144
|
+
expandedDetail = null;
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
expandedChangeSetId = changeSet.id;
|
|
148
|
+
expandedDetail = null;
|
|
149
|
+
const res = await apiClient.get<WithCreatedByName<AgentChangeSetWithOperations>>(
|
|
150
|
+
`/agent/change-sets/${changeSet.id}`
|
|
151
|
+
);
|
|
152
|
+
if (res.success && res.data) expandedDetail = res.data;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
async function undoChangeSet(changeSet: AgentChangeSet) {
|
|
156
|
+
if (undoingId) return;
|
|
157
|
+
undoingId = changeSet.id;
|
|
158
|
+
try {
|
|
159
|
+
const res = await apiClient.post<{
|
|
160
|
+
results: Array<{
|
|
161
|
+
operationId: string;
|
|
162
|
+
documentId: string;
|
|
163
|
+
success: boolean;
|
|
164
|
+
error?: string;
|
|
165
|
+
}>;
|
|
166
|
+
}>(`/agent/change-sets/${changeSet.id}/undo`);
|
|
167
|
+
if (!res.success || !res.data) {
|
|
168
|
+
toast.error(res.error ?? 'Undo failed');
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
const failed = res.data.results.filter((r) => !r.success);
|
|
172
|
+
if (failed.length === 0) {
|
|
173
|
+
toast.success('Undone — reverted document(s) to their prior version.');
|
|
174
|
+
} else {
|
|
175
|
+
toast.error(`${failed.length} operation(s) couldn't be undone (see console).`);
|
|
176
|
+
// eslint-disable-next-line no-console -- surfaced only when an undo partially fails
|
|
177
|
+
console.warn('[agent-changes] undo results:', failed);
|
|
178
|
+
}
|
|
179
|
+
// Refresh the expanded detail (if open) and the list so status/timestamps update.
|
|
180
|
+
if (expandedChangeSetId === changeSet.id) {
|
|
181
|
+
const detailRes = await apiClient.get<WithCreatedByName<AgentChangeSetWithOperations>>(
|
|
182
|
+
`/agent/change-sets/${changeSet.id}`
|
|
183
|
+
);
|
|
184
|
+
if (detailRes.success && detailRes.data) expandedDetail = detailRes.data;
|
|
185
|
+
}
|
|
186
|
+
await load();
|
|
187
|
+
} finally {
|
|
188
|
+
undoingId = null;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
83
192
|
// Reload jobs when the status filter changes (only relevant on the jobs tab).
|
|
84
193
|
$effect(() => {
|
|
85
194
|
// eslint-disable-next-line @typescript-eslint/no-unused-expressions -- reactive dependency: re-run when statusFilter changes
|
|
@@ -94,7 +203,9 @@
|
|
|
94
203
|
<div class="mb-4 flex items-center justify-between gap-3">
|
|
95
204
|
<div>
|
|
96
205
|
<h1 class="text-lg font-semibold">Activity</h1>
|
|
97
|
-
<p class="text-muted-foreground text-sm">
|
|
206
|
+
<p class="text-muted-foreground text-sm">
|
|
207
|
+
Scheduled jobs, the domain-event log, and the AI assistant's audit trail.
|
|
208
|
+
</p>
|
|
98
209
|
</div>
|
|
99
210
|
<Button variant="outline" size="sm" onclick={load} disabled={loading} class="gap-1.5">
|
|
100
211
|
<RefreshCw class="h-3.5 w-3.5 {loading ? 'animate-spin' : ''}" /> Refresh
|
|
@@ -121,6 +232,15 @@
|
|
|
121
232
|
>
|
|
122
233
|
<Radio class="h-3.5 w-3.5" /> Events
|
|
123
234
|
</button>
|
|
235
|
+
<button
|
|
236
|
+
class="flex items-center gap-1.5 border-b-2 px-3 py-2 text-sm transition-colors {tab ===
|
|
237
|
+
'agent'
|
|
238
|
+
? 'border-primary text-foreground'
|
|
239
|
+
: 'text-muted-foreground hover:text-foreground border-transparent'}"
|
|
240
|
+
onclick={() => switchTab('agent')}
|
|
241
|
+
>
|
|
242
|
+
<Sparkles class="h-3.5 w-3.5" /> Agent Changes
|
|
243
|
+
</button>
|
|
124
244
|
</div>
|
|
125
245
|
|
|
126
246
|
{#if tab === 'jobs'}
|
|
@@ -145,7 +265,7 @@
|
|
|
145
265
|
>
|
|
146
266
|
{error}
|
|
147
267
|
</div>
|
|
148
|
-
{:else if loading && jobs.length === 0 && events.length === 0}
|
|
268
|
+
{:else if loading && jobs.length === 0 && events.length === 0 && changeSets.length === 0}
|
|
149
269
|
<div class="text-muted-foreground p-8 text-center text-sm">Loading…</div>
|
|
150
270
|
{:else if tab === 'jobs'}
|
|
151
271
|
{#if jobs.length === 0}
|
|
@@ -188,40 +308,129 @@
|
|
|
188
308
|
</div>
|
|
189
309
|
<p class="text-muted-foreground mt-2 text-xs">Showing {jobs.length} of {total}.</p>
|
|
190
310
|
{/if}
|
|
191
|
-
{:else if
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
<
|
|
196
|
-
<
|
|
197
|
-
<
|
|
198
|
-
<
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
</thead>
|
|
204
|
-
<tbody>
|
|
205
|
-
{#each events as event (event.id)}
|
|
206
|
-
<tr class="border-rule border-t">
|
|
207
|
-
<td class="px-3 py-2 font-mono text-xs">{event.type}</td>
|
|
208
|
-
<td
|
|
209
|
-
class="text-muted-foreground max-w-[320px] truncate px-3 py-2 font-mono text-xs"
|
|
210
|
-
title={JSON.stringify(event.payload)}
|
|
211
|
-
>
|
|
212
|
-
{JSON.stringify(event.payload)}
|
|
213
|
-
</td>
|
|
214
|
-
<td class="text-muted-foreground px-3 py-2 font-mono text-xs"
|
|
215
|
-
>{event.createdBy ?? '—'}</td
|
|
216
|
-
>
|
|
217
|
-
<td class="text-muted-foreground px-3 py-2 whitespace-nowrap"
|
|
218
|
-
>{fmt(event.createdAt)}</td
|
|
219
|
-
>
|
|
311
|
+
{:else if tab === 'events'}
|
|
312
|
+
{#if events.length === 0}
|
|
313
|
+
<div class="text-muted-foreground p-8 text-center text-sm">No events.</div>
|
|
314
|
+
{:else}
|
|
315
|
+
<div class="border-rule overflow-x-auto rounded-md border">
|
|
316
|
+
<table class="w-full text-sm">
|
|
317
|
+
<thead class="bg-muted/50 text-muted-foreground text-xs">
|
|
318
|
+
<tr>
|
|
319
|
+
<th class="px-3 py-2 text-left font-medium">Type</th>
|
|
320
|
+
<th class="px-3 py-2 text-left font-medium">Payload</th>
|
|
321
|
+
<th class="px-3 py-2 text-left font-medium">By</th>
|
|
322
|
+
<th class="px-3 py-2 text-left font-medium">When</th>
|
|
220
323
|
</tr>
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
324
|
+
</thead>
|
|
325
|
+
<tbody>
|
|
326
|
+
{#each events as event (event.id)}
|
|
327
|
+
<tr class="border-rule border-t">
|
|
328
|
+
<td class="px-3 py-2 font-mono text-xs">{event.type}</td>
|
|
329
|
+
<td
|
|
330
|
+
class="text-muted-foreground max-w-[320px] truncate px-3 py-2 font-mono text-xs"
|
|
331
|
+
title={JSON.stringify(event.payload)}
|
|
332
|
+
>
|
|
333
|
+
{JSON.stringify(event.payload)}
|
|
334
|
+
</td>
|
|
335
|
+
<td class="text-muted-foreground px-3 py-2 font-mono text-xs"
|
|
336
|
+
>{event.createdByName ?? event.createdBy ?? '—'}</td
|
|
337
|
+
>
|
|
338
|
+
<td class="text-muted-foreground px-3 py-2 whitespace-nowrap"
|
|
339
|
+
>{fmt(event.createdAt)}</td
|
|
340
|
+
>
|
|
341
|
+
</tr>
|
|
342
|
+
{/each}
|
|
343
|
+
</tbody>
|
|
344
|
+
</table>
|
|
345
|
+
</div>
|
|
346
|
+
<p class="text-muted-foreground mt-2 text-xs">Showing {events.length} of {total}.</p>
|
|
347
|
+
{/if}
|
|
348
|
+
{:else if changeSets.length === 0}
|
|
349
|
+
<div class="text-muted-foreground p-8 text-center text-sm">No agent activity yet.</div>
|
|
350
|
+
{:else}
|
|
351
|
+
<div class="flex flex-col gap-2">
|
|
352
|
+
{#each changeSets as changeSet (changeSet.id)}
|
|
353
|
+
<div class="border-rule rounded-md border">
|
|
354
|
+
<Button
|
|
355
|
+
variant="ghost"
|
|
356
|
+
class="h-auto w-full items-center justify-start gap-3 rounded-b-none px-3 py-2.5 text-left text-sm font-normal"
|
|
357
|
+
onclick={() => toggleExpand(changeSet)}
|
|
358
|
+
>
|
|
359
|
+
<ChevronDown
|
|
360
|
+
class="text-muted-foreground h-3.5 w-3.5 shrink-0 transition-transform {expandedChangeSetId ===
|
|
361
|
+
changeSet.id
|
|
362
|
+
? 'rotate-180'
|
|
363
|
+
: ''}"
|
|
364
|
+
/>
|
|
365
|
+
<span class="min-w-0 flex-1 truncate font-mono">{changeSetHeadline(changeSet)}</span>
|
|
366
|
+
<Badge variant={changeSetStatusVariant[changeSet.status]} class="capitalize"
|
|
367
|
+
>{changeSet.status.replace('_', ' ')}</Badge
|
|
368
|
+
>
|
|
369
|
+
<span class="text-muted-foreground hidden shrink-0 text-xs sm:inline"
|
|
370
|
+
>{changeSet.createdByName ?? changeSet.createdBy ?? 'Unknown'}</span
|
|
371
|
+
>
|
|
372
|
+
<span class="text-muted-foreground hidden shrink-0 font-mono text-xs sm:inline"
|
|
373
|
+
>{changeSet.provider}/{changeSet.model}</span
|
|
374
|
+
>
|
|
375
|
+
<span
|
|
376
|
+
class="text-muted-foreground hidden shrink-0 font-mono text-xs sm:inline"
|
|
377
|
+
title="{changeSet.promptTokens} input tokens, {changeSet.completionTokens} output tokens"
|
|
378
|
+
>{changeSet.promptTokens.toLocaleString()} in / {changeSet.completionTokens.toLocaleString()}
|
|
379
|
+
out</span
|
|
380
|
+
>
|
|
381
|
+
<span class="text-muted-foreground shrink-0 text-xs whitespace-nowrap"
|
|
382
|
+
>{fmt(changeSet.createdAt)}</span
|
|
383
|
+
>
|
|
384
|
+
</Button>
|
|
385
|
+
|
|
386
|
+
{#if expandedChangeSetId === changeSet.id}
|
|
387
|
+
<div class="border-rule border-t p-3">
|
|
388
|
+
{#if !expandedDetail}
|
|
389
|
+
<p class="text-muted-foreground text-xs">Loading…</p>
|
|
390
|
+
{:else}
|
|
391
|
+
{#if expandedDetail.summary}
|
|
392
|
+
<p class="text-muted-foreground mb-3 border-l-2 pl-2 text-xs italic">
|
|
393
|
+
“{expandedDetail.summary}”
|
|
394
|
+
</p>
|
|
395
|
+
{/if}
|
|
396
|
+
{#if expandedDetail.operations.length === 0}
|
|
397
|
+
<p class="text-muted-foreground text-xs">
|
|
398
|
+
No document changes — a read-only conversation.
|
|
399
|
+
</p>
|
|
400
|
+
{:else}
|
|
401
|
+
<div class="flex flex-col gap-1.5">
|
|
402
|
+
{#each expandedDetail.operations as op (op.id)}
|
|
403
|
+
<div class="flex items-center gap-2 font-mono text-xs">
|
|
404
|
+
<Badge variant={op.success ? 'default' : 'destructive'} class="shrink-0"
|
|
405
|
+
>{op.success ? 'ok' : 'error'}</Badge
|
|
406
|
+
>
|
|
407
|
+
<span>{op.toolName}</span>
|
|
408
|
+
<span class="text-muted-foreground">{op.collection}/{op.documentId}</span>
|
|
409
|
+
{#if op.error}
|
|
410
|
+
<span class="text-destructive truncate">{op.error}</span>
|
|
411
|
+
{/if}
|
|
412
|
+
</div>
|
|
413
|
+
{/each}
|
|
414
|
+
</div>
|
|
415
|
+
{#if expandedDetail.operations.some((op) => op.success && op.versionBefore !== null)}
|
|
416
|
+
<Button
|
|
417
|
+
variant="outline"
|
|
418
|
+
size="sm"
|
|
419
|
+
class="mt-3 gap-1.5"
|
|
420
|
+
disabled={undoingId === changeSet.id}
|
|
421
|
+
onclick={() => undoChangeSet(changeSet)}
|
|
422
|
+
>
|
|
423
|
+
<Undo2 class="h-3.5 w-3.5" />
|
|
424
|
+
{undoingId === changeSet.id ? 'Undoing…' : 'Undo this turn'}
|
|
425
|
+
</Button>
|
|
426
|
+
{/if}
|
|
427
|
+
{/if}
|
|
428
|
+
{/if}
|
|
429
|
+
</div>
|
|
430
|
+
{/if}
|
|
431
|
+
</div>
|
|
432
|
+
{/each}
|
|
224
433
|
</div>
|
|
225
|
-
<p class="text-muted-foreground mt-2 text-xs">Showing {
|
|
434
|
+
<p class="text-muted-foreground mt-2 text-xs">Showing {changeSets.length} of {total}.</p>
|
|
226
435
|
{/if}
|
|
227
436
|
</div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActivityView.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/admin/ActivityView.svelte.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ActivityView.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/admin/ActivityView.svelte.ts"],"names":[],"mappings":"AAoZA,QAAA,MAAM,YAAY,2DAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
|