@cosmicdrift/kumiko-framework 0.386.0 → 0.387.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/LICENSE +21 -57
- package/README.md +2 -2
- package/agents/widgets.md +39 -39
- package/dist/api/api-constants.js +2 -2
- package/dist/api/auth-middleware.js +7 -7
- package/dist/api/auth-rate-limiters.js +7 -3
- package/dist/api/auth-routes-mfa.js +1 -1
- package/dist/api/auth-routes-session.js +1 -1
- package/dist/api/auth-routes-shared.js +7 -3
- package/dist/api/auth-routes-signup.js +1 -1
- package/dist/api/client-ip.js +3 -1
- package/dist/api/extra-route.js +1 -1
- package/dist/api/pii-leak-guard.js +4 -2
- package/dist/api/readiness.js +5 -5
- package/dist/api/redis-sse-broker.js +8 -6
- package/dist/api/routes.js +2 -2
- package/dist/api/server.js +34 -33
- package/dist/api/sse-broker.js +1 -1
- package/dist/api/sse-route.d.ts +13 -13
- package/dist/api/sse-route.js +15 -15
- package/dist/auth/index.js +4 -4
- package/dist/auth/roles.d.ts +4 -4
- package/dist/auth/roles.js +24 -24
- package/dist/compliance/duration-spec.js +18 -20
- package/dist/compliance/index.js +2 -3
- package/dist/compliance/override-schema.d.ts +4 -4
- package/dist/compliance/override-schema.js +19 -22
- package/dist/compliance/profiles.d.ts +26 -29
- package/dist/compliance/profiles.js +62 -69
- package/dist/compliance/sub-processors.d.ts +28 -30
- package/dist/compliance/sub-processors.js +17 -21
- package/dist/consumer-cli.js +4 -4
- package/dist/crypto/blind-index.js +18 -17
- package/dist/crypto/ciphertext-pattern.js +1 -1
- package/dist/crypto/event-pii.js +3 -3
- package/dist/crypto/kek-source.d.ts +1 -1
- package/dist/crypto/kek-source.js +3 -2
- package/dist/crypto/kms-adapter.d.ts +1 -1
- package/dist/crypto/kms-adapter.js +4 -6
- package/dist/crypto/kms-wiring.d.ts +1 -2
- package/dist/crypto/kms-wiring.js +2 -2
- package/dist/crypto/pg-kms-adapter.js +2 -6
- package/dist/crypto/pii-field-encryption.js +4 -4
- package/dist/crypto/subject-resolver.d.ts +1 -1
- package/dist/crypto/subject-resolver.js +2 -2
- package/dist/db/apply-entity-event.d.ts +6 -6
- package/dist/db/apply-entity-event.js +55 -55
- package/dist/db/blind-index-cleanup.js +7 -7
- package/dist/db/collect-table-metas.js +10 -11
- package/dist/db/compound-types.d.ts +1 -1
- package/dist/db/compound-types.js +12 -12
- package/dist/db/cursor.js +3 -4
- package/dist/db/dialect.d.ts +2 -2
- package/dist/db/dialect.js +2 -2
- package/dist/db/eagerload.d.ts +3 -3
- package/dist/db/eagerload.js +21 -12
- package/dist/db/entity-table-meta.d.ts +2 -2
- package/dist/db/entity-table-meta.js +4 -4
- package/dist/db/event-store-executor-context.d.ts +1 -1
- package/dist/db/event-store-executor-context.js +13 -13
- package/dist/db/event-store-executor-read.js +27 -28
- package/dist/db/event-store-executor-write.js +65 -70
- package/dist/db/located-timestamp.d.ts +11 -11
- package/dist/db/located-timestamp.js +29 -30
- package/dist/db/migrate-generator.d.ts +1 -1
- package/dist/db/migrate-generator.js +26 -19
- package/dist/db/migrate-runner.js +25 -25
- package/dist/db/money.d.ts +6 -6
- package/dist/db/money.js +29 -27
- package/dist/db/queries/backfill-pii.js +5 -5
- package/dist/db/queries/ddl.js +1 -1
- package/dist/db/queries/es-ops.d.ts +1 -1
- package/dist/db/queries/es-ops.js +1 -1
- package/dist/db/queries/event-consumer.js +3 -3
- package/dist/db/queries/event-store.js +4 -2
- package/dist/db/queries/projection-rebuild.js +3 -3
- package/dist/db/queries/raw-sql.d.ts +2 -2
- package/dist/db/queries/raw-sql.js +2 -2
- package/dist/db/queries/shadow-swap.js +19 -19
- package/dist/db/query.d.ts +1 -1
- package/dist/db/query.js +6 -6
- package/dist/db/rebuild-marker.js +20 -21
- package/dist/db/replay-migration-sql.js +2 -2
- package/dist/db/schema-inspection.js +4 -5
- package/dist/db/table-builder.d.ts +1 -2
- package/dist/db/table-builder.js +82 -82
- package/dist/db/tenant-db.d.ts +2 -2
- package/dist/db/tenant-db.js +9 -2
- package/dist/derivatives/delete-stored-file.js +5 -2
- package/dist/derivatives/derivatives-context.js +1 -1
- package/dist/engine/boot-validator/access-roles.js +4 -3
- package/dist/engine/boot-validator/api-ext.js +14 -14
- package/dist/engine/boot-validator/config-deps.js +7 -6
- package/dist/engine/boot-validator/detail-screens.js +3 -3
- package/dist/engine/boot-validator/entity-handler.js +60 -61
- package/dist/engine/boot-validator/gdpr-storage.js +4 -4
- package/dist/engine/boot-validator/i18n-keys.js +1 -1
- package/dist/engine/boot-validator/index.d.ts +2 -2
- package/dist/engine/boot-validator/index.js +20 -20
- package/dist/engine/boot-validator/nav.js +5 -5
- package/dist/engine/boot-validator/ownership.js +12 -9
- package/dist/engine/boot-validator/parent-ref.js +1 -1
- package/dist/engine/boot-validator/pii-retention.js +50 -57
- package/dist/engine/boot-validator/projection-list-screens.js +7 -7
- package/dist/engine/boot-validator/query-refs.js +1 -1
- package/dist/engine/boot-validator/screens-actions.js +15 -16
- package/dist/engine/boot-validator/screens-forms.js +10 -11
- package/dist/engine/boot-validator/screens-lists.js +14 -15
- package/dist/engine/boot-validator/screens.js +34 -40
- package/dist/engine/boot-validator/security-baseline.js +3 -2
- package/dist/engine/boot-validator/transfer-graph.js +2 -2
- package/dist/engine/boot-validator/workspaces.js +3 -3
- package/dist/engine/bridge-stub.js +3 -4
- package/dist/engine/build-app-schema.js +75 -75
- package/dist/engine/build-config-feature-schema.js +50 -50
- package/dist/engine/build-target.js +20 -23
- package/dist/engine/codemod/pipeline-codemod.js +20 -13
- package/dist/engine/config-helpers.js +4 -4
- package/dist/engine/constants.js +2 -2
- package/dist/engine/create-app.js +2 -2
- package/dist/engine/define-feature.js +12 -11
- package/dist/engine/define-handler.js +12 -11
- package/dist/engine/define-step.js +1 -1
- package/dist/engine/define-workflow.d.ts +5 -5
- package/dist/engine/define-workflow.js +6 -6
- package/dist/engine/entity-handlers.js +13 -14
- package/dist/engine/event-def.js +2 -2
- package/dist/engine/extension-names.d.ts +16 -17
- package/dist/engine/extension-names.js +37 -38
- package/dist/engine/extensions/escape-hatch-usage.js +1 -1
- package/dist/engine/extensions/tenant-data.js +2 -2
- package/dist/engine/extensions/user-data.d.ts +23 -24
- package/dist/engine/factories.d.ts +14 -13
- package/dist/engine/factories.js +38 -37
- package/dist/engine/feature-ast/entity-field-types.js +1 -1
- package/dist/engine/feature-ast/extractors/handlers.js +1 -1
- package/dist/engine/feature-ast/extractors/hooks.js +1 -1
- package/dist/engine/feature-ast/extractors/shared.d.ts +2 -3
- package/dist/engine/feature-ast/extractors/shared.js +2 -3
- package/dist/engine/feature-ast/parse.js +13 -13
- package/dist/engine/feature-ast/patch.js +1 -1
- package/dist/engine/feature-ast/pattern-change-schema.js +1 -1
- package/dist/engine/feature-ast/patterns.d.ts +2 -2
- package/dist/engine/feature-ast/render.js +2 -2
- package/dist/engine/feature-config-events-jobs.js +15 -12
- package/dist/engine/feature-entity-handlers.js +9 -5
- package/dist/engine/feature-manifest.d.ts +9 -9
- package/dist/engine/feature-manifest.js +6 -7
- package/dist/engine/feature-ui-extensions.d.ts +3 -3
- package/dist/engine/feature-ui-extensions.js +30 -22
- package/dist/engine/field-access.js +5 -6
- package/dist/engine/index.d.ts +1 -0
- package/dist/engine/index.js +4 -4
- package/dist/engine/object-form.d.ts +1 -0
- package/dist/engine/object-form.js +14 -4
- package/dist/engine/ownership.js +3 -3
- package/dist/engine/parse-ref-target.js +5 -7
- package/dist/engine/pattern-library/index.js +2 -2
- package/dist/engine/pattern-library/library.js +2 -2
- package/dist/engine/pattern-library/types.js +3 -3
- package/dist/engine/pipeline.js +2 -2
- package/dist/engine/project-app-schema-for-roles.js +1 -1
- package/dist/engine/projection-helpers.js +9 -9
- package/dist/engine/qualified-name.js +2 -2
- package/dist/engine/registry-facade.js +1 -1
- package/dist/engine/registry-ingest.js +12 -12
- package/dist/engine/registry-state.js +17 -19
- package/dist/engine/registry-validate.js +12 -12
- package/dist/engine/run-in.js +2 -2
- package/dist/engine/run-pipeline.js +7 -0
- package/dist/engine/schema-builder.js +40 -38
- package/dist/engine/screen-filter-ops.js +17 -20
- package/dist/engine/screen-helpers.js +4 -3
- package/dist/engine/state-machine.d.ts +12 -12
- package/dist/engine/state-machine.js +7 -7
- package/dist/engine/steps/_resolver-utils.js +4 -3
- package/dist/engine/steps/for-each.js +4 -4
- package/dist/engine/steps/unsafe-projection-delete.js +1 -1
- package/dist/engine/steps/unsafe-projection-upsert.js +4 -4
- package/dist/engine/steps/wait-for-event.js +4 -4
- package/dist/engine/steps/workflow-system-events.js +3 -3
- package/dist/engine/tier-resolver-extension.d.ts +29 -27
- package/dist/engine/tier-resolver-extension.js +26 -26
- package/dist/engine/transfer-adjacency.js +2 -2
- package/dist/engine/validate-projection-allowlist.js +7 -27
- package/dist/engine/walk-step-instances.d.ts +2 -0
- package/dist/engine/walk-step-instances.js +38 -0
- package/dist/engine/where-rule-lint.js +1 -1
- package/dist/engine/write-handler-qn-extract.js +1 -1
- package/dist/entrypoint/index.js +3 -3
- package/dist/env/index.d.ts +7 -6
- package/dist/env/index.js +10 -9
- package/dist/errors/transition-details.js +7 -7
- package/dist/errors/write-error-info.d.ts +6 -6
- package/dist/errors/write-error-info.js +6 -6
- package/dist/es-ops/context.d.ts +9 -9
- package/dist/es-ops/context.js +28 -28
- package/dist/es-ops/index.js +7 -9
- package/dist/es-ops/operations-schema.js +4 -10
- package/dist/es-ops/runner.d.ts +11 -11
- package/dist/es-ops/runner.js +49 -53
- package/dist/es-ops/types.d.ts +55 -55
- package/dist/es-ops/types.js +11 -11
- package/dist/event-store/admin-api.js +6 -7
- package/dist/event-store/errors.js +1 -1
- package/dist/event-store/event-store.js +2 -2
- package/dist/event-store/rebuild-dead-letter.js +1 -1
- package/dist/files/feature.js +9 -10
- package/dist/files/file-handle.js +5 -6
- package/dist/files/file-ref-entity.js +15 -15
- package/dist/files/file-ref-table.js +7 -8
- package/dist/files/file-routes.d.ts +7 -0
- package/dist/files/file-routes.js +11 -5
- package/dist/files/in-memory-provider.js +8 -9
- package/dist/files/local-provider.js +18 -25
- package/dist/files/provider-resolver.d.ts +7 -7
- package/dist/files/storage-tracking.js +2 -2
- package/dist/files/zip-stream.d.ts +12 -19
- package/dist/files/zip-stream.js +44 -63
- package/dist/i18n/required-surface-keys.d.ts +1 -1
- package/dist/i18n/required-surface-keys.js +8 -8
- package/dist/jobs/job-runner-helpers.js +8 -2
- package/dist/jobs/job-runner-schedulers.d.ts +1 -1
- package/dist/jobs/job-runner-schedulers.js +3 -4
- package/dist/jobs/job-runner.js +13 -15
- package/dist/lifecycle/lifecycle.js +3 -5
- package/dist/lifecycle/signal-handlers.js +5 -4
- package/dist/logging/utils.d.ts +2 -1
- package/dist/logging/utils.js +38 -10
- package/dist/migrations/index.js +1 -1
- package/dist/migrations/kumiko-drift.js +14 -13
- package/dist/migrations/pending-rebuilds.d.ts +21 -20
- package/dist/migrations/pending-rebuilds.js +27 -27
- package/dist/migrations/projection-table-index.d.ts +3 -3
- package/dist/migrations/projection-table-index.js +8 -8
- package/dist/observability/metric-validator.js +1 -1
- package/dist/observability/metrics-handle.js +3 -3
- package/dist/pipeline/append-event-core.js +11 -2
- package/dist/pipeline/cascade-handler.d.ts +1 -1
- package/dist/pipeline/dispatch-batch.js +2 -2
- package/dist/pipeline/dispatch-query.js +10 -10
- package/dist/pipeline/dispatch-shared.d.ts +1 -0
- package/dist/pipeline/dispatch-shared.js +15 -17
- package/dist/pipeline/dispatch-stream.js +1 -1
- package/dist/pipeline/dispatch-write.js +3 -3
- package/dist/pipeline/dispatcher-utils.d.ts +1 -1
- package/dist/pipeline/dispatcher-utils.js +1 -1
- package/dist/pipeline/event-consumer-state.js +2 -2
- package/dist/pipeline/event-dispatcher-delivery.js +1 -1
- package/dist/pipeline/event-dispatcher.js +17 -28
- package/dist/pipeline/irreversible-operation-gate.js +1 -1
- package/dist/pipeline/lifecycle-pipeline.js +9 -9
- package/dist/pipeline/member-read-only-transaction.js +1 -3
- package/dist/pipeline/msp-rebuild.js +1 -1
- package/dist/pipeline/projection-rebuild.js +13 -12
- package/dist/pipeline/system-hooks.js +39 -41
- package/dist/pipeline/system-identity-switch.js +1 -3
- package/dist/pipeline/tenant-timezone-cache.js +1 -1
- package/dist/random/generate.d.ts +29 -29
- package/dist/random/generate.js +30 -30
- package/dist/random/words.js +20 -20
- package/dist/rate-limit/middleware.js +9 -5
- package/dist/redis/client.js +2 -2
- package/dist/redis/pubsub-signal.js +14 -17
- package/dist/schema-cli.js +116 -22
- package/dist/search/index.js +4 -4
- package/dist/search/purge-subject.js +4 -5
- package/dist/search/reindex-entity.js +6 -9
- package/dist/time/boot-tz-warning.d.ts +2 -2
- package/dist/time/boot-tz-warning.js +8 -8
- package/dist/time/iana.js +10 -10
- package/dist/time/index.js +9 -9
- package/dist/time/legacy-date.d.ts +2 -2
- package/dist/time/legacy-date.js +6 -8
- package/dist/time/polyfill.js +1 -1
- package/dist/time/tz-context.d.ts +1 -1
- package/dist/time/tz-context.js +1 -1
- package/dist/ui-types/app-schema.js +7 -7
- package/dist/ui-types/list-row-meta.js +4 -4
- package/dist/upgrade-cli.js +10 -9
- package/dist/utils/compare.js +1 -1
- package/package.json +4 -4
- package/src/changes.json +48 -0
- package/src/scripts/codemod/crypto-shredding-testing-move.ts +2 -2
- package/src/scripts/codemod/migrate-cross-tenant.ts +1 -1
- package/src/scripts/codemod/migrate-open-to-all.ts +1 -1
- package/src/scripts/codemod/pii-personal-migration.ts +17 -8
- package/src/scripts/codemod/unprocessable-error-details-reason.ts +2 -2
package/dist/time/iana.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
// IANA
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
// ("europe/berlin"
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
1
|
+
// IANA time zone name validation. Intl.supportedValuesOf("timeZone") returns only
|
|
2
|
+
// CANONICAL names — valid aliases such as "US/Pacific", "GMT", and "Etc/UTC" are
|
|
3
|
+
// missing, even though Intl.DateTimeFormat, Temporal, and ctx.tz.parse all
|
|
4
|
+
// accept them without issue. Intl.DateTimeFormat itself is case-INSENSITIVE
|
|
5
|
+
// ("europe/berlin" resolves to "Europe/Berlin") — a simple try/catch would
|
|
6
|
+
// therefore allow capitalization errors through.
|
|
7
|
+
// The exact comparison with resolvedOptions().timeZone prevents this: a valid
|
|
8
|
+
// canonical name OR alias ALWAYS resolves to itself (verified empirically for
|
|
9
|
+
// US/Pacific, GMT, and Etc/UTC), while a incorrectly cased string resolves to
|
|
10
|
+
// the canonical form and no longer matches exactly.
|
|
11
11
|
export function isValidIanaTimeZone(value) {
|
|
12
12
|
try {
|
|
13
13
|
return (new Intl.DateTimeFormat(undefined, { timeZone: value }).resolvedOptions().timeZone === value);
|
package/dist/time/index.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
// Time
|
|
1
|
+
// Time module: Temporal polyfill + ctx.tz helper.
|
|
2
2
|
//
|
|
3
|
-
//
|
|
4
|
-
// - ensureTemporalPolyfill:
|
|
5
|
-
// - getTemporal: type-
|
|
6
|
-
// - createTzContext: ctx.tz
|
|
7
|
-
// - LocatedTimestampJson: API-
|
|
8
|
-
// - isValidIanaTimeZone: IANA-
|
|
9
|
-
// - warnIfNonUtcServerTimeZone:
|
|
10
|
-
// - GeoTzProvider:
|
|
3
|
+
// Provides:
|
|
4
|
+
// - ensureTemporalPolyfill: installs Temporal globally when needed
|
|
5
|
+
// - getTemporal: type-safe access to globalThis.Temporal
|
|
6
|
+
// - createTzContext: ctx.tz factory with now/today/parse/toLocatedJson/...
|
|
7
|
+
// - LocatedTimestampJson: API-boundary form { at, tz }
|
|
8
|
+
// - isValidIanaTimeZone: IANA time-zone name validation (type:"tz" fields)
|
|
9
|
+
// - warnIfNonUtcServerTimeZone: boot warning for a non-UTC process time zone
|
|
10
|
+
// - GeoTzProvider: optional geo-to-zone adapter (ctx.tz.fromCoordinates/fromAddress)
|
|
11
11
|
export { warnIfNonUtcServerTimeZone } from "./boot-tz-warning.js";
|
|
12
12
|
export { isValidIanaTimeZone } from "./iana.js";
|
|
13
13
|
export { instantToLegacyDate, legacyDateToInstant } from "./legacy-date.js";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Temporal } from "@cosmicdrift/kumiko-types/temporal";
|
|
2
2
|
export declare function instantToLegacyDate(instant: Temporal.Instant): Date;
|
|
3
|
-
/**
|
|
4
|
-
* mailparser Date
|
|
3
|
+
/** Converts dates from foreign libraries (imapflow INTERNALDATE,
|
|
4
|
+
* mailparser Date headers) to Temporal.Instant. */
|
|
5
5
|
export declare function legacyDateToInstant(date: Date): Temporal.Instant;
|
package/dist/time/legacy-date.js
CHANGED
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
import { Temporal } from "@cosmicdrift/kumiko-types/temporal";
|
|
2
|
-
//
|
|
3
|
-
// search({since}), nodemailer
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
// no-date-api-Guard bleibt für Feature-Code scharf, die Konstruktion
|
|
7
|
-
// lebt hier im allowlisteten Time-Layer.
|
|
2
|
+
// Bridge to libraries that require JS `Date` (imapflow
|
|
3
|
+
// search({since}), nodemailer headers, ...). Feature code uses Temporal and
|
|
4
|
+
// converts only at foreign-API boundaries, keeping the no-date-api guard
|
|
5
|
+
// effective outside this allowlisted time layer.
|
|
8
6
|
export function instantToLegacyDate(instant) {
|
|
9
7
|
return new Date(instant.epochMilliseconds);
|
|
10
8
|
}
|
|
11
|
-
/**
|
|
12
|
-
* mailparser Date
|
|
9
|
+
/** Converts dates from foreign libraries (imapflow INTERNALDATE,
|
|
10
|
+
* mailparser Date headers) to Temporal.Instant. */
|
|
13
11
|
export function legacyDateToInstant(date) {
|
|
14
12
|
return Temporal.Instant.fromEpochMilliseconds(date.getTime());
|
|
15
13
|
}
|
package/dist/time/polyfill.js
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
//
|
|
9
9
|
// Idempotent: if `globalThis.Temporal` already exists the call is a no-op.
|
|
10
10
|
// The check is the live global — not a sticky module flag — so tests that
|
|
11
|
-
// delete the ambient global
|
|
11
|
+
// delete the ambient global still get it back on the next call.
|
|
12
12
|
// Re-install assigns the already-resolved module value: re-importing
|
|
13
13
|
// `temporal-polyfill` here would put a polyfill instance on the global while
|
|
14
14
|
// the rest of the code uses the native classes (instanceof mismatch).
|
|
@@ -3,7 +3,7 @@ export type { Clock, LocatedTimestampJson, TzContext, TzContextOptions, } from "
|
|
|
3
3
|
/**
|
|
4
4
|
* Factory: creates a TzContext for the current request.
|
|
5
5
|
* Uses the kumiko-types Temporal module export (not globalThis.Temporal) so
|
|
6
|
-
* buildHandlerContext stays ambient-free
|
|
6
|
+
* buildHandlerContext stays ambient-free.
|
|
7
7
|
*/
|
|
8
8
|
export declare function createTzContext(options?: TzContextOptions): TzContext;
|
|
9
9
|
/**
|
package/dist/time/tz-context.js
CHANGED
|
@@ -25,7 +25,7 @@ const SYSTEM_CLOCK = {
|
|
|
25
25
|
/**
|
|
26
26
|
* Factory: creates a TzContext for the current request.
|
|
27
27
|
* Uses the kumiko-types Temporal module export (not globalThis.Temporal) so
|
|
28
|
-
* buildHandlerContext stays ambient-free
|
|
28
|
+
* buildHandlerContext stays ambient-free.
|
|
29
29
|
*/
|
|
30
30
|
export function createTzContext(options = {}) {
|
|
31
31
|
const tenant = options.tenant ?? "UTC";
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
// Client-safe
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
// re-
|
|
1
|
+
// Client-safe schema types. Live in framework/ui-types rather than renderer
|
|
2
|
+
// so the server (createKumikoServer / buildAppSchema) can produce them
|
|
3
|
+
// without pulling in renderer as a dependency. Renderer and Renderer-Web
|
|
4
|
+
// re-export the same symbols, so consumers do not notice the move.
|
|
5
5
|
//
|
|
6
|
-
// Pattern:
|
|
7
|
-
// web)
|
|
8
|
-
//
|
|
6
|
+
// Pattern: types flow "downstream" (framework → renderer → renderer-
|
|
7
|
+
// web); runtime helpers (toAppSchema, isAppSchema) remain renderer-side
|
|
8
|
+
// because that is the layer that works with AppSchemas at runtime.
|
|
9
9
|
export {};
|
|
@@ -39,13 +39,13 @@ export const LIST_ROW_META_REFERENCES = {
|
|
|
39
39
|
// user:user — the convention QN is a SystemAdmin cross-tenant roster whose
|
|
40
40
|
// `tenants` join must not reach a TenantAdmin, so it stays SystemAdmin-only and
|
|
41
41
|
// the label lookup goes through the member directory instead: own-tenant
|
|
42
|
-
// members for an admin, every user for a SystemAdmin
|
|
42
|
+
// members for an admin, every user for a SystemAdmin.
|
|
43
43
|
//
|
|
44
44
|
// tenant:tenant — the convention QN, `tenant:query:tenant:list`, is a
|
|
45
45
|
// SystemAdmin-only entity-list handler, so a TenantAdmin got a 403 and every
|
|
46
46
|
// tenant cell fell back to the raw UUID. The label lookup goes through the
|
|
47
47
|
// tenant directory instead: the caller's own tenant for an admin, every
|
|
48
|
-
// tenant for a SystemAdmin
|
|
48
|
+
// tenant for a SystemAdmin.
|
|
49
49
|
export const REFERENCE_LOOKUP_SOURCES = {
|
|
50
50
|
"user:user": { queryQn: "tenant:query:member-directory", labelKey: "label" },
|
|
51
51
|
"tenant:tenant": { queryQn: "tenant:query:tenant-directory", labelKey: "label" },
|
|
@@ -56,10 +56,10 @@ export const REFERENCE_LOOKUP_SOURCES = {
|
|
|
56
56
|
// otherwise. Keyed by `${refFeature}:${refEntity}` so useReferenceLookup can
|
|
57
57
|
// consult this generically instead of any screen/hook hardcoding an entity
|
|
58
58
|
// name. Central so the label applies to every screen that references this
|
|
59
|
-
// entity, not just delivery-log
|
|
59
|
+
// entity, not just delivery-log.
|
|
60
60
|
export const SYSTEM_REFERENCE_LABELS = {
|
|
61
61
|
"tenant:tenant": { id: SYSTEM_TENANT_ID, labelKey: "kumiko.reference.system-tenant" },
|
|
62
|
-
// createdBy on a system write
|
|
62
|
+
// createdBy on a system write — SYSTEM_USER_ID is an alias for
|
|
63
63
|
// "no human caller", so read_users never holds a matching row.
|
|
64
64
|
"user:user": {
|
|
65
65
|
id: SYSTEM_USER_ID,
|
package/dist/upgrade-cli.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { existsSync, mkdirSync, readdirSync, readFileSync, realpathSync, statSync, writeFileSync, } from "node:fs";
|
|
3
3
|
import { dirname, isAbsolute, join, relative, resolve } from "node:path";
|
|
4
|
+
import { propertyOf } from "@cosmicdrift/kumiko-types/type-guards";
|
|
4
5
|
import { getFlag, getStringFlag, parseArgs } from "./arg-parser.js";
|
|
5
6
|
import { compareVersions, filterEntriesAfter, parseFeatureChangelog, sortEntries, } from "./engine/index.js";
|
|
6
7
|
import { ensureTemporalPolyfill } from "./time/index.js";
|
|
@@ -96,7 +97,7 @@ export function findFeatureChangelogFiles(featuresDir) {
|
|
|
96
97
|
// Layout is detected per-package, not guessed from a naming convention:
|
|
97
98
|
// enterprise packages keep changes.json under src/, framework's
|
|
98
99
|
// bundled-features keep it flat. A name-prefix heuristic (e.g. "ai-*")
|
|
99
|
-
// silently drops packages that don't match it
|
|
100
|
+
// silently drops packages that don't match it.
|
|
100
101
|
const srcLayout = join(featuresDir, name, "src", "changes.json");
|
|
101
102
|
const flatLayout = join(featuresDir, name, "changes.json");
|
|
102
103
|
const changelogPath = existsSync(srcLayout) ? srcLayout : flatLayout;
|
|
@@ -167,7 +168,7 @@ export function findFeaturesDirs(cwd) {
|
|
|
167
168
|
// Enterprise repo: packages/<name>/src/changes.json or packages/<name>/changes.json.
|
|
168
169
|
// Detected by presence of changes.json, not a package-name prefix — a
|
|
169
170
|
// prefix heuristic silently stops matching once packages are renamed or a
|
|
170
|
-
// differently-named package is added
|
|
171
|
+
// differently-named package is added. Skipped inside the
|
|
171
172
|
// framework repo itself (packages/framework present): every package's own
|
|
172
173
|
// changes.json is already collected via findPackageChangelogFiles, and
|
|
173
174
|
// would otherwise get double-counted as one here.
|
|
@@ -202,7 +203,7 @@ export function findFeaturesDirs(cwd) {
|
|
|
202
203
|
// Consumer-facing codemod scripts ship inside the published
|
|
203
204
|
// @cosmicdrift/kumiko-framework package (src/scripts/codemod), not at the
|
|
204
205
|
// git repo root — only the installed package path exists in a consumer's
|
|
205
|
-
// node_modules after a plain npm/bun install
|
|
206
|
+
// node_modules after a plain npm/bun install.
|
|
206
207
|
export function findCodemodScriptsRoot(repoRoot) {
|
|
207
208
|
const local = join(repoRoot, "packages/framework/src");
|
|
208
209
|
if (existsSync(join(local, CODEMOD_SUBDIR))) {
|
|
@@ -213,7 +214,7 @@ export function findCodemodScriptsRoot(repoRoot) {
|
|
|
213
214
|
if (existsSync(pkgPath)) {
|
|
214
215
|
try {
|
|
215
216
|
const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
|
|
216
|
-
if (pkg
|
|
217
|
+
if (propertyOf(pkg, "name") === "@cosmicdrift/kumiko-framework")
|
|
217
218
|
return local;
|
|
218
219
|
// wrong name → fall through
|
|
219
220
|
}
|
|
@@ -242,7 +243,7 @@ export function findCodemodScriptsRoot(repoRoot) {
|
|
|
242
243
|
// absolute paths, symlinks pointing outward) or that isn't a real .ts file.
|
|
243
244
|
// First arg is the consumer repo root (same as findCodemodScriptsRoot) —
|
|
244
245
|
// not the scripts root — so out-of-tree callers keep compiling against the
|
|
245
|
-
// public upgrade-cli subpath without silently resolving to null
|
|
246
|
+
// public upgrade-cli subpath without silently resolving to null.
|
|
246
247
|
function resolveCodemodScriptAt(codemodScriptsRoot, codemodField) {
|
|
247
248
|
if (!codemodField)
|
|
248
249
|
return null;
|
|
@@ -417,7 +418,7 @@ function parseStoredMarker(raw) {
|
|
|
417
418
|
resolvedManual: dedupeManualById(resolvedManual),
|
|
418
419
|
};
|
|
419
420
|
}
|
|
420
|
-
// A missing marker is a bootstrap app that never ran `--apply
|
|
421
|
+
// A missing marker is a bootstrap app that never ran `--apply`; an
|
|
421
422
|
// existing but unreadable one must not silently fall back to the installed
|
|
422
423
|
// version, or a bare `--apply` would skip every codemod in between.
|
|
423
424
|
function readMarker(targetDir) {
|
|
@@ -512,7 +513,7 @@ function writePartialMarker(out, targetDir, pending, manualEntries, failedVersio
|
|
|
512
513
|
// failure; codemods that already ran are kept in a partial marker. Writes the
|
|
513
514
|
// marker whenever dryRun is false —
|
|
514
515
|
// even with zero pending entries, so an already-current app still gets a
|
|
515
|
-
// bootstrap marker recording its installed version
|
|
516
|
+
// bootstrap marker recording its installed version.
|
|
516
517
|
// kumiko-lint-ignore complexity-budget sequential codemod runner with zero-pending bootstrap marker
|
|
517
518
|
async function applyCodemods(out, pending, repoRoot, targetDir, dryRun,
|
|
518
519
|
// Installed version for the zero-pending bootstrap marker — never a
|
|
@@ -751,8 +752,8 @@ export async function runUpgradeCli(argv, cwd, out, options) {
|
|
|
751
752
|
const installedVersion = readCurrentVersion(cwd);
|
|
752
753
|
// Filter baseline: explicit --from wins, otherwise the marker recorded
|
|
753
754
|
// under targetDir (what was last actually applied there), falling back to
|
|
754
|
-
// the installed version only when no marker exists yet (bootstrap
|
|
755
|
-
//
|
|
755
|
+
// the installed version only when no marker exists yet (bootstrap).
|
|
756
|
+
// Baselining on installedVersion here would silently treat every
|
|
756
757
|
// changelog entry up to the installed version as already handled, even
|
|
757
758
|
// when the marker says otherwise — a bare `--apply` would then always
|
|
758
759
|
// report "Nothing new" and bootstrap the marker onto the installed
|
package/dist/utils/compare.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Locale-independent string ordering for sorts that feed byte-exact serialized
|
|
2
2
|
// artifacts (manifest JSON, snapshot.json, generated migration SQL). Unlike
|
|
3
3
|
// String.localeCompare — whose order depends on the runner's ICU locale and so
|
|
4
|
-
// can drift between a macOS dev box and Linux CI
|
|
4
|
+
// can drift between a macOS dev box and Linux CI — this compares by
|
|
5
5
|
// UTF-16 code unit, which is stable across machines and, for the BMP identifier
|
|
6
6
|
// strings we sort here (table / column / feature / qualified names), equals
|
|
7
7
|
// codepoint order.
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cosmicdrift/kumiko-framework",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.387.0",
|
|
4
4
|
"description": "Framework core — engine, pipeline, API, DB, and every other bit that makes Kumiko go.",
|
|
5
|
-
"license": "
|
|
5
|
+
"license": "MIT",
|
|
6
6
|
"author": "Marc Frost <marc@cosmicdriftgamestudio.com>",
|
|
7
7
|
"repository": {
|
|
8
8
|
"type": "git",
|
|
@@ -199,7 +199,7 @@
|
|
|
199
199
|
"./package.json": "./package.json"
|
|
200
200
|
},
|
|
201
201
|
"dependencies": {
|
|
202
|
-
"@cosmicdrift/kumiko-types": "0.
|
|
202
|
+
"@cosmicdrift/kumiko-types": "0.387.0",
|
|
203
203
|
"bullmq": "^5.76.7",
|
|
204
204
|
"bun-types": "^1.3.13",
|
|
205
205
|
"hono": "^4.13.1",
|
|
@@ -215,7 +215,7 @@
|
|
|
215
215
|
"zod": "^4.4.3"
|
|
216
216
|
},
|
|
217
217
|
"devDependencies": {
|
|
218
|
-
"@cosmicdrift/kumiko-testing": "0.
|
|
218
|
+
"@cosmicdrift/kumiko-testing": "0.387.0",
|
|
219
219
|
"bun-types": "^1.3.13",
|
|
220
220
|
"pino-pretty": "^13.1.3"
|
|
221
221
|
},
|
package/src/changes.json
CHANGED
|
@@ -1,4 +1,52 @@
|
|
|
1
1
|
[
|
|
2
|
+
{
|
|
3
|
+
"version": "0.387.0",
|
|
4
|
+
"type": "improvement",
|
|
5
|
+
"title": "English source comments without issue references in bundled-features",
|
|
6
|
+
"detail": "Comments in bundled-features are translated to English, and issue numbers and planning labels are removed while the reason they stood for stays. Pure paraphrases of the code are dropped. No code changes."
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
"version": "0.387.0",
|
|
10
|
+
"type": "improvement",
|
|
11
|
+
"title": "English source comments without issue references in the framework package",
|
|
12
|
+
"detail": "Comments in packages/framework are translated to English, and issue numbers and planning labels are removed while the reason they stood for stays. Pure paraphrases of the code are dropped. The ZIP entry path doc now states the UTF-8 flag the writer actually sets. No code changes."
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"version": "0.387.0",
|
|
16
|
+
"type": "improvement",
|
|
17
|
+
"title": "English source comments without issue references in the renderer",
|
|
18
|
+
"detail": "Comments in the renderer are translated to English, and issue numbers and planning labels are removed while the reason they stood for stays. Pure paraphrases of the code are dropped. No code changes; the generated widget reference (agents/widgets.md) follows the translated JSDoc."
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"version": "0.387.0",
|
|
22
|
+
"type": "improvement",
|
|
23
|
+
"title": "English source comments without issue references in the smaller packages",
|
|
24
|
+
"detail": "Comments in types, server-runtime, dev-server, guards, testing, cli, create-kumiko-app and renderer-mail-html are translated to English, and issue numbers and planning labels are removed while the reason they stood for stays. Pure paraphrases of the code are dropped. No code changes; the comment-language baseline is lowered accordingly."
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"version": "0.387.0",
|
|
28
|
+
"type": "fix",
|
|
29
|
+
"title": "Runtime log lines go through the process logger",
|
|
30
|
+
"detail": "Modules that wrote to console now use createFallbackLogger, so once setProcessLogger is wired their lines reach the configured logger with namespace and structured fields; before that they still fall back to console. createFallbackLogger gained an info method. The `[kumiko]` prefix now comes from the logger namespace, errors travel as structured fields, and the non-JSON-safe schema assertion in buildAppSchema logs the offending path instead of the whole schema. In production the boot warnings arrive as pino JSON with a `component` field (set by the process-logger child or by `context.log.child({ component })`) instead of `[kumiko:boot]` plain text. The KEK source, the seed migration and \"idle pre-check recovered\" lines are logged at `info`. An app that sets its own `extraContext.log` receives the boot and event-dispatcher warnings in that logger."
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"version": "0.387.0",
|
|
34
|
+
"type": "improvement",
|
|
35
|
+
"title": "MIT License for all public packages",
|
|
36
|
+
"detail": "Every @cosmicdrift package and create-kumiko-app are published under MIT instead of BUSL-1.1, so hosting and platform use no longer need a commercial agreement. Earlier releases keep their BUSL-1.1 terms."
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"version": "0.387.0",
|
|
40
|
+
"type": "fix",
|
|
41
|
+
"title": "Fewer unchecked casts, runtime checks at boundaries",
|
|
42
|
+
"detail": "bridgeStub needs no casts, the db dialect types drop any (TableColumns is SchemaTable, SelectQuery is unknown). Malformed input now fails at the boundary instead of later, for example a step that returns a non-WriteResult as the pipeline result, a non-numeric Redis counter in the login rate limiter, or r.useExtension, r.referenceData, r.job, r.notification, r.metric, r.secret, r.secretNamespace, r.claimKey and r.relation called without their required argument. Snapshot.generatedAt is optional, so snapshots written without it still load. The cast baseline is rewritten so new suspect casts in a file fail the As-Casts Audit."
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"version": "0.387.0",
|
|
46
|
+
"type": "fix",
|
|
47
|
+
"title": "Fail-closed projection allowlist walk, cleaner fallback log lines",
|
|
48
|
+
"detail": "createFallbackLogger no longer prints a trailing `undefined` when a log call carries no data. The step walker shared by the projection allowlist check and the workflow event-trigger registration now aborts with path and index when a sub-step list holds an entry that is not a step, instead of skipping it. The `unknown` overload of `runInSavepoint` hands its callback a `DbRunner`. Log lines drop doubled namespace prefixes, and the remaining errors in eager-load, the event store and the token request route travel as structured fields."
|
|
49
|
+
},
|
|
2
50
|
{
|
|
3
51
|
"version": "0.386.0",
|
|
4
52
|
"type": "improvement",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
// Rewrites `import { resetPiiSubjectKmsForTests, resetBlindIndexKeyForTests }
|
|
3
3
|
// from "@cosmicdrift/kumiko-framework/crypto"` to import both names from
|
|
4
|
-
// "@cosmicdrift/kumiko-framework/testing" instead
|
|
4
|
+
// "@cosmicdrift/kumiko-framework/testing" instead. Only the
|
|
5
5
|
// package barrel specifier is rewritten — relative deep-imports of the
|
|
6
6
|
// defining module are left untouched, per the changes.json migration note.
|
|
7
7
|
// Idempotent: an already-migrated file has nothing left to move.
|
|
@@ -21,7 +21,7 @@ const EXCLUDE_DIRS = new Set(["node_modules", "dist", "build"]);
|
|
|
21
21
|
function findTargetFiles(rootDir: string): string[] {
|
|
22
22
|
// Walk the tree and skip excluded dirs while descending — filtering the
|
|
23
23
|
// absolute path after a full Glob scan silently no-ops when the repo root
|
|
24
|
-
// itself contains "/build/" or "/node_modules/"
|
|
24
|
+
// itself contains "/build/" or "/node_modules/".
|
|
25
25
|
const files: string[] = [];
|
|
26
26
|
const walk = (dir: string): void => {
|
|
27
27
|
let entries: Dirent[];
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
// migrate-cross-tenant — rewrites `crossTenant: true` on entity-convention
|
|
3
3
|
// handlers to `escapeHatch: { reason }` where the handler name and verb can
|
|
4
|
-
// be derived from the call, and reports every other site for review
|
|
4
|
+
// be derived from the call, and reports every other site for review.
|
|
5
5
|
//
|
|
6
6
|
// Usage:
|
|
7
7
|
// bun scripts/codemod/migrate-cross-tenant.ts [--dry-run] <path...>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
// migrate-open-to-all — rewrites deprecated `openToAll: true` to the required
|
|
3
3
|
// `{ reason }` form in test files, and reports every remaining non-test site
|
|
4
|
-
// for a human to pick a reason
|
|
4
|
+
// for a human to pick a reason.
|
|
5
5
|
//
|
|
6
6
|
// Usage:
|
|
7
7
|
// bun scripts/codemod/migrate-open-to-all.ts [--dry-run] [--test-reason "<text>"] <path...>
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
// Migrates create*Field(...) calls from the old flag-based PII API (pii,
|
|
3
3
|
// userOwned, tenantOwned, subjectRef, allowPlaintext, lookupable,
|
|
4
|
-
// searchable, sensitive) to the author-facing personal/find API
|
|
5
|
-
//
|
|
6
|
-
//
|
|
4
|
+
// searchable, sensitive) to the author-facing personal/find API.
|
|
5
|
+
// Idempotent — re-running is a no-op on already migrated fields (skipped once
|
|
6
|
+
// a `personal` property is present).
|
|
7
7
|
//
|
|
8
8
|
// Mapping table (exact):
|
|
9
9
|
// pii: true -> personal: "self"
|
|
@@ -87,7 +87,16 @@ const OVERRIDES_ARG_INDEX_1 = new Set(["createEmbeddedField", "createEmbeddedLis
|
|
|
87
87
|
const FIELD_FACTORY_RE = /^create\w*Field$/;
|
|
88
88
|
|
|
89
89
|
type ReportEntry = { readonly file: string; readonly line: number; readonly note: string };
|
|
90
|
-
|
|
90
|
+
const FIND_BUCKETS = [
|
|
91
|
+
"exact",
|
|
92
|
+
"fuzzy",
|
|
93
|
+
"none",
|
|
94
|
+
"secret",
|
|
95
|
+
"ref",
|
|
96
|
+
"personal-false",
|
|
97
|
+
"no-find",
|
|
98
|
+
] as const;
|
|
99
|
+
type FindBucket = (typeof FIND_BUCKETS)[number];
|
|
91
100
|
|
|
92
101
|
const reports: ReportEntry[] = [];
|
|
93
102
|
const newLookupableSites: ReportEntry[] = [];
|
|
@@ -411,7 +420,9 @@ function applyTransform(
|
|
|
411
420
|
const removedSet = new Set<PropertyAssignment>(removedProps);
|
|
412
421
|
let insertIndex = 0;
|
|
413
422
|
for (let i = 0; i < anchorIndex; i++) {
|
|
414
|
-
|
|
423
|
+
const property = properties[i];
|
|
424
|
+
if (!(property && Node.isPropertyAssignment(property) && removedSet.has(property)))
|
|
425
|
+
insertIndex++;
|
|
415
426
|
}
|
|
416
427
|
|
|
417
428
|
for (const p of removedProps) p.remove();
|
|
@@ -746,9 +757,7 @@ async function main(): Promise<void> {
|
|
|
746
757
|
|
|
747
758
|
const countsBefore = { ...counts };
|
|
748
759
|
for (const { name, objArg } of calls) processObjectLiteral(objArg, name);
|
|
749
|
-
const changed =
|
|
750
|
-
(k) => counts[k] !== countsBefore[k],
|
|
751
|
-
);
|
|
760
|
+
const changed = FIND_BUCKETS.some((k) => counts[k] !== countsBefore[k]);
|
|
752
761
|
|
|
753
762
|
if (changed) {
|
|
754
763
|
touchedFiles++;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
|
-
// `UnprocessableOpts.details` was tightened
|
|
2
|
+
// `UnprocessableOpts.details` was tightened to `& { readonly reason?:
|
|
3
3
|
// never }` — `reason` is owned exclusively by the ctor's first positional
|
|
4
4
|
// argument, which already folds it into `details` internally
|
|
5
5
|
// (`{ ...opts?.details, reason }`). Any consumer that ALSO puts `reason`
|
|
@@ -26,7 +26,7 @@ const KUMIKO_MODULE_RE = /^@cosmicdrift\/kumiko-/;
|
|
|
26
26
|
function findTargetFiles(rootDir: string): string[] {
|
|
27
27
|
// Walk the tree and skip excluded dirs while descending — filtering the
|
|
28
28
|
// absolute path after a full scan silently no-ops when the repo root
|
|
29
|
-
// itself contains "/build/" or "/node_modules
|
|
29
|
+
// itself contains "/build/" or "/node_modules/."
|
|
30
30
|
const files: string[] = [];
|
|
31
31
|
const walk = (dir: string): void => {
|
|
32
32
|
let entries: Dirent[];
|