@aphexcms/cms-core 9.6.0 → 9.8.0
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 +36 -3
- package/dist/api/documents.d.ts.map +1 -1
- package/dist/api/documents.js +24 -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 +41 -0
- package/dist/api/schemas/documents.d.ts.map +1 -1
- package/dist/api/schemas/documents.js +38 -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 +2 -0
- package/dist/client/ui.d.ts.map +1 -1
- package/dist/client/ui.js +3 -0
- package/dist/components/AdminApp.svelte +37 -3
- package/dist/components/AdminApp.svelte.d.ts.map +1 -1
- package/dist/components/admin/ActivityView.svelte +436 -0
- package/dist/components/admin/ActivityView.svelte.d.ts +4 -0
- package/dist/components/admin/ActivityView.svelte.d.ts.map +1 -0
- 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 +469 -70
- 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/ScheduleDialog.svelte +174 -0
- package/dist/components/admin/ScheduleDialog.svelte.d.ts +20 -0
- package/dist/components/admin/ScheduleDialog.svelte.d.ts.map +1 -0
- 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/OrganizationSwitcher.svelte +3 -3
- 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/components/layout/sidebar/NavUser.svelte +5 -5
- 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/events.d.ts +55 -0
- package/dist/db/interfaces/events.d.ts.map +1 -0
- package/dist/db/interfaces/events.js +1 -0
- package/dist/db/interfaces/index.d.ts +13 -2
- package/dist/db/interfaces/index.d.ts.map +1 -1
- package/dist/db/interfaces/index.js +1 -1
- package/dist/db/interfaces/plugin-storage.d.ts +39 -0
- package/dist/db/interfaces/plugin-storage.d.ts.map +1 -0
- package/dist/db/interfaces/plugin-storage.js +1 -0
- 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/events/catalog.d.ts +8 -0
- package/dist/events/catalog.d.ts.map +1 -0
- package/dist/events/catalog.js +11 -0
- package/dist/events/consumer.d.ts +79 -0
- package/dist/events/consumer.d.ts.map +1 -0
- package/dist/events/consumer.js +76 -0
- package/dist/events/define-event.d.ts +17 -0
- package/dist/events/define-event.d.ts.map +1 -0
- package/dist/events/define-event.js +7 -0
- package/dist/events/emit.d.ts +11 -0
- package/dist/events/emit.d.ts.map +1 -0
- package/dist/events/emit.js +20 -0
- package/dist/events/index.d.ts +4 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +3 -0
- package/dist/field-validation/rule.d.ts.map +1 -1
- package/dist/field-validation/rule.js +15 -0
- package/dist/field-validation/utils.d.ts.map +1 -1
- package/dist/field-validation/utils.js +211 -29
- package/dist/forms/define-form.d.ts +25 -0
- package/dist/forms/define-form.d.ts.map +1 -0
- package/dist/forms/define-form.js +22 -0
- package/dist/forms/index.d.ts +4 -0
- package/dist/forms/index.d.ts.map +1 -0
- package/dist/forms/index.js +5 -0
- package/dist/forms/types.d.ts +49 -0
- package/dist/forms/types.d.ts.map +1 -0
- package/dist/forms/types.js +1 -0
- package/dist/forms/validate.d.ts +9 -0
- package/dist/forms/validate.d.ts.map +1 -0
- package/dist/forms/validate.js +18 -0
- package/dist/hooks.d.ts +2 -0
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +17 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/jobs/document-jobs.d.ts +27 -0
- package/dist/jobs/document-jobs.d.ts.map +1 -0
- package/dist/jobs/document-jobs.js +42 -0
- package/dist/jobs/embedded-runner.d.ts +25 -0
- package/dist/jobs/embedded-runner.d.ts.map +1 -0
- package/dist/jobs/embedded-runner.js +46 -0
- package/dist/jobs/index.d.ts +7 -0
- package/dist/jobs/index.d.ts.map +1 -0
- package/dist/jobs/index.js +8 -0
- package/dist/jobs/relay.d.ts +27 -0
- package/dist/jobs/relay.d.ts.map +1 -0
- package/dist/jobs/relay.js +60 -0
- package/dist/jobs/run-batch.d.ts +52 -0
- package/dist/jobs/run-batch.d.ts.map +1 -0
- package/dist/jobs/run-batch.js +61 -0
- package/dist/jobs/run-due-jobs.d.ts +30 -0
- package/dist/jobs/run-due-jobs.d.ts.map +1 -0
- package/dist/jobs/run-due-jobs.js +69 -0
- package/dist/jobs/types.d.ts +18 -0
- package/dist/jobs/types.d.ts.map +1 -0
- package/dist/jobs/types.js +1 -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 +36 -3
- package/dist/lib/api/documents.d.ts.map +1 -1
- package/dist/lib/api/documents.js +24 -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 +41 -0
- package/dist/lib/api/schemas/documents.d.ts.map +1 -1
- package/dist/lib/api/schemas/documents.js +38 -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 +2 -0
- package/dist/lib/client/ui.d.ts.map +1 -1
- package/dist/lib/client/ui.js +3 -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/events.d.ts +55 -0
- package/dist/lib/db/interfaces/events.d.ts.map +1 -0
- package/dist/lib/db/interfaces/events.js +2 -0
- package/dist/lib/db/interfaces/events.js.map +1 -0
- package/dist/lib/db/interfaces/index.d.ts +13 -2
- 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/db/interfaces/plugin-storage.d.ts +39 -0
- package/dist/lib/db/interfaces/plugin-storage.d.ts.map +1 -0
- package/dist/lib/db/interfaces/plugin-storage.js +2 -0
- package/dist/lib/db/interfaces/plugin-storage.js.map +1 -0
- 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/events/catalog.d.ts +8 -0
- package/dist/lib/events/catalog.d.ts.map +1 -0
- package/dist/lib/events/catalog.js +12 -0
- package/dist/lib/events/catalog.js.map +1 -0
- package/dist/lib/events/consumer.d.ts +79 -0
- package/dist/lib/events/consumer.d.ts.map +1 -0
- package/dist/lib/events/consumer.js +77 -0
- package/dist/lib/events/consumer.js.map +1 -0
- package/dist/lib/events/define-event.d.ts +17 -0
- package/dist/lib/events/define-event.d.ts.map +1 -0
- package/dist/lib/events/define-event.js +8 -0
- package/dist/lib/events/define-event.js.map +1 -0
- package/dist/lib/events/emit.d.ts +11 -0
- package/dist/lib/events/emit.d.ts.map +1 -0
- package/dist/lib/events/emit.js +21 -0
- package/dist/lib/events/emit.js.map +1 -0
- package/dist/lib/events/index.d.ts +4 -0
- package/dist/lib/events/index.d.ts.map +1 -0
- package/dist/lib/events/index.js +4 -0
- package/dist/lib/events/index.js.map +1 -0
- package/dist/lib/field-validation/rule.d.ts.map +1 -1
- package/dist/lib/field-validation/rule.js +15 -0
- package/dist/lib/field-validation/rule.js.map +1 -1
- 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/forms/define-form.d.ts +25 -0
- package/dist/lib/forms/define-form.d.ts.map +1 -0
- package/dist/lib/forms/define-form.js +23 -0
- package/dist/lib/forms/define-form.js.map +1 -0
- package/dist/lib/forms/index.d.ts +4 -0
- package/dist/lib/forms/index.d.ts.map +1 -0
- package/dist/lib/forms/index.js +6 -0
- package/dist/lib/forms/index.js.map +1 -0
- package/dist/lib/forms/types.d.ts +49 -0
- package/dist/lib/forms/types.d.ts.map +1 -0
- package/dist/lib/forms/types.js +2 -0
- package/dist/lib/forms/types.js.map +1 -0
- package/dist/lib/forms/validate.d.ts +9 -0
- package/dist/lib/forms/validate.d.ts.map +1 -0
- package/dist/lib/forms/validate.js +19 -0
- package/dist/lib/forms/validate.js.map +1 -0
- package/dist/lib/hooks.d.ts +2 -0
- package/dist/lib/hooks.d.ts.map +1 -1
- package/dist/lib/hooks.js +17 -0
- package/dist/lib/hooks.js.map +1 -1
- package/dist/lib/index.d.ts +2 -0
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +6 -0
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/jobs/document-jobs.d.ts +27 -0
- package/dist/lib/jobs/document-jobs.d.ts.map +1 -0
- package/dist/lib/jobs/document-jobs.js +43 -0
- package/dist/lib/jobs/document-jobs.js.map +1 -0
- package/dist/lib/jobs/embedded-runner.d.ts +25 -0
- package/dist/lib/jobs/embedded-runner.d.ts.map +1 -0
- package/dist/lib/jobs/embedded-runner.js +47 -0
- package/dist/lib/jobs/embedded-runner.js.map +1 -0
- package/dist/lib/jobs/index.d.ts +7 -0
- package/dist/lib/jobs/index.d.ts.map +1 -0
- package/dist/lib/jobs/index.js +9 -0
- package/dist/lib/jobs/index.js.map +1 -0
- package/dist/lib/jobs/relay.d.ts +27 -0
- package/dist/lib/jobs/relay.d.ts.map +1 -0
- package/dist/lib/jobs/relay.js +61 -0
- package/dist/lib/jobs/relay.js.map +1 -0
- package/dist/lib/jobs/run-batch.d.ts +52 -0
- package/dist/lib/jobs/run-batch.d.ts.map +1 -0
- package/dist/lib/jobs/run-batch.js +62 -0
- package/dist/lib/jobs/run-batch.js.map +1 -0
- package/dist/lib/jobs/run-due-jobs.d.ts +30 -0
- package/dist/lib/jobs/run-due-jobs.d.ts.map +1 -0
- package/dist/lib/jobs/run-due-jobs.js +70 -0
- package/dist/lib/jobs/run-due-jobs.js.map +1 -0
- package/dist/lib/jobs/types.d.ts +18 -0
- package/dist/lib/jobs/types.d.ts.map +1 -0
- package/dist/lib/jobs/types.js +2 -0
- package/dist/lib/jobs/types.js.map +1 -0
- package/dist/lib/local-api/collection-api.d.ts +49 -2
- package/dist/lib/local-api/collection-api.d.ts.map +1 -1
- package/dist/lib/local-api/collection-api.js +193 -27
- 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 +19 -1
- package/dist/lib/plugins/resolver.d.ts.map +1 -1
- package/dist/lib/plugins/resolver.js +17 -1
- package/dist/lib/plugins/resolver.js.map +1 -1
- package/dist/lib/plugins/types.d.ts +68 -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 +16 -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 +145 -2
- package/dist/lib/server/api/routes/documents-publish.js.map +1 -1
- package/dist/lib/server/api/routes/jobs.d.ts +4 -0
- package/dist/lib/server/api/routes/jobs.d.ts.map +1 -0
- package/dist/lib/server/api/routes/jobs.js +95 -0
- package/dist/lib/server/api/routes/jobs.js.map +1 -0
- 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/api/routes/workers-run.d.ts +4 -0
- package/dist/lib/server/api/routes/workers-run.d.ts.map +1 -0
- package/dist/lib/server/api/routes/workers-run.js +41 -0
- package/dist/lib/server/api/routes/workers-run.js.map +1 -0
- package/dist/lib/server/index.d.ts +2 -0
- package/dist/lib/server/index.d.ts.map +1 -1
- package/dist/lib/server/index.js +3 -0
- package/dist/lib/server/index.js.map +1 -1
- package/dist/lib/services/version-service.d.ts +19 -3
- package/dist/lib/services/version-service.d.ts.map +1 -1
- package/dist/lib/services/version-service.js +75 -69
- 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 +62 -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/events.d.ts +134 -0
- package/dist/lib/types/events.d.ts.map +1 -0
- package/dist/lib/types/events.js +4 -0
- package/dist/lib/types/events.js.map +1 -0
- package/dist/lib/types/index.d.ts +3 -0
- package/dist/lib/types/index.d.ts.map +1 -1
- package/dist/lib/types/index.js +3 -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/lib/utils/index.d.ts +1 -1
- package/dist/lib/utils/index.d.ts.map +1 -1
- package/dist/lib/utils/index.js.map +1 -1
- package/dist/local-api/collection-api.d.ts +49 -2
- package/dist/local-api/collection-api.d.ts.map +1 -1
- package/dist/local-api/collection-api.js +193 -27
- 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 +19 -1
- package/dist/plugins/resolver.d.ts.map +1 -1
- package/dist/plugins/resolver.js +17 -1
- package/dist/plugins/types.d.ts +68 -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 +16 -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 +145 -2
- package/dist/server/api/routes/jobs.d.ts +4 -0
- package/dist/server/api/routes/jobs.d.ts.map +1 -0
- package/dist/server/api/routes/jobs.js +94 -0
- 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/api/routes/workers-run.d.ts +4 -0
- package/dist/server/api/routes/workers-run.d.ts.map +1 -0
- package/dist/server/api/routes/workers-run.js +40 -0
- package/dist/server/index.d.ts +2 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +3 -0
- package/dist/services/version-service.d.ts +19 -3
- package/dist/services/version-service.d.ts.map +1 -1
- package/dist/services/version-service.js +75 -69
- 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 +62 -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/events.d.ts +134 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +3 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +3 -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/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/package.json +5 -1
|
@@ -81,6 +81,180 @@ export function validateValueShape(field, value) {
|
|
|
81
81
|
return null;
|
|
82
82
|
}
|
|
83
83
|
}
|
|
84
|
+
/**
|
|
85
|
+
* Find which `of` entry an array item belongs to. Mirrors ArrayField.svelte's own
|
|
86
|
+
* resolution (`ref.name === item._type || ref.type === item._type`). An item
|
|
87
|
+
* carrying an explicit `_type` must match one of the declared entries — an
|
|
88
|
+
* unrecognized `_type` is an error, never silently coerced to some other entry,
|
|
89
|
+
* even when only one type is declared. The single-entry fallback only applies
|
|
90
|
+
* when the item has no `_type` tag at all (untagged items in a single-type array).
|
|
91
|
+
*/
|
|
92
|
+
function resolveArrayItemTypeRef(of, item) {
|
|
93
|
+
if (isPlainObject(item) && typeof item._type === 'string') {
|
|
94
|
+
return of.find((ref) => ref.name === item._type || ref.type === item._type);
|
|
95
|
+
}
|
|
96
|
+
if (of.length === 1)
|
|
97
|
+
return of[0];
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* A leaf field error message is always formatted as `Field "<path>" <reason>`
|
|
102
|
+
* (see the bottom of `validateField`). When that message becomes an input to a
|
|
103
|
+
* shallower level of array-item recursion, re-wrapping it verbatim would nest
|
|
104
|
+
* "Field ..." text once per level. Instead, pull the deeper path back out so the
|
|
105
|
+
* caller can extend it into one clean breadcrumb and keep only the reason.
|
|
106
|
+
*/
|
|
107
|
+
function splitFieldMessage(message) {
|
|
108
|
+
const match = message.match(/^Field "([^"]+)"\s*(.*)$/s);
|
|
109
|
+
return match
|
|
110
|
+
? { path: match[1] ?? null, reason: match[2] ?? message }
|
|
111
|
+
: { path: null, reason: message };
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Shape-check a single Portable Text text block (`_type: 'block'`) — `_key`, `children`
|
|
115
|
+
* (spans and/or inline objects), and `markDefs` all need to be the shape
|
|
116
|
+
* portable-text-serializer.ts produces, since nothing else in this write path checks it.
|
|
117
|
+
* A source that isn't the TipTap editor (an agent's `content_patch_fields` call, an
|
|
118
|
+
* imported document) has no other gate before this reaches storage.
|
|
119
|
+
*/
|
|
120
|
+
function validatePortableTextBlock(item, itemPath) {
|
|
121
|
+
if (!isPlainObject(item)) {
|
|
122
|
+
return [
|
|
123
|
+
{
|
|
124
|
+
field: itemPath,
|
|
125
|
+
errors: [`expected a Portable Text block object, got ${describeValue(item)}`]
|
|
126
|
+
}
|
|
127
|
+
];
|
|
128
|
+
}
|
|
129
|
+
const errors = [];
|
|
130
|
+
if (typeof item._key !== 'string' || item._key.length === 0) {
|
|
131
|
+
errors.push('is missing a non-empty "_key"');
|
|
132
|
+
}
|
|
133
|
+
if (item.style !== undefined && typeof item.style !== 'string') {
|
|
134
|
+
errors.push(`"style" must be a string, got ${describeValue(item.style)}`);
|
|
135
|
+
}
|
|
136
|
+
if (item.listItem !== undefined && typeof item.listItem !== 'string') {
|
|
137
|
+
errors.push(`"listItem" must be a string, got ${describeValue(item.listItem)}`);
|
|
138
|
+
}
|
|
139
|
+
if (item.level !== undefined && typeof item.level !== 'number') {
|
|
140
|
+
errors.push(`"level" must be a number, got ${describeValue(item.level)}`);
|
|
141
|
+
}
|
|
142
|
+
if (!Array.isArray(item.children)) {
|
|
143
|
+
errors.push(`"children" must be an array, got ${describeValue(item.children)}`);
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
item.children.forEach((child, childIndex) => {
|
|
147
|
+
const childLabel = `child[${childIndex}]`;
|
|
148
|
+
if (!isPlainObject(child)) {
|
|
149
|
+
errors.push(`${childLabel} expected an object, got ${describeValue(child)}`);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
if (typeof child._type !== 'string' || child._type.length === 0) {
|
|
153
|
+
errors.push(`${childLabel} is missing a "_type"`);
|
|
154
|
+
}
|
|
155
|
+
if (typeof child._key !== 'string' || child._key.length === 0) {
|
|
156
|
+
errors.push(`${childLabel} is missing a non-empty "_key"`);
|
|
157
|
+
}
|
|
158
|
+
if (child._type === 'span') {
|
|
159
|
+
if (typeof child.text !== 'string') {
|
|
160
|
+
errors.push(`${childLabel} (span) "text" must be a string, got ${describeValue(child.text)}`);
|
|
161
|
+
}
|
|
162
|
+
if (child.marks !== undefined && !Array.isArray(child.marks)) {
|
|
163
|
+
errors.push(`${childLabel} (span) "marks" must be an array, got ${describeValue(child.marks)}`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
if (item.markDefs !== undefined) {
|
|
169
|
+
if (!Array.isArray(item.markDefs)) {
|
|
170
|
+
errors.push(`"markDefs" must be an array, got ${describeValue(item.markDefs)}`);
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
item.markDefs.forEach((def, defIndex) => {
|
|
174
|
+
if (!isPlainObject(def)) {
|
|
175
|
+
errors.push(`markDefs[${defIndex}] expected an object, got ${describeValue(def)}`);
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
if (typeof def._type !== 'string' || def._type.length === 0) {
|
|
179
|
+
errors.push(`markDefs[${defIndex}] is missing a "_type"`);
|
|
180
|
+
}
|
|
181
|
+
if (typeof def._key !== 'string' || def._key.length === 0) {
|
|
182
|
+
errors.push(`markDefs[${defIndex}] is missing a non-empty "_key"`);
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return errors.length > 0 ? [{ field: itemPath, errors }] : [];
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Recursively validate each array item against the type it resolves to in `of`.
|
|
191
|
+
* This is the check that was previously entirely missing: `validateValueShape`
|
|
192
|
+
* only confirmed the field's value IS an array, never that its items match `of` —
|
|
193
|
+
* so a mistyped or malformed array item (wrong `_type`, missing required nested
|
|
194
|
+
* fields) passed validation silently regardless of whether `of` was well-formed.
|
|
195
|
+
*
|
|
196
|
+
* Named types in `of` that aren't inline objects (`fields` absent) — i.e. a
|
|
197
|
+
* reference to another registered schema by name — aren't resolvable here: this
|
|
198
|
+
* module has no schema registry. Those items are left unvalidated, same as
|
|
199
|
+
* before this fix, rather than guessed at.
|
|
200
|
+
*/
|
|
201
|
+
async function validateArrayItems(field, items, context) {
|
|
202
|
+
const of = field.of ?? [];
|
|
203
|
+
const results = [];
|
|
204
|
+
for (let index = 0; index < items.length; index++) {
|
|
205
|
+
const item = items[index];
|
|
206
|
+
const itemPath = `${field.name}[${index}]`;
|
|
207
|
+
const typeRef = resolveArrayItemTypeRef(of, item);
|
|
208
|
+
if (!typeRef) {
|
|
209
|
+
const gotType = isPlainObject(item) && typeof item._type === 'string' ? item._type : describeValue(item);
|
|
210
|
+
const declared = of.map((t) => t.name ?? t.type).join(', ') || '(none declared)';
|
|
211
|
+
results.push({
|
|
212
|
+
field: itemPath,
|
|
213
|
+
errors: [
|
|
214
|
+
`has type "${gotType}", which is not one of the declared array item types: ${declared}`
|
|
215
|
+
]
|
|
216
|
+
});
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
// Portable Text text blocks (`_type: 'block'`) — the shape the TipTap editor always
|
|
220
|
+
// produces (portable-text-serializer.ts), but nothing an agent-authored patch is bound
|
|
221
|
+
// to. Custom block types (any other `_type` in `of`) fall through to the `typeRef.fields`
|
|
222
|
+
// branch below and get full field validation already; this is the one shape the rest of
|
|
223
|
+
// this function never checked.
|
|
224
|
+
if (typeRef.type === 'block') {
|
|
225
|
+
results.push(...validatePortableTextBlock(item, itemPath));
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
if (typeRef.type === 'reference') {
|
|
229
|
+
if (!isPlainObject(item) || typeof item._ref !== 'string') {
|
|
230
|
+
results.push({
|
|
231
|
+
field: itemPath,
|
|
232
|
+
errors: [
|
|
233
|
+
`expected a reference object { _type: 'reference', _ref: '<documentId>' }, got ${describeValue(item)}`
|
|
234
|
+
]
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
if (typeRef.fields) {
|
|
240
|
+
if (!isPlainObject(item)) {
|
|
241
|
+
results.push({
|
|
242
|
+
field: itemPath,
|
|
243
|
+
errors: [`expected an object, got ${describeValue(item)}`]
|
|
244
|
+
});
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
const nested = await validateFieldSet(typeRef.fields, item, context);
|
|
248
|
+
for (const err of nested) {
|
|
249
|
+
for (const rawMessage of err.errors) {
|
|
250
|
+
const { path, reason } = splitFieldMessage(rawMessage);
|
|
251
|
+
results.push({ field: `${itemPath}.${path ?? err.field}`, errors: [reason] });
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return results;
|
|
257
|
+
}
|
|
84
258
|
/**
|
|
85
259
|
* Validate a field value against its validation rules
|
|
86
260
|
*/
|
|
@@ -102,6 +276,14 @@ export async function validateField(field, value, context = {}) {
|
|
|
102
276
|
errors: [{ level: 'error', message: `Field "${field.name}" ${shapeError}` }]
|
|
103
277
|
};
|
|
104
278
|
}
|
|
279
|
+
// Array items are never validated by the shape check above (it only confirms
|
|
280
|
+
// the value IS an array) — recurse into each item against `field.of` here.
|
|
281
|
+
if (field.type === 'array' && Array.isArray(value)) {
|
|
282
|
+
const itemErrors = await validateArrayItems(field, value, context);
|
|
283
|
+
for (const err of itemErrors) {
|
|
284
|
+
allErrors.push({ level: 'error', message: `Field "${err.field}" ${err.errors.join('; ')}` });
|
|
285
|
+
}
|
|
286
|
+
}
|
|
105
287
|
// Add automatic validation for date/datetime/url fields based on type
|
|
106
288
|
if (field.type === 'date') {
|
|
107
289
|
const dateField = field;
|
|
@@ -207,6 +389,34 @@ export function getValidationClasses(hasErrors) {
|
|
|
207
389
|
// No green styling for success - only show red for errors
|
|
208
390
|
return '';
|
|
209
391
|
}
|
|
392
|
+
/**
|
|
393
|
+
* Validate a flat set of fields against their values in `data`. Shared by
|
|
394
|
+
* top-level document validation and, recursively, by array-item/nested-object
|
|
395
|
+
* validation — `context.document` carries the full top-level document through
|
|
396
|
+
* either way, since it's set once by the top-level caller and left untouched on
|
|
397
|
+
* recursive calls (so cross-field `Rule.custom((v, { document }) => ...)`
|
|
398
|
+
* validators still see the whole document, not just the nested item).
|
|
399
|
+
*/
|
|
400
|
+
async function validateFieldSet(fields, data, context) {
|
|
401
|
+
const validationErrors = [];
|
|
402
|
+
for (const field of fields) {
|
|
403
|
+
const value = data[field.name];
|
|
404
|
+
const result = await validateField(field, value, {
|
|
405
|
+
...context,
|
|
406
|
+
document: context.document !== undefined ? context.document : data
|
|
407
|
+
});
|
|
408
|
+
if (!result.isValid) {
|
|
409
|
+
const errorMessages = result.errors.filter((e) => e.level === 'error').map((e) => e.message);
|
|
410
|
+
if (errorMessages.length > 0) {
|
|
411
|
+
validationErrors.push({
|
|
412
|
+
field: field.name,
|
|
413
|
+
errors: errorMessages
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
return validationErrors;
|
|
419
|
+
}
|
|
210
420
|
/**
|
|
211
421
|
* Validate an entire document's data against a schema
|
|
212
422
|
* This function:
|
|
@@ -225,41 +435,13 @@ export async function validateDocumentData(schema, data, context = {}) {
|
|
|
225
435
|
schemaName: schema.name,
|
|
226
436
|
data
|
|
227
437
|
});
|
|
228
|
-
const validationErrors = [];
|
|
229
438
|
// Normalize date fields: convert to ISO for storage, user format for validation
|
|
230
439
|
const { normalizedData, dataForValidation } = normalizeDateFields(data, schema);
|
|
231
440
|
cmsLogger.debug('[validateDocumentData]', 'After normalization', {
|
|
232
441
|
normalizedData,
|
|
233
442
|
dataForValidation
|
|
234
443
|
});
|
|
235
|
-
|
|
236
|
-
for (const field of schema.fields) {
|
|
237
|
-
const value = dataForValidation[field.name];
|
|
238
|
-
cmsLogger.debug('[validateDocumentData]', `Validating field "${field.name}"`, {
|
|
239
|
-
type: field.type,
|
|
240
|
-
value
|
|
241
|
-
});
|
|
242
|
-
// Build the document context here from the data we're already validating —
|
|
243
|
-
// no need for callers to pass it. Cross-field validators read it via
|
|
244
|
-
// `Rule.custom((v, { document }) => ...)`, matching ValidationContext.
|
|
245
|
-
const result = await validateField(field, value, {
|
|
246
|
-
...context,
|
|
247
|
-
document: dataForValidation
|
|
248
|
-
});
|
|
249
|
-
cmsLogger.debug('[validateDocumentData]', `Field "${field.name}" validation result`, {
|
|
250
|
-
isValid: result.isValid,
|
|
251
|
-
errors: result.errors
|
|
252
|
-
});
|
|
253
|
-
if (!result.isValid) {
|
|
254
|
-
const errorMessages = result.errors.filter((e) => e.level === 'error').map((e) => e.message);
|
|
255
|
-
if (errorMessages.length > 0) {
|
|
256
|
-
validationErrors.push({
|
|
257
|
-
field: field.name,
|
|
258
|
-
errors: errorMessages
|
|
259
|
-
});
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
}
|
|
444
|
+
const validationErrors = await validateFieldSet(schema.fields, dataForValidation, context);
|
|
263
445
|
cmsLogger.debug('[validateDocumentData]', 'Final result', {
|
|
264
446
|
isValid: validationErrors.length === 0,
|
|
265
447
|
errors: validationErrors
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Field } from '../types/schemas.js';
|
|
2
|
+
import type { FormDefinition } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Define a form whose submission type is inferred from its own fields.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* export const contactForm = defineForm({
|
|
9
|
+
* id: 'contact',
|
|
10
|
+
* title: 'Contact us',
|
|
11
|
+
* fields: [
|
|
12
|
+
* { name: 'name', type: 'string', title: 'Name', validation: (R) => R.required() },
|
|
13
|
+
* { name: 'email', type: 'string', title: 'Email', validation: (R) => R.required().email() },
|
|
14
|
+
* { name: 'message', type: 'text', title: 'Message', validation: (R) => R.required() }
|
|
15
|
+
* ]
|
|
16
|
+
* });
|
|
17
|
+
*
|
|
18
|
+
* type ContactSubmission = InferForm<typeof contactForm>;
|
|
19
|
+
* // { name?: string; email?: string; message?: string }
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export declare function defineForm<const F extends readonly Field[]>(form: Omit<FormDefinition, 'fields'> & {
|
|
23
|
+
fields: F;
|
|
24
|
+
}): FormDefinition<F>;
|
|
25
|
+
//# sourceMappingURL=define-form.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-form.d.ts","sourceRoot":"","sources":["../../src/lib/forms/define-form.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,UAAU,CAAC,KAAK,CAAC,CAAC,SAAS,SAAS,KAAK,EAAE,EAC1D,IAAI,EAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,GAAG;IAAE,MAAM,EAAE,CAAC,CAAA;CAAE,GAClD,cAAc,CAAC,CAAC,CAAC,CAEnB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Define a form whose submission type is inferred from its own fields.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```ts
|
|
6
|
+
* export const contactForm = defineForm({
|
|
7
|
+
* id: 'contact',
|
|
8
|
+
* title: 'Contact us',
|
|
9
|
+
* fields: [
|
|
10
|
+
* { name: 'name', type: 'string', title: 'Name', validation: (R) => R.required() },
|
|
11
|
+
* { name: 'email', type: 'string', title: 'Email', validation: (R) => R.required().email() },
|
|
12
|
+
* { name: 'message', type: 'text', title: 'Message', validation: (R) => R.required() }
|
|
13
|
+
* ]
|
|
14
|
+
* });
|
|
15
|
+
*
|
|
16
|
+
* type ContactSubmission = InferForm<typeof contactForm>;
|
|
17
|
+
* // { name?: string; email?: string; message?: string }
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export function defineForm(form) {
|
|
21
|
+
return form;
|
|
22
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/forms/index.ts"],"names":[],"mappings":"AAEA,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { Field, InferFields } from '../types/schemas.js';
|
|
2
|
+
/**
|
|
3
|
+
* A developer-authored form. `id` is the stable public key (submission endpoint + event
|
|
4
|
+
* payload); `fields` is an ordinary CMS field array, so a text field, an email (a `string`
|
|
5
|
+
* with an email `Rule`), a number, a boolean, etc. all just work.
|
|
6
|
+
*
|
|
7
|
+
* The type parameter preserves the exact field literals when built via `defineForm`, which is
|
|
8
|
+
* what lets `InferForm<typeof form>` recover the submission shape with no generated types.
|
|
9
|
+
*/
|
|
10
|
+
export interface FormDefinition<F extends readonly Field[] = readonly Field[]> {
|
|
11
|
+
/** Stable public id — the submission key and the `form.submitted` payload's `formId`. */
|
|
12
|
+
id: string;
|
|
13
|
+
title: string;
|
|
14
|
+
/** The form's fields, reusing the CMS field DSL. */
|
|
15
|
+
fields: F;
|
|
16
|
+
/** Optional message a client can show after a successful submit. */
|
|
17
|
+
successMessage?: string;
|
|
18
|
+
/**
|
|
19
|
+
* Optional input transform, run on the raw submission BEFORE validation — the one thing
|
|
20
|
+
* validation can't do (it judges, never mutates): `trim()` strings, lowercase an email, coerce
|
|
21
|
+
* shapes. Return the transformed data. This is the forms-native equivalent of a schema's
|
|
22
|
+
* `beforeValidate` hook — a form isn't a document, so it owns its own input shaping here rather
|
|
23
|
+
* than borrowing the document-hook machinery. Rejection (required, format) still belongs in a
|
|
24
|
+
* field's `validation` Rule; side effects (notify) belong in a `form.submitted` consumer.
|
|
25
|
+
*/
|
|
26
|
+
transform?: (data: Record<string, unknown>) => Record<string, unknown>;
|
|
27
|
+
/**
|
|
28
|
+
* Where a "new submission" notification is sent. One address or several. Kept next to the form
|
|
29
|
+
* definition so the routing decision lives with the form, not in a global env var — different
|
|
30
|
+
* forms notify different inboxes. Omit to store-only (no notification); a notification consumer
|
|
31
|
+
* skips forms without it. The email itself is sent out of band by a `form.submitted` consumer,
|
|
32
|
+
* never in the submit path.
|
|
33
|
+
*/
|
|
34
|
+
notifyEmail?: string | string[];
|
|
35
|
+
/**
|
|
36
|
+
* Persist submissions to `cms_plugin_storage` (under `plugin:'forms', collection:id`). Default
|
|
37
|
+
* `true`. Set `false` for a
|
|
38
|
+
* "just email me" form — the `form.submitted` event still fires (so notification consumers
|
|
39
|
+
* run), but nothing is stored. Matches the real split where some forms only notify.
|
|
40
|
+
*/
|
|
41
|
+
store?: boolean;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* The typed shape of a form's submission data, inferred from its fields. Values are
|
|
45
|
+
* `T | undefined` (a submission may omit optional fields); required-ness is enforced at
|
|
46
|
+
* runtime by validation, exactly as in the rest of the CMS.
|
|
47
|
+
*/
|
|
48
|
+
export type InferForm<D> = D extends FormDefinition<infer F> ? InferFields<F> : never;
|
|
49
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/forms/types.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE3D;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,SAAS,KAAK,EAAE,GAAG,SAAS,KAAK,EAAE;IAC5E,yFAAyF;IACzF,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,MAAM,EAAE,CAAC,CAAC;IACV,oEAAoE;IACpE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvE;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAChC;;;;;OAKG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;;;GAIG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { FormDefinition } from './types.js';
|
|
2
|
+
import { type DocumentValidationResult } from '../field-validation/utils.js';
|
|
3
|
+
/**
|
|
4
|
+
* Validate raw submission data against a form's fields. Returns the standard
|
|
5
|
+
* `DocumentValidationResult` (`isValid`, field-keyed `errors`, `normalizedData`) — the core
|
|
6
|
+
* submit path rejects on `!isValid` and stores/emits from `normalizedData`.
|
|
7
|
+
*/
|
|
8
|
+
export declare function validateFormData(form: FormDefinition, data: Record<string, unknown>): Promise<DocumentValidationResult>;
|
|
9
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/lib/forms/validate.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAwB,KAAK,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAYhG;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC/B,IAAI,EAAE,cAAc,EACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,OAAO,CAAC,wBAAwB,CAAC,CAEnC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { validateDocumentData } from '../field-validation/utils.js';
|
|
2
|
+
/** Adapt a form to a schema-like object so the field validator can run against it. */
|
|
3
|
+
function formToSchema(form) {
|
|
4
|
+
return {
|
|
5
|
+
type: 'object',
|
|
6
|
+
name: form.id,
|
|
7
|
+
title: form.title,
|
|
8
|
+
fields: [...form.fields]
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Validate raw submission data against a form's fields. Returns the standard
|
|
13
|
+
* `DocumentValidationResult` (`isValid`, field-keyed `errors`, `normalizedData`) — the core
|
|
14
|
+
* submit path rejects on `!isValid` and stores/emits from `normalizedData`.
|
|
15
|
+
*/
|
|
16
|
+
export function validateFormData(form, data) {
|
|
17
|
+
return validateDocumentData(formToSchema(form), data);
|
|
18
|
+
}
|
package/dist/hooks.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ import type { DatabaseAdapter } from './db/index.js';
|
|
|
5
5
|
import type { AssetService } from './services/asset-service.js';
|
|
6
6
|
import type { StorageAdapter } from './storage/interfaces/storage.js';
|
|
7
7
|
import type { EmailAdapter } from './email/index.js';
|
|
8
|
+
import type { AIProviderAdapter } from './ai/index.js';
|
|
8
9
|
import type { AuthProvider } from './auth/provider.js';
|
|
9
10
|
import type { GraphQLSettings } from './graphql/index.js';
|
|
10
11
|
import type { Logger } from './utils/logger.js';
|
|
@@ -20,6 +21,7 @@ export interface CMSInstances {
|
|
|
20
21
|
storageAdapter: StorageAdapter;
|
|
21
22
|
databaseAdapter: DatabaseAdapter;
|
|
22
23
|
emailAdapter?: EmailAdapter | null;
|
|
24
|
+
aiProvider?: AIProviderAdapter | null;
|
|
23
25
|
cmsEngine: CMSEngine;
|
|
24
26
|
localAPI: LocalAPI;
|
|
25
27
|
rolesService: RolesService;
|
package/dist/hooks.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/lib/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAW,IAAI,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAO7C,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAa,SAAS,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/lib/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAW,IAAI,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAO7C,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAa,SAAS,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE3E,OAAO,EAIN,KAAK,QAAQ,EACb,MAAM,oBAAoB,CAAC;AAG5B,MAAM,WAAW,YAAY;IAC5B,MAAM,EAAE,SAAS,CAAC;IAClB,YAAY,EAAE,YAAY,CAAC;IAC3B,cAAc,EAAE,cAAc,CAAC;IAC/B,eAAe,EAAE,eAAe,CAAC;IACjC,YAAY,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IACnC,UAAU,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACtC,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,YAAY,CAAC;IAC3B,uEAAuE;IACvE,qBAAqB,EAAE,qBAAqB,CAAC;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,eAAe,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACzC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvB,sFAAsF;IACtF,YAAY,EAAE,YAAY,CAAC;CAC3B;AAsCD;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAGrE;AAgBD,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAiNvD"}
|
package/dist/hooks.js
CHANGED
|
@@ -9,6 +9,7 @@ import { PluginSettingsService } from './services/plugin-settings-service.js';
|
|
|
9
9
|
import { createCMS } from './engine.js';
|
|
10
10
|
import { createLocalAPI } from './local-api/index.js';
|
|
11
11
|
import { createPartResolver } from './plugins/resolver.js';
|
|
12
|
+
import { startEmbeddedJobRunner } from './jobs/embedded-runner.js';
|
|
12
13
|
import { createAphexApi, mountAphexBuiltins, toHonoHandler } from './server/api/index.js';
|
|
13
14
|
/**
|
|
14
15
|
* Wrap a plugin route handler so it enforces `requiredCapabilities` before running.
|
|
@@ -35,6 +36,9 @@ let schemaError = null;
|
|
|
35
36
|
let initPromise = null;
|
|
36
37
|
let activeConfig = null;
|
|
37
38
|
let configDirty = false;
|
|
39
|
+
// Started once per process (not per request, and not restarted on schema-HMR re-init): the loop
|
|
40
|
+
// resolves the live `cmsInstances` at each tick, so a rebuilt instance is picked up automatically.
|
|
41
|
+
let embeddedRunner = null;
|
|
38
42
|
/**
|
|
39
43
|
* Called by the Vite HMR plugin (`@aphexcms/cms-core/vite`) when schema
|
|
40
44
|
* files or `aphex.config.ts` change. Replaces the captured config with the
|
|
@@ -105,6 +109,7 @@ export function createCMSHook(config) {
|
|
|
105
109
|
// Use the storage adapter from config, or create the default local one.
|
|
106
110
|
const storageAdapter = currentConfig.storage ?? createDefaultStorageAdapter();
|
|
107
111
|
const emailAdapter = currentConfig.email ?? null;
|
|
112
|
+
const aiProvider = currentConfig.aiProvider ?? null;
|
|
108
113
|
const assetService = new AssetServiceClass(storageAdapter, databaseAdapter);
|
|
109
114
|
const cmsEngine = createCMS(currentConfig, databaseAdapter);
|
|
110
115
|
const rolesService = new RolesService(databaseAdapter, currentConfig.cache ?? null);
|
|
@@ -190,6 +195,7 @@ export function createCMSHook(config) {
|
|
|
190
195
|
assetService: assetService,
|
|
191
196
|
storageAdapter: storageAdapter,
|
|
192
197
|
emailAdapter: emailAdapter,
|
|
198
|
+
aiProvider: aiProvider,
|
|
193
199
|
cmsEngine: cmsEngine,
|
|
194
200
|
localAPI: localAPI,
|
|
195
201
|
rolesService,
|
|
@@ -200,6 +206,17 @@ export function createCMSHook(config) {
|
|
|
200
206
|
apiApp,
|
|
201
207
|
partResolver
|
|
202
208
|
};
|
|
209
|
+
// Start the embedded in-process job loop once, if opted in. It drives the queue
|
|
210
|
+
// directly (no HTTP, no worker secret) so scheduled publishes and event consumers
|
|
211
|
+
// run with zero setup — ideal for dev and single-instance self-hosting. It reads
|
|
212
|
+
// the live `cmsInstances` at each tick, so it survives schema-HMR re-init.
|
|
213
|
+
if (currentConfig.jobs?.embedded && !embeddedRunner) {
|
|
214
|
+
embeddedRunner = startEmbeddedJobRunner({
|
|
215
|
+
intervalMs: currentConfig.jobs.embeddedIntervalMs,
|
|
216
|
+
logger: cmsLogger,
|
|
217
|
+
getServices: () => cmsInstances
|
|
218
|
+
});
|
|
219
|
+
}
|
|
203
220
|
resolveInit();
|
|
204
221
|
}
|
|
205
222
|
// Attach schema error to instances so it can be accessed in load functions
|
package/dist/index.d.ts
CHANGED
|
@@ -4,6 +4,8 @@ export * from './field-validation/rule.js';
|
|
|
4
4
|
export * from './field-validation/utils.js';
|
|
5
5
|
export { createContentHash, hasUnpublishedChanges } from './utils/content-hash.js';
|
|
6
6
|
export * from './schema-utils/index.js';
|
|
7
|
+
export * from './events/index.js';
|
|
8
|
+
export * from './forms/index.js';
|
|
7
9
|
export * from './theme/index.js';
|
|
8
10
|
export * from './plugins/index.js';
|
|
9
11
|
export * from './utils/index.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/lib/index.ts"],"names":[],"mappings":"AAkBA,cAAc,eAAe,CAAC;AAC9B,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAGjG,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AAGzC,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAGhF,cAAc,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/lib/index.ts"],"names":[],"mappings":"AAkBA,cAAc,eAAe,CAAC;AAC9B,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAGjG,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AAGzC,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAGhF,cAAc,sBAAsB,CAAC;AAIrC,cAAc,gBAAgB,CAAC;AAI/B,cAAc,eAAe,CAAC;AAG9B,cAAc,eAAe,CAAC;AAI9B,cAAc,iBAAiB,CAAC;AAGhC,cAAc,eAAe,CAAC;AAG9B,cAAc,aAAa,CAAC;AAC5B,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -23,6 +23,12 @@ export * from './field-validation/utils.js';
|
|
|
23
23
|
export { createContentHash, hasUnpublishedChanges } from './utils/content-hash.js';
|
|
24
24
|
// Schema utilities
|
|
25
25
|
export * from './schema-utils/index.js';
|
|
26
|
+
// Event catalog — defineEvent() + built-in event definitions (document.published, …).
|
|
27
|
+
// Plain TS (zod only), safe for the universal barrel.
|
|
28
|
+
export * from './events/index.js';
|
|
29
|
+
// Forms primitives — defineForm(), InferForm, validateFormData. Plain TS, reuses the field
|
|
30
|
+
// model + validation engine, safe for the universal barrel.
|
|
31
|
+
export * from './forms/index.js';
|
|
26
32
|
// Theme design-system tokens — plain TS (Svelte-free), safe for the universal barrel.
|
|
27
33
|
export * from './theme/index.js';
|
|
28
34
|
// Plugin API — definePlugin(), part types, part resolver. Runtime is plain JS
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { LocalAPI } from '../local-api/index.js';
|
|
3
|
+
import type { JobHandlerMap } from './types.js';
|
|
4
|
+
/** Reserved built-in job types. Scheduling uses these; the worker maps them to the handlers below. */
|
|
5
|
+
export declare const DOCUMENT_PUBLISH_JOB = "document.publish";
|
|
6
|
+
export declare const DOCUMENT_UNPUBLISH_JOB = "document.unpublish";
|
|
7
|
+
/** Payload for document.publish / document.unpublish jobs — identifiers only, never content. */
|
|
8
|
+
export declare const documentJobPayload: z.ZodObject<{
|
|
9
|
+
documentId: z.ZodString;
|
|
10
|
+
documentType: z.ZodString;
|
|
11
|
+
}, z.core.$strip>;
|
|
12
|
+
export type DocumentJobPayload = z.infer<typeof documentJobPayload>;
|
|
13
|
+
export interface DocumentJobDeps {
|
|
14
|
+
localAPI: LocalAPI;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Built-in handlers for scheduled publish/unpublish.
|
|
18
|
+
*
|
|
19
|
+
* Runs as the system (override access) — the permission check already happened when the
|
|
20
|
+
* job was scheduled. Publish routes through `CollectionAPI.publish`, so it re-runs
|
|
21
|
+
* validation + reference guards + cache invalidation and emits `document.published`
|
|
22
|
+
* inside the publish transaction, exactly like a manual publish. A handler throw is a
|
|
23
|
+
* job failure: the runner retries with backoff or dead-letters it (e.g. a doc whose
|
|
24
|
+
* references became unpublished before the scheduled time fails validation and retries).
|
|
25
|
+
*/
|
|
26
|
+
export declare function createDocumentJobHandlers(deps: DocumentJobDeps): JobHandlerMap;
|
|
27
|
+
//# sourceMappingURL=document-jobs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-jobs.d.ts","sourceRoot":"","sources":["../../src/lib/jobs/document-jobs.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,sGAAsG;AACtG,eAAO,MAAM,oBAAoB,qBAAqB,CAAC;AACvD,eAAO,MAAM,sBAAsB,uBAAuB,CAAC;AAE3D,gGAAgG;AAChG,eAAO,MAAM,kBAAkB;;;iBAG7B,CAAC;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEpE,MAAM,WAAW,eAAe;IAC/B,QAAQ,EAAE,QAAQ,CAAC;CACnB;AAED;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,eAAe,GAAG,aAAa,CAgB9E"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// Built-in job types for the scheduled document workflow: publish / unpublish at a
|
|
2
|
+
// future `runAt`. The handlers are provided by core but DI'd with the request-scoped
|
|
3
|
+
// LocalAPI at the worker endpoint (the runner itself only knows the database adapter).
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { systemContext } from '../local-api/auth-helpers.js';
|
|
6
|
+
/** Reserved built-in job types. Scheduling uses these; the worker maps them to the handlers below. */
|
|
7
|
+
export const DOCUMENT_PUBLISH_JOB = 'document.publish';
|
|
8
|
+
export const DOCUMENT_UNPUBLISH_JOB = 'document.unpublish';
|
|
9
|
+
/** Payload for document.publish / document.unpublish jobs — identifiers only, never content. */
|
|
10
|
+
export const documentJobPayload = z.object({
|
|
11
|
+
documentId: z.string(),
|
|
12
|
+
documentType: z.string()
|
|
13
|
+
});
|
|
14
|
+
/**
|
|
15
|
+
* Built-in handlers for scheduled publish/unpublish.
|
|
16
|
+
*
|
|
17
|
+
* Runs as the system (override access) — the permission check already happened when the
|
|
18
|
+
* job was scheduled. Publish routes through `CollectionAPI.publish`, so it re-runs
|
|
19
|
+
* validation + reference guards + cache invalidation and emits `document.published`
|
|
20
|
+
* inside the publish transaction, exactly like a manual publish. A handler throw is a
|
|
21
|
+
* job failure: the runner retries with backoff or dead-letters it (e.g. a doc whose
|
|
22
|
+
* references became unpublished before the scheduled time fails validation and retries).
|
|
23
|
+
*/
|
|
24
|
+
export function createDocumentJobHandlers(deps) {
|
|
25
|
+
const { localAPI } = deps;
|
|
26
|
+
return {
|
|
27
|
+
[DOCUMENT_PUBLISH_JOB]: async ({ job }) => {
|
|
28
|
+
const { documentId, documentType } = documentJobPayload.parse(job.payload);
|
|
29
|
+
const collection = localAPI.getCollection(documentType);
|
|
30
|
+
if (!collection)
|
|
31
|
+
throw new Error(`Unknown collection "${documentType}" for job ${job.id}`);
|
|
32
|
+
await collection.publish(systemContext(job.organizationId), documentId);
|
|
33
|
+
},
|
|
34
|
+
[DOCUMENT_UNPUBLISH_JOB]: async ({ job }) => {
|
|
35
|
+
const { documentId, documentType } = documentJobPayload.parse(job.payload);
|
|
36
|
+
const collection = localAPI.getCollection(documentType);
|
|
37
|
+
if (!collection)
|
|
38
|
+
throw new Error(`Unknown collection "${documentType}" for job ${job.id}`);
|
|
39
|
+
await collection.unpublish(systemContext(job.organizationId), documentId);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { JobRunnerServices } from './run-batch.js';
|
|
2
|
+
import type { Logger } from '../utils/logger.js';
|
|
3
|
+
/** Handle for a running embedded loop. Call `stop()` to clear the interval. */
|
|
4
|
+
export interface EmbeddedJobRunner {
|
|
5
|
+
stop(): void;
|
|
6
|
+
}
|
|
7
|
+
export interface EmbeddedJobRunnerOptions {
|
|
8
|
+
/** Milliseconds between ticks. Default 3000. */
|
|
9
|
+
intervalMs?: number;
|
|
10
|
+
logger: Logger;
|
|
11
|
+
/**
|
|
12
|
+
* Resolve the live services at tick time (rather than capturing them once), so a schema-HMR
|
|
13
|
+
* re-init that rebuilds the CMS instances is picked up automatically. Return `null` to skip a
|
|
14
|
+
* tick (e.g. the app hasn't finished initializing yet).
|
|
15
|
+
*/
|
|
16
|
+
getServices: () => JobRunnerServices | null;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Start the loop. Ticks NEVER overlap: while a tick is in flight the next interval fire is
|
|
20
|
+
* skipped, so a slow batch can't stack runs on top of each other. A thrown error in a tick is
|
|
21
|
+
* logged and swallowed — the loop must survive a transient DB blip and keep going. The interval
|
|
22
|
+
* is `unref`'d where supported so it never keeps the process alive on its own.
|
|
23
|
+
*/
|
|
24
|
+
export declare function startEmbeddedJobRunner(options: EmbeddedJobRunnerOptions): EmbeddedJobRunner;
|
|
25
|
+
//# sourceMappingURL=embedded-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedded-runner.d.ts","sourceRoot":"","sources":["../../src/lib/jobs/embedded-runner.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,iBAAiB,EAAsB,MAAM,aAAa,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAE9C,+EAA+E;AAC/E,MAAM,WAAW,iBAAiB;IACjC,IAAI,IAAI,IAAI,CAAC;CACb;AAED,MAAM,WAAW,wBAAwB;IACxC,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,WAAW,EAAE,MAAM,iBAAiB,GAAG,IAAI,CAAC;CAC5C;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,wBAAwB,GAAG,iBAAiB,CAyC3F"}
|