niceeval 0.14.2 → 0.14.3-canary.53
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/INDEX.md +13 -6
- package/dist/agents/sdk-streams.cjs +6 -1
- package/dist/agents/sdk-streams.cjs.map +1 -1
- package/dist/agents/sdk-streams.d.cts +3 -2
- package/dist/agents/sdk-streams.d.mts +3 -2
- package/dist/agents/sdk-streams.d.ts +3 -2
- package/dist/agents/ui-message-stream.cjs +3 -1
- package/dist/agents/ui-message-stream.cjs.map +1 -1
- package/dist/experiment/host/cli/debug-protocol.cjs +257 -0
- package/dist/experiment/host/cli/debug-protocol.cjs.map +1 -0
- package/dist/experiment/host/cli/debug-protocol.d.cts +13 -0
- package/dist/experiment/host/cli/debug-protocol.d.mts +13 -0
- package/dist/experiment/host/cli/debug-protocol.d.ts +13 -0
- package/dist/experiment/host/cli/debug-protocol.js +8 -0
- package/dist/experiment/host/cli/debug-protocol.js.map +1 -0
- package/dist/experiment/host/cli/session-protocol.cjs +78 -0
- package/dist/experiment/host/cli/session-protocol.cjs.map +1 -0
- package/dist/experiment/host/cli/session-protocol.d.cts +10 -0
- package/dist/experiment/host/cli/session-protocol.d.mts +10 -0
- package/dist/experiment/host/cli/session-protocol.d.ts +10 -0
- package/dist/experiment/host/cli/session-protocol.js +12 -0
- package/dist/experiment/host/cli/session-protocol.js.map +1 -0
- package/dist/experiment/host/index.cjs +9 -1
- package/dist/experiment/host/index.cjs.map +1 -1
- package/dist/experiment/host/index.d.cts +2 -0
- package/dist/experiment/host/index.d.mts +2 -0
- package/dist/experiment/host/index.d.ts +2 -0
- package/dist/experiment/host/index.js +28 -16
- package/dist/experiment/host/index.mjs +28 -16
- package/dist/run/cli/contribution.cjs +5 -5
- package/dist/run/cli/contribution.cjs.map +1 -1
- package/dist/run/host/index.cjs +14 -3
- package/dist/run/host/index.cjs.map +1 -1
- package/dist/run/host/index.d.cts +2 -2
- package/dist/run/host/index.d.mts +2 -2
- package/dist/run/host/index.d.ts +2 -2
- package/dist/run/host/lifecycle-adapter.cjs +12 -12
- package/dist/run/host/lifecycle-adapter.cjs.map +1 -1
- package/dist/run/host/runtime.cjs +22 -22
- package/dist/run/host/runtime.cjs.map +1 -1
- package/dist/run/host/runtime.d.cts +11 -2
- package/dist/run/host/runtime.d.mts +11 -2
- package/dist/run/host/runtime.d.ts +11 -2
- package/dist/run/host/runtime.js +2 -2
- package/dist/run/host/types.cjs.map +1 -1
- package/dist/run/host/types.d.cts +4 -5
- package/dist/run/host/types.d.mts +4 -5
- package/dist/run/host/types.d.ts +4 -5
- package/dist/runner/assert-first-bridge.cjs +78 -3
- package/dist/runner/assert-first-bridge.cjs.map +1 -1
- package/dist/runner/assert-first-bridge.d.cts +11 -1
- package/dist/runner/assert-first-bridge.d.mts +11 -1
- package/dist/runner/assert-first-bridge.d.ts +11 -1
- package/dist/runner/attempt.cjs +77 -67
- package/dist/runner/attempt.cjs.map +1 -1
- package/dist/sandbox/backend.cjs.map +1 -1
- package/dist/sandbox/backend.d.cts +2 -2
- package/dist/sandbox/backend.d.mts +2 -2
- package/dist/sandbox/backend.d.ts +2 -2
- package/dist/sandbox/index.cjs.map +1 -1
- package/dist/sandbox/index.d.cts +1 -0
- package/dist/sandbox/index.d.mts +1 -0
- package/dist/sandbox/index.d.ts +1 -0
- package/dist/sandbox/layer.cjs.map +1 -1
- package/dist/sandbox/layer.d.cts +3 -3
- package/dist/sandbox/layer.d.mts +3 -3
- package/dist/sandbox/layer.d.ts +3 -3
- package/dist/sandbox/runtime.cjs.map +1 -1
- package/dist/sandbox/types.cjs.map +1 -1
- package/dist/sandbox/types.d.cts +2 -0
- package/dist/sandbox/types.d.mts +2 -0
- package/dist/sandbox/types.d.ts +2 -0
- package/dist/show/render.cjs +1 -0
- package/dist/show/render.cjs.map +1 -1
- package/dist/terminal/blocks.cjs +3 -5
- package/dist/terminal/blocks.cjs.map +1 -1
- package/dist/view/app-dist/.vite/manifest.json +3 -76
- package/dist/view/app-dist/assets/index-C6GQwHEF.js +63 -0
- package/dist/view/app-dist/assets/{quality-cost-scatter-B5wDa_F1.js → quality-cost-scatter-CSiMLelf.js} +5 -5
- package/dist/view/app-dist/index.html +1 -2
- package/dist/view/server.cjs +4 -3
- package/dist/view/server.cjs.map +1 -1
- package/docs-site/zh/README.md +2 -2
- package/docs-site/zh/tutorials/agent-feedback-loop.mdx +8 -5
- package/docs-site/zh/tutorials/agent-onboarding.mdx +5 -3
- package/package.json +1 -1
- package/dist/view/app-dist/assets/AttemptDialog-76dX1VQq.js +0 -41
- package/dist/view/app-dist/assets/AttemptRoute-DRHVh2JA.js +0 -4
- package/dist/view/app-dist/assets/ResultsPage-9CSI8dvZ.js +0 -2
- package/dist/view/app-dist/assets/RunPage-BUF0REv7.js +0 -1
- package/dist/view/app-dist/assets/TableContentView-_Sbg5wDr.js +0 -3
- package/dist/view/app-dist/assets/index-BGr_6pGY.js +0 -19
- package/dist/view/app-dist/assets/jsx-runtime-BnHLaUks.js +0 -1
- package/dist/view/app-dist/assets/useSuspenseQuery-D3W8Uy33.js +0 -1
package/dist/run/host/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
export
|
|
1
|
+
import type { RunHost } from "./types.js";
|
|
2
|
+
export declare const runHost: RunHost;
|
|
3
3
|
export { RunDeleteError, RunReadError, RunRecoverError, type RunDeleteReceipt, type RunDeleteRequest, type RunGetRequest, type RunHost, type RunDetail, type RunListRequest, type RunListResult, type RunSlot, type RunState, type RunSummary, type RunRecoverReceipt, type RunRecoverRequest, type RunResult, } from "./types.js";
|
|
@@ -97,18 +97,18 @@ exports.sqliteRunLifecycleAdapter = Object.freeze({
|
|
|
97
97
|
const cutoff = yield* (0, index_ts_1.currentPublicationCutoff)(root);
|
|
98
98
|
const run = yield* (0, index_ts_1.readRunResource)(root, runId, cutoff);
|
|
99
99
|
if (run === undefined) {
|
|
100
|
-
|
|
100
|
+
return yield* effect_1.Effect.fail(new types_ts_1.RunDeleteError({
|
|
101
101
|
operation: "delete",
|
|
102
102
|
code: "run-not-found",
|
|
103
103
|
message: `Run ${runId} was not found.`,
|
|
104
|
-
});
|
|
104
|
+
}));
|
|
105
105
|
}
|
|
106
106
|
if (run.state === "active") {
|
|
107
|
-
|
|
107
|
+
return yield* effect_1.Effect.fail(new types_ts_1.RunDeleteError({
|
|
108
108
|
operation: "delete",
|
|
109
109
|
code: "run-active",
|
|
110
110
|
message: `Run ${runId} is active and cannot be deleted.`,
|
|
111
|
-
});
|
|
111
|
+
}));
|
|
112
112
|
}
|
|
113
113
|
yield* (0, index_ts_1.deleteRunResource)(root, {
|
|
114
114
|
runId,
|
|
@@ -132,33 +132,33 @@ exports.sqliteRunLifecycleAdapter = Object.freeze({
|
|
|
132
132
|
const cutoff = yield* (0, index_ts_1.currentPublicationCutoff)(root);
|
|
133
133
|
const run = yield* (0, index_ts_1.readRunResource)(root, runId, cutoff);
|
|
134
134
|
if (run === undefined) {
|
|
135
|
-
|
|
135
|
+
return yield* effect_1.Effect.fail(new types_ts_1.RunRecoverError({
|
|
136
136
|
operation: "recover",
|
|
137
137
|
code: "run-not-found",
|
|
138
138
|
message: `Run ${runId} was not found.`,
|
|
139
|
-
});
|
|
139
|
+
}));
|
|
140
140
|
}
|
|
141
141
|
if (run.state !== "active") {
|
|
142
|
-
|
|
142
|
+
return yield* effect_1.Effect.fail(new types_ts_1.RunRecoverError({
|
|
143
143
|
operation: "recover",
|
|
144
144
|
code: "run-terminal",
|
|
145
145
|
message: `Run ${runId} is already ${run.state}.`,
|
|
146
|
-
});
|
|
146
|
+
}));
|
|
147
147
|
}
|
|
148
148
|
const observation = (0, index_ts_1.observeRunWriterTermination)(run.writerGeneration);
|
|
149
149
|
if (observation.state === "active") {
|
|
150
|
-
|
|
150
|
+
return yield* effect_1.Effect.fail(new types_ts_1.RunRecoverError({
|
|
151
151
|
operation: "recover",
|
|
152
152
|
code: "run-owner-active",
|
|
153
153
|
message: `Run ${runId} still has a live writer; recovery is refused.`,
|
|
154
|
-
});
|
|
154
|
+
}));
|
|
155
155
|
}
|
|
156
156
|
if (observation.state === "unproven") {
|
|
157
|
-
|
|
157
|
+
return yield* effect_1.Effect.fail(new types_ts_1.RunRecoverError({
|
|
158
158
|
operation: "recover",
|
|
159
159
|
code: "run-owner-termination-unproven",
|
|
160
160
|
message: `Run ${runId} recovery requires verified owner-termination evidence.`,
|
|
161
|
-
});
|
|
161
|
+
}));
|
|
162
162
|
}
|
|
163
163
|
yield* (0, index_ts_1.recoverRunResource)(root, {
|
|
164
164
|
runId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle-adapter.js","sourceRoot":"","sources":["lifecycle-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { DateTime, Effect } from \"effect\";\nimport type { ProjectStateDatabase } from \"../../record/sqlite/project-state-database.ts\";\nimport { SqliteRecordError } from \"../../record/sqlite/errors.ts\";\nimport { currentPublicationCutoff, deleteRunResource, observeRunWriterTermination, readRunResource, recoverRunResource, RunStorageError, } from \"../storage/index.ts\";\nimport type { RunDeleteReceipt, RunRecoverReceipt, } from \"./types.ts\";\nimport { RunDeleteError, RunRecoverError, } from \"./types.ts\";\n/**\n * Narrow wiring seam for the Run-owned SQLite adapter. The current Record\n * runtime cannot yet delete terminal Runs or fence and recover an active\n * writer, so the public Host fails closed instead of rebranding `clean`.\n */\nexport interface RunLifecycleAdapter {\n readonly delete: (request: {\n readonly cwd: string;\n readonly runId: string;\n }) => Effect.Effect<RunDeleteReceipt, RunDeleteError, ProjectStateDatabase>;\n readonly recover: (request: {\n readonly cwd: string;\n readonly runId: string;\n }) => Effect.Effect<RunRecoverReceipt, RunRecoverError, ProjectStateDatabase>;\n}\nfunction storageRoot(cwd: string): string {\n return resolve(cwd, \".niceeval\");\n}\nfunction databaseExists(root: string): boolean {\n return existsSync(resolve(root, \"record.sqlite\"));\n}\nfunction deleteFailure(runId: string, cause: unknown): RunDeleteError {\n if (cause instanceof RunDeleteError)\n return cause;\n if (cause instanceof SqliteRecordError && cause.cause instanceof Error && cause.cause.name === \"run-delete-reference-conflict\") {\n const details = Reflect.get(cause.cause, \"details\");\n if (Array.isArray(details)) {\n const dependencies = details as RunStorageError[\"dependencies\"];\n return new RunDeleteError({\n operation: \"delete\",\n code: \"run-referenced\",\n message: `Run ${runId} is referenced by ${dependencies.length} published Attempt binding(s): ${dependencies.map((dependency) => `${dependency.dependentRunId}/${dependency.dependentSlotId} -> ${dependency.attemptLocator}`).join(\", \")}.`,\n cause,\n });\n }\n }\n if (cause instanceof RunStorageError) {\n if (cause.code === \"run-not-found\") {\n return new RunDeleteError({\n operation: \"delete\",\n code: \"run-not-found\",\n message: `Run ${runId} was not found.`,\n cause,\n });\n }\n if (cause.code === \"run-delete-reference-conflict\") {\n const dependencies = cause.dependencies.map((dependency) => `${dependency.dependentRunId}/${dependency.dependentSlotId} -> ${dependency.attemptLocator}`).join(\", \");\n return new RunDeleteError({\n operation: \"delete\",\n code: \"run-referenced\",\n message: `Run ${runId} is referenced by ${cause.dependencies.length} published Attempt binding(s): ${dependencies}.`,\n cause,\n });\n }\n }\n return new RunDeleteError({\n operation: \"delete\",\n code: \"run-delete-failed\",\n message: cause instanceof Error ? cause.message : `Run ${runId} could not be deleted.`,\n cause,\n });\n}\nfunction recoverFailure(runId: string, cause: unknown): RunRecoverError {\n if (cause instanceof RunRecoverError)\n return cause;\n if (cause instanceof RunStorageError) {\n if (cause.code === \"run-not-found\") {\n return new RunRecoverError({\n operation: \"recover\",\n code: \"run-not-found\",\n message: `Run ${runId} was not found.`,\n cause,\n });\n }\n if (cause.code === \"run-not-active\" || cause.code === \"writer-generation-mismatch\") {\n return new RunRecoverError({\n operation: \"recover\",\n code: \"run-recover-failed\",\n message: `Run ${runId} changed before recovery could fence its writer.`,\n cause,\n });\n }\n }\n return new RunRecoverError({\n operation: \"recover\",\n code: \"run-recover-failed\",\n message: cause instanceof Error ? cause.message : `Run ${runId} could not be recovered.`,\n cause,\n });\n}\nexport const sqliteRunLifecycleAdapter: RunLifecycleAdapter = Object.freeze({\n delete: ({ cwd, runId }: {\n readonly cwd: string;\n readonly runId: string;\n }) => {\n const root = storageRoot(cwd);\n if (!databaseExists(root)) {\n return Effect.fail(new RunDeleteError({\n operation: \"delete\",\n code: \"run-not-found\",\n message: `Run ${runId} was not found.`,\n }));\n }\n return Effect.flatMap(DateTime.now, (now) => Effect.gen(function* () {\n const cutoff = yield* currentPublicationCutoff(root);\n const run = yield* readRunResource(root, runId, cutoff);\n if (run === undefined) {\n throw new RunDeleteError({\n operation: \"delete\",\n code: \"run-not-found\",\n message: `Run ${runId} was not found.`,\n });\n }\n if (run.state === \"active\") {\n throw new RunDeleteError({\n operation: \"delete\",\n code: \"run-active\",\n message: `Run ${runId} is active and cannot be deleted.`,\n });\n }\n yield* deleteRunResource(root, {\n runId,\n expectedState: run.state,\n deletedAt: DateTime.formatIso(now),\n deadlineEpochMs: DateTime.toEpochMillis(now) + 30000,\n });\n return Object.freeze({ runId, state: \"deleted\" as const });\n }).pipe(Effect.mapError((cause) => deleteFailure(runId, cause))));\n },\n recover: ({ cwd, runId }: {\n readonly cwd: string;\n readonly runId: string;\n }) => {\n const root = storageRoot(cwd);\n if (!databaseExists(root)) {\n return Effect.fail(new RunRecoverError({\n operation: \"recover\",\n code: \"run-not-found\",\n message: `Run ${runId} was not found.`,\n }));\n }\n return Effect.flatMap(DateTime.now, (now) => Effect.gen(function* () {\n const cutoff = yield* currentPublicationCutoff(root);\n const run = yield* readRunResource(root, runId, cutoff);\n if (run === undefined) {\n throw new RunRecoverError({\n operation: \"recover\",\n code: \"run-not-found\",\n message: `Run ${runId} was not found.`,\n });\n }\n if (run.state !== \"active\") {\n throw new RunRecoverError({\n operation: \"recover\",\n code: \"run-terminal\",\n message: `Run ${runId} is already ${run.state}.`,\n });\n }\n const observation = observeRunWriterTermination(run.writerGeneration);\n if (observation.state === \"active\") {\n throw new RunRecoverError({\n operation: \"recover\",\n code: \"run-owner-active\",\n message: `Run ${runId} still has a live writer; recovery is refused.`,\n });\n }\n if (observation.state === \"unproven\") {\n throw new RunRecoverError({\n operation: \"recover\",\n code: \"run-owner-termination-unproven\",\n message: `Run ${runId} recovery requires verified owner-termination evidence.`,\n });\n }\n yield* recoverRunResource(root, {\n runId,\n expectedWriterGeneration: run.writerGeneration,\n recoveryWriterGeneration: `recovery-v1:${randomUUID()}`,\n completedAt: DateTime.formatIso(now),\n evidence: {\n kind: \"local-linux-process-terminated-v1\",\n identity: observation.evidenceIdentity,\n observedAt: DateTime.formatIso(now),\n },\n deadlineEpochMs: DateTime.toEpochMillis(now) + 30000,\n });\n return Object.freeze({ runId, state: \"interrupted\" as const });\n }).pipe(Effect.mapError((cause) => recoverFailure(runId, cause))));\n },\n});\nexport const unavailableRunLifecycleAdapter: RunLifecycleAdapter = Object.freeze({\n delete: ({ runId }: {\n readonly cwd: string;\n readonly runId: string;\n }) => Effect.fail(new RunDeleteError({\n operation: \"delete\",\n code: \"run-lifecycle-adapter-unavailable\",\n message: `Run ${runId} cannot be deleted because the Run lifecycle adapter is not installed.`,\n })),\n recover: ({ runId }: {\n readonly cwd: string;\n readonly runId: string;\n }) => Effect.fail(new RunRecoverError({\n operation: \"recover\",\n code: \"run-lifecycle-adapter-unavailable\",\n message: `Run ${runId} cannot be recovered because the Run lifecycle adapter is not installed.`,\n })),\n});\n"]}
|
|
1
|
+
{"version":3,"file":"lifecycle-adapter.js","sourceRoot":"","sources":["lifecycle-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { DateTime, Effect } from \"effect\";\nimport type { ProjectStateDatabase } from \"../../record/sqlite/project-state-database.ts\";\nimport { SqliteRecordError } from \"../../record/sqlite/errors.ts\";\nimport { currentPublicationCutoff, deleteRunResource, observeRunWriterTermination, readRunResource, recoverRunResource, RunStorageError, } from \"../storage/index.ts\";\nimport type { RunDeleteReceipt, RunRecoverReceipt, } from \"./types.ts\";\nimport { RunDeleteError, RunRecoverError, } from \"./types.ts\";\n/**\n * Narrow wiring seam for the Run-owned SQLite adapter. The current Record\n * runtime cannot yet delete terminal Runs or fence and recover an active\n * writer, so the public Host fails closed instead of rebranding `clean`.\n */\nexport interface RunLifecycleAdapter {\n readonly delete: (request: {\n readonly cwd: string;\n readonly runId: string;\n }) => Effect.Effect<RunDeleteReceipt, RunDeleteError, ProjectStateDatabase>;\n readonly recover: (request: {\n readonly cwd: string;\n readonly runId: string;\n }) => Effect.Effect<RunRecoverReceipt, RunRecoverError, ProjectStateDatabase>;\n}\nfunction storageRoot(cwd: string): string {\n return resolve(cwd, \".niceeval\");\n}\nfunction databaseExists(root: string): boolean {\n return existsSync(resolve(root, \"record.sqlite\"));\n}\nfunction deleteFailure(runId: string, cause: unknown): RunDeleteError {\n if (cause instanceof RunDeleteError)\n return cause;\n if (cause instanceof SqliteRecordError && cause.cause instanceof Error && cause.cause.name === \"run-delete-reference-conflict\") {\n const details = Reflect.get(cause.cause, \"details\");\n if (Array.isArray(details)) {\n const dependencies = details as RunStorageError[\"dependencies\"];\n return new RunDeleteError({\n operation: \"delete\",\n code: \"run-referenced\",\n message: `Run ${runId} is referenced by ${dependencies.length} published Attempt binding(s): ${dependencies.map((dependency) => `${dependency.dependentRunId}/${dependency.dependentSlotId} -> ${dependency.attemptLocator}`).join(\", \")}.`,\n cause,\n });\n }\n }\n if (cause instanceof RunStorageError) {\n if (cause.code === \"run-not-found\") {\n return new RunDeleteError({\n operation: \"delete\",\n code: \"run-not-found\",\n message: `Run ${runId} was not found.`,\n cause,\n });\n }\n if (cause.code === \"run-delete-reference-conflict\") {\n const dependencies = cause.dependencies.map((dependency) => `${dependency.dependentRunId}/${dependency.dependentSlotId} -> ${dependency.attemptLocator}`).join(\", \");\n return new RunDeleteError({\n operation: \"delete\",\n code: \"run-referenced\",\n message: `Run ${runId} is referenced by ${cause.dependencies.length} published Attempt binding(s): ${dependencies}.`,\n cause,\n });\n }\n }\n return new RunDeleteError({\n operation: \"delete\",\n code: \"run-delete-failed\",\n message: cause instanceof Error ? cause.message : `Run ${runId} could not be deleted.`,\n cause,\n });\n}\nfunction recoverFailure(runId: string, cause: unknown): RunRecoverError {\n if (cause instanceof RunRecoverError)\n return cause;\n if (cause instanceof RunStorageError) {\n if (cause.code === \"run-not-found\") {\n return new RunRecoverError({\n operation: \"recover\",\n code: \"run-not-found\",\n message: `Run ${runId} was not found.`,\n cause,\n });\n }\n if (cause.code === \"run-not-active\" || cause.code === \"writer-generation-mismatch\") {\n return new RunRecoverError({\n operation: \"recover\",\n code: \"run-recover-failed\",\n message: `Run ${runId} changed before recovery could fence its writer.`,\n cause,\n });\n }\n }\n return new RunRecoverError({\n operation: \"recover\",\n code: \"run-recover-failed\",\n message: cause instanceof Error ? cause.message : `Run ${runId} could not be recovered.`,\n cause,\n });\n}\nexport const sqliteRunLifecycleAdapter: RunLifecycleAdapter = Object.freeze({\n delete: ({ cwd, runId }: {\n readonly cwd: string;\n readonly runId: string;\n }) => {\n const root = storageRoot(cwd);\n if (!databaseExists(root)) {\n return Effect.fail(new RunDeleteError({\n operation: \"delete\",\n code: \"run-not-found\",\n message: `Run ${runId} was not found.`,\n }));\n }\n return Effect.flatMap(DateTime.now, (now) => Effect.gen(function* () {\n const cutoff = yield* currentPublicationCutoff(root);\n const run = yield* readRunResource(root, runId, cutoff);\n if (run === undefined) {\n return yield* Effect.fail(new RunDeleteError({\n operation: \"delete\",\n code: \"run-not-found\",\n message: `Run ${runId} was not found.`,\n }));\n }\n if (run.state === \"active\") {\n return yield* Effect.fail(new RunDeleteError({\n operation: \"delete\",\n code: \"run-active\",\n message: `Run ${runId} is active and cannot be deleted.`,\n }));\n }\n yield* deleteRunResource(root, {\n runId,\n expectedState: run.state,\n deletedAt: DateTime.formatIso(now),\n deadlineEpochMs: DateTime.toEpochMillis(now) + 30000,\n });\n return Object.freeze({ runId, state: \"deleted\" as const });\n }).pipe(Effect.mapError((cause) => deleteFailure(runId, cause))));\n },\n recover: ({ cwd, runId }: {\n readonly cwd: string;\n readonly runId: string;\n }) => {\n const root = storageRoot(cwd);\n if (!databaseExists(root)) {\n return Effect.fail(new RunRecoverError({\n operation: \"recover\",\n code: \"run-not-found\",\n message: `Run ${runId} was not found.`,\n }));\n }\n return Effect.flatMap(DateTime.now, (now) => Effect.gen(function* () {\n const cutoff = yield* currentPublicationCutoff(root);\n const run = yield* readRunResource(root, runId, cutoff);\n if (run === undefined) {\n return yield* Effect.fail(new RunRecoverError({\n operation: \"recover\",\n code: \"run-not-found\",\n message: `Run ${runId} was not found.`,\n }));\n }\n if (run.state !== \"active\") {\n return yield* Effect.fail(new RunRecoverError({\n operation: \"recover\",\n code: \"run-terminal\",\n message: `Run ${runId} is already ${run.state}.`,\n }));\n }\n const observation = observeRunWriterTermination(run.writerGeneration);\n if (observation.state === \"active\") {\n return yield* Effect.fail(new RunRecoverError({\n operation: \"recover\",\n code: \"run-owner-active\",\n message: `Run ${runId} still has a live writer; recovery is refused.`,\n }));\n }\n if (observation.state === \"unproven\") {\n return yield* Effect.fail(new RunRecoverError({\n operation: \"recover\",\n code: \"run-owner-termination-unproven\",\n message: `Run ${runId} recovery requires verified owner-termination evidence.`,\n }));\n }\n yield* recoverRunResource(root, {\n runId,\n expectedWriterGeneration: run.writerGeneration,\n recoveryWriterGeneration: `recovery-v1:${randomUUID()}`,\n completedAt: DateTime.formatIso(now),\n evidence: {\n kind: \"local-linux-process-terminated-v1\",\n identity: observation.evidenceIdentity,\n observedAt: DateTime.formatIso(now),\n },\n deadlineEpochMs: DateTime.toEpochMillis(now) + 30000,\n });\n return Object.freeze({ runId, state: \"interrupted\" as const });\n }).pipe(Effect.mapError((cause) => recoverFailure(runId, cause))));\n },\n});\nexport const unavailableRunLifecycleAdapter: RunLifecycleAdapter = Object.freeze({\n delete: ({ runId }: {\n readonly cwd: string;\n readonly runId: string;\n }) => Effect.fail(new RunDeleteError({\n operation: \"delete\",\n code: \"run-lifecycle-adapter-unavailable\",\n message: `Run ${runId} cannot be deleted because the Run lifecycle adapter is not installed.`,\n })),\n recover: ({ runId }: {\n readonly cwd: string;\n readonly runId: string;\n }) => Effect.fail(new RunRecoverError({\n operation: \"recover\",\n code: \"run-lifecycle-adapter-unavailable\",\n message: `Run ${runId} cannot be recovered because the Run lifecycle adapter is not installed.`,\n })),\n});\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.rawRunHost = void 0;
|
|
4
4
|
const node_crypto_1 = require("node:crypto");
|
|
5
5
|
const node_fs_1 = require("node:fs");
|
|
6
6
|
const node_path_1 = require("node:path");
|
|
@@ -91,27 +91,27 @@ function encodeContinuation(cutoff, afterRunId, invocationId) {
|
|
|
91
91
|
]), "utf8").toString("base64url");
|
|
92
92
|
}
|
|
93
93
|
function decodeContinuation(token, invocationId) {
|
|
94
|
-
try
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
94
|
+
return effect_1.Effect.try({
|
|
95
|
+
try: () => {
|
|
96
|
+
const value = JSON.parse(Buffer.from(token, "base64url").toString("utf8"));
|
|
97
|
+
if (!Array.isArray(value) || value.length !== 5 || value[0] !== CONTINUATION_PROTOCOL ||
|
|
98
|
+
typeof value[1] !== "string" || !Number.isSafeInteger(value[2]) || Number(value[2]) < 0 ||
|
|
99
|
+
typeof value[3] !== "string" || (value[4] !== null && typeof value[4] !== "string") ||
|
|
100
|
+
value[4] !== (invocationId ?? null)) {
|
|
101
|
+
throw new Error("Run continuation binding is invalid.");
|
|
102
|
+
}
|
|
103
|
+
return Object.freeze({
|
|
104
|
+
cutoff: Object.freeze({ storeGeneration: value[1], revision: Number(value[2]) }),
|
|
105
|
+
afterRunId: value[3],
|
|
106
|
+
});
|
|
107
|
+
},
|
|
108
|
+
catch: (cause) => new types_ts_1.RunReadError({
|
|
109
109
|
operation: "list",
|
|
110
110
|
code: "run-continuation-invalid",
|
|
111
111
|
message: "Run continuation is invalid or belongs to a different filter.",
|
|
112
112
|
cause,
|
|
113
|
-
})
|
|
114
|
-
}
|
|
113
|
+
}),
|
|
114
|
+
});
|
|
115
115
|
}
|
|
116
116
|
function decodeRunId(value) {
|
|
117
117
|
const decoded = effect_1.Schema.decodeUnknownResult(identifiers_ts_1.RunIdSchema)(value);
|
|
@@ -131,7 +131,7 @@ function makeRunHost(lifecycle) {
|
|
|
131
131
|
return effect_1.Effect.gen(function* () {
|
|
132
132
|
const continuation = request.continuation === undefined
|
|
133
133
|
? undefined
|
|
134
|
-
: decodeContinuation(request.continuation, request.invocationId);
|
|
134
|
+
: yield* decodeContinuation(request.continuation, request.invocationId);
|
|
135
135
|
const page = yield* (0, index_ts_1.listRunResources)(recordStorageRoot(request.cwd), {
|
|
136
136
|
...(continuation === undefined ? {} : {
|
|
137
137
|
cutoff: continuation.cutoff,
|
|
@@ -170,11 +170,11 @@ function makeRunHost(lifecycle) {
|
|
|
170
170
|
const cutoff = yield* (0, index_ts_1.currentPublicationCutoff)(root);
|
|
171
171
|
const run = yield* (0, index_ts_1.readRunResource)(root, runId.success, cutoff);
|
|
172
172
|
if (run === undefined) {
|
|
173
|
-
|
|
173
|
+
return yield* effect_1.Effect.fail(new types_ts_1.RunReadError({
|
|
174
174
|
operation: "get",
|
|
175
175
|
code: "run-not-found",
|
|
176
176
|
message: `Run ${runId.success} was not found.`,
|
|
177
|
-
});
|
|
177
|
+
}));
|
|
178
178
|
}
|
|
179
179
|
return Object.freeze({
|
|
180
180
|
operation: "run.get",
|
|
@@ -205,5 +205,5 @@ function makeRunHost(lifecycle) {
|
|
|
205
205
|
};
|
|
206
206
|
return Object.freeze({ list, get, delete: deleteRun, recover });
|
|
207
207
|
}
|
|
208
|
-
exports.
|
|
208
|
+
exports.rawRunHost = makeRunHost(lifecycle_adapter_ts_1.sqliteRunLifecycleAdapter);
|
|
209
209
|
//# sourceMappingURL=runtime.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { Effect, Result, Schema } from \"effect\";\nimport { RunIdSchema } from \"../../record/codec/identifiers.ts\";\nimport { EMPTY_PUBLICATION_CUTOFF_IDENTITY } from \"../protocol.ts\";\nimport { currentPublicationCutoff, listRunResources, readRunResource, type PublicationCutoff, type ReadableRunResource, } from \"../storage/index.ts\";\nimport { sqliteRunLifecycleAdapter, type RunLifecycleAdapter, } from \"./lifecycle-adapter.ts\";\nimport { RunDeleteError, RunReadError, RunRecoverError, type RunDetail, type RunHost, type RunSummary, } from \"./types.ts\";\nconst CONTINUATION_PROTOCOL = \"niceeval.run-continuation/v1\";\nconst EMPTY_CUTOFF = Object.freeze({\n identity: EMPTY_PUBLICATION_CUTOFF_IDENTITY,\n revision: 0,\n});\nfunction readFailure(operation: \"list\" | \"get\", cause: unknown): RunReadError {\n const message = cause instanceof Error\n ? cause.message\n : `Run ${operation} failed.`;\n return new RunReadError({\n operation,\n code: \"run-read-failed\",\n message,\n cause,\n });\n}\nfunction recordStorageRoot(cwd: string): string {\n return resolve(cwd, \".niceeval\");\n}\nfunction recordDatabaseExists(cwd: string): boolean {\n return existsSync(resolve(recordStorageRoot(cwd), \"record.sqlite\"));\n}\nfunction publicCutoff(cutoff: PublicationCutoff) {\n return Object.freeze({\n identity: createHash(\"sha256\")\n .update(\"niceeval.run-publication-cutoff/v1\\0\")\n .update(cutoff.storeGeneration)\n .update(\"\\0\")\n .update(String(cutoff.revision))\n .digest(\"hex\"),\n revision: cutoff.revision,\n });\n}\nfunction projectSummary(run: ReadableRunResource): RunSummary {\n return Object.freeze({\n runId: run.runId,\n invocationId: run.invocationId,\n experimentId: run.experimentId,\n state: run.state,\n startedAt: run.startedAt,\n ...(run.completedAt === undefined ? {} : { completedAt: run.completedAt }),\n coverage: Object.freeze({\n published: run.published,\n expected: run.expected,\n missing: run.missing,\n }),\n });\n}\nfunction projectDetail(run: ReadableRunResource): RunDetail {\n return Object.freeze({\n ...projectSummary(run),\n slots: Object.freeze(run.slots.map((slot) => Object.freeze({\n slotId: slot.slotId,\n evalId: slot.evalId,\n attemptOrdinal: slot.attemptOrdinal,\n executionIdentityDigest: slot.executionIdentityDigest,\n publication: slot.publication.state === \"published\"\n ? Object.freeze({\n state: \"published\" as const,\n action: slot.publication.action,\n attemptId: slot.publication.attemptId,\n attemptLocator: slot.publication.attemptLocator,\n originRunId: slot.publication.originRunId,\n originSlotId: slot.publication.originSlotId,\n })\n : slot.publication.state === \"absent\"\n ? Object.freeze({ state: \"absent\" as const, reason: slot.publication.reason })\n : Object.freeze({ state: \"pending\" as const }),\n }))),\n });\n}\nfunction encodeContinuation(cutoff: PublicationCutoff, afterRunId: string, invocationId: string | undefined): string {\n return Buffer.from(JSON.stringify([\n CONTINUATION_PROTOCOL,\n cutoff.storeGeneration,\n cutoff.revision,\n afterRunId,\n invocationId ?? null,\n ]), \"utf8\").toString(\"base64url\");\n}\nfunction decodeContinuation(token: string, invocationId: string | undefined): {\n readonly cutoff: PublicationCutoff;\n readonly afterRunId: string;\n} {\n try {\n const value = JSON.parse(Buffer.from(token, \"base64url\").toString(\"utf8\")) as unknown;\n if (!Array.isArray(value) || value.length !== 5 || value[0] !== CONTINUATION_PROTOCOL ||\n typeof value[1] !== \"string\" || !Number.isSafeInteger(value[2]) || Number(value[2]) < 0 ||\n typeof value[3] !== \"string\" || (value[4] !== null && typeof value[4] !== \"string\") ||\n value[4] !== (invocationId ?? null)) {\n throw new Error(\"Run continuation binding is invalid.\");\n }\n return Object.freeze({\n cutoff: Object.freeze({ storeGeneration: value[1], revision: Number(value[2]) }),\n afterRunId: value[3],\n });\n }\n catch (cause) {\n throw new RunReadError({\n operation: \"list\",\n code: \"run-continuation-invalid\",\n message: \"Run continuation is invalid or belongs to a different filter.\",\n cause,\n });\n }\n}\nfunction decodeRunId(value: string): Result.Result<Schema.Schema.Type<typeof RunIdSchema>, string> {\n const decoded = Schema.decodeUnknownResult(RunIdSchema)(value);\n return Result.isFailure(decoded)\n ? Result.fail(`Invalid exact Run ID ${JSON.stringify(value)}.`)\n : Result.succeed(decoded.success);\n}\nfunction makeRunHost(lifecycle: RunLifecycleAdapter): RunHost {\n const list: RunHost[\"list\"] = (request) => {\n if (!recordDatabaseExists(request.cwd)) {\n return Effect.succeed(Object.freeze({\n operation: \"run.list\" as const,\n publicationCutoff: EMPTY_CUTOFF,\n runs: Object.freeze([]),\n }));\n }\n return Effect.gen(function* () {\n const continuation = request.continuation === undefined\n ? undefined\n : decodeContinuation(request.continuation, request.invocationId);\n const page = yield* listRunResources(recordStorageRoot(request.cwd), {\n ...(continuation === undefined ? {} : {\n cutoff: continuation.cutoff,\n afterRunId: continuation.afterRunId,\n }),\n ...(request.invocationId === undefined ? {} : { invocationId: request.invocationId }),\n });\n return Object.freeze({\n operation: \"run.list\" as const,\n publicationCutoff: publicCutoff(page.cutoff),\n runs: Object.freeze(page.runs.map(projectSummary)),\n ...(page.nextAfterRunId === null ? {} : {\n continuation: encodeContinuation(page.cutoff, page.nextAfterRunId, request.invocationId),\n }),\n });\n }).pipe(Effect.mapError((cause) => cause instanceof RunReadError ? cause : readFailure(\"list\", cause)));\n };\n const get: RunHost[\"get\"] = (request) => {\n const runId = decodeRunId(request.runId);\n if (Result.isFailure(runId)) {\n return Effect.fail(new RunReadError({\n operation: \"get\",\n code: \"run-id-invalid\",\n message: runId.failure,\n }));\n }\n if (!recordDatabaseExists(request.cwd)) {\n return Effect.fail(new RunReadError({\n operation: \"get\",\n code: \"run-not-found\",\n message: `Run ${runId.success} was not found.`,\n }));\n }\n return Effect.gen(function* () {\n const root = recordStorageRoot(request.cwd);\n const cutoff = yield* currentPublicationCutoff(root);\n const run = yield* readRunResource(root, runId.success, cutoff);\n if (run === undefined) {\n throw new RunReadError({\n operation: \"get\",\n code: \"run-not-found\",\n message: `Run ${runId.success} was not found.`,\n });\n }\n return Object.freeze({\n operation: \"run.get\" as const,\n publicationCutoff: publicCutoff(cutoff),\n run: projectDetail(run),\n });\n }).pipe(Effect.mapError((cause) => cause instanceof RunReadError ? cause : readFailure(\"get\", cause)));\n };\n const deleteRun: RunHost[\"delete\"] = (request) => {\n const runId = decodeRunId(request.runId);\n return Result.isFailure(runId)\n ? Effect.fail(new RunDeleteError({\n operation: \"delete\",\n code: \"run-id-invalid\",\n message: runId.failure,\n }))\n : lifecycle.delete({ cwd: request.cwd, runId: runId.success });\n };\n const recover: RunHost[\"recover\"] = (request) => {\n const runId = decodeRunId(request.runId);\n return Result.isFailure(runId)\n ? Effect.fail(new RunRecoverError({\n operation: \"recover\",\n code: \"run-id-invalid\",\n message: runId.failure,\n }))\n : lifecycle.recover({ cwd: request.cwd, runId: runId.success });\n };\n return Object.freeze({ list, get, delete: deleteRun, recover });\n}\nexport const runHost: RunHost = makeRunHost(sqliteRunLifecycleAdapter);\n"]}
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { Effect, Result, Schema } from \"effect\";\nimport { RunIdSchema } from \"../../record/codec/identifiers.ts\";\nimport type { ProjectStateDatabase } from \"../../record/sqlite/project-state-database.ts\";\nimport { EMPTY_PUBLICATION_CUTOFF_IDENTITY } from \"../protocol.ts\";\nimport { currentPublicationCutoff, listRunResources, readRunResource, type PublicationCutoff, type ReadableRunResource, } from \"../storage/index.ts\";\nimport { sqliteRunLifecycleAdapter, type RunLifecycleAdapter, } from \"./lifecycle-adapter.ts\";\nimport { RunDeleteError, RunReadError, RunRecoverError, type RunDeleteReceipt, type RunDetail, type RunDeleteRequest, type RunGetRequest, type RunListRequest, type RunListResult, type RunRecoverReceipt, type RunRecoverRequest, type RunResult, type RunSummary, } from \"./types.ts\";\nconst CONTINUATION_PROTOCOL = \"niceeval.run-continuation/v1\";\nconst EMPTY_CUTOFF = Object.freeze({\n identity: EMPTY_PUBLICATION_CUTOFF_IDENTITY,\n revision: 0,\n});\nfunction readFailure(operation: \"list\" | \"get\", cause: unknown): RunReadError {\n const message = cause instanceof Error\n ? cause.message\n : `Run ${operation} failed.`;\n return new RunReadError({\n operation,\n code: \"run-read-failed\",\n message,\n cause,\n });\n}\nfunction recordStorageRoot(cwd: string): string {\n return resolve(cwd, \".niceeval\");\n}\nfunction recordDatabaseExists(cwd: string): boolean {\n return existsSync(resolve(recordStorageRoot(cwd), \"record.sqlite\"));\n}\ninterface RawRunHost {\n readonly list: (request: RunListRequest) => Effect.Effect<RunListResult, RunReadError, ProjectStateDatabase>;\n readonly get: (request: RunGetRequest) => Effect.Effect<RunResult, RunReadError, ProjectStateDatabase>;\n readonly delete: (request: RunDeleteRequest) => Effect.Effect<RunDeleteReceipt, RunDeleteError, ProjectStateDatabase>;\n readonly recover: (request: RunRecoverRequest) => Effect.Effect<RunRecoverReceipt, RunRecoverError, ProjectStateDatabase>;\n}\nfunction publicCutoff(cutoff: PublicationCutoff) {\n return Object.freeze({\n identity: createHash(\"sha256\")\n .update(\"niceeval.run-publication-cutoff/v1\\0\")\n .update(cutoff.storeGeneration)\n .update(\"\\0\")\n .update(String(cutoff.revision))\n .digest(\"hex\"),\n revision: cutoff.revision,\n });\n}\nfunction projectSummary(run: ReadableRunResource): RunSummary {\n return Object.freeze({\n runId: run.runId,\n invocationId: run.invocationId,\n experimentId: run.experimentId,\n state: run.state,\n startedAt: run.startedAt,\n ...(run.completedAt === undefined ? {} : { completedAt: run.completedAt }),\n coverage: Object.freeze({\n published: run.published,\n expected: run.expected,\n missing: run.missing,\n }),\n });\n}\nfunction projectDetail(run: ReadableRunResource): RunDetail {\n return Object.freeze({\n ...projectSummary(run),\n slots: Object.freeze(run.slots.map((slot) => Object.freeze({\n slotId: slot.slotId,\n evalId: slot.evalId,\n attemptOrdinal: slot.attemptOrdinal,\n executionIdentityDigest: slot.executionIdentityDigest,\n publication: slot.publication.state === \"published\"\n ? Object.freeze({\n state: \"published\" as const,\n action: slot.publication.action,\n attemptId: slot.publication.attemptId,\n attemptLocator: slot.publication.attemptLocator,\n originRunId: slot.publication.originRunId,\n originSlotId: slot.publication.originSlotId,\n })\n : slot.publication.state === \"absent\"\n ? Object.freeze({ state: \"absent\" as const, reason: slot.publication.reason })\n : Object.freeze({ state: \"pending\" as const }),\n }))),\n });\n}\nfunction encodeContinuation(cutoff: PublicationCutoff, afterRunId: string, invocationId: string | undefined): string {\n return Buffer.from(JSON.stringify([\n CONTINUATION_PROTOCOL,\n cutoff.storeGeneration,\n cutoff.revision,\n afterRunId,\n invocationId ?? null,\n ]), \"utf8\").toString(\"base64url\");\n}\nfunction decodeContinuation(token: string, invocationId: string | undefined): Effect.Effect<{\n readonly cutoff: PublicationCutoff;\n readonly afterRunId: string;\n}, RunReadError> {\n return Effect.try({\n try: () => {\n const value = JSON.parse(Buffer.from(token, \"base64url\").toString(\"utf8\")) as unknown;\n if (!Array.isArray(value) || value.length !== 5 || value[0] !== CONTINUATION_PROTOCOL ||\n typeof value[1] !== \"string\" || !Number.isSafeInteger(value[2]) || Number(value[2]) < 0 ||\n typeof value[3] !== \"string\" || (value[4] !== null && typeof value[4] !== \"string\") ||\n value[4] !== (invocationId ?? null)) {\n throw new Error(\"Run continuation binding is invalid.\");\n }\n return Object.freeze({\n cutoff: Object.freeze({ storeGeneration: value[1], revision: Number(value[2]) }),\n afterRunId: value[3],\n });\n },\n catch: (cause) => new RunReadError({\n operation: \"list\",\n code: \"run-continuation-invalid\",\n message: \"Run continuation is invalid or belongs to a different filter.\",\n cause,\n }),\n });\n}\nfunction decodeRunId(value: string): Result.Result<Schema.Schema.Type<typeof RunIdSchema>, string> {\n const decoded = Schema.decodeUnknownResult(RunIdSchema)(value);\n return Result.isFailure(decoded)\n ? Result.fail(`Invalid exact Run ID ${JSON.stringify(value)}.`)\n : Result.succeed(decoded.success);\n}\nfunction makeRunHost(lifecycle: RunLifecycleAdapter): RawRunHost {\n const list: RawRunHost[\"list\"] = (request) => {\n if (!recordDatabaseExists(request.cwd)) {\n return Effect.succeed(Object.freeze({\n operation: \"run.list\" as const,\n publicationCutoff: EMPTY_CUTOFF,\n runs: Object.freeze([]),\n }));\n }\n return Effect.gen(function* () {\n const continuation = request.continuation === undefined\n ? undefined\n : yield* decodeContinuation(request.continuation, request.invocationId);\n const page = yield* listRunResources(recordStorageRoot(request.cwd), {\n ...(continuation === undefined ? {} : {\n cutoff: continuation.cutoff,\n afterRunId: continuation.afterRunId,\n }),\n ...(request.invocationId === undefined ? {} : { invocationId: request.invocationId }),\n });\n return Object.freeze({\n operation: \"run.list\" as const,\n publicationCutoff: publicCutoff(page.cutoff),\n runs: Object.freeze(page.runs.map(projectSummary)),\n ...(page.nextAfterRunId === null ? {} : {\n continuation: encodeContinuation(page.cutoff, page.nextAfterRunId, request.invocationId),\n }),\n });\n }).pipe(Effect.mapError((cause) => cause instanceof RunReadError ? cause : readFailure(\"list\", cause)));\n };\n const get: RawRunHost[\"get\"] = (request) => {\n const runId = decodeRunId(request.runId);\n if (Result.isFailure(runId)) {\n return Effect.fail(new RunReadError({\n operation: \"get\",\n code: \"run-id-invalid\",\n message: runId.failure,\n }));\n }\n if (!recordDatabaseExists(request.cwd)) {\n return Effect.fail(new RunReadError({\n operation: \"get\",\n code: \"run-not-found\",\n message: `Run ${runId.success} was not found.`,\n }));\n }\n return Effect.gen(function* () {\n const root = recordStorageRoot(request.cwd);\n const cutoff = yield* currentPublicationCutoff(root);\n const run = yield* readRunResource(root, runId.success, cutoff);\n if (run === undefined) {\n return yield* Effect.fail(new RunReadError({\n operation: \"get\",\n code: \"run-not-found\",\n message: `Run ${runId.success} was not found.`,\n }));\n }\n return Object.freeze({\n operation: \"run.get\" as const,\n publicationCutoff: publicCutoff(cutoff),\n run: projectDetail(run),\n });\n }).pipe(Effect.mapError((cause) => cause instanceof RunReadError ? cause : readFailure(\"get\", cause)));\n };\n const deleteRun: RawRunHost[\"delete\"] = (request) => {\n const runId = decodeRunId(request.runId);\n return Result.isFailure(runId)\n ? Effect.fail(new RunDeleteError({\n operation: \"delete\",\n code: \"run-id-invalid\",\n message: runId.failure,\n }))\n : lifecycle.delete({ cwd: request.cwd, runId: runId.success });\n };\n const recover: RawRunHost[\"recover\"] = (request) => {\n const runId = decodeRunId(request.runId);\n return Result.isFailure(runId)\n ? Effect.fail(new RunRecoverError({\n operation: \"recover\",\n code: \"run-id-invalid\",\n message: runId.failure,\n }))\n : lifecycle.recover({ cwd: request.cwd, runId: runId.success });\n };\n return Object.freeze({ list, get, delete: deleteRun, recover });\n}\nexport const rawRunHost: RawRunHost = makeRunHost(sqliteRunLifecycleAdapter);\n"]}
|
|
@@ -1,2 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import type { ProjectStateDatabase } from "../../record/sqlite/project-state-database.cjs";
|
|
3
|
+
import { RunDeleteError, RunReadError, RunRecoverError, type RunDeleteReceipt, type RunDeleteRequest, type RunGetRequest, type RunListRequest, type RunListResult, type RunRecoverReceipt, type RunRecoverRequest, type RunResult } from "./types.cjs";
|
|
4
|
+
interface RawRunHost {
|
|
5
|
+
readonly list: (request: RunListRequest) => Effect.Effect<RunListResult, RunReadError, ProjectStateDatabase>;
|
|
6
|
+
readonly get: (request: RunGetRequest) => Effect.Effect<RunResult, RunReadError, ProjectStateDatabase>;
|
|
7
|
+
readonly delete: (request: RunDeleteRequest) => Effect.Effect<RunDeleteReceipt, RunDeleteError, ProjectStateDatabase>;
|
|
8
|
+
readonly recover: (request: RunRecoverRequest) => Effect.Effect<RunRecoverReceipt, RunRecoverError, ProjectStateDatabase>;
|
|
9
|
+
}
|
|
10
|
+
export declare const rawRunHost: RawRunHost;
|
|
11
|
+
export {};
|
|
@@ -1,2 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import type { ProjectStateDatabase } from "../../record/sqlite/project-state-database.mjs";
|
|
3
|
+
import { RunDeleteError, RunReadError, RunRecoverError, type RunDeleteReceipt, type RunDeleteRequest, type RunGetRequest, type RunListRequest, type RunListResult, type RunRecoverReceipt, type RunRecoverRequest, type RunResult } from "./types.mjs";
|
|
4
|
+
interface RawRunHost {
|
|
5
|
+
readonly list: (request: RunListRequest) => Effect.Effect<RunListResult, RunReadError, ProjectStateDatabase>;
|
|
6
|
+
readonly get: (request: RunGetRequest) => Effect.Effect<RunResult, RunReadError, ProjectStateDatabase>;
|
|
7
|
+
readonly delete: (request: RunDeleteRequest) => Effect.Effect<RunDeleteReceipt, RunDeleteError, ProjectStateDatabase>;
|
|
8
|
+
readonly recover: (request: RunRecoverRequest) => Effect.Effect<RunRecoverReceipt, RunRecoverError, ProjectStateDatabase>;
|
|
9
|
+
}
|
|
10
|
+
export declare const rawRunHost: RawRunHost;
|
|
11
|
+
export {};
|
|
@@ -1,2 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import type { ProjectStateDatabase } from "../../record/sqlite/project-state-database.js";
|
|
3
|
+
import { RunDeleteError, RunReadError, RunRecoverError, type RunDeleteReceipt, type RunDeleteRequest, type RunGetRequest, type RunListRequest, type RunListResult, type RunRecoverReceipt, type RunRecoverRequest, type RunResult } from "./types.js";
|
|
4
|
+
interface RawRunHost {
|
|
5
|
+
readonly list: (request: RunListRequest) => Effect.Effect<RunListResult, RunReadError, ProjectStateDatabase>;
|
|
6
|
+
readonly get: (request: RunGetRequest) => Effect.Effect<RunResult, RunReadError, ProjectStateDatabase>;
|
|
7
|
+
readonly delete: (request: RunDeleteRequest) => Effect.Effect<RunDeleteReceipt, RunDeleteError, ProjectStateDatabase>;
|
|
8
|
+
readonly recover: (request: RunRecoverRequest) => Effect.Effect<RunRecoverReceipt, RunRecoverError, ProjectStateDatabase>;
|
|
9
|
+
}
|
|
10
|
+
export declare const rawRunHost: RawRunHost;
|
|
11
|
+
export {};
|
package/dist/run/host/runtime.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createRequire as __niceevalCreateRequire } from "node:module";
|
|
2
2
|
const __niceevalRequire = __niceevalCreateRequire(import.meta.url);
|
|
3
3
|
const __niceevalCanonical = __niceevalRequire("./runtime.cjs");
|
|
4
|
-
const __niceevalExport0 = __niceevalCanonical["
|
|
5
|
-
export { __niceevalExport0 as
|
|
4
|
+
const __niceevalExport0 = __niceevalCanonical["rawRunHost"];
|
|
5
|
+
export { __niceevalExport0 as rawRunHost };
|
|
6
6
|
//# sourceMappingURL=runtime.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["types.ts"],"names":[],"mappings":";;;AAAA,mCAA2C;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["types.ts"],"names":[],"mappings":";;;AAAA,mCAA2C;AAmC3C,MAAa,YAAa,SAAQ,aAAI,CAAC,WAAW,CAAC,cAAc,CAK/D;CACD;AAND,oCAMC;AACD,MAAa,cAAe,SAAQ,aAAI,CAAC,WAAW,CAAC,gBAAgB,CAKnE;CACD;AAND,wCAMC;AACD,MAAa,eAAgB,SAAQ,aAAI,CAAC,WAAW,CAAC,iBAAiB,CAKrE;CACD;AAND,0CAMC","sourcesContent":["import { Data, type Effect } from \"effect\";\nimport type { PublicationCutoff, RunDetail, RunSlot, RunState, RunSummary, } from \"../protocol.ts\";\nexport type { RunDetail, RunSlot, RunState, RunSummary } from \"../protocol.ts\";\nexport interface RunListRequest {\n readonly cwd: string;\n readonly invocationId?: string;\n readonly continuation?: string;\n}\nexport interface RunGetRequest {\n readonly cwd: string;\n readonly runId: string;\n}\nexport interface RunDeleteRequest extends RunGetRequest {\n}\nexport interface RunRecoverRequest extends RunGetRequest {\n}\nexport interface RunListResult {\n readonly operation: \"run.list\";\n readonly publicationCutoff: PublicationCutoff;\n readonly runs: readonly RunSummary[];\n readonly continuation?: string;\n}\nexport interface RunResult {\n readonly operation: \"run.get\";\n readonly publicationCutoff: RunListResult[\"publicationCutoff\"];\n readonly run: RunDetail;\n}\nexport interface RunDeleteReceipt {\n readonly runId: string;\n readonly state: \"deleted\";\n}\nexport interface RunRecoverReceipt {\n readonly runId: string;\n readonly state: \"interrupted\";\n}\nexport class RunReadError extends Data.TaggedError(\"RunReadError\")<{\n readonly operation: \"list\" | \"get\";\n readonly code: \"run-id-invalid\" | \"run-not-found\" | \"run-continuation-invalid\" | \"run-invocation-filter-unavailable\" | \"run-read-failed\";\n readonly message: string;\n readonly cause?: unknown;\n}> {\n}\nexport class RunDeleteError extends Data.TaggedError(\"RunDeleteError\")<{\n readonly operation: \"delete\";\n readonly code: \"run-id-invalid\" | \"run-not-found\" | \"run-active\" | \"run-referenced\" | \"run-lifecycle-adapter-unavailable\" | \"run-delete-failed\";\n readonly message: string;\n readonly cause?: unknown;\n}> {\n}\nexport class RunRecoverError extends Data.TaggedError(\"RunRecoverError\")<{\n readonly operation: \"recover\";\n readonly code: \"run-id-invalid\" | \"run-not-found\" | \"run-terminal\" | \"run-owner-active\" | \"run-owner-termination-unproven\" | \"run-lifecycle-adapter-unavailable\" | \"run-recover-failed\";\n readonly message: string;\n readonly cause?: unknown;\n}> {\n}\nexport interface RunHost {\n readonly list: (request: RunListRequest) => Effect.Effect<RunListResult, RunReadError>;\n readonly get: (request: RunGetRequest) => Effect.Effect<RunResult, RunReadError>;\n readonly delete: (request: RunDeleteRequest) => Effect.Effect<RunDeleteReceipt, RunDeleteError>;\n readonly recover: (request: RunRecoverRequest) => Effect.Effect<RunRecoverReceipt, RunRecoverError>;\n}\n"]}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { type Effect } from "effect";
|
|
2
|
-
import type { ProjectStateDatabase } from "../../record/sqlite/project-state-database.cjs";
|
|
3
2
|
import type { PublicationCutoff, RunDetail, RunSummary } from "../protocol.cjs";
|
|
4
3
|
export type { RunDetail, RunSlot, RunState, RunSummary } from "../protocol.cjs";
|
|
5
4
|
export interface RunListRequest {
|
|
@@ -65,8 +64,8 @@ export declare class RunRecoverError extends RunRecoverError_base<{
|
|
|
65
64
|
}> {
|
|
66
65
|
}
|
|
67
66
|
export interface RunHost {
|
|
68
|
-
readonly list: (request: RunListRequest) => Effect.Effect<RunListResult, RunReadError
|
|
69
|
-
readonly get: (request: RunGetRequest) => Effect.Effect<RunResult, RunReadError
|
|
70
|
-
readonly delete: (request: RunDeleteRequest) => Effect.Effect<RunDeleteReceipt, RunDeleteError
|
|
71
|
-
readonly recover: (request: RunRecoverRequest) => Effect.Effect<RunRecoverReceipt, RunRecoverError
|
|
67
|
+
readonly list: (request: RunListRequest) => Effect.Effect<RunListResult, RunReadError>;
|
|
68
|
+
readonly get: (request: RunGetRequest) => Effect.Effect<RunResult, RunReadError>;
|
|
69
|
+
readonly delete: (request: RunDeleteRequest) => Effect.Effect<RunDeleteReceipt, RunDeleteError>;
|
|
70
|
+
readonly recover: (request: RunRecoverRequest) => Effect.Effect<RunRecoverReceipt, RunRecoverError>;
|
|
72
71
|
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { type Effect } from "effect";
|
|
2
|
-
import type { ProjectStateDatabase } from "../../record/sqlite/project-state-database.mjs";
|
|
3
2
|
import type { PublicationCutoff, RunDetail, RunSummary } from "../protocol.mjs";
|
|
4
3
|
export type { RunDetail, RunSlot, RunState, RunSummary } from "../protocol.mjs";
|
|
5
4
|
export interface RunListRequest {
|
|
@@ -65,8 +64,8 @@ export declare class RunRecoverError extends RunRecoverError_base<{
|
|
|
65
64
|
}> {
|
|
66
65
|
}
|
|
67
66
|
export interface RunHost {
|
|
68
|
-
readonly list: (request: RunListRequest) => Effect.Effect<RunListResult, RunReadError
|
|
69
|
-
readonly get: (request: RunGetRequest) => Effect.Effect<RunResult, RunReadError
|
|
70
|
-
readonly delete: (request: RunDeleteRequest) => Effect.Effect<RunDeleteReceipt, RunDeleteError
|
|
71
|
-
readonly recover: (request: RunRecoverRequest) => Effect.Effect<RunRecoverReceipt, RunRecoverError
|
|
67
|
+
readonly list: (request: RunListRequest) => Effect.Effect<RunListResult, RunReadError>;
|
|
68
|
+
readonly get: (request: RunGetRequest) => Effect.Effect<RunResult, RunReadError>;
|
|
69
|
+
readonly delete: (request: RunDeleteRequest) => Effect.Effect<RunDeleteReceipt, RunDeleteError>;
|
|
70
|
+
readonly recover: (request: RunRecoverRequest) => Effect.Effect<RunRecoverReceipt, RunRecoverError>;
|
|
72
71
|
}
|
package/dist/run/host/types.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { type Effect } from "effect";
|
|
2
|
-
import type { ProjectStateDatabase } from "../../record/sqlite/project-state-database.js";
|
|
3
2
|
import type { PublicationCutoff, RunDetail, RunSummary } from "../protocol.js";
|
|
4
3
|
export type { RunDetail, RunSlot, RunState, RunSummary } from "../protocol.js";
|
|
5
4
|
export interface RunListRequest {
|
|
@@ -65,8 +64,8 @@ export declare class RunRecoverError extends RunRecoverError_base<{
|
|
|
65
64
|
}> {
|
|
66
65
|
}
|
|
67
66
|
export interface RunHost {
|
|
68
|
-
readonly list: (request: RunListRequest) => Effect.Effect<RunListResult, RunReadError
|
|
69
|
-
readonly get: (request: RunGetRequest) => Effect.Effect<RunResult, RunReadError
|
|
70
|
-
readonly delete: (request: RunDeleteRequest) => Effect.Effect<RunDeleteReceipt, RunDeleteError
|
|
71
|
-
readonly recover: (request: RunRecoverRequest) => Effect.Effect<RunRecoverReceipt, RunRecoverError
|
|
67
|
+
readonly list: (request: RunListRequest) => Effect.Effect<RunListResult, RunReadError>;
|
|
68
|
+
readonly get: (request: RunGetRequest) => Effect.Effect<RunResult, RunReadError>;
|
|
69
|
+
readonly delete: (request: RunDeleteRequest) => Effect.Effect<RunDeleteReceipt, RunDeleteError>;
|
|
70
|
+
readonly recover: (request: RunRecoverRequest) => Effect.Effect<RunRecoverReceipt, RunRecoverError>;
|
|
72
71
|
}
|
|
@@ -9,6 +9,7 @@ exports.makeAssertFirstAttemptBridge = makeAssertFirstAttemptBridge;
|
|
|
9
9
|
*/
|
|
10
10
|
const effect_1 = require("effect");
|
|
11
11
|
const api_ts_1 = require("../assertions/api.cjs");
|
|
12
|
+
const cleanup_timeout_ts_1 = require("./cleanup-timeout.cjs");
|
|
12
13
|
/** This is a facade adapter, not a bridge lifecycle primitive. */
|
|
13
14
|
function promiseFacade() {
|
|
14
15
|
let resolve;
|
|
@@ -58,8 +59,14 @@ function makeAssertFirstAttemptBridge() {
|
|
|
58
59
|
// must never await a control barrier such as awaitAuthor(), otherwise an
|
|
59
60
|
// author assertion queued behind it cannot make the barrier complete.
|
|
60
61
|
const requestScope = yield* effect_1.Scope.make();
|
|
62
|
+
const cleanupCompleted = yield* effect_1.Deferred.make();
|
|
63
|
+
const cleanupRequests = yield* effect_1.Queue.unbounded();
|
|
64
|
+
const cleanupRequestScope = yield* effect_1.Scope.make();
|
|
61
65
|
let terminalError;
|
|
62
66
|
let assertionCloseError;
|
|
67
|
+
let cleanupExpected = false;
|
|
68
|
+
let cleanupStarted = false;
|
|
69
|
+
let cleanupTerminalError;
|
|
63
70
|
const closeReason = () => terminalError ?? new api_ts_1.AssertionAuthoringClosedError("attempt-sealed");
|
|
64
71
|
const closeEffectRequests = (error) => effect_1.Effect.suspend(() => {
|
|
65
72
|
// This synchronous guard is intentionally the first close transition.
|
|
@@ -90,6 +97,18 @@ function makeAssertFirstAttemptBridge() {
|
|
|
90
97
|
}));
|
|
91
98
|
});
|
|
92
99
|
const awaitClose = (kind) => effect_1.Effect.raceFirst(effect_1.Deferred.await(effectRequestsClosed), kind === "assertion" ? effect_1.Deferred.await(assertionRequestsClosed) : effect_1.Effect.never).pipe(effect_1.Effect.exit);
|
|
100
|
+
const closeCleanupRequestsNow = (error) => {
|
|
101
|
+
if (cleanupTerminalError !== undefined)
|
|
102
|
+
return effect_1.Effect.void;
|
|
103
|
+
cleanupTerminalError = error;
|
|
104
|
+
return effect_1.Effect.gen(function* () {
|
|
105
|
+
yield* effect_1.Scope.close(cleanupRequestScope, effect_1.Exit.fail(error));
|
|
106
|
+
const pending = yield* effect_1.Queue.clear(cleanupRequests);
|
|
107
|
+
yield* effect_1.Effect.forEach(pending, (request) => completeRequest(request, effect_1.Exit.fail(error)), { discard: true });
|
|
108
|
+
yield* effect_1.Queue.shutdown(cleanupRequests);
|
|
109
|
+
});
|
|
110
|
+
};
|
|
111
|
+
const closeCleanupRequests = (error) => effect_1.Effect.suspend(() => closeCleanupRequestsNow(error));
|
|
93
112
|
const runRequest = (request) => {
|
|
94
113
|
const closureError = () => terminalError ?? (request.kind === "assertion" ? assertionCloseError : undefined);
|
|
95
114
|
return effect_1.Effect.raceFirst(request.effect.pipe(effect_1.Effect.exit), awaitClose(request.kind)).pipe(effect_1.Effect.flatMap((exit) => completeRequest(request, exit, closureError())),
|
|
@@ -105,6 +124,12 @@ function makeAssertFirstAttemptBridge() {
|
|
|
105
124
|
? effect_1.Effect.void
|
|
106
125
|
: closeEffectRequests(effect_1.Cause.squash(cause))));
|
|
107
126
|
yield* effect_1.Effect.forkScoped(worker);
|
|
127
|
+
const cleanupWorker = effect_1.Effect.forever(effect_1.Queue.take(cleanupRequests).pipe(effect_1.Effect.flatMap((request) => effect_1.Effect.forkIn(request.effect.pipe(effect_1.Effect.exit, effect_1.Effect.flatMap((exit) => completeRequest(request, exit, cleanupTerminalError)), effect_1.Effect.onExit((workerExit) => effect_1.Exit.isFailure(workerExit)
|
|
128
|
+
? completeRequest(request, effect_1.Exit.failCause(workerExit.cause), cleanupTerminalError)
|
|
129
|
+
: effect_1.Effect.void)), cleanupRequestScope).pipe(effect_1.Effect.asVoid)))).pipe(effect_1.Effect.catchCause((cause) => effect_1.Cause.hasInterruptsOnly(cause)
|
|
130
|
+
? effect_1.Effect.void
|
|
131
|
+
: closeCleanupRequests(effect_1.Cause.squash(cause))));
|
|
132
|
+
yield* effect_1.Effect.forkScoped(cleanupWorker);
|
|
108
133
|
const enqueue = (effect, kind) => {
|
|
109
134
|
const facade = promiseFacade();
|
|
110
135
|
if (terminalError !== undefined) {
|
|
@@ -129,6 +154,23 @@ function makeAssertFirstAttemptBridge() {
|
|
|
129
154
|
}
|
|
130
155
|
return facade.promise;
|
|
131
156
|
};
|
|
157
|
+
const enqueueCleanup = (effect) => {
|
|
158
|
+
const facade = promiseFacade();
|
|
159
|
+
if (cleanupTerminalError !== undefined) {
|
|
160
|
+
facade.reject(cleanupTerminalError);
|
|
161
|
+
return facade.promise;
|
|
162
|
+
}
|
|
163
|
+
const request = {
|
|
164
|
+
kind: "operation",
|
|
165
|
+
effect,
|
|
166
|
+
resolve: facade.resolve,
|
|
167
|
+
reject: facade.reject,
|
|
168
|
+
};
|
|
169
|
+
if (!effect_1.Queue.offerUnsafe(cleanupRequests, request)) {
|
|
170
|
+
facade.reject(cleanupTerminalError ?? new api_ts_1.AssertionAuthoringClosedError("attempt-sealed"));
|
|
171
|
+
}
|
|
172
|
+
return facade.promise;
|
|
173
|
+
};
|
|
132
174
|
const bridge = {
|
|
133
175
|
offerContext(value) {
|
|
134
176
|
return exactlyOnce(effect_1.Deferred.succeed(context, value), "Assert-first Context was offered twice");
|
|
@@ -151,6 +193,36 @@ function makeAssertFirstAttemptBridge() {
|
|
|
151
193
|
requestEffect(effect) {
|
|
152
194
|
return enqueue(effect, "operation");
|
|
153
195
|
},
|
|
196
|
+
expectCleanup() {
|
|
197
|
+
cleanupExpected = true;
|
|
198
|
+
},
|
|
199
|
+
beginCleanup() {
|
|
200
|
+
if (cleanupTerminalError !== undefined || cleanupStarted)
|
|
201
|
+
return false;
|
|
202
|
+
cleanupStarted = true;
|
|
203
|
+
return true;
|
|
204
|
+
},
|
|
205
|
+
requestCleanup(effect) {
|
|
206
|
+
return enqueueCleanup(effect);
|
|
207
|
+
},
|
|
208
|
+
completeCleanup() {
|
|
209
|
+
// The Promise body's outer finally must acknowledge completion even
|
|
210
|
+
// when a dispatcher has failed. This does not submit another request.
|
|
211
|
+
effect_1.Deferred.doneUnsafe(cleanupCompleted, effect_1.Effect.void);
|
|
212
|
+
},
|
|
213
|
+
awaitCleanup() {
|
|
214
|
+
return effect_1.Effect.suspend(() => {
|
|
215
|
+
const close = () => closeCleanupRequestsNow(closeReason());
|
|
216
|
+
if (!cleanupExpected)
|
|
217
|
+
return close();
|
|
218
|
+
return (0, cleanup_timeout_ts_1.withCleanupTimeout)(effect_1.Deferred.await(cleanupCompleted).pipe(effect_1.Effect.interruptible)).pipe(effect_1.Effect.catchTag("CleanupTimeoutError", () => effect_1.Effect.suspend(() =>
|
|
219
|
+
// Each started callback has its own deadline. The join may only
|
|
220
|
+
// abandon a body that has not entered cleanup. Both this decision
|
|
221
|
+
// and closeCleanupRequests' terminal guard run before yielding,
|
|
222
|
+
// so a late finally cannot race resource release.
|
|
223
|
+
cleanupStarted ? effect_1.Deferred.await(cleanupCompleted) : close())));
|
|
224
|
+
});
|
|
225
|
+
},
|
|
154
226
|
closeAssertionRequests(error) {
|
|
155
227
|
return effect_1.Effect.suspend(() => {
|
|
156
228
|
if (assertionCloseError !== undefined)
|
|
@@ -194,9 +266,12 @@ function makeAssertFirstAttemptBridge() {
|
|
|
194
266
|
// This fallback is intentionally after the worker is scoped. Attempt's
|
|
195
267
|
// more specific finalizer runs first and supplies timeout/interruption
|
|
196
268
|
// detail; this one closes any exceptional construction path.
|
|
197
|
-
yield* effect_1.Effect.addFinalizer((exit) =>
|
|
198
|
-
|
|
199
|
-
|
|
269
|
+
yield* effect_1.Effect.addFinalizer((exit) => {
|
|
270
|
+
const reason = effect_1.Exit.isFailure(exit) && effect_1.Cause.hasInterruptsOnly(exit.cause)
|
|
271
|
+
? new api_ts_1.AssertionAuthoringClosedError("attempt-interrupted")
|
|
272
|
+
: closeReason();
|
|
273
|
+
return closeEffectRequests(reason).pipe(effect_1.Effect.andThen(closeCleanupRequests(reason)));
|
|
274
|
+
});
|
|
200
275
|
return Object.freeze(bridge);
|
|
201
276
|
});
|
|
202
277
|
}
|