niceeval 0.16.2 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (258) hide show
  1. package/dist/cli/bootstrap.cjs +7 -1
  2. package/dist/cli/bootstrap.cjs.map +1 -1
  3. package/dist/cli/project-configuration.cjs +8 -11
  4. package/dist/cli/project-configuration.cjs.map +1 -1
  5. package/dist/expect/index.cjs.map +1 -1
  6. package/dist/expect/index.d.cts +1 -0
  7. package/dist/expect/index.d.mts +1 -0
  8. package/dist/expect/index.d.ts +1 -0
  9. package/dist/experiment/host/cli/contribution.cjs +6 -11
  10. package/dist/experiment/host/cli/contribution.cjs.map +1 -1
  11. package/dist/experiment/host/cli/contribution.d.cts +0 -16
  12. package/dist/experiment/host/cli/contribution.d.mts +0 -16
  13. package/dist/experiment/host/cli/contribution.d.ts +0 -16
  14. package/dist/experiment/host/operations.cjs +3 -3
  15. package/dist/experiment/host/operations.cjs.map +1 -1
  16. package/dist/experiment/host/types.cjs.map +1 -1
  17. package/dist/experiment/host/types.d.cts +0 -4
  18. package/dist/experiment/host/types.d.mts +0 -4
  19. package/dist/experiment/host/types.d.ts +0 -4
  20. package/dist/fresh-import.cjs +2 -2
  21. package/dist/fresh-import.cjs.map +1 -1
  22. package/dist/fresh-import.d.cts +3 -3
  23. package/dist/fresh-import.d.mts +3 -3
  24. package/dist/fresh-import.d.ts +3 -3
  25. package/dist/index.cjs.map +1 -1
  26. package/dist/index.d.cts +1 -0
  27. package/dist/index.d.mts +1 -0
  28. package/dist/index.d.ts +1 -0
  29. package/dist/inspection/codec.cjs.map +1 -1
  30. package/dist/inspection/codec.d.cts +1 -1
  31. package/dist/inspection/codec.d.mts +1 -1
  32. package/dist/inspection/codec.d.ts +1 -1
  33. package/dist/inspection/facts.cjs +66 -9
  34. package/dist/inspection/facts.cjs.map +1 -1
  35. package/dist/inspection/facts.d.cts +4 -0
  36. package/dist/inspection/facts.d.mts +4 -0
  37. package/dist/inspection/facts.d.ts +4 -0
  38. package/dist/inspection/facts.js +4 -2
  39. package/dist/inspection/index.cjs +1 -3
  40. package/dist/inspection/index.cjs.map +1 -1
  41. package/dist/inspection/index.d.cts +1 -1
  42. package/dist/inspection/index.d.mts +1 -1
  43. package/dist/inspection/index.d.ts +1 -1
  44. package/dist/inspection/index.js +44 -48
  45. package/dist/inspection/limits.cjs +3 -1
  46. package/dist/inspection/limits.cjs.map +1 -1
  47. package/dist/inspection/limits.d.cts +2 -0
  48. package/dist/inspection/limits.d.mts +2 -0
  49. package/dist/inspection/limits.d.ts +2 -0
  50. package/dist/inspection/limits.js +6 -4
  51. package/dist/inspection/project-source.cjs +4 -1
  52. package/dist/inspection/project-source.cjs.map +1 -1
  53. package/dist/inspection/protocol.cjs +10 -18
  54. package/dist/inspection/protocol.cjs.map +1 -1
  55. package/dist/inspection/protocol.d.cts +111 -173
  56. package/dist/inspection/protocol.d.mts +111 -173
  57. package/dist/inspection/protocol.d.ts +111 -173
  58. package/dist/inspection/public.mjs +73 -109
  59. package/dist/inspection/results.cjs +12 -48
  60. package/dist/inspection/results.cjs.map +1 -1
  61. package/dist/inspection/results.d.cts +124 -122
  62. package/dist/inspection/results.d.mts +124 -122
  63. package/dist/inspection/results.d.ts +124 -122
  64. package/dist/inspection/results.js +16 -20
  65. package/dist/inspection/select.cjs +80 -117
  66. package/dist/inspection/select.cjs.map +1 -1
  67. package/dist/inspection/source.cjs +14 -15
  68. package/dist/inspection/source.cjs.map +1 -1
  69. package/dist/inspection/source.d.cts +6 -3
  70. package/dist/inspection/source.d.mts +6 -3
  71. package/dist/inspection/source.d.ts +6 -3
  72. package/dist/inspection/trace.cjs +1 -1
  73. package/dist/inspection/trace.cjs.map +1 -1
  74. package/dist/load-config.cjs +17 -11
  75. package/dist/load-config.cjs.map +1 -1
  76. package/dist/load-config.d.cts +3 -2
  77. package/dist/load-config.d.mts +3 -2
  78. package/dist/load-config.d.ts +3 -2
  79. package/dist/o11y/adapter-usage-projection.cjs +5 -1
  80. package/dist/o11y/adapter-usage-projection.cjs.map +1 -1
  81. package/dist/o11y/adapter-usage-projection.d.cts +109 -1
  82. package/dist/o11y/adapter-usage-projection.d.mts +109 -1
  83. package/dist/o11y/adapter-usage-projection.d.ts +109 -1
  84. package/dist/o11y/cache-read.cjs +113 -0
  85. package/dist/o11y/cache-read.cjs.map +1 -0
  86. package/dist/o11y/cache-read.d.cts +80 -0
  87. package/dist/o11y/cache-read.d.mts +80 -0
  88. package/dist/o11y/cache-read.d.ts +80 -0
  89. package/dist/o11y/cache-read.js +8 -0
  90. package/dist/o11y/cache-read.js.map +1 -0
  91. package/dist/o11y/eval-usage.cjs +4 -1
  92. package/dist/o11y/eval-usage.cjs.map +1 -1
  93. package/dist/o11y/eval-usage.d.cts +4 -1
  94. package/dist/o11y/eval-usage.d.mts +4 -1
  95. package/dist/o11y/eval-usage.d.ts +4 -1
  96. package/dist/record/host/sqlite-host.cjs +188 -53
  97. package/dist/record/host/sqlite-host.cjs.map +1 -1
  98. package/dist/record/host/sqlite-host.d.cts +37 -1
  99. package/dist/record/host/sqlite-host.d.mts +37 -1
  100. package/dist/record/host/sqlite-host.d.ts +37 -1
  101. package/dist/record/host/sqlite-host.js +16 -8
  102. package/dist/record/maintenance/runtime.cjs +3 -3
  103. package/dist/record/maintenance/runtime.cjs.map +1 -1
  104. package/dist/record/sqlite/admission-repository.cjs +18 -18
  105. package/dist/record/sqlite/admission-repository.cjs.map +1 -1
  106. package/dist/record/sqlite/case-repository.cjs +6 -6
  107. package/dist/record/sqlite/case-repository.cjs.map +1 -1
  108. package/dist/record/sqlite/coordination-repository.cjs +25 -25
  109. package/dist/record/sqlite/coordination-repository.cjs.map +1 -1
  110. package/dist/record/sqlite/current-schema.cjs +115 -111
  111. package/dist/record/sqlite/current-schema.cjs.map +1 -1
  112. package/dist/record/sqlite/current-schema.d.cts +3 -3
  113. package/dist/record/sqlite/current-schema.d.mts +3 -3
  114. package/dist/record/sqlite/current-schema.d.ts +3 -3
  115. package/dist/record/sqlite/database.cjs +56 -53
  116. package/dist/record/sqlite/database.cjs.map +1 -1
  117. package/dist/record/sqlite/index.cjs +3 -1
  118. package/dist/record/sqlite/index.cjs.map +1 -1
  119. package/dist/record/sqlite/index.d.cts +5 -2
  120. package/dist/record/sqlite/index.d.mts +5 -2
  121. package/dist/record/sqlite/index.d.ts +5 -2
  122. package/dist/record/sqlite/legacy-schema-018.cjs +443 -0
  123. package/dist/record/sqlite/legacy-schema-018.cjs.map +1 -0
  124. package/dist/record/sqlite/legacy-schema-018.d.cts +6 -0
  125. package/dist/record/sqlite/legacy-schema-018.d.mts +6 -0
  126. package/dist/record/sqlite/legacy-schema-018.d.ts +6 -0
  127. package/dist/record/sqlite/legacy-schema-018.js +6 -0
  128. package/dist/record/sqlite/legacy-schema-018.js.map +1 -0
  129. package/dist/record/sqlite/migration.cjs +105 -46
  130. package/dist/record/sqlite/migration.cjs.map +1 -1
  131. package/dist/record/sqlite/migration.d.cts +2 -1
  132. package/dist/record/sqlite/migration.d.mts +2 -1
  133. package/dist/record/sqlite/migration.d.ts +2 -1
  134. package/dist/record/sqlite/portable-capture.cjs +13 -13
  135. package/dist/record/sqlite/portable-capture.cjs.map +1 -1
  136. package/dist/record/sqlite/registry-repository.cjs +22 -22
  137. package/dist/record/sqlite/registry-repository.cjs.map +1 -1
  138. package/dist/record/sqlite/schema.cjs +10 -2
  139. package/dist/record/sqlite/schema.cjs.map +1 -1
  140. package/dist/record/sqlite/schema.d.cts +4 -1
  141. package/dist/record/sqlite/schema.d.mts +4 -1
  142. package/dist/record/sqlite/schema.d.ts +4 -1
  143. package/dist/record/sqlite/schema.js +20 -14
  144. package/dist/record/sqlite/storage-worker.cjs +1 -1
  145. package/dist/record/sqlite/storage-worker.cjs.map +1 -1
  146. package/dist/record/sqlite/storage.cjs +316 -232
  147. package/dist/record/sqlite/storage.cjs.map +1 -1
  148. package/dist/record/sqlite/storage.d.cts +10 -2
  149. package/dist/record/sqlite/storage.d.mts +10 -2
  150. package/dist/record/sqlite/storage.d.ts +10 -2
  151. package/dist/record/sqlite/storage.js +54 -50
  152. package/dist/record/sqlite/types.cjs +1 -1
  153. package/dist/record/sqlite/types.cjs.map +1 -1
  154. package/dist/record/sqlite/types.d.cts +13 -1
  155. package/dist/record/sqlite/types.d.mts +13 -1
  156. package/dist/record/sqlite/types.d.ts +13 -1
  157. package/dist/run/cli/contribution.cjs +17 -12
  158. package/dist/run/cli/contribution.cjs.map +1 -1
  159. package/dist/run/host/lifecycle-adapter.cjs +1 -1
  160. package/dist/run/host/lifecycle-adapter.cjs.map +1 -1
  161. package/dist/run/storage/owner-identity.cjs +78 -16
  162. package/dist/run/storage/owner-identity.cjs.map +1 -1
  163. package/dist/run/storage/owner-identity.d.cts +2 -1
  164. package/dist/run/storage/owner-identity.d.mts +2 -1
  165. package/dist/run/storage/owner-identity.d.ts +2 -1
  166. package/dist/run/storage/sqlite.cjs +55 -55
  167. package/dist/run/storage/sqlite.cjs.map +1 -1
  168. package/dist/runner/accept.cjs +12 -42
  169. package/dist/runner/accept.cjs.map +1 -1
  170. package/dist/runner/accept.d.cts +2 -3
  171. package/dist/runner/accept.d.mts +2 -3
  172. package/dist/runner/accept.d.ts +2 -3
  173. package/dist/runner/adapter-usage.cjs +2 -2
  174. package/dist/runner/adapter-usage.cjs.map +1 -1
  175. package/dist/runner/adoption.cjs +14 -26
  176. package/dist/runner/adoption.cjs.map +1 -1
  177. package/dist/runner/adoption.d.cts +5 -13
  178. package/dist/runner/adoption.d.mts +5 -13
  179. package/dist/runner/adoption.d.ts +5 -13
  180. package/dist/runner/adoption.js +2 -4
  181. package/dist/runner/record.cjs +24 -18
  182. package/dist/runner/record.cjs.map +1 -1
  183. package/dist/runner/rename-experiment.cjs +5 -7
  184. package/dist/runner/rename-experiment.cjs.map +1 -1
  185. package/dist/runner/reuse-plan.cjs +37 -18
  186. package/dist/runner/reuse-plan.cjs.map +1 -1
  187. package/dist/runner/reuse-plan.d.cts +4 -1
  188. package/dist/runner/reuse-plan.d.mts +4 -1
  189. package/dist/runner/reuse-plan.d.ts +4 -1
  190. package/dist/runner/setup-prefix-plan.cjs +17 -12
  191. package/dist/runner/setup-prefix-plan.cjs.map +1 -1
  192. package/dist/runner/setup-prefix-plan.d.cts +0 -2
  193. package/dist/runner/setup-prefix-plan.d.mts +0 -2
  194. package/dist/runner/setup-prefix-plan.d.ts +0 -2
  195. package/dist/runner/setup-prefix-plan.js +8 -12
  196. package/dist/sandbox/backend.cjs +10 -1
  197. package/dist/sandbox/backend.cjs.map +1 -1
  198. package/dist/sandbox/backend.d.cts +16 -8
  199. package/dist/sandbox/backend.d.mts +16 -8
  200. package/dist/sandbox/backend.d.ts +16 -8
  201. package/dist/sandbox/backend.js +28 -26
  202. package/dist/sandbox/docker.cjs +7 -1
  203. package/dist/sandbox/docker.cjs.map +1 -1
  204. package/dist/sandbox/e2b-cache-repository.cjs +13 -3
  205. package/dist/sandbox/e2b-cache-repository.cjs.map +1 -1
  206. package/dist/sandbox/e2b-cache-repository.d.cts +3 -0
  207. package/dist/sandbox/e2b-cache-repository.d.mts +3 -0
  208. package/dist/sandbox/e2b-cache-repository.d.ts +3 -0
  209. package/dist/sandbox/e2b-cache-repository.js +16 -12
  210. package/dist/sandbox/e2b.cjs +2 -2
  211. package/dist/sandbox/e2b.cjs.map +1 -1
  212. package/dist/sandbox/incus/materialize.cjs +1 -1
  213. package/dist/sandbox/incus/materialize.cjs.map +1 -1
  214. package/dist/show/contribution.cjs +3 -3
  215. package/dist/show/contribution.cjs.map +1 -1
  216. package/dist/show/model.cjs +14 -13
  217. package/dist/show/model.cjs.map +1 -1
  218. package/dist/show/model.d.cts +7 -7
  219. package/dist/show/model.d.mts +7 -7
  220. package/dist/show/model.d.ts +7 -7
  221. package/dist/show/render.cjs +14 -0
  222. package/dist/show/render.cjs.map +1 -1
  223. package/dist/user-database/storage-worker.cjs +13 -3
  224. package/dist/user-database/storage-worker.cjs.map +1 -1
  225. package/dist/view/app-dist/.vite/manifest.json +2 -2
  226. package/dist/view/app-dist/assets/{index-CmVoXbwG.js → index-B3ijZRph.js} +17 -17
  227. package/dist/view/app-dist/assets/{quality-cost-scatter-BuLISaH4.js → quality-cost-scatter-B--DfJ9s.js} +1 -1
  228. package/dist/view/app-dist/index.html +1 -1
  229. package/dist/view/application-runtime.cjs +8 -0
  230. package/dist/view/application-runtime.cjs.map +1 -0
  231. package/dist/view/application-runtime.d.cts +9 -0
  232. package/dist/view/application-runtime.d.mts +9 -0
  233. package/dist/view/application-runtime.d.ts +9 -0
  234. package/dist/view/application-runtime.js +6 -0
  235. package/dist/view/application-runtime.js.map +1 -0
  236. package/dist/view/cli/contribution.cjs +5 -2
  237. package/dist/view/cli/contribution.cjs.map +1 -1
  238. package/dist/view/cli/contribution.d.cts +2 -1
  239. package/dist/view/cli/contribution.d.mts +2 -1
  240. package/dist/view/cli/contribution.d.ts +2 -1
  241. package/dist/view/function-runtime.mjs +1019 -456
  242. package/dist/view/http-protocol.d.cts +1 -9
  243. package/dist/view/http-protocol.d.mts +1 -9
  244. package/dist/view/http-protocol.d.ts +1 -9
  245. package/dist/view/inspection-host.cjs +39 -30
  246. package/dist/view/inspection-host.cjs.map +1 -1
  247. package/dist/view/inspection-host.d.cts +7545 -2
  248. package/dist/view/inspection-host.d.mts +7545 -2
  249. package/dist/view/inspection-host.d.ts +7545 -2
  250. package/dist/view/server.cjs +8 -5
  251. package/dist/view/server.cjs.map +1 -1
  252. package/dist/view/server.d.cts +4 -2
  253. package/dist/view/server.d.mts +4 -2
  254. package/dist/view/server.d.ts +4 -2
  255. package/docs-site/zh/reference/cli.mdx +1 -2
  256. package/docs-site/zh/tutorials/control-run-cost.mdx +22 -0
  257. package/docs-site/zh/tutorials/niceeval-taste-application.mdx +21 -0
  258. 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["discardAttemptWriteSession"];
5
- export { __niceevalExport0 as discardAttemptWriteSession };
6
- const __niceevalExport1 = __niceevalCanonical["makeRecordHost"];
7
- export { __niceevalExport1 as makeRecordHost };
8
- const __niceevalExport2 = __niceevalCanonical["recordHost"];
9
- export { __niceevalExport2 as recordHost };
10
- const __niceevalExport3 = __niceevalCanonical["writerGenerationForRunSession"];
11
- export { __niceevalExport3 as writerGenerationForRunSession };
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 ne18_runs WHERE status <> 'sealed' ORDER BY run_id LIMIT ?").all(types_ts_1.RECORD_MAINTENANCE_MAXIMUM_RUNS + 1);
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 ne18_runs WHERE run_id = ? AND status <> 'sealed'");
70
- const reopenSealing = connection.db.prepare(`UPDATE ne18_runs SET status='open',candidate_seal_identity=NULL,
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":"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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 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 ne18_coordination_state WHERE singleton=1").get();
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 ne18_coordination_state SET
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 ne18_coordination_state SET
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 ne18_coordination_tickets ORDER BY sequence LIMIT 1`).get());
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 ne18_coordination_tickets WHERE ticket_id=? AND sequence=?")
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 ne18_record_metadata WHERE singleton=1").get();
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 ne18_record_metadata SET barrier_state='open',storage_generation=?,portable_generation=NULL,
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 ne18_coordination_state SET operational_generation=?,revision=revision+1 WHERE singleton=1")
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 ne18_coordination_tickets WHERE ticket_id=?`).get(request.ticketId));
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 ne18_coordination_tickets(
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 ne18_coordination_state
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 ne18_coordination_tickets ORDER BY sequence LIMIT 1`).get());
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 ne18_coordination_tickets WHERE ticket_id=? AND sequence=?")
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 ne18_coordination_state SET
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 ne18_coordination_tickets WHERE ticket_id=?`).get(request.ticketId));
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 ne18_coordination_tickets WHERE ticket_id=? AND sequence=?")
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 ne18_coordination_state SET
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 ne18_coordination_state SET
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":";;AAqWA,0DAmBC;AAxXD,6CAAyC;AACzC,+CAAqE;AACrE,2CAA0C;AAC1C,qDAA4D;AAC5D,mGAAyF;AAEzF,MAAM,mCAAmC,GAAG,EAAE,CAAC;AAsC/C,SAAS,OAAO,CAAC,SAAiB,EAAE,OAAe;IAC/C,MAAM,IAAA,uBAAW,EAAC,yBAAyB,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AACrE,CAAC;AACD,SAAS,IAAI,CAAC,KAAc,EAAE,KAAa;IACvC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAC/C,OAAO,CAAC,cAAc,EAAE,GAAG,KAAK,aAAa,CAAC,CAAC;IACnD,OAAO,KAAK,CAAC;AACjB,CAAC;AACD,SAAS,OAAO,CAAC,KAAc,EAAE,KAAa;IAC1C,MAAM,MAAM,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACjE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC;QAC7B,OAAO,CAAC,cAAc,EAAE,GAAG,KAAK,aAAa,CAAC,CAAC;IACnD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;AAC1B,CAAC;AACD,SAAS,eAAe,CAAC,KAAc,EAAE,KAAa;IAClD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACrC,IAAI,MAAM,IAAI,CAAC;QACX,OAAO,CAAC,cAAc,EAAE,GAAG,KAAK,aAAa,CAAC,CAAC;IACnD,OAAO,MAAM,CAAC;AAClB,CAAC;AACD,SAAS,aAAa,CAAC,KAKtB;IACG,OAAO,IAAA,4CAAiB,EAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,GAAG,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC;AAClF,CAAC;AACD,SAAS,aAAa,CAAC,GAAwC;IAC3D,IAAI,GAAG,KAAK,SAAS;QACjB,OAAO,SAAS,CAAC;IACrB,OAAO;QACH,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,gCAAgC,CAAC;QAC/D,QAAQ,EAAE,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,+BAA+B,CAAC;QACxE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,2BAA2B,CAAC;QACjD,GAAG,EAAE,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE,0BAA0B,CAAC;QACzD,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,8BAA8B,CAAC;QACzD,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,oCAAoC,CAAC;QAC3E,QAAQ,EAAE,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,+BAA+B,CAAC;QACxE,UAAU,EAAE,eAAe,CAAC,GAAG,CAAC,WAAW,EAAE,kCAAkC,CAAC;KACnF,CAAC;AACN,CAAC;AACD,SAAS,iBAAiB,CAAC,UAA0B;IACjD,MAAM,GAAG,GAAG,IAAA,6BAAe,EAAC,UAAU,EAAE,yDAAyD,CAAC,CAAC,GAAG,EAAyC,CAAC;IAChJ,IAAI,GAAG,KAAK,SAAS;QACjB,OAAO,CAAC,cAAc,EAAE,yCAAyC,CAAC,CAAC;IACvE,MAAM,cAAc,GAAG,GAAG,CAAC,gBAAgB,CAAC;IAC5C,MAAM,MAAM,GAAG,cAAc,KAAK,IAAI;QAClC,CAAC,CAAC,SAAS;QACX,CAAC,CAAC;YACE,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE,qCAAqC,CAAC;YACrE,QAAQ,EAAE,eAAe,CAAC,GAAG,CAAC,eAAe,EAAE,oCAAoC,CAAC;YACpF,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,gCAAgC,CAAC;YAC7D,GAAG,EAAE,eAAe,CAAC,GAAG,CAAC,UAAU,EAAE,+BAA+B,CAAC;YACrE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,mCAAmC,CAAC;YACrE,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,oBAAoB,EAAE,yCAAyC,CAAC;YACvF,QAAQ,EAAE,eAAe,CAAC,GAAG,CAAC,eAAe,EAAE,oCAAoC,CAAC;YACpF,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,iCAAiC,CAAC;YAChE,cAAc,EAAE,eAAe,CAAC,GAAG,CAAC,uBAAuB,EAAE,4CAA4C,CAAC;SAC7G,CAAC;IACN,MAAM,SAAS,GAAG,GAAG,CAAC,UAAU,CAAC;IACjC,IAAI,OAAiC,CAAC;IACtC,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,GAAG,CAAC,cAAc,CAAC;QAClC,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YAChD,OAAO,CAAC,cAAc,EAAE,8CAA8C,CAAC,CAAC;QAC5E,CAAC;QACD,OAAO,GAAG;YACN,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,+BAA+B,CAAC;YAC3D,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,kCAAkC,CAAC;YAClE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,iCAAiC,CAAC;YAC/D,GAAG,EAAE,eAAe,CAAC,GAAG,CAAC,WAAW,EAAE,gCAAgC,CAAC;YACvE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,oCAAoC,CAAC;YACvE,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,qBAAqB,EAAE,0CAA0C,CAAC;YACzF,QAAQ,EAAE,eAAe,CAAC,GAAG,CAAC,gBAAgB,EAAE,qCAAqC,CAAC;YACtF,cAAc,EAAE,eAAe,CAAC,GAAG,CAAC,wBAAwB,EAAE,6CAA6C,CAAC;YAC5G,MAAM;SACT,CAAC;IACN,CAAC;IACD,OAAO;QACH,kBAAkB,EAAE,eAAe,CAAC,GAAG,CAAC,oBAAoB,EAAE,yCAAyC,CAAC;QACxG,MAAM;QACN,OAAO;KACV,CAAC;AACN,CAAC;AACD,SAAS,WAAW,CAAC,UAA0B,EAAE,KAAkB;IAC/D,MAAM,MAAM,GAAG,IAAA,6BAAe,EAAC,UAAU,EAAE;;;;;sFAKuC,CAAC;SAC9E,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACtD,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;QAC5B,OAAO,CAAC,cAAc,EAAE,qCAAqC,CAAC,CAAC;AACvE,CAAC;AACD,SAAS,YAAY,CAAC,UAA0B,EAAE,KAAmB;IACjE,MAAM,MAAM,GAAG,IAAA,6BAAe,EAAC,UAAU,EAAE;;;;;2DAKY,CAAC;SACnD,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACvC,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;QAC5B,OAAO,CAAC,cAAc,EAAE,qCAAqC,CAAC,CAAC;AACvE,CAAC;AACD,SAAS,OAAO,CAAC,UAA0B,EAAE,IAAY;IACrD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,mCAAmC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC1E,MAAM,IAAI,GAAG,aAAa,CAAC,IAAA,6BAAe,EAAC,UAAU,EAAE;+DACA,CAAC,CAAC,GAAG,EAAyC,CAAC,CAAC;QACvG,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;YAC1C,MAAM;QACV,IAAA,6BAAe,EAAC,UAAU,EAAE,wEAAwE,CAAC;aAChG,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;IACD,MAAM,KAAK,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5D,WAAW,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9D,YAAY,CAAC,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;AACL,CAAC;AACD,SAAS,UAAU,CAAC,KAAkB,EAAE,OAOvC;IACG,OAAO,KAAK,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ;QAC7E,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM;QAC3F,KAAK,CAAC,YAAY,KAAK,OAAO,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO,CAAC,QAAQ,CAAC;AACxF,CAAC;AACD,SAAS,WAAW,CAAC,KAAmB,EAAE,OAOzC;IACG,OAAO,KAAK,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK;QACzE,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM;QAC3F,KAAK,CAAC,YAAY,KAAK,OAAO,CAAC,YAAY,CAAC;AACpD,CAAC;AACD,SAAS,UAAU,CAAC,UAA0B,EAAE,OAE9C;IACE,MAAM,QAAQ,GAAG,IAAA,6BAAe,EAAC,UAAU,EAAE,kEAAkE,CAAC,CAAC,GAAG,EAAyC,CAAC;IAC9J,IAAI,QAAQ,KAAK,SAAS;QACtB,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,oCAAoC,CAAC,CAAC;IACrE,IAAI,QAAQ,CAAC,aAAa,KAAK,UAAU;QACrC,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC;IAC3C,IAAI,QAAQ,CAAC,aAAa,KAAK,UAAU,EAAE,CAAC;QACxC,MAAM,UAAU,GAAG,IAAA,wBAAU,GAAE,CAAC;QAChC,IAAA,6BAAe,EAAC,UAAU,EAAE;kGAC8D,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC5G,IAAA,6BAAe,EAAC,UAAU,EAAE,mGAAmG,CAAC;aAC3H,GAAG,CAAC,UAAU,CAAC,CAAC;IACzB,CAAC;SACI,IAAI,QAAQ,CAAC,aAAa,KAAK,MAAM,EAAE,CAAC;QACzC,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,oCAAoC,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAA,6BAAe,EAAC,UAAU,EAAE;qDACV,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAwC,CAAC,CAAC;IACjH,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QACzB,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,IAAI,QAAQ,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG;YAC9D,QAAQ,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,IAAI,QAAQ,CAAC,YAAY,KAAK,OAAO,CAAC,YAAY;YACpF,QAAQ,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;YACzC,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,gCAAgC,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC5D,CAAC;IACD,MAAM,KAAK,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAC5C,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;QAC3B,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC;IAC3C,IAAI,KAAK,CAAC,kBAAkB,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;QACtD,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,qCAAqC,CAAC,CAAC;IACtE,CAAC;IACD,IAAA,6BAAe,EAAC,UAAU,EAAE;qGACqE,CAAC;SAC7F,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,kBAAkB,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5J,MAAM,QAAQ,GAAG,IAAA,6BAAe,EAAC,UAAU,EAAE;;iDAEA,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAC7E,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC;QAC9B,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,yBAAyB,CAAC,CAAC;IAC1D,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,kBAAkB,EAAE,CAAC;AACnE,CAAC;AACD,SAAS,WAAW,CAAC,UAA0B,EAAE,OAE/C;IACE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;QAC3B,OAAO,KAAK,CAAC;IACjB,MAAM,IAAI,GAAG,aAAa,CAAC,IAAA,6BAAe,EAAC,UAAU,EAAE;6DACE,CAAC,CAAC,GAAG,EAAyC,CAAC,CAAC;IACzG,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ;QACxD,OAAO,KAAK,CAAC;IACjB,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG;QAC5F,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,KAAK,OAAO,CAAC,YAAY;QAC5E,IAAI,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrC,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,iDAAiD,CAAC,CAAC;IAClF,CAAC;IACD,MAAM,OAAO,GAAG,IAAA,6BAAe,EAAC,UAAU,EAAE,wEAAwE,CAAC;SAChH,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;QAC7B,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,wCAAwC,CAAC,CAAC;IACzE,MAAM,QAAQ,GAAG,IAAA,6BAAe,EAAC,UAAU,EAAE;;;8FAG6C,CAAC;SACtF,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClM,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC;QAC9B,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,gCAAgC,CAAC,CAAC;IACjE,OAAO,IAAI,CAAC;AAChB,CAAC;AACD,SAAS,eAAe,CAAC,UAA0B,EAAE,OAEnD;IACE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,aAAa,CAAC,IAAA,6BAAe,EAAC,UAAU,EAAE;qDACR,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAwC,CAAC,CAAC;IACjH,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACvB,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG;YAC1D,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,YAAY,KAAK,OAAO,CAAC,YAAY,EAAE,CAAC;YACnF,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,wDAAwD,CAAC,CAAC;QACzF,CAAC;QACD,IAAA,6BAAe,EAAC,UAAU,EAAE,wEAAwE,CAAC;aAChG,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,MAAM,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;IACpD,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC/D,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;YACjE,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,uDAAuD,CAAC,CAAC;QACxF,CAAC;QACD,WAAW,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;AACL,CAAC;AACD,SAAS,gBAAgB,CAAC,UAA0B,EAAE,OAEpD;IACE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;IACpD,IAAI,MAAM,KAAK,SAAS;QACpB,OAAO;IACX,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,kDAAkD,CAAC,CAAC;IACnF,CAAC;IACD,WAAW,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;AACpC,CAAC;AACD,SAAS,iBAAiB,CAAC,UAA0B,EAAE,OAErD;IACE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAC5C,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;QAC3B,OAAO,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC/C,MAAM,WAAW,GAAG,IAAA,6BAAe,EAAC,UAAU,EAAE;;;wFAGoC,CAAC;SAChF,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IACrK,IAAI,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;QACjC,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAAC;IACvD,OAAO,IAAI,CAAC;AAChB,CAAC;AACD,SAAS,qBAAqB,CAAC,UAA0B,EAAE,OAEzD;IACE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAC5C,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;QAC3B,OAAO,KAAK,CAAC;IACjB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,iDAAiD,CAAC,CAAC;IAClF,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;QAC1B,OAAO,KAAK,CAAC;IACjB,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,QAAQ;QACjC,OAAO,IAAI,CAAC;IAChB,MAAM,SAAS,GAAG,IAAA,6BAAe,EAAC,UAAU,EAAE;;;mCAGf,CAAC;SAC3B,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACxD,IAAI,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC;QAC/B,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,wCAAwC,CAAC,CAAC;IACzE,OAAO,IAAI,CAAC;AAChB,CAAC;AACD,SAAS,gBAAgB,CAAC,UAA0B,EAAE,OAEpD;IACE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC;IACtD,IAAI,OAAO,KAAK,SAAS;QACrB,OAAO;IACX,IAAI,OAAO,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS;QACvC,OAAO;IACX,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,6DAA6D,CAAC,CAAC;IAC9F,CAAC;IACD,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AACtC,CAAC;AACD,iFAAiF;AACjF,SAAgB,uBAAuB,CAAC,UAA0B,EAAE,OAAuB;IACvF,OAAO,IAAA,yCAAwB,EAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE;QAClF,QAAQ,OAAO,CAAC,SAAS,EAAE,CAAC;YACxB,KAAK,SAAS;gBACV,OAAO,UAAU,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAC3C,KAAK,WAAW;gBACZ,OAAO,WAAW,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAC5C,KAAK,eAAe;gBAChB,OAAO,eAAe,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAChD,KAAK,gBAAgB;gBACjB,OAAO,gBAAgB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACjD,KAAK,iBAAiB;gBAClB,OAAO,iBAAiB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAClD,KAAK,sBAAsB;gBACvB,OAAO,qBAAqB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACtD,KAAK,gBAAgB;gBACjB,OAAO,gBAAgB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACrD,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC","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 ne18_record_metadata WHERE singleton=1").get();
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 ne18_case_locks WHERE case_id=?").get(caseId);
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 ne18_case_locks(case_id,owner_id,owner_generation,owner_host,owner_pid,owner_boot_id,owner_process_start,acquired_at,heartbeat_at)
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 ne18_case_locks SET heartbeat_at=? WHERE case_id=? AND ${ownerSql()}`)
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 ne18_case_locks WHERE case_id=? AND ${ownerSql()}`)
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 ne18_case_locks SET owner_id=?,owner_generation=owner_generation+1,owner_host=?,owner_pid=?,
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");