@cosmicdrift/kumiko-framework 0.389.0 → 0.390.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/AGENTS.md +9 -4
- package/README.md +1 -1
- package/agents/examples/apex-surface-auth.md +2 -3
- package/agents/examples/api-worker-split.md +9 -2
- package/agents/examples/auth-claims.md +1 -1
- package/agents/examples/cross-feature-events.md +12 -12
- package/agents/examples/crypto-shredding-hr.md +2 -2
- package/agents/examples/encrypted-tenant-config.md +1 -1
- package/agents/examples/error-contract.md +12 -7
- package/agents/examples/event-sourcing.md +29 -29
- package/agents/examples/files-post-processing.md +10 -8
- package/agents/examples/inbound-mail-triage.md +1 -0
- package/agents/examples/lane-routing.md +2 -1
- package/agents/examples/legal-pages.md +2 -2
- package/agents/examples/lifecycle-hooks.md +3 -3
- package/agents/examples/managed-config.md +4 -4
- package/agents/examples/managed-pages.md +1 -1
- package/agents/examples/relations.md +19 -4
- package/agents/examples/search.md +4 -4
- package/agents/examples/secrets-demo.md +9 -6
- package/agents/examples/state-machine.md +2 -2
- package/agents/examples/tenant-settings.md +1 -1
- package/agents/examples/user-data-rights.md +3 -6
- package/agents/examples/workflow-engine.md +53 -47
- package/agents/examples.md +4 -4
- package/agents/features.md +1 -1
- package/dist/api/auth-middleware.js +1 -1
- package/dist/api/auth-routes-invite.js +2 -1
- package/dist/api/entity-read-access.d.ts +3 -1
- package/dist/api/export/export-columns.d.ts +3 -1
- package/dist/api/export/export-route.js +3 -2
- package/dist/api/export/export-screen.d.ts +2 -1
- package/dist/api/extra-route.d.ts +3 -1
- package/dist/api/index.d.ts +23 -27
- package/dist/api/index.js +13 -15
- package/dist/api/jwt.js +1 -1
- package/dist/api/observability-middleware.d.ts +1 -1
- package/dist/api/observability-middleware.js +2 -1
- package/dist/api/request-context-internals.d.ts +31 -0
- package/dist/api/request-context-internals.js +11 -0
- package/dist/api/request-context-scopes.d.ts +14 -0
- package/dist/api/request-context-scopes.js +69 -0
- package/dist/api/request-context.d.ts +1 -40
- package/dist/api/request-context.js +22 -51
- package/dist/api/request-id-middleware.d.ts +1 -1
- package/dist/api/route-registrars.d.ts +2 -1
- package/dist/api/route-registrars.js +1 -1
- package/dist/api/routes.js +7 -3
- package/dist/api/server-boot-checks.d.ts +1 -1
- package/dist/api/server-boot-checks.js +2 -2
- package/dist/api/server-event-dispatcher.d.ts +6 -1
- package/dist/api/server-event-dispatcher.js +3 -4
- package/dist/api/server-extra-routes.d.ts +1 -1
- package/dist/api/server-extra-routes.js +2 -1
- package/dist/api/server-middleware.js +3 -1
- package/dist/api/server-routes.d.ts +2 -1
- package/dist/api/server-wiring.js +6 -4
- package/dist/api/server.d.ts +2 -1
- package/dist/api/sse-route.d.ts +2 -1
- package/dist/api/tenant-scoped-secrets.d.ts +2 -0
- package/dist/api/tenant-scoped-secrets.js +13 -0
- package/dist/api/websocket-route.d.ts +1 -1
- package/dist/auth/index.d.ts +0 -1
- package/dist/auth/roles.d.ts +0 -5
- package/dist/compliance/duration-spec.d.ts +0 -1
- package/dist/compliance/duration-spec.js +0 -5
- package/dist/compliance/index.d.ts +4 -4
- package/dist/compliance/index.js +2 -2
- package/dist/compliance/profiles.d.ts +0 -15
- package/dist/compliance/profiles.js +0 -23
- package/dist/config/index.d.ts +10 -10
- package/dist/config/index.js +13 -1
- package/dist/config/internals.d.ts +9 -0
- package/dist/config/internals.js +1 -0
- package/dist/consumer-cli-internals.d.ts +4 -0
- package/dist/consumer-cli-internals.js +1 -0
- package/dist/consumer-cli.d.ts +1 -4
- package/dist/consumer-cli.js +5 -1
- package/dist/crypto/event-pii.js +1 -1
- package/dist/crypto/index.d.ts +8 -9
- package/dist/crypto/index.js +7 -8
- package/dist/crypto/pg-kms-adapter.js +6 -1
- package/dist/db/apply-entity-event.d.ts +1 -1
- package/dist/db/apply-entity-event.js +15 -47
- package/dist/db/blind-index-cleanup.js +91 -77
- package/dist/db/collect-table-metas.js +1 -1
- package/dist/db/compound-types.d.ts +1 -1
- package/dist/db/compound-types.js +0 -7
- package/dist/db/config-seed.d.ts +2 -1
- package/dist/db/config-seed.js +6 -1
- package/dist/db/connection.d.ts +3 -1
- package/dist/db/connection.js +15 -5
- package/dist/db/cross-tenant-reads.d.ts +1 -1
- package/dist/db/cross-tenant-reads.js +1 -1
- package/dist/db/dialect.d.ts +0 -5
- package/dist/db/dialect.js +0 -3
- package/dist/db/driver-value-preparation.js +23 -2
- package/dist/db/eagerload.d.ts +2 -1
- package/dist/db/entity-field-encryption.d.ts +1 -1
- package/dist/db/entity-table-meta.d.ts +1 -1
- package/dist/db/event-store-executor-context.d.ts +3 -1
- package/dist/db/event-store-executor-context.js +4 -3
- package/dist/db/event-store-executor-read-filter.d.ts +1 -1
- package/dist/db/event-store-executor-read-rows.d.ts +2 -1
- package/dist/db/event-store-executor-read-search.d.ts +2 -1
- package/dist/db/event-store-executor-read-sort.d.ts +2 -1
- package/dist/db/event-store-executor-read.js +2 -2
- package/dist/db/event-store-executor-write-atomic.js +8 -7
- package/dist/db/event-store-executor-write-steps.d.ts +3 -2
- package/dist/db/event-store-executor-write.js +7 -4
- package/dist/db/event-store-executor.d.ts +1 -1
- package/dist/db/executor-managed-tables.d.ts +7 -1
- package/dist/db/executor-managed-tables.js +11 -2
- package/dist/db/index.d.ts +29 -28
- package/dist/db/index.js +22 -20
- package/dist/db/known-table-names.d.ts +6 -0
- package/dist/db/known-table-names.js +21 -0
- package/dist/db/list-aggregate-labels.d.ts +1 -1
- package/dist/db/located-timestamp.d.ts +1 -1
- package/dist/db/located-timestamp.js +0 -5
- package/dist/db/migrate-generator.d.ts +17 -1
- package/dist/db/migrate-generator.js +50 -20
- package/dist/db/migrate-primary-key.d.ts +12 -0
- package/dist/db/migrate-primary-key.js +45 -0
- package/dist/db/migrate-rls-diff.d.ts +20 -0
- package/dist/db/migrate-rls-diff.js +61 -0
- package/dist/db/migrate-runner.js +4 -0
- package/dist/db/money.d.ts +1 -1
- package/dist/db/money.js +1 -1
- package/dist/db/parent-ref-clause.d.ts +2 -1
- package/dist/db/pg-error.d.ts +2 -0
- package/dist/db/pg-error.js +11 -0
- package/dist/db/queries/ddl.d.ts +3 -0
- package/dist/db/queries/ddl.js +34 -1
- package/dist/db/queries/event-store.js +4 -2
- package/dist/db/queries/event-tenants.d.ts +2 -0
- package/dist/db/queries/event-tenants.js +17 -0
- package/dist/db/queries/rebuild-rls-guard.d.ts +2 -0
- package/dist/db/queries/rebuild-rls-guard.js +29 -0
- package/dist/db/queries/rls-boot-catalog.d.ts +16 -0
- package/dist/db/queries/rls-boot-catalog.js +39 -0
- package/dist/db/queries/rls-catalog.d.ts +6 -0
- package/dist/db/queries/rls-catalog.js +82 -0
- package/dist/db/queries/rls-scope.d.ts +3 -0
- package/dist/db/queries/rls-scope.js +17 -0
- package/dist/db/queries/rls-shape.d.ts +10 -0
- package/dist/db/queries/rls-shape.js +42 -0
- package/dist/db/queries/session-advisory-lock.d.ts +2 -0
- package/dist/db/queries/session-advisory-lock.js +23 -0
- package/dist/db/queries/shadow-swap.d.ts +1 -2
- package/dist/db/queries/shadow-swap.js +9 -25
- package/dist/db/queries/test-stack.d.ts +4 -1
- package/dist/db/queries/test-stack.js +84 -2
- package/dist/db/query.js +11 -7
- package/dist/db/reference-data.d.ts +1 -1
- package/dist/db/reference-data.js +6 -1
- package/dist/db/render-ddl.d.ts +6 -2
- package/dist/db/render-ddl.js +7 -7
- package/dist/db/render-rls-ddl.d.ts +35 -0
- package/dist/db/render-rls-ddl.js +127 -0
- package/dist/db/replay-migration-sql.d.ts +3 -1
- package/dist/db/replay-migration-sql.js +22 -5
- package/dist/db/replay-rls.d.ts +25 -0
- package/dist/db/replay-rls.js +156 -0
- package/dist/db/row-level-security-boot-check.d.ts +6 -0
- package/dist/db/row-level-security-boot-check.js +86 -0
- package/dist/db/row-level-security-connection.d.ts +3 -0
- package/dist/db/row-level-security-connection.js +213 -0
- package/dist/db/row-level-security-scope.d.ts +33 -0
- package/dist/db/row-level-security-scope.js +127 -0
- package/dist/db/scope-tenant-db-to-tenant.d.ts +3 -0
- package/dist/db/scope-tenant-db-to-tenant.js +14 -0
- package/dist/db/sql-identifier.d.ts +1 -0
- package/dist/db/sql-identifier.js +3 -0
- package/dist/db/table-builder.d.ts +2 -1
- package/dist/db/table-builder.js +1 -1
- package/dist/db/table-info.js +1 -1
- package/dist/db/table-push.d.ts +11 -2
- package/dist/db/table-push.js +15 -2
- package/dist/db/tenant-db-runner.d.ts +3 -1
- package/dist/db/tenant-db-runner.js +4 -3
- package/dist/db/tenant-db-scoped-rebind.d.ts +10 -0
- package/dist/db/tenant-db-scoped-rebind.js +33 -0
- package/dist/db/tenant-db-statement-runner.d.ts +13 -0
- package/dist/db/tenant-db-statement-runner.js +48 -0
- package/dist/db/tenant-db.d.ts +17 -12
- package/dist/db/tenant-db.js +49 -120
- package/dist/db/tenant-id-filter.d.ts +3 -0
- package/dist/db/tenant-id-filter.js +30 -0
- package/dist/db/transaction-serialization.d.ts +6 -0
- package/dist/db/transaction-serialization.js +60 -0
- package/dist/derivatives/delete-stored-file.js +1 -1
- package/dist/derivatives/index.d.ts +2 -5
- package/dist/derivatives/index.js +2 -3
- package/dist/engine/access.d.ts +2 -1
- package/dist/engine/access.js +1 -1
- package/dist/engine/boot-validator/entity-handler.d.ts +2 -1
- package/dist/engine/boot-validator/entity-handler.js +1 -1
- package/dist/engine/boot-validator/entity-list-aggregate-options.d.ts +1 -1
- package/dist/engine/boot-validator/list-table-aggregate-options.d.ts +1 -1
- package/dist/engine/boot-validator/list-table-aggregate-query.d.ts +2 -1
- package/dist/engine/boot-validator/nav.d.ts +3 -1
- package/dist/engine/boot-validator/nav.js +1 -1
- package/dist/engine/boot-validator/ownership.d.ts +2 -1
- package/dist/engine/boot-validator/parent-ref.d.ts +2 -1
- package/dist/engine/boot-validator/projection-list-screens.d.ts +2 -1
- package/dist/engine/boot-validator/query-refs.d.ts +2 -1
- package/dist/engine/boot-validator/screens-forms.d.ts +2 -1
- package/dist/engine/boot-validator/screens-kind-shared.d.ts +3 -1
- package/dist/engine/boot-validator/screens.d.ts +2 -1
- package/dist/engine/boot-validator/workspaces.d.ts +3 -1
- package/dist/engine/bridge-stub.d.ts +5 -2
- package/dist/engine/bridge-stub.js +39 -24
- package/dist/engine/config-helpers.d.ts +2 -2
- package/dist/engine/config-helpers.js +0 -9
- package/dist/engine/constants.d.ts +0 -10
- package/dist/engine/constants.js +0 -8
- package/dist/engine/create-app.js +1 -1
- package/dist/engine/define-feature.d.ts +2 -1
- package/dist/engine/define-feature.js +1 -2
- package/dist/engine/define-handler.d.ts +1 -1
- package/dist/engine/define-step.d.ts +0 -1
- package/dist/engine/define-step.js +0 -3
- package/dist/engine/embedded-derived.d.ts +1 -1
- package/dist/engine/entity-handlers.d.ts +2 -1
- package/dist/engine/entity-handlers.js +7 -7
- package/dist/engine/entity-list-runtime-options.js +3 -1
- package/dist/engine/entity-list-searchability.d.ts +2 -1
- package/dist/engine/event-def.d.ts +2 -1
- package/dist/engine/event-helpers.d.ts +3 -1
- package/dist/engine/event-helpers.js +3 -3
- package/dist/engine/extension-names.d.ts +2 -8
- package/dist/engine/extension-names.js +2 -2
- package/dist/engine/extension-selector-plugins.d.ts +1 -1
- package/dist/engine/extensions/storage-provider.d.ts +1 -2
- package/dist/engine/extensions/user-data.d.ts +0 -8
- package/dist/engine/factories.d.ts +2 -1
- package/dist/engine/feature-builder-state.d.ts +8 -1
- package/dist/engine/feature-changelog.d.ts +1 -1
- package/dist/engine/feature-config-events-jobs.d.ts +4 -1
- package/dist/engine/feature-entity-handlers.d.ts +5 -1
- package/dist/engine/feature-manifest.js +1 -1
- package/dist/engine/feature-ui-extensions.d.ts +7 -1
- package/dist/engine/feature-ui-extensions.js +6 -4
- package/dist/engine/field-access.d.ts +2 -1
- package/dist/engine/handler-field-references.d.ts +0 -4
- package/dist/engine/index.d.ts +57 -54
- package/dist/engine/index.js +22 -27
- package/dist/engine/instruction-fields.d.ts +1 -1
- package/dist/engine/personal-data-fields.d.ts +1 -1
- package/dist/engine/qualified-name.d.ts +0 -1
- package/dist/engine/read-claim.d.ts +2 -1
- package/dist/engine/registry-facade.js +0 -3
- package/dist/engine/registry-ingest.d.ts +2 -1
- package/dist/engine/registry-ingest.js +1 -2
- package/dist/engine/registry-state.d.ts +12 -2
- package/dist/engine/registry-state.js +2 -3
- package/dist/engine/registry-validate.d.ts +3 -1
- package/dist/engine/registry-validate.js +7 -7
- package/dist/engine/run-in.d.ts +1 -1
- package/dist/engine/run-in.js +0 -1
- package/dist/engine/schema-builder.d.ts +1 -1
- package/dist/engine/schema-builder.js +1 -1
- package/dist/engine/screen-filter-ops.d.ts +2 -1
- package/dist/engine/screen-filter-ops.js +0 -5
- package/dist/engine/soft-delete-cleanup.d.ts +1 -1
- package/dist/engine/soft-delete-cleanup.js +4 -4
- package/dist/engine/state-machine.js +2 -1
- package/dist/engine/steps/_read-source.js +1 -1
- package/dist/engine/steps/aggregate-append-event.js +2 -2
- package/dist/engine/steps/call-feature.js +2 -2
- package/dist/engine/steps/mail-send.js +1 -1
- package/dist/engine/steps/retry.js +1 -1
- package/dist/engine/steps/wait-for-event.js +1 -1
- package/dist/engine/steps/wait.js +1 -1
- package/dist/engine/steps/webhook-send.js +1 -1
- package/dist/engine/template-variables.d.ts +2 -1
- package/dist/engine/transfer-adjacency.d.ts +1 -1
- package/dist/engine/types/index.d.ts +8 -31
- package/dist/engine/types/index.js +2 -10
- package/dist/engine/validation.d.ts +2 -1
- package/dist/entrypoint/index.d.ts +7 -35
- package/dist/entrypoint/index.js +7 -1
- package/dist/entrypoint/internals.d.ts +40 -0
- package/dist/entrypoint/internals.js +1 -0
- package/dist/entrypoint/row-level-security-mode-check.d.ts +3 -0
- package/dist/entrypoint/row-level-security-mode-check.js +19 -0
- package/dist/env/dry-run-internals.d.ts +10 -0
- package/dist/env/dry-run-internals.js +1 -0
- package/dist/env/dry-run.d.ts +1 -10
- package/dist/env/dry-run.js +2 -1
- package/dist/env/index.d.ts +1 -85
- package/dist/env/index.js +6 -50
- package/dist/env/internals.d.ts +87 -0
- package/dist/env/internals.js +53 -0
- package/dist/errors/classes.js +2 -2
- package/dist/errors/index.d.ts +5 -14
- package/dist/errors/index.js +4 -9
- package/dist/errors/member-resolution.js +1 -1
- package/dist/errors/reasons.d.ts +0 -1
- package/dist/errors/reasons.js +7 -7
- package/dist/errors/serialize.d.ts +0 -18
- package/dist/errors/serialize.js +0 -27
- package/dist/es-ops/index.d.ts +4 -4
- package/dist/es-ops/index.js +2 -2
- package/dist/es-ops/operations-schema.d.ts +1 -1
- package/dist/es-ops/types.d.ts +4 -5
- package/dist/event-store/admin-api-internals.d.ts +14 -0
- package/dist/event-store/admin-api-internals.js +1 -0
- package/dist/event-store/admin-api.d.ts +1 -14
- package/dist/event-store/admin-api.js +11 -6
- package/dist/event-store/archive.js +4 -2
- package/dist/event-store/errors.js +2 -2
- package/dist/event-store/event-store.js +41 -34
- package/dist/event-store/events-schema.js +4 -1
- package/dist/event-store/index.d.ts +11 -13
- package/dist/event-store/index.js +7 -9
- package/dist/event-store/rebuild-dead-letter.js +4 -2
- package/dist/event-store/snapshot.js +4 -3
- package/dist/event-store/stream-scope.d.ts +2 -0
- package/dist/event-store/stream-scope.js +6 -0
- package/dist/event-store/upcaster-dead-letter.js +4 -2
- package/dist/event-store/upcaster.d.ts +2 -1
- package/dist/files/action-form-upload.d.ts +2 -1
- package/dist/files/action-form-upload.js +1 -1
- package/dist/files/assert-file-refs-belong-to-tenant.d.ts +2 -1
- package/dist/files/assert-file-refs-belong-to-tenant.js +1 -1
- package/dist/files/bind-pending-file-refs.d.ts +2 -1
- package/dist/files/bind-pending-file-refs.js +2 -1
- package/dist/files/bind-referenced-files.write.js +1 -1
- package/dist/files/create-file-ref-from-bytes.d.ts +6 -3
- package/dist/files/create-file-ref-from-bytes.js +3 -3
- package/dist/files/create-file-ref.d.ts +3 -2
- package/dist/files/create-file-ref.js +2 -2
- package/dist/files/dispose-removed-file-refs.d.ts +2 -1
- package/dist/files/dispose-removed-file-refs.js +1 -1
- package/dist/files/feature.js +2 -2
- package/dist/files/file-handle.js +1 -1
- package/dist/files/file-routes.d.ts +1 -1
- package/dist/files/file-routes.js +12 -2
- package/dist/files/index.d.ts +11 -13
- package/dist/files/index.js +5 -7
- package/dist/files/load-save-file-refs.d.ts +2 -1
- package/dist/files/load-save-file-refs.js +1 -1
- package/dist/files/provider-resolver.d.ts +5 -4
- package/dist/files/provider-resolver.js +4 -4
- package/dist/files/storage-tracking.js +4 -2
- package/dist/files/sweep-orphaned-uploads.d.ts +1 -1
- package/dist/files/sweep-orphaned-uploads.js +1 -1
- package/dist/i18n/index.d.ts +2 -8
- package/dist/i18n/index.js +1 -1
- package/dist/i18n/internals.d.ts +7 -0
- package/dist/i18n/internals.js +1 -0
- package/dist/i18n/required-surface-keys.d.ts +4 -1
- package/dist/internal/row-level-security.d.ts +3 -0
- package/dist/internal/row-level-security.js +3 -0
- package/dist/internal/stack-support.d.ts +1 -1
- package/dist/internal/stack-support.js +1 -1
- package/dist/internal/testing.d.ts +1 -0
- package/dist/internal/testing.js +9 -5
- package/dist/jobs/index.d.ts +1 -1
- package/dist/jobs/job-append-event.d.ts +12 -0
- package/dist/jobs/job-append-event.js +30 -0
- package/dist/jobs/job-runner-context.d.ts +2 -2
- package/dist/jobs/job-runner-context.js +46 -16
- package/dist/jobs/job-runner-execution.d.ts +1 -1
- package/dist/jobs/job-runner-execution.js +6 -4
- package/dist/jobs/job-runner-gates.d.ts +1 -1
- package/dist/jobs/job-runner-gates.js +0 -1
- package/dist/jobs/job-runner-helpers.d.ts +11 -4
- package/dist/jobs/job-runner-helpers.js +10 -1
- package/dist/jobs/job-runner-scope.d.ts +5 -2
- package/dist/jobs/job-runner-types.d.ts +2 -1
- package/dist/jobs/job-runner.js +19 -6
- package/dist/jobs/max-per-tenant.d.ts +1 -1
- package/dist/logging/index.d.ts +1 -2
- package/dist/logging/index.js +1 -1
- package/dist/logging/pino-logger.js +1 -1
- package/dist/logging/utils.d.ts +1 -0
- package/dist/logging/utils.js +6 -0
- package/dist/migrations/index.d.ts +3 -3
- package/dist/migrations/index.js +3 -3
- package/dist/migrations/pending-rebuilds.d.ts +1 -1
- package/dist/migrations/pending-rebuilds.js +1 -1
- package/dist/migrations/pii-event-backfill.js +4 -1
- package/dist/observability/escape-hatch-report.d.ts +2 -1
- package/dist/observability/index.d.ts +7 -15
- package/dist/observability/index.js +4 -12
- package/dist/observability/metric-validator.js +1 -1
- package/dist/observability/metrics-handle.d.ts +0 -1
- package/dist/observability/metrics-handle.js +2 -15
- package/dist/observability/recording-tracer.d.ts +1 -2
- package/dist/observability/recording-tracer.js +0 -6
- package/dist/observability/sensitive-filter.d.ts +0 -2
- package/dist/observability/sensitive-filter.js +0 -29
- package/dist/pipeline/active-membership.d.ts +2 -1
- package/dist/pipeline/active-membership.js +6 -2
- package/dist/pipeline/append-event-core.d.ts +2 -1
- package/dist/pipeline/append-event-core.js +2 -2
- package/dist/pipeline/attach-outside-transaction.d.ts +3 -0
- package/dist/pipeline/attach-outside-transaction.js +13 -0
- package/dist/pipeline/auth-claims-resolver.d.ts +2 -1
- package/dist/pipeline/cascade-handler.d.ts +2 -1
- package/dist/pipeline/cascade-handler.js +3 -2
- package/dist/pipeline/config-accessor-factory.d.ts +1 -1
- package/dist/pipeline/config-accessor-factory.js +1 -1
- package/dist/pipeline/context-services.d.ts +56 -0
- package/dist/pipeline/context-services.js +73 -0
- package/dist/pipeline/dispatch-batch.d.ts +2 -1
- package/dist/pipeline/dispatch-batch.js +31 -18
- package/dist/pipeline/dispatch-query.js +5 -4
- package/dist/pipeline/dispatch-scope.d.ts +6 -0
- package/dist/pipeline/dispatch-scope.js +27 -0
- package/dist/pipeline/dispatch-shared.d.ts +13 -9
- package/dist/pipeline/dispatch-shared.js +75 -198
- package/dist/pipeline/dispatch-stream.js +8 -4
- package/dist/pipeline/dispatch-write.d.ts +2 -1
- package/dist/pipeline/dispatch-write.js +10 -8
- package/dist/pipeline/dispatcher-utils.d.ts +3 -1
- package/dist/pipeline/dispatcher-utils.js +8 -2
- package/dist/pipeline/dispatcher.d.ts +3 -2
- package/dist/pipeline/dispatcher.js +4 -3
- package/dist/pipeline/event-consumer-state.d.ts +0 -1
- package/dist/pipeline/event-dispatcher-delivery.d.ts +1 -1
- package/dist/pipeline/event-dispatcher-delivery.js +4 -2
- package/dist/pipeline/event-dispatcher.d.ts +2 -2
- package/dist/pipeline/event-dispatcher.js +7 -3
- package/dist/pipeline/event-retention.js +59 -56
- package/dist/pipeline/handler-access-error.js +2 -1
- package/dist/pipeline/handler-context-auth.d.ts +5 -6
- package/dist/pipeline/handler-context-auth.js +7 -4
- package/dist/pipeline/handler-context-config.d.ts +2 -5
- package/dist/pipeline/handler-context-config.js +2 -2
- package/dist/pipeline/handler-context-db.d.ts +32 -7
- package/dist/pipeline/handler-context-db.js +26 -17
- package/dist/pipeline/handler-context-dispatch.d.ts +13 -7
- package/dist/pipeline/handler-context-dispatch.js +9 -8
- package/dist/pipeline/handler-context-events.d.ts +22 -36
- package/dist/pipeline/handler-context-events.js +36 -31
- package/dist/pipeline/handler-context-member-resolution.d.ts +2 -0
- package/dist/pipeline/handler-context-member-resolution.js +110 -0
- package/dist/pipeline/handler-context-notify.d.ts +3 -2
- package/dist/pipeline/handler-context-notify.js +1 -1
- package/dist/pipeline/handler-context-observability.d.ts +2 -4
- package/dist/pipeline/handler-context-observability.js +7 -5
- package/dist/pipeline/handler-context-phase-denials.d.ts +11 -0
- package/dist/pipeline/handler-context-phase-denials.js +98 -0
- package/dist/pipeline/handler-context-scope.d.ts +7 -10
- package/dist/pipeline/handler-context-scope.js +18 -20
- package/dist/pipeline/index.d.ts +9 -21
- package/dist/pipeline/index.js +5 -7
- package/dist/pipeline/irreversible-operation-gate.d.ts +1 -1
- package/dist/pipeline/irreversible-operation-gate.js +2 -2
- package/dist/pipeline/lifecycle-pipeline.d.ts +8 -7
- package/dist/pipeline/lifecycle-pipeline.js +9 -15
- package/dist/pipeline/member-read-only-transaction.js +11 -3
- package/dist/pipeline/member-reader.d.ts +1 -1
- package/dist/pipeline/member-reader.js +2 -2
- package/dist/pipeline/msp-rebuild.js +5 -3
- package/dist/pipeline/multi-stream-apply-context.js +3 -2
- package/dist/pipeline/notify-scope.d.ts +2 -1
- package/dist/pipeline/pre-handler-gates.d.ts +2 -1
- package/dist/pipeline/pre-transaction-reservations.d.ts +3 -3
- package/dist/pipeline/pre-transaction-reservations.js +9 -7
- package/dist/pipeline/projection-rebuild.js +12 -5
- package/dist/pipeline/projection-state.d.ts +0 -6
- package/dist/pipeline/projection-state.js +0 -5
- package/dist/pipeline/projections-runner.d.ts +2 -1
- package/dist/pipeline/projections-runner.js +10 -6
- package/dist/pipeline/system-hooks.d.ts +3 -1
- package/dist/pipeline/system-hooks.js +6 -4
- package/dist/pipeline/system-identity-switch.d.ts +4 -2
- package/dist/pipeline/system-identity-switch.js +51 -36
- package/dist/pipeline/typed-append-event.d.ts +2 -0
- package/dist/pipeline/typed-append-event.js +4 -0
- package/dist/pipeline/write-origin.js +2 -2
- package/dist/pipeline/write-result-masking.d.ts +1 -1
- package/dist/random/index.d.ts +1 -2
- package/dist/random/index.js +1 -2
- package/dist/rate-limit/bucket.d.ts +2 -1
- package/dist/rate-limit/middleware.js +2 -1
- package/dist/redis/index.d.ts +3 -4
- package/dist/redis/index.js +2 -2
- package/dist/schema-cli/apply-command.js +5 -2
- package/dist/schema-cli/baseline-command.js +7 -2
- package/dist/schema-cli/generate-command.js +7 -9
- package/dist/schema-cli/shared.d.ts +12 -2
- package/dist/schema-cli/shared.js +24 -2
- package/dist/schema-cli/status-command.js +8 -2
- package/dist/schema-cli/validate-command.js +48 -4
- package/dist/schema-cli.d.ts +0 -1
- package/dist/search/configure-tenant-index.d.ts +1 -3
- package/dist/search/configure-tenant-index.js +0 -4
- package/dist/search/index.d.ts +1 -4
- package/dist/search/index.js +0 -2
- package/dist/search/meilisearch-adapter-internals.d.ts +8 -0
- package/dist/search/meilisearch-adapter-internals.js +9 -0
- package/dist/search/meilisearch-adapter.d.ts +1 -8
- package/dist/search/meilisearch-adapter.js +6 -7
- package/dist/search/meilisearch-peer.d.ts +2 -0
- package/dist/search/meilisearch-peer.js +5 -0
- package/dist/search/reindex-entity.js +93 -87
- package/dist/secrets/index.d.ts +3 -4
- package/dist/secrets/index.js +2 -3
- package/dist/seeding/index.d.ts +2 -2
- package/dist/seeding/index.js +1 -2
- package/dist/time/index.d.ts +2 -2
- package/dist/time/index.js +1 -1
- package/dist/time/tz-context.d.ts +0 -5
- package/dist/time/tz-context.js +0 -9
- package/dist/ui-types/index.d.ts +8 -11
- package/dist/ui-types/index.js +3 -3
- package/dist/upgrade-changelog.d.ts +3 -2
- package/dist/upgrade-changelog.js +12 -8
- package/dist/upgrade-cli-internals.d.ts +8 -0
- package/dist/upgrade-cli-internals.js +63 -0
- package/dist/upgrade-cli.d.ts +2 -9
- package/dist/upgrade-cli.js +28 -70
- package/dist/utils/import-optional-peer.d.ts +6 -0
- package/dist/utils/import-optional-peer.js +19 -0
- package/dist/utils/index.d.ts +1 -4
- package/dist/utils/index.js +1 -4
- package/package.json +23 -19
- package/src/changes.json +236 -0
- package/dist/crypto/request-kms-cache.d.ts +0 -8
- package/dist/crypto/request-kms-cache.js +0 -21
- package/dist/engine/codemod/index.d.ts +0 -2
- package/dist/engine/codemod/index.js +0 -1
- package/dist/engine/codemod/pipeline-codemod.d.ts +0 -50
- package/dist/engine/codemod/pipeline-codemod.js +0 -536
- package/dist/engine/feature-ast/entity-field-types.d.ts +0 -13
- package/dist/engine/feature-ast/entity-field-types.js +0 -35
- package/dist/engine/feature-ast/extractors/ai-steps.d.ts +0 -6
- package/dist/engine/feature-ast/extractors/ai-steps.js +0 -254
- package/dist/engine/feature-ast/extractors/events.d.ts +0 -5
- package/dist/engine/feature-ast/extractors/events.js +0 -275
- package/dist/engine/feature-ast/extractors/handlers.d.ts +0 -24
- package/dist/engine/feature-ast/extractors/handlers.js +0 -358
- package/dist/engine/feature-ast/extractors/hooks.d.ts +0 -24
- package/dist/engine/feature-ast/extractors/hooks.js +0 -248
- package/dist/engine/feature-ast/extractors/index.d.ts +0 -14
- package/dist/engine/feature-ast/extractors/index.js +0 -13
- package/dist/engine/feature-ast/extractors/jobs-routes.d.ts +0 -7
- package/dist/engine/feature-ast/extractors/jobs-routes.js +0 -145
- package/dist/engine/feature-ast/extractors/projections-screens.d.ts +0 -10
- package/dist/engine/feature-ast/extractors/projections-screens.js +0 -195
- package/dist/engine/feature-ast/extractors/resolve-import.d.ts +0 -21
- package/dist/engine/feature-ast/extractors/resolve-import.js +0 -180
- package/dist/engine/feature-ast/extractors/round1.d.ts +0 -11
- package/dist/engine/feature-ast/extractors/round1.js +0 -87
- package/dist/engine/feature-ast/extractors/round2.d.ts +0 -7
- package/dist/engine/feature-ast/extractors/round2.js +0 -191
- package/dist/engine/feature-ast/extractors/round3.d.ts +0 -23
- package/dist/engine/feature-ast/extractors/round3.js +0 -292
- package/dist/engine/feature-ast/extractors/round5.d.ts +0 -9
- package/dist/engine/feature-ast/extractors/round5.js +0 -68
- package/dist/engine/feature-ast/extractors/round6.d.ts +0 -4
- package/dist/engine/feature-ast/extractors/round6.js +0 -17
- package/dist/engine/feature-ast/extractors/shared.d.ts +0 -94
- package/dist/engine/feature-ast/extractors/shared.js +0 -343
- package/dist/engine/feature-ast/index.d.ts +0 -16
- package/dist/engine/feature-ast/index.js +0 -10
- package/dist/engine/feature-ast/parse.d.ts +0 -31
- package/dist/engine/feature-ast/parse.js +0 -485
- package/dist/engine/feature-ast/patch.d.ts +0 -212
- package/dist/engine/feature-ast/patch.js +0 -611
- package/dist/engine/feature-ast/patcher.d.ts +0 -217
- package/dist/engine/feature-ast/patcher.js +0 -281
- package/dist/engine/feature-ast/pattern-change-schema.d.ts +0 -1238
- package/dist/engine/feature-ast/pattern-change-schema.js +0 -1072
- package/dist/engine/feature-ast/pattern-id-matchers.d.ts +0 -7
- package/dist/engine/feature-ast/pattern-id-matchers.js +0 -211
- package/dist/engine/feature-ast/pattern-id-schema.d.ts +0 -251
- package/dist/engine/feature-ast/pattern-id-schema.js +0 -166
- package/dist/engine/feature-ast/patterns.d.ts +0 -322
- package/dist/engine/feature-ast/patterns.js +0 -107
- package/dist/engine/feature-ast/render.d.ts +0 -47
- package/dist/engine/feature-ast/render.js +0 -666
- package/dist/engine/feature-ast/source-location.d.ts +0 -17
- package/dist/engine/feature-ast/source-location.js +0 -27
- package/dist/engine/pattern-library/index.d.ts +0 -2
- package/dist/engine/pattern-library/index.js +0 -3
- package/dist/engine/pattern-library/library.d.ts +0 -14
- package/dist/engine/pattern-library/library.js +0 -94
- package/dist/engine/pattern-library/mixed-schemas.d.ts +0 -16
- package/dist/engine/pattern-library/mixed-schemas.js +0 -559
- package/dist/engine/pattern-library/opaque-schemas.d.ts +0 -7
- package/dist/engine/pattern-library/opaque-schemas.js +0 -115
- package/dist/engine/pattern-library/shared-fields.d.ts +0 -122
- package/dist/engine/pattern-library/shared-fields.js +0 -88
- package/dist/engine/pattern-library/static-schemas.d.ts +0 -21
- package/dist/engine/pattern-library/static-schemas.js +0 -487
- package/dist/engine/pattern-library/types.d.ts +0 -158
- package/dist/engine/pattern-library/types.js +0 -36
- package/dist/engine/resolve-config-or-param.d.ts +0 -18
- package/dist/engine/resolve-config-or-param.js +0 -76
- package/src/scripts/codemod/README.md +0 -187
- package/src/scripts/codemod/codemod-support.ts +0 -334
- package/src/scripts/codemod/collect-source-files.ts +0 -48
- package/src/scripts/codemod/crypto-shredding-testing-move.ts +0 -119
- package/src/scripts/codemod/db-factory.ts +0 -810
- package/src/scripts/codemod/feature-factory.ts +0 -429
- package/src/scripts/codemod/feature-layout.ts +0 -424
- package/src/scripts/codemod/import-extensions.ts +0 -118
- package/src/scripts/codemod/migrate-cross-tenant.ts +0 -328
- package/src/scripts/codemod/migrate-db-raw.ts +0 -401
- package/src/scripts/codemod/migrate-open-to-all.ts +0 -235
- package/src/scripts/codemod/object-form.ts +0 -746
- package/src/scripts/codemod/package-merge.ts +0 -299
- package/src/scripts/codemod/pii-personal-migration.ts +0 -816
- package/src/scripts/codemod/remove-engine-payload-casts.ts +0 -318
- package/src/scripts/codemod/s3-imports.ts +0 -236
- package/src/scripts/codemod/tenant-db-options.ts +0 -454
- package/src/scripts/codemod/testing-injection.ts +0 -215
- package/src/scripts/codemod/testing-move-targets.ts +0 -161
- package/src/scripts/codemod/testing-move.ts +0 -542
- package/src/scripts/codemod/unprocessable-error-details-reason.ts +0 -411
|
@@ -1,254 +0,0 @@
|
|
|
1
|
-
import { sourceLocationFromNode } from "../source-location.js";
|
|
2
|
-
import { fail, findFunctionLiteral, isPlainObject, isRawRefSentinel, ok, readDataLiteralNode, readNameLiteral, readObjectPropertyInitializer, readStringOrRaw, resolveSameFileObjectLiteral, } from "./shared.js";
|
|
3
|
-
function readEditableStringProp(obj, propertyName) {
|
|
4
|
-
const init = readObjectPropertyInitializer(obj, propertyName);
|
|
5
|
-
if (!init)
|
|
6
|
-
return undefined;
|
|
7
|
-
const value = readStringOrRaw(init);
|
|
8
|
-
if (value === undefined)
|
|
9
|
-
return undefined;
|
|
10
|
-
return value;
|
|
11
|
-
}
|
|
12
|
-
function readEditableDefaults(node) {
|
|
13
|
-
const value = readDataLiteralNode(node);
|
|
14
|
-
if (isRawRefSentinel(value))
|
|
15
|
-
return value;
|
|
16
|
-
if (!isPlainObject(value))
|
|
17
|
-
return undefined;
|
|
18
|
-
if (typeof value["enabled"] !== "boolean")
|
|
19
|
-
return undefined;
|
|
20
|
-
if (!isPlainObject(value["params"]))
|
|
21
|
-
return undefined;
|
|
22
|
-
return {
|
|
23
|
-
enabled: value["enabled"],
|
|
24
|
-
params: value["params"],
|
|
25
|
-
...(typeof value["providerId"] === "string" && { providerId: value["providerId"] }),
|
|
26
|
-
...(typeof value["model"] === "string" && { model: value["model"] }),
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
function readClassifyActions(node) {
|
|
30
|
-
const value = readDataLiteralNode(node);
|
|
31
|
-
if (!Array.isArray(value))
|
|
32
|
-
return undefined;
|
|
33
|
-
const out = [];
|
|
34
|
-
for (const entry of value) {
|
|
35
|
-
if (!isPlainObject(entry))
|
|
36
|
-
return undefined;
|
|
37
|
-
if (typeof entry["type"] !== "string" || typeof entry["description"] !== "string") {
|
|
38
|
-
return undefined;
|
|
39
|
-
}
|
|
40
|
-
out.push({ type: entry["type"], description: entry["description"] });
|
|
41
|
-
}
|
|
42
|
-
return out;
|
|
43
|
-
}
|
|
44
|
-
function extractAiStepCommon(call, sourceFile, kind) {
|
|
45
|
-
const source = sourceLocationFromNode(call, sourceFile);
|
|
46
|
-
const arg = call.getArguments()[0];
|
|
47
|
-
if (!arg) {
|
|
48
|
-
return fail(kind, source, "expected one argument object");
|
|
49
|
-
}
|
|
50
|
-
const obj = resolveSameFileObjectLiteral(arg);
|
|
51
|
-
if (!obj) {
|
|
52
|
-
if (isRawRefSentinel(readDataLiteralNode(arg))) {
|
|
53
|
-
return ok({
|
|
54
|
-
source,
|
|
55
|
-
argsSource: { __raw: arg.getText() },
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
return fail(kind, source, "argument must be an inline object literal or a same-file const resolving to one");
|
|
59
|
-
}
|
|
60
|
-
const stepKeyInit = readObjectPropertyInitializer(obj, "stepKey");
|
|
61
|
-
if (!stepKeyInit) {
|
|
62
|
-
return fail(kind, source, "missing `stepKey` property");
|
|
63
|
-
}
|
|
64
|
-
// PatternId needs a concrete string — resolve identifiers like patch.readAiStepKey.
|
|
65
|
-
const stepKeyLiteral = readNameLiteral(stepKeyInit);
|
|
66
|
-
const stepKey = stepKeyLiteral ?? readStringOrRaw(stepKeyInit);
|
|
67
|
-
if (stepKey === undefined) {
|
|
68
|
-
return fail(kind, source, "`stepKey` must be a string literal or resolvable identifier");
|
|
69
|
-
}
|
|
70
|
-
const promptKey = readEditableStringProp(obj, "promptKey");
|
|
71
|
-
if (promptKey === undefined) {
|
|
72
|
-
return fail(kind, source, "missing `promptKey` property");
|
|
73
|
-
}
|
|
74
|
-
const promptFallbackInit = readObjectPropertyInitializer(obj, "promptFallback");
|
|
75
|
-
if (!promptFallbackInit) {
|
|
76
|
-
return fail(kind, source, "missing `promptFallback` property");
|
|
77
|
-
}
|
|
78
|
-
const promptFallback = readStringOrRaw(promptFallbackInit);
|
|
79
|
-
if (promptFallback === undefined) {
|
|
80
|
-
return fail(kind, source, "`promptFallback` must be a string literal or identifier reference");
|
|
81
|
-
}
|
|
82
|
-
const defaultsInit = readObjectPropertyInitializer(obj, "defaults");
|
|
83
|
-
if (!defaultsInit) {
|
|
84
|
-
return fail(kind, source, "missing `defaults` property");
|
|
85
|
-
}
|
|
86
|
-
const defaults = readEditableDefaults(defaultsInit);
|
|
87
|
-
if (defaults === undefined) {
|
|
88
|
-
return fail(kind, source, "`defaults` could not be read as a StepPolicy literal");
|
|
89
|
-
}
|
|
90
|
-
const paramsSchemaInit = readObjectPropertyInitializer(obj, "paramsSchema");
|
|
91
|
-
if (!paramsSchemaInit) {
|
|
92
|
-
return fail(kind, source, "missing `paramsSchema` property");
|
|
93
|
-
}
|
|
94
|
-
return ok({
|
|
95
|
-
source,
|
|
96
|
-
stepKey,
|
|
97
|
-
promptKey,
|
|
98
|
-
promptFallback,
|
|
99
|
-
defaults,
|
|
100
|
-
paramsSchemaSource: sourceLocationFromNode(paramsSchemaInit, sourceFile),
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
function requireResolvedCommon(kind, pattern) {
|
|
104
|
-
if (pattern.argsSource) {
|
|
105
|
-
return fail(kind, pattern.source, "expected resolved inline object, got opaque args reference");
|
|
106
|
-
}
|
|
107
|
-
const { stepKey, promptKey, promptFallback, defaults, paramsSchemaSource, source } = pattern;
|
|
108
|
-
if (stepKey === undefined ||
|
|
109
|
-
promptKey === undefined ||
|
|
110
|
-
promptFallback === undefined ||
|
|
111
|
-
defaults === undefined ||
|
|
112
|
-
paramsSchemaSource === undefined) {
|
|
113
|
-
return fail(kind, source, "resolved AI step is missing required header fields");
|
|
114
|
-
}
|
|
115
|
-
return ok({ source, stepKey, promptKey, promptFallback, defaults, paramsSchemaSource });
|
|
116
|
-
}
|
|
117
|
-
export function extractAiGenerate(call, sourceFile) {
|
|
118
|
-
const common = extractAiStepCommon(call, sourceFile, "ai.generate");
|
|
119
|
-
if (common.kind === "error")
|
|
120
|
-
return common;
|
|
121
|
-
if (common.pattern.argsSource) {
|
|
122
|
-
return ok({
|
|
123
|
-
kind: "ai.generate",
|
|
124
|
-
source: common.pattern.source,
|
|
125
|
-
argsSource: common.pattern.argsSource,
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
const arg = call.getArguments()[0];
|
|
129
|
-
const obj = arg ? resolveSameFileObjectLiteral(arg) : undefined;
|
|
130
|
-
if (!obj) {
|
|
131
|
-
return fail("ai.generate", common.pattern.source, "expected resolvable argument object");
|
|
132
|
-
}
|
|
133
|
-
const inputInit = readObjectPropertyInitializer(obj, "input");
|
|
134
|
-
if (!inputInit) {
|
|
135
|
-
return fail("ai.generate", common.pattern.source, "missing `input` property");
|
|
136
|
-
}
|
|
137
|
-
const fn = findFunctionLiteral(inputInit);
|
|
138
|
-
if (!fn) {
|
|
139
|
-
return fail("ai.generate", common.pattern.source, "`input` must be an inline arrow function or function expression");
|
|
140
|
-
}
|
|
141
|
-
const resolved = requireResolvedCommon("ai.generate", common.pattern);
|
|
142
|
-
if (resolved.kind === "error")
|
|
143
|
-
return resolved;
|
|
144
|
-
return ok({
|
|
145
|
-
kind: "ai.generate",
|
|
146
|
-
source: resolved.pattern.source,
|
|
147
|
-
stepKey: resolved.pattern.stepKey,
|
|
148
|
-
promptKey: resolved.pattern.promptKey,
|
|
149
|
-
promptFallback: resolved.pattern.promptFallback,
|
|
150
|
-
defaults: resolved.pattern.defaults,
|
|
151
|
-
paramsSchemaSource: resolved.pattern.paramsSchemaSource,
|
|
152
|
-
inputBody: sourceLocationFromNode(fn, sourceFile),
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
export function extractAiExtract(call, sourceFile) {
|
|
156
|
-
const common = extractAiStepCommon(call, sourceFile, "ai.extract");
|
|
157
|
-
if (common.kind === "error")
|
|
158
|
-
return common;
|
|
159
|
-
if (common.pattern.argsSource) {
|
|
160
|
-
return ok({
|
|
161
|
-
kind: "ai.extract",
|
|
162
|
-
source: common.pattern.source,
|
|
163
|
-
argsSource: common.pattern.argsSource,
|
|
164
|
-
});
|
|
165
|
-
}
|
|
166
|
-
const arg = call.getArguments()[0];
|
|
167
|
-
const obj = arg ? resolveSameFileObjectLiteral(arg) : undefined;
|
|
168
|
-
if (!obj) {
|
|
169
|
-
return fail("ai.extract", common.pattern.source, "expected resolvable argument object");
|
|
170
|
-
}
|
|
171
|
-
const outputSchemaInit = readObjectPropertyInitializer(obj, "outputSchema");
|
|
172
|
-
if (!outputSchemaInit) {
|
|
173
|
-
return fail("ai.extract", common.pattern.source, "missing `outputSchema` property");
|
|
174
|
-
}
|
|
175
|
-
const instructionsInit = readObjectPropertyInitializer(obj, "instructions");
|
|
176
|
-
if (!instructionsInit) {
|
|
177
|
-
return fail("ai.extract", common.pattern.source, "missing `instructions` property");
|
|
178
|
-
}
|
|
179
|
-
const instructionsFn = findFunctionLiteral(instructionsInit);
|
|
180
|
-
if (!instructionsFn) {
|
|
181
|
-
return fail("ai.extract", common.pattern.source, "`instructions` must be an inline arrow function or function expression");
|
|
182
|
-
}
|
|
183
|
-
const documentInit = readObjectPropertyInitializer(obj, "document");
|
|
184
|
-
let documentBody;
|
|
185
|
-
if (documentInit) {
|
|
186
|
-
const documentFn = findFunctionLiteral(documentInit);
|
|
187
|
-
if (!documentFn) {
|
|
188
|
-
return fail("ai.extract", common.pattern.source, "`document` must be an inline arrow function or function expression");
|
|
189
|
-
}
|
|
190
|
-
documentBody = sourceLocationFromNode(documentFn, sourceFile);
|
|
191
|
-
}
|
|
192
|
-
const resolved = requireResolvedCommon("ai.extract", common.pattern);
|
|
193
|
-
if (resolved.kind === "error")
|
|
194
|
-
return resolved;
|
|
195
|
-
return ok({
|
|
196
|
-
kind: "ai.extract",
|
|
197
|
-
source: resolved.pattern.source,
|
|
198
|
-
stepKey: resolved.pattern.stepKey,
|
|
199
|
-
promptKey: resolved.pattern.promptKey,
|
|
200
|
-
promptFallback: resolved.pattern.promptFallback,
|
|
201
|
-
defaults: resolved.pattern.defaults,
|
|
202
|
-
paramsSchemaSource: resolved.pattern.paramsSchemaSource,
|
|
203
|
-
outputSchemaSource: sourceLocationFromNode(outputSchemaInit, sourceFile),
|
|
204
|
-
instructionsBody: sourceLocationFromNode(instructionsFn, sourceFile),
|
|
205
|
-
...(documentBody !== undefined && { documentBody }),
|
|
206
|
-
});
|
|
207
|
-
}
|
|
208
|
-
export function extractAiClassify(call, sourceFile) {
|
|
209
|
-
const common = extractAiStepCommon(call, sourceFile, "ai.classify");
|
|
210
|
-
if (common.kind === "error")
|
|
211
|
-
return common;
|
|
212
|
-
if (common.pattern.argsSource) {
|
|
213
|
-
return ok({
|
|
214
|
-
kind: "ai.classify",
|
|
215
|
-
source: common.pattern.source,
|
|
216
|
-
argsSource: common.pattern.argsSource,
|
|
217
|
-
});
|
|
218
|
-
}
|
|
219
|
-
const arg = call.getArguments()[0];
|
|
220
|
-
const obj = arg ? resolveSameFileObjectLiteral(arg) : undefined;
|
|
221
|
-
if (!obj) {
|
|
222
|
-
return fail("ai.classify", common.pattern.source, "expected resolvable argument object");
|
|
223
|
-
}
|
|
224
|
-
const actionsInit = readObjectPropertyInitializer(obj, "actions");
|
|
225
|
-
if (!actionsInit) {
|
|
226
|
-
return fail("ai.classify", common.pattern.source, "missing `actions` property");
|
|
227
|
-
}
|
|
228
|
-
const actions = readClassifyActions(actionsInit);
|
|
229
|
-
if (actions === undefined) {
|
|
230
|
-
return fail("ai.classify", common.pattern.source, "`actions` must be an inline array of { type, description } objects");
|
|
231
|
-
}
|
|
232
|
-
const inputInit = readObjectPropertyInitializer(obj, "input");
|
|
233
|
-
if (!inputInit) {
|
|
234
|
-
return fail("ai.classify", common.pattern.source, "missing `input` property");
|
|
235
|
-
}
|
|
236
|
-
const inputFn = findFunctionLiteral(inputInit);
|
|
237
|
-
if (!inputFn) {
|
|
238
|
-
return fail("ai.classify", common.pattern.source, "`input` must be an inline arrow function or function expression");
|
|
239
|
-
}
|
|
240
|
-
const resolved = requireResolvedCommon("ai.classify", common.pattern);
|
|
241
|
-
if (resolved.kind === "error")
|
|
242
|
-
return resolved;
|
|
243
|
-
return ok({
|
|
244
|
-
kind: "ai.classify",
|
|
245
|
-
source: resolved.pattern.source,
|
|
246
|
-
stepKey: resolved.pattern.stepKey,
|
|
247
|
-
promptKey: resolved.pattern.promptKey,
|
|
248
|
-
promptFallback: resolved.pattern.promptFallback,
|
|
249
|
-
defaults: resolved.pattern.defaults,
|
|
250
|
-
paramsSchemaSource: resolved.pattern.paramsSchemaSource,
|
|
251
|
-
actions,
|
|
252
|
-
inputBody: sourceLocationFromNode(inputFn, sourceFile),
|
|
253
|
-
});
|
|
254
|
-
}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import type { CallExpression, SourceFile } from "ts-morph";
|
|
2
|
-
import type { DefineEventPattern, NotificationPattern } from "../patterns.ts";
|
|
3
|
-
import { type ExtractOutput } from "./shared.ts";
|
|
4
|
-
export declare function extractDefineEvent(call: CallExpression, sourceFile: SourceFile): ExtractOutput<DefineEventPattern>;
|
|
5
|
-
export declare function extractNotification(call: CallExpression, sourceFile: SourceFile): ExtractOutput<NotificationPattern>;
|
|
@@ -1,275 +0,0 @@
|
|
|
1
|
-
import { SyntaxKind } from "ts-morph";
|
|
2
|
-
import { sourceLocationFromNode } from "../source-location.js";
|
|
3
|
-
import { fail, findFunctionLiteral, ok, readDataLiteralNode, readNameLiteral, readNameLiteralRef, readNameOrRef, readPropertyKey, } from "./shared.js";
|
|
4
|
-
// Reads defineEvent's `migrations` option — either the array-of-steps shape
|
|
5
|
-
// used by hand-authored calls (`[{ fromVersion, toVersion, transform }]`,
|
|
6
|
-
// toVersion is redundant on-disk since it is always fromVersion + 1) or the
|
|
7
|
-
// keyed-object canonical shape the Designer renders (`{ "1": transform }`).
|
|
8
|
-
// Keyed by fromVersion (as a string) → the transform closure's location.
|
|
9
|
-
// Skips malformed entries rather than failing the whole defineEvent extract
|
|
10
|
-
// — same "best-effort, degrade gracefully" posture as readDataLiteralNode.
|
|
11
|
-
function extractEventMigrationsFromArray(arr, sourceFile) {
|
|
12
|
-
const result = {};
|
|
13
|
-
const arrLit = arr.asKindOrThrow(SyntaxKind.ArrayLiteralExpression);
|
|
14
|
-
for (const el of arrLit.getElements()) {
|
|
15
|
-
const obj = el.asKind(SyntaxKind.ObjectLiteralExpression);
|
|
16
|
-
if (!obj)
|
|
17
|
-
continue;
|
|
18
|
-
const fromInit = obj
|
|
19
|
-
.getProperty("fromVersion")
|
|
20
|
-
?.asKind(SyntaxKind.PropertyAssignment)
|
|
21
|
-
?.getInitializer();
|
|
22
|
-
const fromVersion = fromInit ? readDataLiteralNode(fromInit) : undefined;
|
|
23
|
-
if (typeof fromVersion !== "number")
|
|
24
|
-
continue;
|
|
25
|
-
const transformInit = obj
|
|
26
|
-
.getProperty("transform")
|
|
27
|
-
?.asKind(SyntaxKind.PropertyAssignment)
|
|
28
|
-
?.getInitializer();
|
|
29
|
-
const fn = transformInit ? findFunctionLiteral(transformInit) : undefined;
|
|
30
|
-
if (!fn)
|
|
31
|
-
continue;
|
|
32
|
-
result[String(fromVersion)] = sourceLocationFromNode(fn, sourceFile);
|
|
33
|
-
}
|
|
34
|
-
return result;
|
|
35
|
-
}
|
|
36
|
-
function extractEventMigrationsFromKeyedObject(objLit, sourceFile) {
|
|
37
|
-
const result = {};
|
|
38
|
-
const obj = objLit.asKindOrThrow(SyntaxKind.ObjectLiteralExpression);
|
|
39
|
-
for (const prop of obj.getProperties()) {
|
|
40
|
-
const propAssign = prop.asKind(SyntaxKind.PropertyAssignment);
|
|
41
|
-
const initializer = propAssign?.getInitializer();
|
|
42
|
-
const fn = initializer ? findFunctionLiteral(initializer) : undefined;
|
|
43
|
-
if (!propAssign || !fn)
|
|
44
|
-
continue;
|
|
45
|
-
result[readPropertyKey(propAssign)] = sourceLocationFromNode(fn, sourceFile);
|
|
46
|
-
}
|
|
47
|
-
return result;
|
|
48
|
-
}
|
|
49
|
-
// Reads defineEvent's `migrations` option — either the array-of-steps shape
|
|
50
|
-
// used by hand-authored calls (`[{ fromVersion, toVersion, transform }]`,
|
|
51
|
-
// toVersion is redundant on-disk since it is always fromVersion + 1) or the
|
|
52
|
-
// keyed-object canonical shape the Designer renders (`{ "1": transform }`).
|
|
53
|
-
// Keyed by fromVersion (as a string) → the transform closure's location.
|
|
54
|
-
// Skips malformed entries rather than failing the whole defineEvent extract
|
|
55
|
-
// — same "best-effort, degrade gracefully" posture as readDataLiteralNode.
|
|
56
|
-
function extractEventMigrationsField(node, sourceFile) {
|
|
57
|
-
const result = node.asKind(SyntaxKind.ArrayLiteralExpression)
|
|
58
|
-
? extractEventMigrationsFromArray(node, sourceFile)
|
|
59
|
-
: node.asKind(SyntaxKind.ObjectLiteralExpression)
|
|
60
|
-
? extractEventMigrationsFromKeyedObject(node, sourceFile)
|
|
61
|
-
: undefined;
|
|
62
|
-
return result && Object.keys(result).length > 0 ? result : undefined;
|
|
63
|
-
}
|
|
64
|
-
// `{ piiFields }` shorthand is a valid stance; its name node doubles as the location.
|
|
65
|
-
function readPiiFieldsNode(obj) {
|
|
66
|
-
const prop = obj?.getProperty("piiFields");
|
|
67
|
-
return (prop?.asKind(SyntaxKind.PropertyAssignment)?.getInitializer() ??
|
|
68
|
-
prop?.asKind(SyntaxKind.ShorthandPropertyAssignment)?.getNameNode());
|
|
69
|
-
}
|
|
70
|
-
export function extractDefineEvent(call, sourceFile) {
|
|
71
|
-
const args = call.getArguments();
|
|
72
|
-
const first = args[0];
|
|
73
|
-
if (!first) {
|
|
74
|
-
return fail("defineEvent", sourceLocationFromNode(call, sourceFile), "expected at least one argument");
|
|
75
|
-
}
|
|
76
|
-
const obj = first.asKind(SyntaxKind.ObjectLiteralExpression);
|
|
77
|
-
if (obj && args.length === 1) {
|
|
78
|
-
const nameInit = obj
|
|
79
|
-
.getProperty("name")
|
|
80
|
-
?.asKind(SyntaxKind.PropertyAssignment)
|
|
81
|
-
?.getInitializer()
|
|
82
|
-
?.asKind(SyntaxKind.StringLiteral);
|
|
83
|
-
if (!nameInit) {
|
|
84
|
-
return fail("defineEvent", sourceLocationFromNode(call, sourceFile), "object form requires a string-literal `name` property");
|
|
85
|
-
}
|
|
86
|
-
const schemaInit = obj
|
|
87
|
-
.getProperty("schema")
|
|
88
|
-
?.asKind(SyntaxKind.PropertyAssignment)
|
|
89
|
-
?.getInitializer();
|
|
90
|
-
if (!schemaInit) {
|
|
91
|
-
return fail("defineEvent", sourceLocationFromNode(call, sourceFile), "object form requires a `schema` property");
|
|
92
|
-
}
|
|
93
|
-
let version;
|
|
94
|
-
const versionInit = obj
|
|
95
|
-
.getProperty("version")
|
|
96
|
-
?.asKind(SyntaxKind.PropertyAssignment)
|
|
97
|
-
?.getInitializer();
|
|
98
|
-
if (versionInit) {
|
|
99
|
-
const v = readDataLiteralNode(versionInit);
|
|
100
|
-
if (typeof v === "number")
|
|
101
|
-
version = v;
|
|
102
|
-
}
|
|
103
|
-
const piiFieldsInit = readPiiFieldsNode(obj);
|
|
104
|
-
if (!piiFieldsInit) {
|
|
105
|
-
return fail("defineEvent", sourceLocationFromNode(call, sourceFile), 'requires an explicit `piiFields` stance (an object literal or "none")');
|
|
106
|
-
}
|
|
107
|
-
const migrationsInit = obj
|
|
108
|
-
.getProperty("migrations")
|
|
109
|
-
?.asKind(SyntaxKind.PropertyAssignment)
|
|
110
|
-
?.getInitializer();
|
|
111
|
-
const migrations = migrationsInit
|
|
112
|
-
? extractEventMigrationsField(migrationsInit, sourceFile)
|
|
113
|
-
: undefined;
|
|
114
|
-
return ok({
|
|
115
|
-
kind: "defineEvent",
|
|
116
|
-
source: sourceLocationFromNode(call, sourceFile),
|
|
117
|
-
eventName: nameInit.getLiteralValue(),
|
|
118
|
-
schemaSource: sourceLocationFromNode(schemaInit, sourceFile),
|
|
119
|
-
piiFields: sourceLocationFromNode(piiFieldsInit, sourceFile),
|
|
120
|
-
...(version !== undefined && { version }),
|
|
121
|
-
...(migrations !== undefined && { migrations }),
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
const eventNameRef = readNameLiteralRef(first);
|
|
125
|
-
if (eventNameRef === undefined) {
|
|
126
|
-
return fail("defineEvent", sourceLocationFromNode(call, sourceFile), "first argument must be a string literal event name, or an identifier resolving to one (or use the object form)");
|
|
127
|
-
}
|
|
128
|
-
const schemaArg = args[1];
|
|
129
|
-
if (!schemaArg) {
|
|
130
|
-
return fail("defineEvent", sourceLocationFromNode(call, sourceFile), "expected a Zod schema as second argument");
|
|
131
|
-
}
|
|
132
|
-
let version;
|
|
133
|
-
let migrations;
|
|
134
|
-
const optionsArg = args[2];
|
|
135
|
-
const optionsObj = optionsArg?.asKind(SyntaxKind.ObjectLiteralExpression);
|
|
136
|
-
const piiFieldsInit = readPiiFieldsNode(optionsObj);
|
|
137
|
-
if (!piiFieldsInit) {
|
|
138
|
-
if (optionsArg && !optionsObj) {
|
|
139
|
-
return fail("defineEvent", sourceLocationFromNode(call, sourceFile), "options must be an object literal");
|
|
140
|
-
}
|
|
141
|
-
return fail("defineEvent", sourceLocationFromNode(call, sourceFile), 'requires an explicit `piiFields` stance (an object literal or "none")');
|
|
142
|
-
}
|
|
143
|
-
if (optionsObj) {
|
|
144
|
-
const versionInit = optionsObj
|
|
145
|
-
.getProperty("version")
|
|
146
|
-
?.asKind(SyntaxKind.PropertyAssignment)
|
|
147
|
-
?.getInitializer();
|
|
148
|
-
if (versionInit) {
|
|
149
|
-
const v = readDataLiteralNode(versionInit);
|
|
150
|
-
if (typeof v === "number")
|
|
151
|
-
version = v;
|
|
152
|
-
}
|
|
153
|
-
const migrationsInit = optionsObj
|
|
154
|
-
.getProperty("migrations")
|
|
155
|
-
?.asKind(SyntaxKind.PropertyAssignment)
|
|
156
|
-
?.getInitializer();
|
|
157
|
-
if (migrationsInit) {
|
|
158
|
-
migrations = extractEventMigrationsField(migrationsInit, sourceFile);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
return ok({
|
|
162
|
-
kind: "defineEvent",
|
|
163
|
-
source: sourceLocationFromNode(call, sourceFile),
|
|
164
|
-
eventName: eventNameRef.value,
|
|
165
|
-
...(eventNameRef.raw !== undefined && { eventNameRaw: eventNameRef.raw }),
|
|
166
|
-
schemaSource: sourceLocationFromNode(schemaArg, sourceFile),
|
|
167
|
-
piiFields: sourceLocationFromNode(piiFieldsInit, sourceFile),
|
|
168
|
-
...(version !== undefined && { version }),
|
|
169
|
-
...(migrations !== undefined && { migrations }),
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
export function extractNotification(call, sourceFile) {
|
|
173
|
-
const args = call.getArguments();
|
|
174
|
-
const first = args[0];
|
|
175
|
-
if (!first) {
|
|
176
|
-
return fail("notification", sourceLocationFromNode(call, sourceFile), "expected at least one argument");
|
|
177
|
-
}
|
|
178
|
-
let notificationName;
|
|
179
|
-
let defObj;
|
|
180
|
-
const firstObj = first.asKind(SyntaxKind.ObjectLiteralExpression);
|
|
181
|
-
if (firstObj && args.length === 1) {
|
|
182
|
-
const nameInit = firstObj
|
|
183
|
-
.getProperty("name")
|
|
184
|
-
?.asKind(SyntaxKind.PropertyAssignment)
|
|
185
|
-
?.getInitializer()
|
|
186
|
-
?.asKind(SyntaxKind.StringLiteral);
|
|
187
|
-
if (!nameInit) {
|
|
188
|
-
return fail("notification", sourceLocationFromNode(call, sourceFile), "object form requires a string-literal `name` property");
|
|
189
|
-
}
|
|
190
|
-
notificationName = nameInit.getLiteralValue();
|
|
191
|
-
defObj = firstObj;
|
|
192
|
-
}
|
|
193
|
-
else {
|
|
194
|
-
notificationName = readNameLiteral(first);
|
|
195
|
-
if (notificationName === undefined) {
|
|
196
|
-
return fail("notification", sourceLocationFromNode(call, sourceFile), "first argument must be a string literal notification name, or an identifier resolving to one (or use the object form)");
|
|
197
|
-
}
|
|
198
|
-
defObj = args[1]?.asKind(SyntaxKind.ObjectLiteralExpression);
|
|
199
|
-
if (!defObj) {
|
|
200
|
-
return fail("notification", sourceLocationFromNode(call, sourceFile), "second argument must be an inline definition object");
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
const triggerProp = defObj.getProperty("trigger");
|
|
204
|
-
if (!triggerProp && (defObj.getProperty("recipient") || defObj.getProperty("data"))) {
|
|
205
|
-
return fail("notification", sourceLocationFromNode(call, sourceFile), "recipient and data require a `trigger`");
|
|
206
|
-
}
|
|
207
|
-
let onName;
|
|
208
|
-
let recipientFn;
|
|
209
|
-
let dataFn;
|
|
210
|
-
if (triggerProp) {
|
|
211
|
-
const triggerObj = triggerProp
|
|
212
|
-
.asKind(SyntaxKind.PropertyAssignment)
|
|
213
|
-
?.getInitializer()
|
|
214
|
-
?.asKind(SyntaxKind.ObjectLiteralExpression);
|
|
215
|
-
if (!triggerObj) {
|
|
216
|
-
return fail("notification", sourceLocationFromNode(call, sourceFile), "non-object `trigger` property");
|
|
217
|
-
}
|
|
218
|
-
const onInit = triggerObj
|
|
219
|
-
.getProperty("on")
|
|
220
|
-
?.asKind(SyntaxKind.PropertyAssignment)
|
|
221
|
-
?.getInitializer();
|
|
222
|
-
onName = onInit ? readNameOrRef(onInit) : undefined;
|
|
223
|
-
if (!onName) {
|
|
224
|
-
return fail("notification", sourceLocationFromNode(call, sourceFile), "trigger.on must be a string literal or inline { name } object");
|
|
225
|
-
}
|
|
226
|
-
const recipientInit = defObj
|
|
227
|
-
.getProperty("recipient")
|
|
228
|
-
?.asKind(SyntaxKind.PropertyAssignment)
|
|
229
|
-
?.getInitializer();
|
|
230
|
-
recipientFn = recipientInit ? findFunctionLiteral(recipientInit) : undefined;
|
|
231
|
-
if (!recipientFn) {
|
|
232
|
-
return fail("notification", sourceLocationFromNode(call, sourceFile), "recipient must be an inline arrow function or function expression");
|
|
233
|
-
}
|
|
234
|
-
const dataInit = defObj
|
|
235
|
-
.getProperty("data")
|
|
236
|
-
?.asKind(SyntaxKind.PropertyAssignment)
|
|
237
|
-
?.getInitializer();
|
|
238
|
-
dataFn = dataInit ? findFunctionLiteral(dataInit) : undefined;
|
|
239
|
-
if (!dataFn) {
|
|
240
|
-
return fail("notification", sourceLocationFromNode(call, sourceFile), "data must be an inline arrow function or function expression");
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
let templates;
|
|
244
|
-
const templatesObj = defObj
|
|
245
|
-
.getProperty("templates")
|
|
246
|
-
?.asKind(SyntaxKind.PropertyAssignment)
|
|
247
|
-
?.getInitializer()
|
|
248
|
-
?.asKind(SyntaxKind.ObjectLiteralExpression);
|
|
249
|
-
if (templatesObj) {
|
|
250
|
-
templates = {};
|
|
251
|
-
for (const prop of templatesObj.getProperties()) {
|
|
252
|
-
const propAssign = prop.asKind(SyntaxKind.PropertyAssignment);
|
|
253
|
-
if (!propAssign)
|
|
254
|
-
continue;
|
|
255
|
-
const init = propAssign.getInitializer();
|
|
256
|
-
if (!init)
|
|
257
|
-
continue;
|
|
258
|
-
const tfn = findFunctionLiteral(init);
|
|
259
|
-
if (!tfn)
|
|
260
|
-
continue;
|
|
261
|
-
templates[readPropertyKey(propAssign)] = sourceLocationFromNode(tfn, sourceFile);
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
return ok({
|
|
265
|
-
kind: "notification",
|
|
266
|
-
source: sourceLocationFromNode(call, sourceFile),
|
|
267
|
-
notificationName,
|
|
268
|
-
...(onName !== undefined && { trigger: { on: onName } }),
|
|
269
|
-
...(recipientFn !== undefined && {
|
|
270
|
-
recipientBody: sourceLocationFromNode(recipientFn, sourceFile),
|
|
271
|
-
}),
|
|
272
|
-
...(dataFn !== undefined && { dataBody: sourceLocationFromNode(dataFn, sourceFile) }),
|
|
273
|
-
...(templates !== undefined && { templates }),
|
|
274
|
-
});
|
|
275
|
-
}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import type { CallExpression, SourceFile } from "ts-morph";
|
|
2
|
-
import type { AccessRule, AgentHandlerHints, AgentRisk, EscapeHatchDeclaration, PayloadRateLimitOption, RateLimitDeclaration } from "../../types/handlers.ts";
|
|
3
|
-
import type { QueryHandlerPattern, StreamHandlerPattern, WriteHandlerPattern } from "../patterns.ts";
|
|
4
|
-
import type { SourceLocation } from "../source-location.ts";
|
|
5
|
-
import { type ExtractOutput, type RawRefSentinel } from "./shared.ts";
|
|
6
|
-
export type ParsedHandlerCall = {
|
|
7
|
-
readonly source: SourceLocation;
|
|
8
|
-
readonly handlerName?: string;
|
|
9
|
-
readonly schemaSource?: SourceLocation;
|
|
10
|
-
readonly handlerBody?: SourceLocation;
|
|
11
|
-
readonly access?: AccessRule | RawRefSentinel;
|
|
12
|
-
readonly description?: string;
|
|
13
|
-
readonly agent?: AgentHandlerHints | RawRefSentinel;
|
|
14
|
-
readonly rateLimit?: RateLimitDeclaration | RawRefSentinel;
|
|
15
|
-
readonly additionalRateLimits?: readonly PayloadRateLimitOption[] | RawRefSentinel;
|
|
16
|
-
readonly unsafeSkipTransitionGuard?: boolean;
|
|
17
|
-
readonly escapeHatch?: EscapeHatchDeclaration | RawRefSentinel;
|
|
18
|
-
};
|
|
19
|
-
export declare const AGENT_RISK_VALUES: readonly AgentRisk[];
|
|
20
|
-
export declare function readOptionalAgentHints(value: unknown): AgentHandlerHints | undefined;
|
|
21
|
-
export declare function parseHandlerCall(call: CallExpression, sourceFile: SourceFile, methodName: "writeHandler" | "queryHandler" | "streamHandler"): ExtractOutput<ParsedHandlerCall>;
|
|
22
|
-
export declare function extractWriteHandler(call: CallExpression, sourceFile: SourceFile): ExtractOutput<WriteHandlerPattern>;
|
|
23
|
-
export declare function extractQueryHandler(call: CallExpression, sourceFile: SourceFile): ExtractOutput<QueryHandlerPattern>;
|
|
24
|
-
export declare function extractStreamHandler(call: CallExpression, sourceFile: SourceFile): ExtractOutput<StreamHandlerPattern>;
|