niceeval 0.16.3-canary.99 → 0.17.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/bootstrap.cjs +7 -1
- package/dist/cli/bootstrap.cjs.map +1 -1
- package/dist/cli/project-configuration.cjs +8 -11
- package/dist/cli/project-configuration.cjs.map +1 -1
- package/dist/expect/index.cjs.map +1 -1
- package/dist/expect/index.d.cts +2 -1
- package/dist/expect/index.d.mts +2 -1
- package/dist/expect/index.d.ts +2 -1
- package/dist/experiment/host/cli/contribution.cjs +6 -11
- package/dist/experiment/host/cli/contribution.cjs.map +1 -1
- package/dist/experiment/host/cli/contribution.d.cts +0 -16
- package/dist/experiment/host/cli/contribution.d.mts +0 -16
- package/dist/experiment/host/cli/contribution.d.ts +0 -16
- package/dist/experiment/host/operations.cjs +3 -3
- package/dist/experiment/host/operations.cjs.map +1 -1
- package/dist/experiment/host/types.cjs.map +1 -1
- package/dist/experiment/host/types.d.cts +0 -4
- package/dist/experiment/host/types.d.mts +0 -4
- package/dist/experiment/host/types.d.ts +0 -4
- package/dist/fresh-import.cjs +2 -2
- package/dist/fresh-import.cjs.map +1 -1
- package/dist/fresh-import.d.cts +3 -3
- package/dist/fresh-import.d.mts +3 -3
- package/dist/fresh-import.d.ts +3 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -1
- package/dist/index.d.mts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/inspection/codec.cjs.map +1 -1
- package/dist/inspection/codec.d.cts +1 -1
- package/dist/inspection/codec.d.mts +1 -1
- package/dist/inspection/codec.d.ts +1 -1
- package/dist/inspection/facts.cjs +66 -9
- package/dist/inspection/facts.cjs.map +1 -1
- package/dist/inspection/facts.d.cts +4 -0
- package/dist/inspection/facts.d.mts +4 -0
- package/dist/inspection/facts.d.ts +4 -0
- package/dist/inspection/facts.js +4 -2
- package/dist/inspection/index.cjs +1 -3
- package/dist/inspection/index.cjs.map +1 -1
- package/dist/inspection/index.d.cts +1 -1
- package/dist/inspection/index.d.mts +1 -1
- package/dist/inspection/index.d.ts +1 -1
- package/dist/inspection/index.js +44 -48
- package/dist/inspection/limits.cjs +3 -1
- package/dist/inspection/limits.cjs.map +1 -1
- package/dist/inspection/limits.d.cts +2 -0
- package/dist/inspection/limits.d.mts +2 -0
- package/dist/inspection/limits.d.ts +2 -0
- package/dist/inspection/limits.js +6 -4
- package/dist/inspection/project-source.cjs +4 -1
- package/dist/inspection/project-source.cjs.map +1 -1
- package/dist/inspection/protocol.cjs +10 -18
- package/dist/inspection/protocol.cjs.map +1 -1
- package/dist/inspection/protocol.d.cts +111 -173
- package/dist/inspection/protocol.d.mts +111 -173
- package/dist/inspection/protocol.d.ts +111 -173
- package/dist/inspection/public.mjs +73 -109
- package/dist/inspection/results.cjs +12 -48
- package/dist/inspection/results.cjs.map +1 -1
- package/dist/inspection/results.d.cts +124 -122
- package/dist/inspection/results.d.mts +124 -122
- package/dist/inspection/results.d.ts +124 -122
- package/dist/inspection/results.js +16 -20
- package/dist/inspection/select.cjs +80 -117
- package/dist/inspection/select.cjs.map +1 -1
- package/dist/inspection/source.cjs +14 -15
- package/dist/inspection/source.cjs.map +1 -1
- package/dist/inspection/source.d.cts +6 -3
- package/dist/inspection/source.d.mts +6 -3
- package/dist/inspection/source.d.ts +6 -3
- package/dist/inspection/trace.cjs +1 -1
- package/dist/inspection/trace.cjs.map +1 -1
- package/dist/load-config.cjs +17 -11
- package/dist/load-config.cjs.map +1 -1
- package/dist/load-config.d.cts +3 -2
- package/dist/load-config.d.mts +3 -2
- package/dist/load-config.d.ts +3 -2
- package/dist/o11y/adapter-usage-projection.cjs +5 -1
- package/dist/o11y/adapter-usage-projection.cjs.map +1 -1
- package/dist/o11y/adapter-usage-projection.d.cts +109 -1
- package/dist/o11y/adapter-usage-projection.d.mts +109 -1
- package/dist/o11y/adapter-usage-projection.d.ts +109 -1
- package/dist/o11y/cache-read.cjs +113 -0
- package/dist/o11y/cache-read.cjs.map +1 -0
- package/dist/o11y/cache-read.d.cts +80 -0
- package/dist/o11y/cache-read.d.mts +80 -0
- package/dist/o11y/cache-read.d.ts +80 -0
- package/dist/o11y/cache-read.js +8 -0
- package/dist/o11y/cache-read.js.map +1 -0
- package/dist/o11y/eval-usage.cjs +22 -1
- package/dist/o11y/eval-usage.cjs.map +1 -1
- package/dist/o11y/eval-usage.d.cts +9 -1
- package/dist/o11y/eval-usage.d.mts +9 -1
- package/dist/o11y/eval-usage.d.ts +9 -1
- package/dist/record/host/sqlite-host.cjs +188 -53
- package/dist/record/host/sqlite-host.cjs.map +1 -1
- package/dist/record/host/sqlite-host.d.cts +37 -1
- package/dist/record/host/sqlite-host.d.mts +37 -1
- package/dist/record/host/sqlite-host.d.ts +37 -1
- package/dist/record/host/sqlite-host.js +16 -8
- package/dist/record/maintenance/runtime.cjs +3 -3
- package/dist/record/maintenance/runtime.cjs.map +1 -1
- package/dist/record/sqlite/admission-repository.cjs +18 -18
- package/dist/record/sqlite/admission-repository.cjs.map +1 -1
- package/dist/record/sqlite/case-repository.cjs +6 -6
- package/dist/record/sqlite/case-repository.cjs.map +1 -1
- package/dist/record/sqlite/coordination-repository.cjs +25 -25
- package/dist/record/sqlite/coordination-repository.cjs.map +1 -1
- package/dist/record/sqlite/current-schema.cjs +115 -111
- package/dist/record/sqlite/current-schema.cjs.map +1 -1
- package/dist/record/sqlite/current-schema.d.cts +3 -3
- package/dist/record/sqlite/current-schema.d.mts +3 -3
- package/dist/record/sqlite/current-schema.d.ts +3 -3
- package/dist/record/sqlite/database.cjs +56 -53
- package/dist/record/sqlite/database.cjs.map +1 -1
- package/dist/record/sqlite/index.cjs +3 -1
- package/dist/record/sqlite/index.cjs.map +1 -1
- package/dist/record/sqlite/index.d.cts +5 -2
- package/dist/record/sqlite/index.d.mts +5 -2
- package/dist/record/sqlite/index.d.ts +5 -2
- package/dist/record/sqlite/legacy-schema-018.cjs +443 -0
- package/dist/record/sqlite/legacy-schema-018.cjs.map +1 -0
- package/dist/record/sqlite/legacy-schema-018.d.cts +6 -0
- package/dist/record/sqlite/legacy-schema-018.d.mts +6 -0
- package/dist/record/sqlite/legacy-schema-018.d.ts +6 -0
- package/dist/record/sqlite/legacy-schema-018.js +6 -0
- package/dist/record/sqlite/legacy-schema-018.js.map +1 -0
- package/dist/record/sqlite/migration.cjs +105 -46
- package/dist/record/sqlite/migration.cjs.map +1 -1
- package/dist/record/sqlite/migration.d.cts +2 -1
- package/dist/record/sqlite/migration.d.mts +2 -1
- package/dist/record/sqlite/migration.d.ts +2 -1
- package/dist/record/sqlite/portable-capture.cjs +13 -13
- package/dist/record/sqlite/portable-capture.cjs.map +1 -1
- package/dist/record/sqlite/registry-repository.cjs +22 -22
- package/dist/record/sqlite/registry-repository.cjs.map +1 -1
- package/dist/record/sqlite/schema.cjs +10 -2
- package/dist/record/sqlite/schema.cjs.map +1 -1
- package/dist/record/sqlite/schema.d.cts +4 -1
- package/dist/record/sqlite/schema.d.mts +4 -1
- package/dist/record/sqlite/schema.d.ts +4 -1
- package/dist/record/sqlite/schema.js +20 -14
- package/dist/record/sqlite/storage-worker.cjs +1 -1
- package/dist/record/sqlite/storage-worker.cjs.map +1 -1
- package/dist/record/sqlite/storage.cjs +316 -232
- package/dist/record/sqlite/storage.cjs.map +1 -1
- package/dist/record/sqlite/storage.d.cts +10 -2
- package/dist/record/sqlite/storage.d.mts +10 -2
- package/dist/record/sqlite/storage.d.ts +10 -2
- package/dist/record/sqlite/storage.js +54 -50
- package/dist/record/sqlite/types.cjs +1 -1
- package/dist/record/sqlite/types.cjs.map +1 -1
- package/dist/record/sqlite/types.d.cts +13 -1
- package/dist/record/sqlite/types.d.mts +13 -1
- package/dist/record/sqlite/types.d.ts +13 -1
- package/dist/run/cli/contribution.cjs +17 -12
- package/dist/run/cli/contribution.cjs.map +1 -1
- package/dist/run/host/lifecycle-adapter.cjs +1 -1
- package/dist/run/host/lifecycle-adapter.cjs.map +1 -1
- package/dist/run/storage/owner-identity.cjs +78 -16
- package/dist/run/storage/owner-identity.cjs.map +1 -1
- package/dist/run/storage/owner-identity.d.cts +2 -1
- package/dist/run/storage/owner-identity.d.mts +2 -1
- package/dist/run/storage/owner-identity.d.ts +2 -1
- package/dist/run/storage/sqlite.cjs +55 -55
- package/dist/run/storage/sqlite.cjs.map +1 -1
- package/dist/runner/accept.cjs +12 -42
- package/dist/runner/accept.cjs.map +1 -1
- package/dist/runner/accept.d.cts +2 -3
- package/dist/runner/accept.d.mts +2 -3
- package/dist/runner/accept.d.ts +2 -3
- package/dist/runner/adapter-usage.cjs +2 -2
- package/dist/runner/adapter-usage.cjs.map +1 -1
- package/dist/runner/adoption.cjs +14 -26
- package/dist/runner/adoption.cjs.map +1 -1
- package/dist/runner/adoption.d.cts +5 -13
- package/dist/runner/adoption.d.mts +5 -13
- package/dist/runner/adoption.d.ts +5 -13
- package/dist/runner/adoption.js +2 -4
- package/dist/runner/record.cjs +24 -18
- package/dist/runner/record.cjs.map +1 -1
- package/dist/runner/rename-experiment.cjs +5 -7
- package/dist/runner/rename-experiment.cjs.map +1 -1
- package/dist/runner/reuse-plan.cjs +37 -18
- package/dist/runner/reuse-plan.cjs.map +1 -1
- package/dist/runner/reuse-plan.d.cts +4 -1
- package/dist/runner/reuse-plan.d.mts +4 -1
- package/dist/runner/reuse-plan.d.ts +4 -1
- package/dist/runner/setup-prefix-plan.cjs +17 -12
- package/dist/runner/setup-prefix-plan.cjs.map +1 -1
- package/dist/runner/setup-prefix-plan.d.cts +0 -2
- package/dist/runner/setup-prefix-plan.d.mts +0 -2
- package/dist/runner/setup-prefix-plan.d.ts +0 -2
- package/dist/runner/setup-prefix-plan.js +8 -12
- package/dist/sandbox/backend.cjs +10 -1
- package/dist/sandbox/backend.cjs.map +1 -1
- package/dist/sandbox/backend.d.cts +16 -8
- package/dist/sandbox/backend.d.mts +16 -8
- package/dist/sandbox/backend.d.ts +16 -8
- package/dist/sandbox/backend.js +28 -26
- package/dist/sandbox/docker.cjs +7 -1
- package/dist/sandbox/docker.cjs.map +1 -1
- package/dist/sandbox/e2b-cache-repository.cjs +13 -3
- package/dist/sandbox/e2b-cache-repository.cjs.map +1 -1
- package/dist/sandbox/e2b-cache-repository.d.cts +3 -0
- package/dist/sandbox/e2b-cache-repository.d.mts +3 -0
- package/dist/sandbox/e2b-cache-repository.d.ts +3 -0
- package/dist/sandbox/e2b-cache-repository.js +16 -12
- package/dist/sandbox/e2b.cjs +2 -2
- package/dist/sandbox/e2b.cjs.map +1 -1
- package/dist/sandbox/incus/materialize.cjs +1 -1
- package/dist/sandbox/incus/materialize.cjs.map +1 -1
- package/dist/show/contribution.cjs +3 -3
- package/dist/show/contribution.cjs.map +1 -1
- package/dist/show/model.cjs +14 -13
- package/dist/show/model.cjs.map +1 -1
- package/dist/show/model.d.cts +7 -7
- package/dist/show/model.d.mts +7 -7
- package/dist/show/model.d.ts +7 -7
- package/dist/show/render.cjs +14 -0
- package/dist/show/render.cjs.map +1 -1
- package/dist/user-database/storage-worker.cjs +13 -3
- package/dist/user-database/storage-worker.cjs.map +1 -1
- package/dist/view/app-dist/.vite/manifest.json +2 -2
- package/dist/view/app-dist/assets/{index-CmVoXbwG.js → index-B3ijZRph.js} +17 -17
- package/dist/view/app-dist/assets/{quality-cost-scatter-BuLISaH4.js → quality-cost-scatter-B--DfJ9s.js} +1 -1
- package/dist/view/app-dist/index.html +1 -1
- package/dist/view/application-runtime.cjs +8 -0
- package/dist/view/application-runtime.cjs.map +1 -0
- package/dist/view/application-runtime.d.cts +9 -0
- package/dist/view/application-runtime.d.mts +9 -0
- package/dist/view/application-runtime.d.ts +9 -0
- package/dist/view/application-runtime.js +6 -0
- package/dist/view/application-runtime.js.map +1 -0
- package/dist/view/cli/contribution.cjs +5 -2
- package/dist/view/cli/contribution.cjs.map +1 -1
- package/dist/view/cli/contribution.d.cts +2 -1
- package/dist/view/cli/contribution.d.mts +2 -1
- package/dist/view/cli/contribution.d.ts +2 -1
- package/dist/view/function-runtime.mjs +1019 -456
- package/dist/view/http-protocol.d.cts +1 -9
- package/dist/view/http-protocol.d.mts +1 -9
- package/dist/view/http-protocol.d.ts +1 -9
- package/dist/view/inspection-host.cjs +39 -30
- package/dist/view/inspection-host.cjs.map +1 -1
- package/dist/view/inspection-host.d.cts +7545 -2
- package/dist/view/inspection-host.d.mts +7545 -2
- package/dist/view/inspection-host.d.ts +7545 -2
- package/dist/view/server.cjs +8 -5
- package/dist/view/server.cjs.map +1 -1
- package/dist/view/server.d.cts +4 -2
- package/dist/view/server.d.mts +4 -2
- package/dist/view/server.d.ts +4 -2
- package/docs-site/zh/reference/cli.mdx +1 -2
- package/docs-site/zh/tutorials/control-run-cost.mdx +61 -0
- package/docs-site/zh/tutorials/niceeval-taste-application.mdx +21 -0
- package/package.json +1 -1
|
@@ -1,10 +1,46 @@
|
|
|
1
1
|
import { Effect } from "effect";
|
|
2
|
+
import { type NonEmptyRecordIssues } from "../errors/record-errors.cjs";
|
|
2
3
|
import { type RecordContribution } from "../authoring.cjs";
|
|
4
|
+
import type { MemberDocument } from "../model/core.cjs";
|
|
5
|
+
import { type AttemptId, type RunId, type SlotId } from "../model/identifiers.cjs";
|
|
6
|
+
import { type RecordRoot } from "../platform/root.cjs";
|
|
7
|
+
import { type RecordReaderReadError } from "../reader/errors.cjs";
|
|
3
8
|
import type { RecordWriteError } from "../writer/types.cjs";
|
|
4
|
-
import type { AttemptWriteSession, RecordHostSDK, ReferenceRunWriteSession, RunWriteSession } from "./types.cjs";
|
|
9
|
+
import type { AttemptWriteSession, RecordHostSDK, RecordReadSession, RecordSelection, ReferenceRunWriteSession, RunWriteSession, SelectedAttemptRef } from "./types.cjs";
|
|
10
|
+
import type { SourceBarrierRequest } from "../sqlite/types.cjs";
|
|
11
|
+
declare const exactReferenceBrand: unique symbol;
|
|
12
|
+
/** Host-private proof of an exact publication, independent of a reader. */
|
|
13
|
+
export interface PlanningExactReference {
|
|
14
|
+
readonly record: RecordRoot;
|
|
15
|
+
readonly originRunId: RunId;
|
|
16
|
+
readonly attemptId: AttemptId;
|
|
17
|
+
readonly publicationIdentity: NonNullable<SelectedAttemptRef["publicationIdentity"]>;
|
|
18
|
+
readonly [exactReferenceBrand]: true;
|
|
19
|
+
}
|
|
20
|
+
export declare function detachPlanningReference(reader: RecordReadSession, attempt: SelectedAttemptRef): PlanningExactReference | undefined;
|
|
21
|
+
/** Stages Core membership; the following binding transaction rechecks the publication CAS. */
|
|
22
|
+
export declare function stagePlanningReference(session: RunWriteSession | ReferenceRunWriteSession, input: {
|
|
23
|
+
readonly slotId: SlotId;
|
|
24
|
+
readonly action: "carried" | "accepted";
|
|
25
|
+
readonly reference: PlanningExactReference;
|
|
26
|
+
}): Effect.Effect<void, RecordWriteError>;
|
|
27
|
+
export declare function selectPlanningLocator(reader: RecordReadSession, locator: string): Effect.Effect<RecordSelection, RecordReaderReadError>;
|
|
28
|
+
/** Select barriers before loading Core; fetch only those barriers and necessary origins. */
|
|
29
|
+
export declare function selectPlanningSources(reader: RecordReadSession, positions: readonly SourceBarrierRequest[]): Effect.Effect<Readonly<{
|
|
30
|
+
selection: RecordSelection;
|
|
31
|
+
resources: readonly import("../../run/storage/types.cjs").ReadableRunResource[];
|
|
32
|
+
members: Map<RunId, readonly {
|
|
33
|
+
readonly document: MemberDocument;
|
|
34
|
+
readonly bindingRevision?: number;
|
|
35
|
+
readonly attempt: SelectedAttemptRef | null;
|
|
36
|
+
}[]>;
|
|
37
|
+
issuesByExperiment: Map<string, NonEmptyRecordIssues>;
|
|
38
|
+
experimentByRun: Map<string, string>;
|
|
39
|
+
}>, RecordReaderReadError, never>;
|
|
5
40
|
export declare function writerGenerationForRunSession(session: RunWriteSession | ReferenceRunWriteSession): string | undefined;
|
|
6
41
|
export declare function discardAttemptWriteSession(session: AttemptWriteSession): Effect.Effect<void, RecordWriteError>;
|
|
7
42
|
export declare function makeRecordHost(input: {
|
|
8
43
|
readonly records: readonly RecordContribution[];
|
|
9
44
|
}): RecordHostSDK;
|
|
10
45
|
export declare const recordHost: RecordHostSDK;
|
|
46
|
+
export {};
|
|
@@ -1,10 +1,46 @@
|
|
|
1
1
|
import { Effect } from "effect";
|
|
2
|
+
import { type NonEmptyRecordIssues } from "../errors/record-errors.mjs";
|
|
2
3
|
import { type RecordContribution } from "../authoring.mjs";
|
|
4
|
+
import type { MemberDocument } from "../model/core.mjs";
|
|
5
|
+
import { type AttemptId, type RunId, type SlotId } from "../model/identifiers.mjs";
|
|
6
|
+
import { type RecordRoot } from "../platform/root.mjs";
|
|
7
|
+
import { type RecordReaderReadError } from "../reader/errors.mjs";
|
|
3
8
|
import type { RecordWriteError } from "../writer/types.mjs";
|
|
4
|
-
import type { AttemptWriteSession, RecordHostSDK, ReferenceRunWriteSession, RunWriteSession } from "./types.mjs";
|
|
9
|
+
import type { AttemptWriteSession, RecordHostSDK, RecordReadSession, RecordSelection, ReferenceRunWriteSession, RunWriteSession, SelectedAttemptRef } from "./types.mjs";
|
|
10
|
+
import type { SourceBarrierRequest } from "../sqlite/types.mjs";
|
|
11
|
+
declare const exactReferenceBrand: unique symbol;
|
|
12
|
+
/** Host-private proof of an exact publication, independent of a reader. */
|
|
13
|
+
export interface PlanningExactReference {
|
|
14
|
+
readonly record: RecordRoot;
|
|
15
|
+
readonly originRunId: RunId;
|
|
16
|
+
readonly attemptId: AttemptId;
|
|
17
|
+
readonly publicationIdentity: NonNullable<SelectedAttemptRef["publicationIdentity"]>;
|
|
18
|
+
readonly [exactReferenceBrand]: true;
|
|
19
|
+
}
|
|
20
|
+
export declare function detachPlanningReference(reader: RecordReadSession, attempt: SelectedAttemptRef): PlanningExactReference | undefined;
|
|
21
|
+
/** Stages Core membership; the following binding transaction rechecks the publication CAS. */
|
|
22
|
+
export declare function stagePlanningReference(session: RunWriteSession | ReferenceRunWriteSession, input: {
|
|
23
|
+
readonly slotId: SlotId;
|
|
24
|
+
readonly action: "carried" | "accepted";
|
|
25
|
+
readonly reference: PlanningExactReference;
|
|
26
|
+
}): Effect.Effect<void, RecordWriteError>;
|
|
27
|
+
export declare function selectPlanningLocator(reader: RecordReadSession, locator: string): Effect.Effect<RecordSelection, RecordReaderReadError>;
|
|
28
|
+
/** Select barriers before loading Core; fetch only those barriers and necessary origins. */
|
|
29
|
+
export declare function selectPlanningSources(reader: RecordReadSession, positions: readonly SourceBarrierRequest[]): Effect.Effect<Readonly<{
|
|
30
|
+
selection: RecordSelection;
|
|
31
|
+
resources: readonly import("../../run/storage/types.mjs").ReadableRunResource[];
|
|
32
|
+
members: Map<RunId, readonly {
|
|
33
|
+
readonly document: MemberDocument;
|
|
34
|
+
readonly bindingRevision?: number;
|
|
35
|
+
readonly attempt: SelectedAttemptRef | null;
|
|
36
|
+
}[]>;
|
|
37
|
+
issuesByExperiment: Map<string, NonEmptyRecordIssues>;
|
|
38
|
+
experimentByRun: Map<string, string>;
|
|
39
|
+
}>, RecordReaderReadError, never>;
|
|
5
40
|
export declare function writerGenerationForRunSession(session: RunWriteSession | ReferenceRunWriteSession): string | undefined;
|
|
6
41
|
export declare function discardAttemptWriteSession(session: AttemptWriteSession): Effect.Effect<void, RecordWriteError>;
|
|
7
42
|
export declare function makeRecordHost(input: {
|
|
8
43
|
readonly records: readonly RecordContribution[];
|
|
9
44
|
}): RecordHostSDK;
|
|
10
45
|
export declare const recordHost: RecordHostSDK;
|
|
46
|
+
export {};
|
|
@@ -1,10 +1,46 @@
|
|
|
1
1
|
import { Effect } from "effect";
|
|
2
|
+
import { type NonEmptyRecordIssues } from "../errors/record-errors.js";
|
|
2
3
|
import { type RecordContribution } from "../authoring.js";
|
|
4
|
+
import type { MemberDocument } from "../model/core.js";
|
|
5
|
+
import { type AttemptId, type RunId, type SlotId } from "../model/identifiers.js";
|
|
6
|
+
import { type RecordRoot } from "../platform/root.js";
|
|
7
|
+
import { type RecordReaderReadError } from "../reader/errors.js";
|
|
3
8
|
import type { RecordWriteError } from "../writer/types.js";
|
|
4
|
-
import type { AttemptWriteSession, RecordHostSDK, ReferenceRunWriteSession, RunWriteSession } from "./types.js";
|
|
9
|
+
import type { AttemptWriteSession, RecordHostSDK, RecordReadSession, RecordSelection, ReferenceRunWriteSession, RunWriteSession, SelectedAttemptRef } from "./types.js";
|
|
10
|
+
import type { SourceBarrierRequest } from "../sqlite/types.js";
|
|
11
|
+
declare const exactReferenceBrand: unique symbol;
|
|
12
|
+
/** Host-private proof of an exact publication, independent of a reader. */
|
|
13
|
+
export interface PlanningExactReference {
|
|
14
|
+
readonly record: RecordRoot;
|
|
15
|
+
readonly originRunId: RunId;
|
|
16
|
+
readonly attemptId: AttemptId;
|
|
17
|
+
readonly publicationIdentity: NonNullable<SelectedAttemptRef["publicationIdentity"]>;
|
|
18
|
+
readonly [exactReferenceBrand]: true;
|
|
19
|
+
}
|
|
20
|
+
export declare function detachPlanningReference(reader: RecordReadSession, attempt: SelectedAttemptRef): PlanningExactReference | undefined;
|
|
21
|
+
/** Stages Core membership; the following binding transaction rechecks the publication CAS. */
|
|
22
|
+
export declare function stagePlanningReference(session: RunWriteSession | ReferenceRunWriteSession, input: {
|
|
23
|
+
readonly slotId: SlotId;
|
|
24
|
+
readonly action: "carried" | "accepted";
|
|
25
|
+
readonly reference: PlanningExactReference;
|
|
26
|
+
}): Effect.Effect<void, RecordWriteError>;
|
|
27
|
+
export declare function selectPlanningLocator(reader: RecordReadSession, locator: string): Effect.Effect<RecordSelection, RecordReaderReadError>;
|
|
28
|
+
/** Select barriers before loading Core; fetch only those barriers and necessary origins. */
|
|
29
|
+
export declare function selectPlanningSources(reader: RecordReadSession, positions: readonly SourceBarrierRequest[]): Effect.Effect<Readonly<{
|
|
30
|
+
selection: RecordSelection;
|
|
31
|
+
resources: readonly import("../../run/storage/types.js").ReadableRunResource[];
|
|
32
|
+
members: Map<RunId, readonly {
|
|
33
|
+
readonly document: MemberDocument;
|
|
34
|
+
readonly bindingRevision?: number;
|
|
35
|
+
readonly attempt: SelectedAttemptRef | null;
|
|
36
|
+
}[]>;
|
|
37
|
+
issuesByExperiment: Map<string, NonEmptyRecordIssues>;
|
|
38
|
+
experimentByRun: Map<string, string>;
|
|
39
|
+
}>, RecordReaderReadError, never>;
|
|
5
40
|
export declare function writerGenerationForRunSession(session: RunWriteSession | ReferenceRunWriteSession): string | undefined;
|
|
6
41
|
export declare function discardAttemptWriteSession(session: AttemptWriteSession): Effect.Effect<void, RecordWriteError>;
|
|
7
42
|
export declare function makeRecordHost(input: {
|
|
8
43
|
readonly records: readonly RecordContribution[];
|
|
9
44
|
}): RecordHostSDK;
|
|
10
45
|
export declare const recordHost: RecordHostSDK;
|
|
46
|
+
export {};
|
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
import { createRequire as __niceevalCreateRequire } from "node:module";
|
|
2
2
|
const __niceevalRequire = __niceevalCreateRequire(import.meta.url);
|
|
3
3
|
const __niceevalCanonical = __niceevalRequire("./sqlite-host.cjs");
|
|
4
|
-
const __niceevalExport0 = __niceevalCanonical["
|
|
5
|
-
export { __niceevalExport0 as
|
|
6
|
-
const __niceevalExport1 = __niceevalCanonical["
|
|
7
|
-
export { __niceevalExport1 as
|
|
8
|
-
const __niceevalExport2 = __niceevalCanonical["
|
|
9
|
-
export { __niceevalExport2 as
|
|
10
|
-
const __niceevalExport3 = __niceevalCanonical["
|
|
11
|
-
export { __niceevalExport3 as
|
|
4
|
+
const __niceevalExport0 = __niceevalCanonical["detachPlanningReference"];
|
|
5
|
+
export { __niceevalExport0 as detachPlanningReference };
|
|
6
|
+
const __niceevalExport1 = __niceevalCanonical["discardAttemptWriteSession"];
|
|
7
|
+
export { __niceevalExport1 as discardAttemptWriteSession };
|
|
8
|
+
const __niceevalExport2 = __niceevalCanonical["makeRecordHost"];
|
|
9
|
+
export { __niceevalExport2 as makeRecordHost };
|
|
10
|
+
const __niceevalExport3 = __niceevalCanonical["recordHost"];
|
|
11
|
+
export { __niceevalExport3 as recordHost };
|
|
12
|
+
const __niceevalExport4 = __niceevalCanonical["selectPlanningLocator"];
|
|
13
|
+
export { __niceevalExport4 as selectPlanningLocator };
|
|
14
|
+
const __niceevalExport5 = __niceevalCanonical["selectPlanningSources"];
|
|
15
|
+
export { __niceevalExport5 as selectPlanningSources };
|
|
16
|
+
const __niceevalExport6 = __niceevalCanonical["stagePlanningReference"];
|
|
17
|
+
export { __niceevalExport6 as stagePlanningReference };
|
|
18
|
+
const __niceevalExport7 = __niceevalCanonical["writerGenerationForRunSession"];
|
|
19
|
+
export { __niceevalExport7 as writerGenerationForRunSession };
|
|
12
20
|
//# sourceMappingURL=sqlite-host.js.map
|
|
@@ -43,7 +43,7 @@ function readIncomplete(path) {
|
|
|
43
43
|
const connection = (0, database_ts_1.openRecordMaintenance)(path);
|
|
44
44
|
try {
|
|
45
45
|
(0, database_ts_1.validateExactSchema)(connection);
|
|
46
|
-
const rows = connection.db.prepare("SELECT run_id FROM
|
|
46
|
+
const rows = connection.db.prepare("SELECT run_id FROM ne19_runs WHERE status <> 'sealed' ORDER BY run_id LIMIT ?").all(types_ts_1.RECORD_MAINTENANCE_MAXIMUM_RUNS + 1);
|
|
47
47
|
if (rows.length > types_ts_1.RECORD_MAINTENANCE_MAXIMUM_RUNS) {
|
|
48
48
|
throw new errors_ts_1.SqliteRecordError("record-resource-limit-exceeded", "inspect-incomplete", "incomplete Run discovery exceeded its bounded limit");
|
|
49
49
|
}
|
|
@@ -66,8 +66,8 @@ function cleanRows(path, runIds) {
|
|
|
66
66
|
const connection = (0, database_ts_1.openRecordMaintenance)(path);
|
|
67
67
|
try {
|
|
68
68
|
(0, database_ts_1.validateExactSchema)(connection);
|
|
69
|
-
const statement = connection.db.prepare("DELETE FROM
|
|
70
|
-
const reopenSealing = connection.db.prepare(`UPDATE
|
|
69
|
+
const statement = connection.db.prepare("DELETE FROM ne19_runs WHERE run_id = ? AND status <> 'sealed'");
|
|
70
|
+
const reopenSealing = connection.db.prepare(`UPDATE ne19_runs SET status='open',candidate_seal_identity=NULL,
|
|
71
71
|
candidate_seal_entry_count=NULL,candidate_seal_staged_count=0 WHERE run_id=? AND status='sealing'`);
|
|
72
72
|
const deleted = [];
|
|
73
73
|
const skipped = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["runtime.ts"],"names":[],"mappings":";;;AAgGA,sDAEC;AAlGD,qCAAqC;AAErC,mCAAgD;AAChD,0EAAyE;AACzE,4DAAsD;AACtD,4DAA+E;AAE/E,iDAAsD;AACtD,uDAAyJ;AACzJ,mDAAwD;AACxD,yCAA0M;AAC1M,SAAS,eAAe,CAAC,MAAwB;IAC7C,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,yCAAwB,CAAC,CAAC,CAAC;AAC9E,CAAC;AACD,SAAS,aAAa,CAAC,KAAY;IAC/B,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACpC,CAAC;AACD,SAAS,aAAa,CAAC,SAAiB,EAAE,KAAc;IACpD,OAAO,KAAK,YAAY,6BAAiB;QACrC,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,IAAI,6BAAiB,CAAC,qBAAqB,EAAE,SAAS,EAAE,2BAA2B,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;AAC1G,CAAC;AACD,SAAS,YAAY,CAAC,IAAkD;IACpE,MAAM,KAAK,GAAG,IAAA,yBAAe,EAAC,IAAI,CAAC,CAAC;IACpC,IAAI,KAAK,KAAK,SAAS;QACnB,MAAM,IAAI,6BAAiB,CAAC,yBAAyB,EAAE,QAAQ,EAAE,wBAAwB,CAAC,CAAC;IAC/F,OAAO,IAAA,8BAAgB,EAAC,KAAK,CAAC,YAAY,CAAC,CAAC;AAChD,CAAC;AACD,SAAS,eAAe,CAAC,IAAkD;IACvE,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,UAAU,GAAG,IAAA,0CAA4B,EAAC,IAAI,CAAC,CAAC;IACtD,IAAI,UAAU,CAAC,KAAK,KAAK,SAAS;QAC9B,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IAChD,MAAM,IAAI,6BAAiB,CAAC,2BAA2B,EAAE,qBAAqB,EAAE,UAAU,CAAC,KAAK,KAAK,SAAS;QAC1G,CAAC,CAAC,kDAAkD;QACpD,CAAC,CAAC,0CAA0C,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;AACzE,CAAC;AACD,SAAS,cAAc,CAAC,IAAY;IAChC,IAAI,CAAC,IAAA,oBAAU,EAAC,IAAI,CAAC;QACjB,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC7B,MAAM,UAAU,GAAG,IAAA,mCAAqB,EAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,CAAC;QACD,IAAA,iCAAmB,EAAC,UAAU,CAAC,CAAC;QAChC,MAAM,IAAI,GAAG,UAAU,CAAC,EAAE,CAAC,OAAO,CAAC,+EAA+E,CAAC,CAAC,GAAG,CAAC,0CAA+B,GAAG,CAAC,CAAyD,CAAC;QACrN,IAAI,IAAI,CAAC,MAAM,GAAG,0CAA+B,EAAE,CAAC;YAChD,MAAM,IAAI,6BAAiB,CAAC,gCAAgC,EAAE,oBAAoB,EAAE,qDAAqD,CAAC,CAAC;QAC/I,CAAC;QACD,MAAM,MAAM,GAA0B,EAAE,CAAC;QACzC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,OAAO,GAAG,eAAM,CAAC,mBAAmB,CAAC,4BAAW,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACpE,IAAI,eAAM,CAAC,SAAS,CAAC,OAAO,CAAC;gBACzB,MAAM,IAAI,6BAAiB,CAAC,yBAAyB,EAAE,oBAAoB,EAAE,wBAAwB,CAAC,CAAC;YAC3G,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;YACO,CAAC;QACL,IAAA,iCAAmB,EAAC,UAAU,CAAC,CAAC;IACpC,CAAC;AACL,CAAC;AACD,SAAS,SAAS,CAAC,IAAY,EAAE,MAAwB;IACrD,IAAI,CAAC,IAAA,oBAAU,EAAC,IAAI,CAAC;QACjB,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;IAC9F,MAAM,UAAU,GAAG,IAAA,mCAAqB,EAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,CAAC;QACD,IAAA,iCAAmB,EAAC,UAAU,CAAC,CAAC;QAChC,MAAM,SAAS,GAAG,UAAU,CAAC,EAAE,CAAC,OAAO,CAAC,+DAA+D,CAAC,CAAC;QACzG,MAAM,aAAa,GAAG,UAAU,CAAC,EAAE,CAAC,OAAO,CAAC;wGACoD,CAAC,CAAC;QAClG,MAAM,OAAO,GAAY,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAY,EAAE,CAAC;QAC5B,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACtC,IAAI,CAAC;YACD,KAAK,MAAM,KAAK,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1C,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACzB,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACrC,IAAI,OAAO,CAAC,OAAO,KAAK,EAAE;oBACtB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;oBAEpB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5B,CAAC;YACD,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,KAAK,EAAE,CAAC;YACX,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/B,MAAM,KAAK,CAAC;QAChB,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC/F,CAAC;YACO,CAAC;QACL,IAAA,iCAAmB,EAAC,UAAU,CAAC,CAAC;IACpC,CAAC;AACL,CAAC;AACD,SAAS,oBAAoB,CAAC,KAAY;IACtC,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,CAAC,CAAC;AAC9F,CAAC;AACD,SAAgB,qBAAqB,CAAC,cAA8C;IAChF,OAAO,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC;AAC9G,CAAC;AACM,MAAM,qBAAqB,GAA0B,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,eAAM,CAAC,MAAM,CAAC,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IACxG,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,eAAM,CAAC,GAAG,CAAC;QAC3B,GAAG,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC;QAChC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,oBAAoB,EAAE,KAAK,CAAC;KAC/D,CAAC,CAAC;IACH,IAAI,IAAI,KAAK,SAAS;QAClB,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC7B,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,qCAAkB,CAAC;IAC/C,KAAK,CAAC,CAAC,YAAY,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;IACjD,OAAO,KAAK,CAAC,CAAC,eAAM,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,oBAAoB,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;AAChI,CAAC,CAAC,CAAC,CAAC;AAVS,QAAA,qBAAqB,yBAU9B;AACG,MAAM,4BAA4B,GAAiC,CAAC,KAAK,EAAE,EAAE,CAAC,eAAM,CAAC,GAAG,CAAC,IAAA,6BAAqB,EAAC,KAAK,CAAC,EAAE,qBAAqB,CAAC,CAAC;AAAxI,QAAA,4BAA4B,gCAA4G;AAC9I,MAAM,mBAAmB,GAAwB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,eAAM,CAAC,MAAM,CAAC,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC5G,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,eAAM,CAAC,GAAG,CAAC;QAC3B,GAAG,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC;QAChC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,kBAAkB,EAAE,KAAK,CAAC;KAC7D,CAAC,CAAC;IACH,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACrB,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC3F,CAAC;IACD,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,qCAAkB,CAAC;IAC/C,KAAK,CAAC,CAAC,YAAY,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;IACjD,OAAO,KAAK,CAAC,CAAC,eAAM,CAAC,eAAe,CAAC,eAAM,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AACzJ,CAAC,CAAC,CAAC,CAAC;AAXS,QAAA,mBAAmB,uBAW5B","sourcesContent":["import { existsSync } from \"node:fs\";\nimport type { SQLOutputValue } from \"node:sqlite\";\nimport { Effect, Result, Schema } from \"effect\";\nimport { RecordCoordination } from \"../../coordination/record-leases.ts\";\nimport { RunIdSchema } from \"../codec/identifiers.ts\";\nimport { compareCanonicalIdentity, type RunId } from \"../model/identifiers.ts\";\nimport type { RecordIncompleteRunWarning } from \"../model/read-state.ts\";\nimport { recordRootPaths } from \"../platform/root.ts\";\nimport { closeRecordDatabase, inspectProjectRecordDatabase, openRecordMaintenance, recordSqlitePath, validateExactSchema, } from \"../sqlite/database.ts\";\nimport { SqliteRecordError } from \"../sqlite/errors.ts\";\nimport { RECORD_MAINTENANCE_MAXIMUM_RUNS, type CleanIncompleteRuns, type InspectIncompleteRunWarnings, type InspectIncompleteRuns, type RecordCleanReceipt, type RecordIncompleteRun, } from \"./types.ts\";\nfunction canonicalRunIds(runIds: readonly RunId[]): readonly RunId[] {\n return Object.freeze([...new Set(runIds)].sort(compareCanonicalIdentity));\n}\nfunction incompleteRun(runId: RunId): RecordIncompleteRun {\n return Object.freeze({ runId });\n}\nfunction sqliteFailure(operation: string, cause: unknown): SqliteRecordError {\n return cause instanceof SqliteRecordError\n ? cause\n : new SqliteRecordError(\"record-sqlite-error\", operation, \"Record maintenance failed\", { cause });\n}\nfunction databasePath(root: Parameters<InspectIncompleteRuns>[0][\"root\"]): string {\n const paths = recordRootPaths(root);\n if (paths === undefined)\n throw new SqliteRecordError(\"record-database-invalid\", \"locate\", \"Record root is invalid\");\n return recordSqlitePath(paths.portableRoot);\n}\nfunction maintenancePath(root: Parameters<InspectIncompleteRuns>[0][\"root\"]): string | undefined {\n const path = databasePath(root);\n const inspection = inspectProjectRecordDatabase(path);\n if (inspection.state === \"current\")\n return inspection.exists ? path : undefined;\n throw new SqliteRecordError(\"record-schema-unsupported\", \"inspect-maintenance\", inspection.state === \"foreign\"\n ? \"foreign SQLite database is not a ProjectDatabase\"\n : `Record database format is unsupported: ${inspection.format}`);\n}\nfunction readIncomplete(path: string): readonly RecordIncompleteRun[] {\n if (!existsSync(path))\n return Object.freeze([]);\n const connection = openRecordMaintenance(path);\n try {\n validateExactSchema(connection);\n const rows = connection.db.prepare(\"SELECT run_id FROM ne18_runs WHERE status <> 'sealed' ORDER BY run_id LIMIT ?\").all(RECORD_MAINTENANCE_MAXIMUM_RUNS + 1) as unknown as readonly Record<string, SQLOutputValue>[];\n if (rows.length > RECORD_MAINTENANCE_MAXIMUM_RUNS) {\n throw new SqliteRecordError(\"record-resource-limit-exceeded\", \"inspect-incomplete\", \"incomplete Run discovery exceeded its bounded limit\");\n }\n const result: RecordIncompleteRun[] = [];\n for (const row of rows) {\n const decoded = Schema.decodeUnknownResult(RunIdSchema)(row.run_id);\n if (Result.isFailure(decoded))\n throw new SqliteRecordError(\"record-database-invalid\", \"inspect-incomplete\", \"runs.run_id is invalid\");\n result.push(incompleteRun(decoded.success));\n }\n return Object.freeze(result);\n }\n finally {\n closeRecordDatabase(connection);\n }\n}\nfunction cleanRows(path: string, runIds: readonly RunId[]): RecordCleanReceipt {\n if (!existsSync(path))\n return Object.freeze({ deleted: Object.freeze([]), skipped: Object.freeze([...runIds]) });\n const connection = openRecordMaintenance(path);\n try {\n validateExactSchema(connection);\n const statement = connection.db.prepare(\"DELETE FROM ne18_runs WHERE run_id = ? AND status <> 'sealed'\");\n const reopenSealing = connection.db.prepare(`UPDATE ne18_runs SET status='open',candidate_seal_identity=NULL,\n candidate_seal_entry_count=NULL,candidate_seal_staged_count=0 WHERE run_id=? AND status='sealing'`);\n const deleted: RunId[] = [];\n const skipped: RunId[] = [];\n connection.db.exec(\"BEGIN IMMEDIATE\");\n try {\n for (const runId of canonicalRunIds(runIds)) {\n reopenSealing.run(runId);\n const receipt = statement.run(runId);\n if (receipt.changes === 1n)\n deleted.push(runId);\n else\n skipped.push(runId);\n }\n connection.db.exec(\"COMMIT\");\n }\n catch (cause) {\n connection.db.exec(\"ROLLBACK\");\n throw cause;\n }\n return Object.freeze({ deleted: Object.freeze(deleted), skipped: Object.freeze(skipped) });\n }\n finally {\n closeRecordDatabase(connection);\n }\n}\nfunction incompleteRunWarning(runId: RunId): RecordIncompleteRunWarning {\n return Object.freeze({ code: \"incomplete-run\", runId, cleanupCommand: \"niceeval clean\" });\n}\nexport function incompleteRunWarnings(incompleteRuns: readonly RecordIncompleteRun[]): readonly RecordIncompleteRunWarning[] {\n return Object.freeze(canonicalRunIds(incompleteRuns.map(({ runId }) => runId)).map(incompleteRunWarning));\n}\nexport const inspectIncompleteRuns: InspectIncompleteRuns = ({ root }) => Effect.scoped(Effect.gen(function* () {\n const path = yield* Effect.try({\n try: () => maintenancePath(root),\n catch: (cause) => sqliteFailure(\"inspect-incomplete\", cause),\n });\n if (path === undefined)\n return Object.freeze([]);\n const coordination = yield* RecordCoordination;\n yield* coordination.enterRecordMaintenance(root);\n return yield* Effect.try({ try: () => readIncomplete(path), catch: (cause) => sqliteFailure(\"inspect-incomplete\", cause) });\n}));\nexport const inspectIncompleteRunWarnings: InspectIncompleteRunWarnings = (input) => Effect.map(inspectIncompleteRuns(input), incompleteRunWarnings);\nexport const cleanIncompleteRuns: CleanIncompleteRuns = ({ root, runIds }) => Effect.scoped(Effect.gen(function* () {\n const path = yield* Effect.try({\n try: () => maintenancePath(root),\n catch: (cause) => sqliteFailure(\"clean-incomplete\", cause),\n });\n if (path === undefined) {\n return Object.freeze({ deleted: Object.freeze([]), skipped: canonicalRunIds(runIds) });\n }\n const coordination = yield* RecordCoordination;\n yield* coordination.enterRecordMaintenance(root);\n return yield* Effect.uninterruptible(Effect.try({ try: () => cleanRows(path, runIds), catch: (cause) => sqliteFailure(\"clean-incomplete\", cause) }));\n}));\n"]}
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from \"node:fs\";\nimport type { SQLOutputValue } from \"node:sqlite\";\nimport { Effect, Result, Schema } from \"effect\";\nimport { RecordCoordination } from \"../../coordination/record-leases.ts\";\nimport { RunIdSchema } from \"../codec/identifiers.ts\";\nimport { compareCanonicalIdentity, type RunId } from \"../model/identifiers.ts\";\nimport type { RecordIncompleteRunWarning } from \"../model/read-state.ts\";\nimport { recordRootPaths } from \"../platform/root.ts\";\nimport { closeRecordDatabase, inspectProjectRecordDatabase, openRecordMaintenance, recordSqlitePath, validateExactSchema, } from \"../sqlite/database.ts\";\nimport { SqliteRecordError } from \"../sqlite/errors.ts\";\nimport { RECORD_MAINTENANCE_MAXIMUM_RUNS, type CleanIncompleteRuns, type InspectIncompleteRunWarnings, type InspectIncompleteRuns, type RecordCleanReceipt, type RecordIncompleteRun, } from \"./types.ts\";\nfunction canonicalRunIds(runIds: readonly RunId[]): readonly RunId[] {\n return Object.freeze([...new Set(runIds)].sort(compareCanonicalIdentity));\n}\nfunction incompleteRun(runId: RunId): RecordIncompleteRun {\n return Object.freeze({ runId });\n}\nfunction sqliteFailure(operation: string, cause: unknown): SqliteRecordError {\n return cause instanceof SqliteRecordError\n ? cause\n : new SqliteRecordError(\"record-sqlite-error\", operation, \"Record maintenance failed\", { cause });\n}\nfunction databasePath(root: Parameters<InspectIncompleteRuns>[0][\"root\"]): string {\n const paths = recordRootPaths(root);\n if (paths === undefined)\n throw new SqliteRecordError(\"record-database-invalid\", \"locate\", \"Record root is invalid\");\n return recordSqlitePath(paths.portableRoot);\n}\nfunction maintenancePath(root: Parameters<InspectIncompleteRuns>[0][\"root\"]): string | undefined {\n const path = databasePath(root);\n const inspection = inspectProjectRecordDatabase(path);\n if (inspection.state === \"current\")\n return inspection.exists ? path : undefined;\n throw new SqliteRecordError(\"record-schema-unsupported\", \"inspect-maintenance\", inspection.state === \"foreign\"\n ? \"foreign SQLite database is not a ProjectDatabase\"\n : `Record database format is unsupported: ${inspection.format}`);\n}\nfunction readIncomplete(path: string): readonly RecordIncompleteRun[] {\n if (!existsSync(path))\n return Object.freeze([]);\n const connection = openRecordMaintenance(path);\n try {\n validateExactSchema(connection);\n const rows = connection.db.prepare(\"SELECT run_id FROM ne19_runs WHERE status <> 'sealed' ORDER BY run_id LIMIT ?\").all(RECORD_MAINTENANCE_MAXIMUM_RUNS + 1) as unknown as readonly Record<string, SQLOutputValue>[];\n if (rows.length > RECORD_MAINTENANCE_MAXIMUM_RUNS) {\n throw new SqliteRecordError(\"record-resource-limit-exceeded\", \"inspect-incomplete\", \"incomplete Run discovery exceeded its bounded limit\");\n }\n const result: RecordIncompleteRun[] = [];\n for (const row of rows) {\n const decoded = Schema.decodeUnknownResult(RunIdSchema)(row.run_id);\n if (Result.isFailure(decoded))\n throw new SqliteRecordError(\"record-database-invalid\", \"inspect-incomplete\", \"runs.run_id is invalid\");\n result.push(incompleteRun(decoded.success));\n }\n return Object.freeze(result);\n }\n finally {\n closeRecordDatabase(connection);\n }\n}\nfunction cleanRows(path: string, runIds: readonly RunId[]): RecordCleanReceipt {\n if (!existsSync(path))\n return Object.freeze({ deleted: Object.freeze([]), skipped: Object.freeze([...runIds]) });\n const connection = openRecordMaintenance(path);\n try {\n validateExactSchema(connection);\n const statement = connection.db.prepare(\"DELETE FROM ne19_runs WHERE run_id = ? AND status <> 'sealed'\");\n const reopenSealing = connection.db.prepare(`UPDATE ne19_runs SET status='open',candidate_seal_identity=NULL,\n candidate_seal_entry_count=NULL,candidate_seal_staged_count=0 WHERE run_id=? AND status='sealing'`);\n const deleted: RunId[] = [];\n const skipped: RunId[] = [];\n connection.db.exec(\"BEGIN IMMEDIATE\");\n try {\n for (const runId of canonicalRunIds(runIds)) {\n reopenSealing.run(runId);\n const receipt = statement.run(runId);\n if (receipt.changes === 1n)\n deleted.push(runId);\n else\n skipped.push(runId);\n }\n connection.db.exec(\"COMMIT\");\n }\n catch (cause) {\n connection.db.exec(\"ROLLBACK\");\n throw cause;\n }\n return Object.freeze({ deleted: Object.freeze(deleted), skipped: Object.freeze(skipped) });\n }\n finally {\n closeRecordDatabase(connection);\n }\n}\nfunction incompleteRunWarning(runId: RunId): RecordIncompleteRunWarning {\n return Object.freeze({ code: \"incomplete-run\", runId, cleanupCommand: \"niceeval clean\" });\n}\nexport function incompleteRunWarnings(incompleteRuns: readonly RecordIncompleteRun[]): readonly RecordIncompleteRunWarning[] {\n return Object.freeze(canonicalRunIds(incompleteRuns.map(({ runId }) => runId)).map(incompleteRunWarning));\n}\nexport const inspectIncompleteRuns: InspectIncompleteRuns = ({ root }) => Effect.scoped(Effect.gen(function* () {\n const path = yield* Effect.try({\n try: () => maintenancePath(root),\n catch: (cause) => sqliteFailure(\"inspect-incomplete\", cause),\n });\n if (path === undefined)\n return Object.freeze([]);\n const coordination = yield* RecordCoordination;\n yield* coordination.enterRecordMaintenance(root);\n return yield* Effect.try({ try: () => readIncomplete(path), catch: (cause) => sqliteFailure(\"inspect-incomplete\", cause) });\n}));\nexport const inspectIncompleteRunWarnings: InspectIncompleteRunWarnings = (input) => Effect.map(inspectIncompleteRuns(input), incompleteRunWarnings);\nexport const cleanIncompleteRuns: CleanIncompleteRuns = ({ root, runIds }) => Effect.scoped(Effect.gen(function* () {\n const path = yield* Effect.try({\n try: () => maintenancePath(root),\n catch: (cause) => sqliteFailure(\"clean-incomplete\", cause),\n });\n if (path === undefined) {\n return Object.freeze({ deleted: Object.freeze([]), skipped: canonicalRunIds(runIds) });\n }\n const coordination = yield* RecordCoordination;\n yield* coordination.enterRecordMaintenance(root);\n return yield* Effect.uninterruptible(Effect.try({ try: () => cleanRows(path, runIds), catch: (cause) => sqliteFailure(\"clean-incomplete\", cause) }));\n}));\n"]}
|
|
@@ -45,7 +45,7 @@ function waitingTicket(row) {
|
|
|
45
45
|
};
|
|
46
46
|
}
|
|
47
47
|
function coordinationState(connection) {
|
|
48
|
-
const row = (0, database_ts_1.recordStatement)(connection, "SELECT * FROM
|
|
48
|
+
const row = (0, database_ts_1.recordStatement)(connection, "SELECT * FROM ne19_coordination_state WHERE singleton=1").get();
|
|
49
49
|
if (row === undefined)
|
|
50
50
|
invalid("coordination", "coordination_state singleton is missing");
|
|
51
51
|
const writerTicketId = row.writer_ticket_id;
|
|
@@ -88,7 +88,7 @@ function coordinationState(connection) {
|
|
|
88
88
|
};
|
|
89
89
|
}
|
|
90
90
|
function clearWriter(connection, owner) {
|
|
91
|
-
const result = (0, database_ts_1.recordStatement)(connection, `UPDATE
|
|
91
|
+
const result = (0, database_ts_1.recordStatement)(connection, `UPDATE ne19_coordination_state SET
|
|
92
92
|
writer_ticket_id=NULL,writer_sequence=NULL,writer_host=NULL,writer_pid=NULL,
|
|
93
93
|
writer_boot_id=NULL,writer_process_start=NULL,
|
|
94
94
|
writer_deadline=NULL,writer_enqueued_at=NULL,writer_nonce=NULL,
|
|
@@ -99,7 +99,7 @@ function clearWriter(connection, owner) {
|
|
|
99
99
|
invalid("coordination", "writer owner changed while clearing");
|
|
100
100
|
}
|
|
101
101
|
function clearBarrier(connection, owner) {
|
|
102
|
-
const result = (0, database_ts_1.recordStatement)(connection, `UPDATE
|
|
102
|
+
const result = (0, database_ts_1.recordStatement)(connection, `UPDATE ne19_coordination_state SET
|
|
103
103
|
barrier_id=NULL,barrier_nonce=NULL,barrier_host=NULL,barrier_pid=NULL,
|
|
104
104
|
barrier_boot_id=NULL,barrier_process_start=NULL,
|
|
105
105
|
barrier_deadline=NULL,barrier_requested_at=NULL,barrier_lease_expires_at=NULL,
|
|
@@ -112,10 +112,10 @@ function clearBarrier(connection, owner) {
|
|
|
112
112
|
function recover(connection, _now) {
|
|
113
113
|
for (let count = 0; count < MAXIMUM_STALE_HEADS_PER_TRANSACTION; count += 1) {
|
|
114
114
|
const head = waitingTicket((0, database_ts_1.recordStatement)(connection, `SELECT ticket_id,sequence,host,pid,boot_id,process_start,deadline,enqueued_at
|
|
115
|
-
FROM
|
|
115
|
+
FROM ne19_coordination_tickets ORDER BY sequence LIMIT 1`).get());
|
|
116
116
|
if (head === undefined || !isExactlyDead(head))
|
|
117
117
|
break;
|
|
118
|
-
(0, database_ts_1.recordStatement)(connection, "DELETE FROM
|
|
118
|
+
(0, database_ts_1.recordStatement)(connection, "DELETE FROM ne19_coordination_tickets WHERE ticket_id=? AND sequence=?")
|
|
119
119
|
.run(head.ticketId, head.sequence);
|
|
120
120
|
}
|
|
121
121
|
const state = coordinationState(connection);
|
|
@@ -137,16 +137,16 @@ function sameBarrier(owner, request) {
|
|
|
137
137
|
owner.processStart === request.processStart;
|
|
138
138
|
}
|
|
139
139
|
function runEnqueue(connection, request) {
|
|
140
|
-
const metadata = (0, database_ts_1.recordStatement)(connection, "SELECT barrier_state FROM
|
|
140
|
+
const metadata = (0, database_ts_1.recordStatement)(connection, "SELECT barrier_state FROM ne19_record_metadata WHERE singleton=1").get();
|
|
141
141
|
if (metadata === undefined)
|
|
142
142
|
invalid(request.operation, "ProjectDatabase barrier is missing");
|
|
143
143
|
if (metadata.barrier_state === "draining")
|
|
144
144
|
return { state: "blocked-by-barrier" };
|
|
145
145
|
if (metadata.barrier_state === "portable") {
|
|
146
146
|
const generation = (0, node_crypto_1.randomUUID)();
|
|
147
|
-
(0, database_ts_1.recordStatement)(connection, `UPDATE
|
|
147
|
+
(0, database_ts_1.recordStatement)(connection, `UPDATE ne19_record_metadata SET barrier_state='open',storage_generation=?,portable_generation=NULL,
|
|
148
148
|
portable_revision=NULL,portable_gate_id=NULL WHERE singleton=1 AND barrier_state='portable'`).run(generation);
|
|
149
|
-
(0, database_ts_1.recordStatement)(connection, "UPDATE
|
|
149
|
+
(0, database_ts_1.recordStatement)(connection, "UPDATE ne19_coordination_state SET operational_generation=?,revision=revision+1 WHERE singleton=1")
|
|
150
150
|
.run(generation);
|
|
151
151
|
}
|
|
152
152
|
else if (metadata.barrier_state !== "open") {
|
|
@@ -154,7 +154,7 @@ function runEnqueue(connection, request) {
|
|
|
154
154
|
}
|
|
155
155
|
recover(connection, request.enqueuedAt);
|
|
156
156
|
const existing = waitingTicket((0, database_ts_1.recordStatement)(connection, `SELECT ticket_id,sequence,host,pid,boot_id,process_start,deadline,enqueued_at
|
|
157
|
-
FROM
|
|
157
|
+
FROM ne19_coordination_tickets WHERE ticket_id=?`).get(request.ticketId));
|
|
158
158
|
if (existing !== undefined) {
|
|
159
159
|
if (existing.host !== request.host || existing.pid !== request.pid ||
|
|
160
160
|
existing.bootId !== request.bootId || existing.processStart !== request.processStart ||
|
|
@@ -169,10 +169,10 @@ function runEnqueue(connection, request) {
|
|
|
169
169
|
if (state.nextWriterSequence >= Number.MAX_SAFE_INTEGER) {
|
|
170
170
|
invalid(request.operation, "writer ticket sequence is exhausted");
|
|
171
171
|
}
|
|
172
|
-
(0, database_ts_1.recordStatement)(connection, `INSERT INTO
|
|
172
|
+
(0, database_ts_1.recordStatement)(connection, `INSERT INTO ne19_coordination_tickets(
|
|
173
173
|
ticket_id,sequence,host,pid,boot_id,process_start,deadline,enqueued_at) VALUES (?,?,?,?,?,?,?,?)`)
|
|
174
174
|
.run(request.ticketId, state.nextWriterSequence, request.host, request.pid, request.bootId, request.processStart, request.deadline, request.enqueuedAt);
|
|
175
|
-
const advanced = (0, database_ts_1.recordStatement)(connection, `UPDATE
|
|
175
|
+
const advanced = (0, database_ts_1.recordStatement)(connection, `UPDATE ne19_coordination_state
|
|
176
176
|
SET next_writer_sequence=next_writer_sequence+1,revision=revision+1
|
|
177
177
|
WHERE singleton=1 AND next_writer_sequence=?`).run(state.nextWriterSequence);
|
|
178
178
|
if (Number(advanced.changes) !== 1)
|
|
@@ -188,7 +188,7 @@ function runTryAdmit(connection, request) {
|
|
|
188
188
|
if (state.barrier !== undefined)
|
|
189
189
|
return false;
|
|
190
190
|
const head = waitingTicket((0, database_ts_1.recordStatement)(connection, `SELECT ticket_id,sequence,host,pid,boot_id,process_start,deadline,enqueued_at
|
|
191
|
-
FROM
|
|
191
|
+
FROM ne19_coordination_tickets ORDER BY sequence LIMIT 1`).get());
|
|
192
192
|
if (head === undefined || head.ticketId !== request.ticketId)
|
|
193
193
|
return false;
|
|
194
194
|
if (head.sequence !== request.sequence || head.host !== request.host || head.pid !== request.pid ||
|
|
@@ -196,11 +196,11 @@ function runTryAdmit(connection, request) {
|
|
|
196
196
|
head.deadline !== request.deadline) {
|
|
197
197
|
invalid(request.operation, "writer ticket identity changed before admission");
|
|
198
198
|
}
|
|
199
|
-
const removed = (0, database_ts_1.recordStatement)(connection, "DELETE FROM
|
|
199
|
+
const removed = (0, database_ts_1.recordStatement)(connection, "DELETE FROM ne19_coordination_tickets WHERE ticket_id=? AND sequence=?")
|
|
200
200
|
.run(request.ticketId, request.sequence);
|
|
201
201
|
if (Number(removed.changes) !== 1)
|
|
202
202
|
invalid(request.operation, "writer ticket changed before admission");
|
|
203
|
-
const admitted = (0, database_ts_1.recordStatement)(connection, `UPDATE
|
|
203
|
+
const admitted = (0, database_ts_1.recordStatement)(connection, `UPDATE ne19_coordination_state SET
|
|
204
204
|
writer_ticket_id=?,writer_sequence=?,writer_host=?,writer_pid=?,writer_boot_id=?,writer_process_start=?,writer_deadline=?,
|
|
205
205
|
writer_enqueued_at=?,writer_nonce=?,writer_admitted_at=?,writer_lease_expires_at=?,
|
|
206
206
|
revision=revision+1 WHERE singleton=1 AND writer_ticket_id IS NULL AND barrier_id IS NULL`)
|
|
@@ -212,13 +212,13 @@ function runTryAdmit(connection, request) {
|
|
|
212
212
|
function runCancelWriter(connection, request) {
|
|
213
213
|
recover(connection, request.now);
|
|
214
214
|
const ticket = waitingTicket((0, database_ts_1.recordStatement)(connection, `SELECT ticket_id,sequence,host,pid,boot_id,process_start,deadline,enqueued_at
|
|
215
|
-
FROM
|
|
215
|
+
FROM ne19_coordination_tickets WHERE ticket_id=?`).get(request.ticketId));
|
|
216
216
|
if (ticket !== undefined) {
|
|
217
217
|
if (ticket.host !== request.host || ticket.pid !== request.pid ||
|
|
218
218
|
ticket.bootId !== request.bootId || ticket.processStart !== request.processStart) {
|
|
219
219
|
invalid(request.operation, "writer cancellation identity does not match its ticket");
|
|
220
220
|
}
|
|
221
|
-
(0, database_ts_1.recordStatement)(connection, "DELETE FROM
|
|
221
|
+
(0, database_ts_1.recordStatement)(connection, "DELETE FROM ne19_coordination_tickets WHERE ticket_id=? AND sequence=?")
|
|
222
222
|
.run(request.ticketId, ticket.sequence);
|
|
223
223
|
}
|
|
224
224
|
const writer = coordinationState(connection).writer;
|
|
@@ -244,7 +244,7 @@ function runRequestBarrier(connection, request) {
|
|
|
244
244
|
const state = coordinationState(connection);
|
|
245
245
|
if (state.barrier !== undefined)
|
|
246
246
|
return sameBarrier(state.barrier, request);
|
|
247
|
-
const established = (0, database_ts_1.recordStatement)(connection, `UPDATE
|
|
247
|
+
const established = (0, database_ts_1.recordStatement)(connection, `UPDATE ne19_coordination_state SET
|
|
248
248
|
barrier_id=?,barrier_nonce=?,barrier_host=?,barrier_pid=?,barrier_boot_id=?,barrier_process_start=?,barrier_deadline=?,
|
|
249
249
|
barrier_requested_at=?,barrier_lease_expires_at=?,barrier_status='requested',
|
|
250
250
|
barrier_active_at=NULL,revision=revision+1 WHERE singleton=1 AND barrier_id IS NULL`)
|
|
@@ -265,7 +265,7 @@ function runTryActivateBarrier(connection, request) {
|
|
|
265
265
|
return false;
|
|
266
266
|
if (state.barrier.status === "active")
|
|
267
267
|
return true;
|
|
268
|
-
const activated = (0, database_ts_1.recordStatement)(connection, `UPDATE
|
|
268
|
+
const activated = (0, database_ts_1.recordStatement)(connection, `UPDATE ne19_coordination_state SET
|
|
269
269
|
barrier_status='active',barrier_active_at=?,revision=revision+1
|
|
270
270
|
WHERE singleton=1 AND barrier_id=? AND barrier_nonce=? AND barrier_status='requested'
|
|
271
271
|
AND writer_ticket_id IS NULL`)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admission-repository.js","sourceRoot":"","sources":["admission-repository.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { recordStatement, type RecordDatabase } from \"./database.ts\";\nimport { sqliteError } from \"./errors.ts\";\nimport { withImmediateTransaction } from \"./transaction.ts\";\nimport { exactProcessState } from \"../../coordination/platform/node-process-identity.ts\";\nimport type { AdmissionInput, EnqueueResult, } from \"../../coordination/platform/node-record-admission-protocol.ts\";\nconst MAXIMUM_STALE_HEADS_PER_TRANSACTION = 16;\ninterface WriterOwner {\n readonly ticketId: string;\n readonly sequence: number;\n readonly host: string;\n readonly pid: number;\n readonly bootId: string;\n readonly processStart: string;\n readonly deadline: number;\n readonly nonce: string;\n readonly leaseExpiresAt: number;\n}\ninterface BarrierOwner {\n readonly barrierId: string;\n readonly nonce: string;\n readonly host: string;\n readonly pid: number;\n readonly bootId: string;\n readonly processStart: string;\n readonly deadline: number;\n readonly leaseExpiresAt: number;\n readonly status: \"requested\" | \"active\";\n}\ninterface CoordinationState {\n readonly nextWriterSequence: number;\n readonly writer: WriterOwner | undefined;\n readonly barrier: BarrierOwner | undefined;\n}\ninterface WaitingTicket {\n readonly ticketId: string;\n readonly sequence: number;\n readonly host: string;\n readonly pid: number;\n readonly bootId: string;\n readonly processStart: string;\n readonly deadline: number;\n readonly enqueuedAt: number;\n}\nfunction invalid(operation: string, message: string): never {\n throw sqliteError(\"record-database-invalid\", operation, message);\n}\nfunction text(value: unknown, field: string): string {\n if (typeof value !== \"string\" || value.length === 0)\n invalid(\"coordination\", `${field} is invalid`);\n return value;\n}\nfunction integer(value: unknown, field: string): number {\n const number = typeof value === \"bigint\" ? Number(value) : value;\n if (!Number.isSafeInteger(number))\n invalid(\"coordination\", `${field} is invalid`);\n return Number(number);\n}\nfunction positiveInteger(value: unknown, field: string): number {\n const number = integer(value, field);\n if (number <= 0)\n invalid(\"coordination\", `${field} is invalid`);\n return number;\n}\nfunction isExactlyDead(owner: {\n readonly host: string;\n readonly pid: number;\n readonly bootId: string;\n readonly processStart: string;\n}): boolean {\n return exactProcessState({ ownerId: \"admission-owner\", ...owner }) === \"dead\";\n}\nfunction waitingTicket(row: Record<string, unknown> | undefined): WaitingTicket | undefined {\n if (row === undefined)\n return undefined;\n return {\n ticketId: text(row.ticket_id, \"coordination_tickets.ticket_id\"),\n sequence: positiveInteger(row.sequence, \"coordination_tickets.sequence\"),\n host: text(row.host, \"coordination_tickets.host\"),\n pid: positiveInteger(row.pid, \"coordination_tickets.pid\"),\n bootId: text(row.boot_id, \"coordination_tickets.boot_id\"),\n processStart: text(row.process_start, \"coordination_tickets.process_start\"),\n deadline: positiveInteger(row.deadline, \"coordination_tickets.deadline\"),\n enqueuedAt: positiveInteger(row.enqueued_at, \"coordination_tickets.enqueued_at\"),\n };\n}\nfunction coordinationState(connection: RecordDatabase): CoordinationState {\n const row = recordStatement(connection, \"SELECT * FROM ne18_coordination_state WHERE singleton=1\").get() as Record<string, unknown> | undefined;\n if (row === undefined)\n invalid(\"coordination\", \"coordination_state singleton is missing\");\n const writerTicketId = row.writer_ticket_id;\n const writer = writerTicketId === null\n ? undefined\n : {\n ticketId: text(writerTicketId, \"coordination_state.writer_ticket_id\"),\n sequence: positiveInteger(row.writer_sequence, \"coordination_state.writer_sequence\"),\n host: text(row.writer_host, \"coordination_state.writer_host\"),\n pid: positiveInteger(row.writer_pid, \"coordination_state.writer_pid\"),\n bootId: text(row.writer_boot_id, \"coordination_state.writer_boot_id\"),\n processStart: text(row.writer_process_start, \"coordination_state.writer_process_start\"),\n deadline: positiveInteger(row.writer_deadline, \"coordination_state.writer_deadline\"),\n nonce: text(row.writer_nonce, \"coordination_state.writer_nonce\"),\n leaseExpiresAt: positiveInteger(row.writer_lease_expires_at, \"coordination_state.writer_lease_expires_at\"),\n };\n const barrierId = row.barrier_id;\n let barrier: BarrierOwner | undefined;\n if (barrierId !== null) {\n const status = row.barrier_status;\n if (status !== \"requested\" && status !== \"active\") {\n invalid(\"coordination\", \"coordination_state.barrier_status is invalid\");\n }\n barrier = {\n barrierId: text(barrierId, \"coordination_state.barrier_id\"),\n nonce: text(row.barrier_nonce, \"coordination_state.barrier_nonce\"),\n host: text(row.barrier_host, \"coordination_state.barrier_host\"),\n pid: positiveInteger(row.barrier_pid, \"coordination_state.barrier_pid\"),\n bootId: text(row.barrier_boot_id, \"coordination_state.barrier_boot_id\"),\n processStart: text(row.barrier_process_start, \"coordination_state.barrier_process_start\"),\n deadline: positiveInteger(row.barrier_deadline, \"coordination_state.barrier_deadline\"),\n leaseExpiresAt: positiveInteger(row.barrier_lease_expires_at, \"coordination_state.barrier_lease_expires_at\"),\n status,\n };\n }\n return {\n nextWriterSequence: positiveInteger(row.next_writer_sequence, \"coordination_state.next_writer_sequence\"),\n writer,\n barrier,\n };\n}\nfunction clearWriter(connection: RecordDatabase, owner: WriterOwner): void {\n const result = recordStatement(connection, `UPDATE ne18_coordination_state SET\n writer_ticket_id=NULL,writer_sequence=NULL,writer_host=NULL,writer_pid=NULL,\n writer_boot_id=NULL,writer_process_start=NULL,\n writer_deadline=NULL,writer_enqueued_at=NULL,writer_nonce=NULL,\n writer_admitted_at=NULL,writer_lease_expires_at=NULL,revision=revision+1\n WHERE singleton=1 AND writer_ticket_id=? AND writer_sequence=? AND writer_nonce=?`)\n .run(owner.ticketId, owner.sequence, owner.nonce);\n if (Number(result.changes) !== 1)\n invalid(\"coordination\", \"writer owner changed while clearing\");\n}\nfunction clearBarrier(connection: RecordDatabase, owner: BarrierOwner): void {\n const result = recordStatement(connection, `UPDATE ne18_coordination_state SET\n barrier_id=NULL,barrier_nonce=NULL,barrier_host=NULL,barrier_pid=NULL,\n barrier_boot_id=NULL,barrier_process_start=NULL,\n barrier_deadline=NULL,barrier_requested_at=NULL,barrier_lease_expires_at=NULL,\n barrier_status=NULL,barrier_active_at=NULL,revision=revision+1\n WHERE singleton=1 AND barrier_id=? AND barrier_nonce=?`)\n .run(owner.barrierId, owner.nonce);\n if (Number(result.changes) !== 1)\n invalid(\"coordination\", \"write freeze changed while clearing\");\n}\nfunction recover(connection: RecordDatabase, _now: number): void {\n for (let count = 0; count < MAXIMUM_STALE_HEADS_PER_TRANSACTION; count += 1) {\n const head = waitingTicket(recordStatement(connection, `SELECT ticket_id,sequence,host,pid,boot_id,process_start,deadline,enqueued_at\n FROM ne18_coordination_tickets ORDER BY sequence LIMIT 1`).get() as Record<string, unknown> | undefined);\n if (head === undefined || !isExactlyDead(head))\n break;\n recordStatement(connection, \"DELETE FROM ne18_coordination_tickets WHERE ticket_id=? AND sequence=?\")\n .run(head.ticketId, head.sequence);\n }\n const state = coordinationState(connection);\n if (state.writer !== undefined && isExactlyDead(state.writer)) {\n clearWriter(connection, state.writer);\n }\n if (state.barrier !== undefined && isExactlyDead(state.barrier)) {\n clearBarrier(connection, state.barrier);\n }\n}\nfunction sameWriter(owner: WriterOwner, request: {\n readonly ticketId: string;\n readonly sequence: number;\n readonly host: string;\n readonly pid: number;\n readonly bootId: string;\n readonly processStart: string;\n}): boolean {\n return owner.ticketId === request.ticketId && owner.sequence === request.sequence &&\n owner.host === request.host && owner.pid === request.pid && owner.bootId === request.bootId &&\n owner.processStart === request.processStart && owner.nonce === request.ticketId;\n}\nfunction sameBarrier(owner: BarrierOwner, request: {\n readonly barrierId: string;\n readonly nonce: string;\n readonly host: string;\n readonly pid: number;\n readonly bootId: string;\n readonly processStart: string;\n}): boolean {\n return owner.barrierId === request.barrierId && owner.nonce === request.nonce &&\n owner.host === request.host && owner.pid === request.pid && owner.bootId === request.bootId &&\n owner.processStart === request.processStart;\n}\nfunction runEnqueue(connection: RecordDatabase, request: Extract<AdmissionInput, {\n readonly operation: \"enqueue\";\n}>): EnqueueResult {\n const metadata = recordStatement(connection, \"SELECT barrier_state FROM ne18_record_metadata WHERE singleton=1\").get() as Record<string, unknown> | undefined;\n if (metadata === undefined)\n invalid(request.operation, \"ProjectDatabase barrier is missing\");\n if (metadata.barrier_state === \"draining\")\n return { state: \"blocked-by-barrier\" };\n if (metadata.barrier_state === \"portable\") {\n const generation = randomUUID();\n recordStatement(connection, `UPDATE ne18_record_metadata SET barrier_state='open',storage_generation=?,portable_generation=NULL,\n portable_revision=NULL,portable_gate_id=NULL WHERE singleton=1 AND barrier_state='portable'`).run(generation);\n recordStatement(connection, \"UPDATE ne18_coordination_state SET operational_generation=?,revision=revision+1 WHERE singleton=1\")\n .run(generation);\n }\n else if (metadata.barrier_state !== \"open\") {\n invalid(request.operation, \"ProjectDatabase barrier is invalid\");\n }\n recover(connection, request.enqueuedAt);\n const existing = waitingTicket(recordStatement(connection, `SELECT ticket_id,sequence,host,pid,boot_id,process_start,deadline,enqueued_at\n FROM ne18_coordination_tickets WHERE ticket_id=?`).get(request.ticketId) as Record<string, unknown> | undefined);\n if (existing !== undefined) {\n if (existing.host !== request.host || existing.pid !== request.pid ||\n existing.bootId !== request.bootId || existing.processStart !== request.processStart ||\n existing.deadline !== request.deadline) {\n invalid(request.operation, \"writer ticket identity changed\");\n }\n return { state: \"queued\", sequence: existing.sequence };\n }\n const state = coordinationState(connection);\n if (state.barrier !== undefined)\n return { state: \"blocked-by-barrier\" };\n if (state.nextWriterSequence >= Number.MAX_SAFE_INTEGER) {\n invalid(request.operation, \"writer ticket sequence is exhausted\");\n }\n recordStatement(connection, `INSERT INTO ne18_coordination_tickets(\n ticket_id,sequence,host,pid,boot_id,process_start,deadline,enqueued_at) VALUES (?,?,?,?,?,?,?,?)`)\n .run(request.ticketId, state.nextWriterSequence, request.host, request.pid, request.bootId, request.processStart, request.deadline, request.enqueuedAt);\n const advanced = recordStatement(connection, `UPDATE ne18_coordination_state\n SET next_writer_sequence=next_writer_sequence+1,revision=revision+1\n WHERE singleton=1 AND next_writer_sequence=?`).run(state.nextWriterSequence);\n if (Number(advanced.changes) !== 1)\n invalid(request.operation, \"writer sequence changed\");\n return { state: \"queued\", sequence: state.nextWriterSequence };\n}\nfunction runTryAdmit(connection: RecordDatabase, request: Extract<AdmissionInput, {\n readonly operation: \"try-admit\";\n}>): boolean {\n recover(connection, request.now);\n const state = coordinationState(connection);\n if (state.writer !== undefined) {\n return sameWriter(state.writer, request);\n }\n if (state.barrier !== undefined)\n return false;\n const head = waitingTicket(recordStatement(connection, `SELECT ticket_id,sequence,host,pid,boot_id,process_start,deadline,enqueued_at\n FROM ne18_coordination_tickets ORDER BY sequence LIMIT 1`).get() as Record<string, unknown> | undefined);\n if (head === undefined || head.ticketId !== request.ticketId)\n return false;\n if (head.sequence !== request.sequence || head.host !== request.host || head.pid !== request.pid ||\n head.bootId !== request.bootId || head.processStart !== request.processStart ||\n head.deadline !== request.deadline) {\n invalid(request.operation, \"writer ticket identity changed before admission\");\n }\n const removed = recordStatement(connection, \"DELETE FROM ne18_coordination_tickets WHERE ticket_id=? AND sequence=?\")\n .run(request.ticketId, request.sequence);\n if (Number(removed.changes) !== 1)\n invalid(request.operation, \"writer ticket changed before admission\");\n const admitted = recordStatement(connection, `UPDATE ne18_coordination_state SET\n writer_ticket_id=?,writer_sequence=?,writer_host=?,writer_pid=?,writer_boot_id=?,writer_process_start=?,writer_deadline=?,\n writer_enqueued_at=?,writer_nonce=?,writer_admitted_at=?,writer_lease_expires_at=?,\n revision=revision+1 WHERE singleton=1 AND writer_ticket_id IS NULL AND barrier_id IS NULL`)\n .run(request.ticketId, request.sequence, request.host, request.pid, request.bootId, request.processStart, request.deadline, head.enqueuedAt, request.ticketId, request.now, request.deadline);\n if (Number(admitted.changes) !== 1)\n invalid(request.operation, \"writer admission state changed\");\n return true;\n}\nfunction runCancelWriter(connection: RecordDatabase, request: Extract<AdmissionInput, {\n readonly operation: \"cancel-writer\";\n}>): void {\n recover(connection, request.now);\n const ticket = waitingTicket(recordStatement(connection, `SELECT ticket_id,sequence,host,pid,boot_id,process_start,deadline,enqueued_at\n FROM ne18_coordination_tickets WHERE ticket_id=?`).get(request.ticketId) as Record<string, unknown> | undefined);\n if (ticket !== undefined) {\n if (ticket.host !== request.host || ticket.pid !== request.pid ||\n ticket.bootId !== request.bootId || ticket.processStart !== request.processStart) {\n invalid(request.operation, \"writer cancellation identity does not match its ticket\");\n }\n recordStatement(connection, \"DELETE FROM ne18_coordination_tickets WHERE ticket_id=? AND sequence=?\")\n .run(request.ticketId, ticket.sequence);\n }\n const writer = coordinationState(connection).writer;\n if (writer !== undefined && writer.ticketId === request.ticketId) {\n if (!sameWriter(writer, { ...request, sequence: writer.sequence })) {\n invalid(request.operation, \"writer cancellation identity does not match its owner\");\n }\n clearWriter(connection, writer);\n }\n}\nfunction runReleaseWriter(connection: RecordDatabase, request: Extract<AdmissionInput, {\n readonly operation: \"release-writer\";\n}>): void {\n recover(connection, request.now);\n const writer = coordinationState(connection).writer;\n if (writer === undefined)\n return;\n if (!sameWriter(writer, request)) {\n invalid(request.operation, \"writer release identity does not match its owner\");\n }\n clearWriter(connection, writer);\n}\nfunction runRequestBarrier(connection: RecordDatabase, request: Extract<AdmissionInput, {\n readonly operation: \"request-barrier\";\n}>): boolean {\n recover(connection, request.requestedAt);\n const state = coordinationState(connection);\n if (state.barrier !== undefined)\n return sameBarrier(state.barrier, request);\n const established = recordStatement(connection, `UPDATE ne18_coordination_state SET\n barrier_id=?,barrier_nonce=?,barrier_host=?,barrier_pid=?,barrier_boot_id=?,barrier_process_start=?,barrier_deadline=?,\n barrier_requested_at=?,barrier_lease_expires_at=?,barrier_status='requested',\n barrier_active_at=NULL,revision=revision+1 WHERE singleton=1 AND barrier_id IS NULL`)\n .run(request.barrierId, request.nonce, request.host, request.pid, request.bootId, request.processStart, request.deadline, request.requestedAt, request.deadline);\n if (Number(established.changes) !== 1)\n invalid(request.operation, \"write freeze changed\");\n return true;\n}\nfunction runTryActivateBarrier(connection: RecordDatabase, request: Extract<AdmissionInput, {\n readonly operation: \"try-activate-barrier\";\n}>): boolean {\n recover(connection, request.now);\n const state = coordinationState(connection);\n if (state.barrier === undefined)\n return false;\n if (!sameBarrier(state.barrier, request)) {\n invalid(request.operation, \"write freeze identity changed before activation\");\n }\n if (state.writer !== undefined)\n return false;\n if (state.barrier.status === \"active\")\n return true;\n const activated = recordStatement(connection, `UPDATE ne18_coordination_state SET\n barrier_status='active',barrier_active_at=?,revision=revision+1\n WHERE singleton=1 AND barrier_id=? AND barrier_nonce=? AND barrier_status='requested'\n AND writer_ticket_id IS NULL`)\n .run(request.now, request.barrierId, request.nonce);\n if (Number(activated.changes) !== 1)\n invalid(request.operation, \"write freeze changed before activation\");\n return true;\n}\nfunction runCancelBarrier(connection: RecordDatabase, request: Extract<AdmissionInput, {\n readonly operation: \"cancel-barrier\";\n}>): void {\n recover(connection, request.now);\n const barrier = coordinationState(connection).barrier;\n if (barrier === undefined)\n return;\n if (barrier.barrierId !== request.barrierId)\n return;\n if (!sameBarrier(barrier, request)) {\n invalid(request.operation, \"write freeze cancellation identity does not match its owner\");\n }\n clearBarrier(connection, barrier);\n}\n/** Executes admission SQL on the canonical storage worker's owned connection. */\nexport function executeAdmissionCommand(connection: RecordDatabase, request: AdmissionInput): unknown {\n return withImmediateTransaction(connection, request.deadline, request.operation, () => {\n switch (request.operation) {\n case \"enqueue\":\n return runEnqueue(connection, request);\n case \"try-admit\":\n return runTryAdmit(connection, request);\n case \"cancel-writer\":\n return runCancelWriter(connection, request);\n case \"release-writer\":\n return runReleaseWriter(connection, request);\n case \"request-barrier\":\n return runRequestBarrier(connection, request);\n case \"try-activate-barrier\":\n return runTryActivateBarrier(connection, request);\n case \"cancel-barrier\":\n return runCancelBarrier(connection, request);\n }\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"admission-repository.js","sourceRoot":"","sources":["admission-repository.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { recordStatement, type RecordDatabase } from \"./database.ts\";\nimport { sqliteError } from \"./errors.ts\";\nimport { withImmediateTransaction } from \"./transaction.ts\";\nimport { exactProcessState } from \"../../coordination/platform/node-process-identity.ts\";\nimport type { AdmissionInput, EnqueueResult, } from \"../../coordination/platform/node-record-admission-protocol.ts\";\nconst MAXIMUM_STALE_HEADS_PER_TRANSACTION = 16;\ninterface WriterOwner {\n readonly ticketId: string;\n readonly sequence: number;\n readonly host: string;\n readonly pid: number;\n readonly bootId: string;\n readonly processStart: string;\n readonly deadline: number;\n readonly nonce: string;\n readonly leaseExpiresAt: number;\n}\ninterface BarrierOwner {\n readonly barrierId: string;\n readonly nonce: string;\n readonly host: string;\n readonly pid: number;\n readonly bootId: string;\n readonly processStart: string;\n readonly deadline: number;\n readonly leaseExpiresAt: number;\n readonly status: \"requested\" | \"active\";\n}\ninterface CoordinationState {\n readonly nextWriterSequence: number;\n readonly writer: WriterOwner | undefined;\n readonly barrier: BarrierOwner | undefined;\n}\ninterface WaitingTicket {\n readonly ticketId: string;\n readonly sequence: number;\n readonly host: string;\n readonly pid: number;\n readonly bootId: string;\n readonly processStart: string;\n readonly deadline: number;\n readonly enqueuedAt: number;\n}\nfunction invalid(operation: string, message: string): never {\n throw sqliteError(\"record-database-invalid\", operation, message);\n}\nfunction text(value: unknown, field: string): string {\n if (typeof value !== \"string\" || value.length === 0)\n invalid(\"coordination\", `${field} is invalid`);\n return value;\n}\nfunction integer(value: unknown, field: string): number {\n const number = typeof value === \"bigint\" ? Number(value) : value;\n if (!Number.isSafeInteger(number))\n invalid(\"coordination\", `${field} is invalid`);\n return Number(number);\n}\nfunction positiveInteger(value: unknown, field: string): number {\n const number = integer(value, field);\n if (number <= 0)\n invalid(\"coordination\", `${field} is invalid`);\n return number;\n}\nfunction isExactlyDead(owner: {\n readonly host: string;\n readonly pid: number;\n readonly bootId: string;\n readonly processStart: string;\n}): boolean {\n return exactProcessState({ ownerId: \"admission-owner\", ...owner }) === \"dead\";\n}\nfunction waitingTicket(row: Record<string, unknown> | undefined): WaitingTicket | undefined {\n if (row === undefined)\n return undefined;\n return {\n ticketId: text(row.ticket_id, \"coordination_tickets.ticket_id\"),\n sequence: positiveInteger(row.sequence, \"coordination_tickets.sequence\"),\n host: text(row.host, \"coordination_tickets.host\"),\n pid: positiveInteger(row.pid, \"coordination_tickets.pid\"),\n bootId: text(row.boot_id, \"coordination_tickets.boot_id\"),\n processStart: text(row.process_start, \"coordination_tickets.process_start\"),\n deadline: positiveInteger(row.deadline, \"coordination_tickets.deadline\"),\n enqueuedAt: positiveInteger(row.enqueued_at, \"coordination_tickets.enqueued_at\"),\n };\n}\nfunction coordinationState(connection: RecordDatabase): CoordinationState {\n const row = recordStatement(connection, \"SELECT * FROM ne19_coordination_state WHERE singleton=1\").get() as Record<string, unknown> | undefined;\n if (row === undefined)\n invalid(\"coordination\", \"coordination_state singleton is missing\");\n const writerTicketId = row.writer_ticket_id;\n const writer = writerTicketId === null\n ? undefined\n : {\n ticketId: text(writerTicketId, \"coordination_state.writer_ticket_id\"),\n sequence: positiveInteger(row.writer_sequence, \"coordination_state.writer_sequence\"),\n host: text(row.writer_host, \"coordination_state.writer_host\"),\n pid: positiveInteger(row.writer_pid, \"coordination_state.writer_pid\"),\n bootId: text(row.writer_boot_id, \"coordination_state.writer_boot_id\"),\n processStart: text(row.writer_process_start, \"coordination_state.writer_process_start\"),\n deadline: positiveInteger(row.writer_deadline, \"coordination_state.writer_deadline\"),\n nonce: text(row.writer_nonce, \"coordination_state.writer_nonce\"),\n leaseExpiresAt: positiveInteger(row.writer_lease_expires_at, \"coordination_state.writer_lease_expires_at\"),\n };\n const barrierId = row.barrier_id;\n let barrier: BarrierOwner | undefined;\n if (barrierId !== null) {\n const status = row.barrier_status;\n if (status !== \"requested\" && status !== \"active\") {\n invalid(\"coordination\", \"coordination_state.barrier_status is invalid\");\n }\n barrier = {\n barrierId: text(barrierId, \"coordination_state.barrier_id\"),\n nonce: text(row.barrier_nonce, \"coordination_state.barrier_nonce\"),\n host: text(row.barrier_host, \"coordination_state.barrier_host\"),\n pid: positiveInteger(row.barrier_pid, \"coordination_state.barrier_pid\"),\n bootId: text(row.barrier_boot_id, \"coordination_state.barrier_boot_id\"),\n processStart: text(row.barrier_process_start, \"coordination_state.barrier_process_start\"),\n deadline: positiveInteger(row.barrier_deadline, \"coordination_state.barrier_deadline\"),\n leaseExpiresAt: positiveInteger(row.barrier_lease_expires_at, \"coordination_state.barrier_lease_expires_at\"),\n status,\n };\n }\n return {\n nextWriterSequence: positiveInteger(row.next_writer_sequence, \"coordination_state.next_writer_sequence\"),\n writer,\n barrier,\n };\n}\nfunction clearWriter(connection: RecordDatabase, owner: WriterOwner): void {\n const result = recordStatement(connection, `UPDATE ne19_coordination_state SET\n writer_ticket_id=NULL,writer_sequence=NULL,writer_host=NULL,writer_pid=NULL,\n writer_boot_id=NULL,writer_process_start=NULL,\n writer_deadline=NULL,writer_enqueued_at=NULL,writer_nonce=NULL,\n writer_admitted_at=NULL,writer_lease_expires_at=NULL,revision=revision+1\n WHERE singleton=1 AND writer_ticket_id=? AND writer_sequence=? AND writer_nonce=?`)\n .run(owner.ticketId, owner.sequence, owner.nonce);\n if (Number(result.changes) !== 1)\n invalid(\"coordination\", \"writer owner changed while clearing\");\n}\nfunction clearBarrier(connection: RecordDatabase, owner: BarrierOwner): void {\n const result = recordStatement(connection, `UPDATE ne19_coordination_state SET\n barrier_id=NULL,barrier_nonce=NULL,barrier_host=NULL,barrier_pid=NULL,\n barrier_boot_id=NULL,barrier_process_start=NULL,\n barrier_deadline=NULL,barrier_requested_at=NULL,barrier_lease_expires_at=NULL,\n barrier_status=NULL,barrier_active_at=NULL,revision=revision+1\n WHERE singleton=1 AND barrier_id=? AND barrier_nonce=?`)\n .run(owner.barrierId, owner.nonce);\n if (Number(result.changes) !== 1)\n invalid(\"coordination\", \"write freeze changed while clearing\");\n}\nfunction recover(connection: RecordDatabase, _now: number): void {\n for (let count = 0; count < MAXIMUM_STALE_HEADS_PER_TRANSACTION; count += 1) {\n const head = waitingTicket(recordStatement(connection, `SELECT ticket_id,sequence,host,pid,boot_id,process_start,deadline,enqueued_at\n FROM ne19_coordination_tickets ORDER BY sequence LIMIT 1`).get() as Record<string, unknown> | undefined);\n if (head === undefined || !isExactlyDead(head))\n break;\n recordStatement(connection, \"DELETE FROM ne19_coordination_tickets WHERE ticket_id=? AND sequence=?\")\n .run(head.ticketId, head.sequence);\n }\n const state = coordinationState(connection);\n if (state.writer !== undefined && isExactlyDead(state.writer)) {\n clearWriter(connection, state.writer);\n }\n if (state.barrier !== undefined && isExactlyDead(state.barrier)) {\n clearBarrier(connection, state.barrier);\n }\n}\nfunction sameWriter(owner: WriterOwner, request: {\n readonly ticketId: string;\n readonly sequence: number;\n readonly host: string;\n readonly pid: number;\n readonly bootId: string;\n readonly processStart: string;\n}): boolean {\n return owner.ticketId === request.ticketId && owner.sequence === request.sequence &&\n owner.host === request.host && owner.pid === request.pid && owner.bootId === request.bootId &&\n owner.processStart === request.processStart && owner.nonce === request.ticketId;\n}\nfunction sameBarrier(owner: BarrierOwner, request: {\n readonly barrierId: string;\n readonly nonce: string;\n readonly host: string;\n readonly pid: number;\n readonly bootId: string;\n readonly processStart: string;\n}): boolean {\n return owner.barrierId === request.barrierId && owner.nonce === request.nonce &&\n owner.host === request.host && owner.pid === request.pid && owner.bootId === request.bootId &&\n owner.processStart === request.processStart;\n}\nfunction runEnqueue(connection: RecordDatabase, request: Extract<AdmissionInput, {\n readonly operation: \"enqueue\";\n}>): EnqueueResult {\n const metadata = recordStatement(connection, \"SELECT barrier_state FROM ne19_record_metadata WHERE singleton=1\").get() as Record<string, unknown> | undefined;\n if (metadata === undefined)\n invalid(request.operation, \"ProjectDatabase barrier is missing\");\n if (metadata.barrier_state === \"draining\")\n return { state: \"blocked-by-barrier\" };\n if (metadata.barrier_state === \"portable\") {\n const generation = randomUUID();\n recordStatement(connection, `UPDATE ne19_record_metadata SET barrier_state='open',storage_generation=?,portable_generation=NULL,\n portable_revision=NULL,portable_gate_id=NULL WHERE singleton=1 AND barrier_state='portable'`).run(generation);\n recordStatement(connection, \"UPDATE ne19_coordination_state SET operational_generation=?,revision=revision+1 WHERE singleton=1\")\n .run(generation);\n }\n else if (metadata.barrier_state !== \"open\") {\n invalid(request.operation, \"ProjectDatabase barrier is invalid\");\n }\n recover(connection, request.enqueuedAt);\n const existing = waitingTicket(recordStatement(connection, `SELECT ticket_id,sequence,host,pid,boot_id,process_start,deadline,enqueued_at\n FROM ne19_coordination_tickets WHERE ticket_id=?`).get(request.ticketId) as Record<string, unknown> | undefined);\n if (existing !== undefined) {\n if (existing.host !== request.host || existing.pid !== request.pid ||\n existing.bootId !== request.bootId || existing.processStart !== request.processStart ||\n existing.deadline !== request.deadline) {\n invalid(request.operation, \"writer ticket identity changed\");\n }\n return { state: \"queued\", sequence: existing.sequence };\n }\n const state = coordinationState(connection);\n if (state.barrier !== undefined)\n return { state: \"blocked-by-barrier\" };\n if (state.nextWriterSequence >= Number.MAX_SAFE_INTEGER) {\n invalid(request.operation, \"writer ticket sequence is exhausted\");\n }\n recordStatement(connection, `INSERT INTO ne19_coordination_tickets(\n ticket_id,sequence,host,pid,boot_id,process_start,deadline,enqueued_at) VALUES (?,?,?,?,?,?,?,?)`)\n .run(request.ticketId, state.nextWriterSequence, request.host, request.pid, request.bootId, request.processStart, request.deadline, request.enqueuedAt);\n const advanced = recordStatement(connection, `UPDATE ne19_coordination_state\n SET next_writer_sequence=next_writer_sequence+1,revision=revision+1\n WHERE singleton=1 AND next_writer_sequence=?`).run(state.nextWriterSequence);\n if (Number(advanced.changes) !== 1)\n invalid(request.operation, \"writer sequence changed\");\n return { state: \"queued\", sequence: state.nextWriterSequence };\n}\nfunction runTryAdmit(connection: RecordDatabase, request: Extract<AdmissionInput, {\n readonly operation: \"try-admit\";\n}>): boolean {\n recover(connection, request.now);\n const state = coordinationState(connection);\n if (state.writer !== undefined) {\n return sameWriter(state.writer, request);\n }\n if (state.barrier !== undefined)\n return false;\n const head = waitingTicket(recordStatement(connection, `SELECT ticket_id,sequence,host,pid,boot_id,process_start,deadline,enqueued_at\n FROM ne19_coordination_tickets ORDER BY sequence LIMIT 1`).get() as Record<string, unknown> | undefined);\n if (head === undefined || head.ticketId !== request.ticketId)\n return false;\n if (head.sequence !== request.sequence || head.host !== request.host || head.pid !== request.pid ||\n head.bootId !== request.bootId || head.processStart !== request.processStart ||\n head.deadline !== request.deadline) {\n invalid(request.operation, \"writer ticket identity changed before admission\");\n }\n const removed = recordStatement(connection, \"DELETE FROM ne19_coordination_tickets WHERE ticket_id=? AND sequence=?\")\n .run(request.ticketId, request.sequence);\n if (Number(removed.changes) !== 1)\n invalid(request.operation, \"writer ticket changed before admission\");\n const admitted = recordStatement(connection, `UPDATE ne19_coordination_state SET\n writer_ticket_id=?,writer_sequence=?,writer_host=?,writer_pid=?,writer_boot_id=?,writer_process_start=?,writer_deadline=?,\n writer_enqueued_at=?,writer_nonce=?,writer_admitted_at=?,writer_lease_expires_at=?,\n revision=revision+1 WHERE singleton=1 AND writer_ticket_id IS NULL AND barrier_id IS NULL`)\n .run(request.ticketId, request.sequence, request.host, request.pid, request.bootId, request.processStart, request.deadline, head.enqueuedAt, request.ticketId, request.now, request.deadline);\n if (Number(admitted.changes) !== 1)\n invalid(request.operation, \"writer admission state changed\");\n return true;\n}\nfunction runCancelWriter(connection: RecordDatabase, request: Extract<AdmissionInput, {\n readonly operation: \"cancel-writer\";\n}>): void {\n recover(connection, request.now);\n const ticket = waitingTicket(recordStatement(connection, `SELECT ticket_id,sequence,host,pid,boot_id,process_start,deadline,enqueued_at\n FROM ne19_coordination_tickets WHERE ticket_id=?`).get(request.ticketId) as Record<string, unknown> | undefined);\n if (ticket !== undefined) {\n if (ticket.host !== request.host || ticket.pid !== request.pid ||\n ticket.bootId !== request.bootId || ticket.processStart !== request.processStart) {\n invalid(request.operation, \"writer cancellation identity does not match its ticket\");\n }\n recordStatement(connection, \"DELETE FROM ne19_coordination_tickets WHERE ticket_id=? AND sequence=?\")\n .run(request.ticketId, ticket.sequence);\n }\n const writer = coordinationState(connection).writer;\n if (writer !== undefined && writer.ticketId === request.ticketId) {\n if (!sameWriter(writer, { ...request, sequence: writer.sequence })) {\n invalid(request.operation, \"writer cancellation identity does not match its owner\");\n }\n clearWriter(connection, writer);\n }\n}\nfunction runReleaseWriter(connection: RecordDatabase, request: Extract<AdmissionInput, {\n readonly operation: \"release-writer\";\n}>): void {\n recover(connection, request.now);\n const writer = coordinationState(connection).writer;\n if (writer === undefined)\n return;\n if (!sameWriter(writer, request)) {\n invalid(request.operation, \"writer release identity does not match its owner\");\n }\n clearWriter(connection, writer);\n}\nfunction runRequestBarrier(connection: RecordDatabase, request: Extract<AdmissionInput, {\n readonly operation: \"request-barrier\";\n}>): boolean {\n recover(connection, request.requestedAt);\n const state = coordinationState(connection);\n if (state.barrier !== undefined)\n return sameBarrier(state.barrier, request);\n const established = recordStatement(connection, `UPDATE ne19_coordination_state SET\n barrier_id=?,barrier_nonce=?,barrier_host=?,barrier_pid=?,barrier_boot_id=?,barrier_process_start=?,barrier_deadline=?,\n barrier_requested_at=?,barrier_lease_expires_at=?,barrier_status='requested',\n barrier_active_at=NULL,revision=revision+1 WHERE singleton=1 AND barrier_id IS NULL`)\n .run(request.barrierId, request.nonce, request.host, request.pid, request.bootId, request.processStart, request.deadline, request.requestedAt, request.deadline);\n if (Number(established.changes) !== 1)\n invalid(request.operation, \"write freeze changed\");\n return true;\n}\nfunction runTryActivateBarrier(connection: RecordDatabase, request: Extract<AdmissionInput, {\n readonly operation: \"try-activate-barrier\";\n}>): boolean {\n recover(connection, request.now);\n const state = coordinationState(connection);\n if (state.barrier === undefined)\n return false;\n if (!sameBarrier(state.barrier, request)) {\n invalid(request.operation, \"write freeze identity changed before activation\");\n }\n if (state.writer !== undefined)\n return false;\n if (state.barrier.status === \"active\")\n return true;\n const activated = recordStatement(connection, `UPDATE ne19_coordination_state SET\n barrier_status='active',barrier_active_at=?,revision=revision+1\n WHERE singleton=1 AND barrier_id=? AND barrier_nonce=? AND barrier_status='requested'\n AND writer_ticket_id IS NULL`)\n .run(request.now, request.barrierId, request.nonce);\n if (Number(activated.changes) !== 1)\n invalid(request.operation, \"write freeze changed before activation\");\n return true;\n}\nfunction runCancelBarrier(connection: RecordDatabase, request: Extract<AdmissionInput, {\n readonly operation: \"cancel-barrier\";\n}>): void {\n recover(connection, request.now);\n const barrier = coordinationState(connection).barrier;\n if (barrier === undefined)\n return;\n if (barrier.barrierId !== request.barrierId)\n return;\n if (!sameBarrier(barrier, request)) {\n invalid(request.operation, \"write freeze cancellation identity does not match its owner\");\n }\n clearBarrier(connection, barrier);\n}\n/** Executes admission SQL on the canonical storage worker's owned connection. */\nexport function executeAdmissionCommand(connection: RecordDatabase, request: AdmissionInput): unknown {\n return withImmediateTransaction(connection, request.deadline, request.operation, () => {\n switch (request.operation) {\n case \"enqueue\":\n return runEnqueue(connection, request);\n case \"try-admit\":\n return runTryAdmit(connection, request);\n case \"cancel-writer\":\n return runCancelWriter(connection, request);\n case \"release-writer\":\n return runReleaseWriter(connection, request);\n case \"request-barrier\":\n return runRequestBarrier(connection, request);\n case \"try-activate-barrier\":\n return runTryActivateBarrier(connection, request);\n case \"cancel-barrier\":\n return runCancelBarrier(connection, request);\n }\n });\n}\n"]}
|
|
@@ -22,7 +22,7 @@ function integer(row, field) {
|
|
|
22
22
|
return decoded;
|
|
23
23
|
}
|
|
24
24
|
function requireOpen(connection, operation) {
|
|
25
|
-
const row = (0, database_ts_1.recordStatement)(connection, "SELECT barrier_state FROM
|
|
25
|
+
const row = (0, database_ts_1.recordStatement)(connection, "SELECT barrier_state FROM ne19_record_metadata WHERE singleton=1").get();
|
|
26
26
|
if (row === undefined || text(row, "barrier_state") !== "open")
|
|
27
27
|
conflict(operation, "ProjectDatabase writer barrier is not open");
|
|
28
28
|
}
|
|
@@ -33,7 +33,7 @@ function ownerArgs(owner) {
|
|
|
33
33
|
return [owner.ownerId, owner.generation, owner.host, owner.pid, owner.bootId, owner.processStart];
|
|
34
34
|
}
|
|
35
35
|
function read(connection, caseId) {
|
|
36
|
-
const row = (0, database_ts_1.recordStatement)(connection, "SELECT * FROM
|
|
36
|
+
const row = (0, database_ts_1.recordStatement)(connection, "SELECT * FROM ne19_case_locks WHERE case_id=?").get(caseId);
|
|
37
37
|
return row === undefined ? undefined : Object.freeze({
|
|
38
38
|
owner: Object.freeze({
|
|
39
39
|
ownerId: text(row, "owner_id"), generation: integer(row, "owner_generation"),
|
|
@@ -53,19 +53,19 @@ function executeCaseCommand(connection, command) {
|
|
|
53
53
|
if (read(connection, command.caseId) !== undefined)
|
|
54
54
|
conflict(command._tag, `case ${command.caseId} is already owned`);
|
|
55
55
|
const owner = command.owner;
|
|
56
|
-
(0, database_ts_1.recordStatement)(connection, `INSERT INTO
|
|
56
|
+
(0, database_ts_1.recordStatement)(connection, `INSERT INTO ne19_case_locks(case_id,owner_id,owner_generation,owner_host,owner_pid,owner_boot_id,owner_process_start,acquired_at,heartbeat_at)
|
|
57
57
|
VALUES (?,?,1,?,?,?,?,?,?)`).run(command.caseId, owner.ownerId, owner.host, owner.pid, owner.bootId, owner.processStart, command.at, command.at);
|
|
58
58
|
return Object.freeze({ ...owner, generation: 1 });
|
|
59
59
|
}
|
|
60
60
|
case "case-heartbeat": {
|
|
61
|
-
const changed = (0, database_ts_1.recordStatement)(connection, `UPDATE
|
|
61
|
+
const changed = (0, database_ts_1.recordStatement)(connection, `UPDATE ne19_case_locks SET heartbeat_at=? WHERE case_id=? AND ${ownerSql()}`)
|
|
62
62
|
.run(command.at, command.caseId, ...ownerArgs(command.owner));
|
|
63
63
|
if (Number(changed.changes) !== 1)
|
|
64
64
|
conflict(command._tag, "case lock owner generation is fenced");
|
|
65
65
|
return undefined;
|
|
66
66
|
}
|
|
67
67
|
case "case-release": {
|
|
68
|
-
const changed = (0, database_ts_1.recordStatement)(connection, `DELETE FROM
|
|
68
|
+
const changed = (0, database_ts_1.recordStatement)(connection, `DELETE FROM ne19_case_locks WHERE case_id=? AND ${ownerSql()}`)
|
|
69
69
|
.run(command.caseId, ...ownerArgs(command.owner));
|
|
70
70
|
if (Number(changed.changes) !== 1)
|
|
71
71
|
conflict(command._tag, "case lock owner generation is fenced");
|
|
@@ -73,7 +73,7 @@ function executeCaseCommand(connection, command) {
|
|
|
73
73
|
}
|
|
74
74
|
case "case-takeover": {
|
|
75
75
|
const replacement = command.replacement;
|
|
76
|
-
const changed = (0, database_ts_1.recordStatement)(connection, `UPDATE
|
|
76
|
+
const changed = (0, database_ts_1.recordStatement)(connection, `UPDATE ne19_case_locks SET owner_id=?,owner_generation=owner_generation+1,owner_host=?,owner_pid=?,
|
|
77
77
|
owner_boot_id=?,owner_process_start=?,acquired_at=?,heartbeat_at=? WHERE case_id=? AND ${ownerSql()}`).run(replacement.ownerId, replacement.host, replacement.pid, replacement.bootId, replacement.processStart, command.at, command.at, command.caseId, ...ownerArgs(command.deadOwner));
|
|
78
78
|
if (Number(changed.changes) !== 1)
|
|
79
79
|
conflict(command._tag, "exact dead case owner did not match");
|