@claudexor/cli 3.25.1 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/account-reset-services.d.ts +2 -2
- package/dist/account-reset-services.d.ts.map +1 -1
- package/dist/account-reset-services.js.map +1 -1
- package/dist/account-resource-query.d.ts +2 -2
- package/dist/account-resource-query.d.ts.map +1 -1
- package/dist/account-resource-query.js +3 -3
- package/dist/account-resource-query.js.map +1 -1
- package/dist/claude-statusline.d.ts +2 -4
- package/dist/claude-statusline.d.ts.map +1 -1
- package/dist/claude-statusline.js +6 -5
- package/dist/claude-statusline.js.map +1 -1
- package/dist/claudexord-entry.d.ts +7 -2
- package/dist/claudexord-entry.d.ts.map +1 -1
- package/dist/claudexord-entry.js +10 -3
- package/dist/claudexord-entry.js.map +1 -1
- package/dist/claudexord.d.ts +0 -1
- package/dist/claudexord.d.ts.map +1 -1
- package/dist/claudexord.js +308 -240
- package/dist/claudexord.js.map +1 -1
- package/dist/cli-error.js +3 -3
- package/dist/cli-error.js.map +1 -1
- package/dist/cli.js +4 -49
- package/dist/cli.js.map +1 -1
- package/dist/codex-quota-source.js +2 -2
- package/dist/codex-quota-source.js.map +1 -1
- package/dist/command-flags.d.ts.map +1 -1
- package/dist/command-flags.js +1 -0
- package/dist/command-flags.js.map +1 -1
- package/dist/command-registry.js +1 -1
- package/dist/command-registry.js.map +1 -1
- package/dist/continue-from-run.d.ts +7 -8
- package/dist/continue-from-run.d.ts.map +1 -1
- package/dist/continue-from-run.js +3 -4
- package/dist/continue-from-run.js.map +1 -1
- package/dist/control-api-address.d.ts +6 -0
- package/dist/control-api-address.d.ts.map +1 -0
- package/dist/control-api-address.js +53 -0
- package/dist/control-api-address.js.map +1 -0
- package/dist/control-services.d.ts +139 -115
- package/dist/control-services.d.ts.map +1 -1
- package/dist/control-services.js +11 -32
- package/dist/control-services.js.map +1 -1
- package/dist/daemon-admission-runtime.d.ts +0 -60
- package/dist/daemon-admission-runtime.d.ts.map +1 -1
- package/dist/daemon-admission-runtime.js +3 -168
- package/dist/daemon-admission-runtime.js.map +1 -1
- package/dist/daemon-agent-runner.d.ts +6 -3
- package/dist/daemon-agent-runner.d.ts.map +1 -1
- package/dist/daemon-agent-runner.js +2 -1
- package/dist/daemon-agent-runner.js.map +1 -1
- package/dist/daemon-lifecycle.d.ts +10 -3
- package/dist/daemon-lifecycle.d.ts.map +1 -1
- package/dist/daemon-lifecycle.js +16 -7
- package/dist/daemon-lifecycle.js.map +1 -1
- package/dist/daemon-owner.d.ts +7 -0
- package/dist/daemon-owner.d.ts.map +1 -0
- package/dist/daemon-owner.js +39 -0
- package/dist/daemon-owner.js.map +1 -0
- package/dist/daemon-run.d.ts +8 -1
- package/dist/daemon-run.d.ts.map +1 -1
- package/dist/daemon-run.js +31 -3
- package/dist/daemon-run.js.map +1 -1
- package/dist/daemon-runtime-shutdown.d.ts +1 -1
- package/dist/daemon-runtime-shutdown.d.ts.map +1 -1
- package/dist/daemon-runtime-shutdown.js +2 -2
- package/dist/daemon-runtime-shutdown.js.map +1 -1
- package/dist/daemon-startup.d.ts +5 -42
- package/dist/daemon-startup.d.ts.map +1 -1
- package/dist/daemon-startup.js +7 -85
- package/dist/daemon-startup.js.map +1 -1
- package/dist/daemon-status-report.d.ts +4 -0
- package/dist/daemon-status-report.d.ts.map +1 -0
- package/dist/daemon-status-report.js +39 -0
- package/dist/daemon-status-report.js.map +1 -0
- package/dist/engine-skew.d.ts +1 -0
- package/dist/engine-skew.d.ts.map +1 -1
- package/dist/engine-skew.js +6 -2
- package/dist/engine-skew.js.map +1 -1
- package/dist/harness-maintenance-service.d.ts +9 -222
- package/dist/harness-maintenance-service.d.ts.map +1 -1
- package/dist/harness-maintenance-service.js +7 -37
- package/dist/harness-maintenance-service.js.map +1 -1
- package/dist/live.d.ts +2 -5
- package/dist/live.d.ts.map +1 -1
- package/dist/live.js +2 -44
- package/dist/live.js.map +1 -1
- package/dist/mcp-catalog-query.d.ts +2 -1
- package/dist/mcp-catalog-query.d.ts.map +1 -1
- package/dist/mcp-catalog-query.js +6 -5
- package/dist/mcp-catalog-query.js.map +1 -1
- package/dist/mcp-daemon-unavailable.d.ts.map +1 -1
- package/dist/mcp-daemon-unavailable.js +4 -3
- package/dist/mcp-daemon-unavailable.js.map +1 -1
- package/dist/mcp-journal-recovery.d.ts.map +1 -1
- package/dist/mcp-journal-recovery.js +4 -4
- package/dist/mcp-journal-recovery.js.map +1 -1
- package/dist/mcp-runner.d.ts +1 -1
- package/dist/mcp-runner.d.ts.map +1 -1
- package/dist/mcp-runner.js +8 -6
- package/dist/mcp-runner.js.map +1 -1
- package/dist/mcp-thread-query.d.ts +1 -1
- package/dist/mcp-thread-query.d.ts.map +1 -1
- package/dist/mcp-thread-query.js +2 -2
- package/dist/mcp-thread-query.js.map +1 -1
- package/dist/model-operation-control.d.ts +375 -0
- package/dist/model-operation-control.d.ts.map +1 -0
- package/dist/model-operation-control.js +16 -0
- package/dist/model-operation-control.js.map +1 -0
- package/dist/model-services.d.ts +302 -91
- package/dist/model-services.d.ts.map +1 -1
- package/dist/model-services.js +5 -7
- package/dist/model-services.js.map +1 -1
- package/dist/ops-commands.d.ts +1 -8
- package/dist/ops-commands.d.ts.map +1 -1
- package/dist/ops-commands.js +13 -16
- package/dist/ops-commands.js.map +1 -1
- package/dist/orphan-reaper.d.ts +18 -0
- package/dist/orphan-reaper.d.ts.map +1 -1
- package/dist/orphan-reaper.js +50 -0
- package/dist/orphan-reaper.js.map +1 -1
- package/dist/plugin-cli.d.ts +3 -0
- package/dist/plugin-cli.d.ts.map +1 -0
- package/dist/plugin-cli.js +57 -0
- package/dist/plugin-cli.js.map +1 -0
- package/dist/plugin-mcp.d.ts +3 -0
- package/dist/plugin-mcp.d.ts.map +1 -0
- package/dist/plugin-mcp.js +116 -0
- package/dist/plugin-mcp.js.map +1 -0
- package/dist/plugin-runtime.d.ts +24 -0
- package/dist/plugin-runtime.d.ts.map +1 -0
- package/dist/plugin-runtime.js +113 -0
- package/dist/plugin-runtime.js.map +1 -0
- package/dist/plugins.d.ts +2 -0
- package/dist/plugins.d.ts.map +1 -1
- package/dist/plugins.js +92 -184
- package/dist/plugins.js.map +1 -1
- package/dist/project-command.d.ts +4 -1
- package/dist/project-command.d.ts.map +1 -1
- package/dist/project-command.js +14 -5
- package/dist/project-command.js.map +1 -1
- package/dist/quota-services.d.ts +6 -4
- package/dist/quota-services.d.ts.map +1 -1
- package/dist/quota-services.js +58 -23
- package/dist/quota-services.js.map +1 -1
- package/dist/recovery-control-services.d.ts +99 -0
- package/dist/recovery-control-services.d.ts.map +1 -0
- package/dist/recovery-control-services.js +32 -0
- package/dist/recovery-control-services.js.map +1 -0
- package/dist/remote-filesystem.d.ts +3 -3
- package/dist/remote-filesystem.d.ts.map +1 -1
- package/dist/remote-filesystem.js.map +1 -1
- package/dist/request-preflight.d.ts +2 -2
- package/dist/request-preflight.d.ts.map +1 -1
- package/dist/request-preflight.js.map +1 -1
- package/dist/retention-service.d.ts +3 -3
- package/dist/retention-service.d.ts.map +1 -1
- package/dist/settings-command.d.ts.map +1 -1
- package/dist/settings-command.js +7 -2
- package/dist/settings-command.js.map +1 -1
- package/dist/settings-service.d.ts +66 -6
- package/dist/settings-service.d.ts.map +1 -1
- package/dist/settings-service.js +1 -1
- package/dist/settings-service.js.map +1 -1
- package/dist/setup-client-pty.js +1 -1
- package/dist/setup-client-pty.js.map +1 -1
- package/dist/setup-credential-window.d.ts +4 -4
- package/dist/setup-credential-window.d.ts.map +1 -1
- package/dist/setup-credential-window.js +1 -1
- package/dist/setup-credential-window.js.map +1 -1
- package/dist/setup-device-code-disclosure.js +1 -1
- package/dist/setup-device-code-disclosure.js.map +1 -1
- package/dist/setup-job-persistence.d.ts +30 -0
- package/dist/setup-job-persistence.d.ts.map +1 -0
- package/dist/setup-job-persistence.js +3 -0
- package/dist/setup-job-persistence.js.map +1 -0
- package/dist/{setup-job-store.d.ts → setup-job-projection.d.ts} +9 -17
- package/dist/setup-job-projection.d.ts.map +1 -0
- package/dist/{setup-job-store.js → setup-job-projection.js} +29 -68
- package/dist/setup-job-projection.js.map +1 -0
- package/dist/setup-job-support.js +1 -1
- package/dist/setup-job-support.js.map +1 -1
- package/dist/setup-jobs.d.ts +3 -4
- package/dist/setup-jobs.d.ts.map +1 -1
- package/dist/setup-jobs.js +3 -3
- package/dist/setup-jobs.js.map +1 -1
- package/dist/setup-lifecycle-binding.js +1 -1
- package/dist/setup-lifecycle-binding.js.map +1 -1
- package/dist/setup-login-completion.js +1 -1
- package/dist/setup-login-completion.js.map +1 -1
- package/dist/sql-daemon-queries.d.ts +24 -0
- package/dist/sql-daemon-queries.d.ts.map +1 -0
- package/dist/sql-daemon-queries.js +41 -0
- package/dist/sql-daemon-queries.js.map +1 -0
- package/dist/sql-daemon-runtime.d.ts +1415 -0
- package/dist/sql-daemon-runtime.d.ts.map +1 -0
- package/dist/sql-daemon-runtime.js +94 -0
- package/dist/sql-daemon-runtime.js.map +1 -0
- package/dist/sql-daemon-storage.d.ts +40 -0
- package/dist/sql-daemon-storage.d.ts.map +1 -0
- package/dist/sql-daemon-storage.js +203 -0
- package/dist/sql-daemon-storage.js.map +1 -0
- package/dist/sql-import-publication.d.ts +19 -0
- package/dist/sql-import-publication.d.ts.map +1 -0
- package/dist/sql-import-publication.js +54 -0
- package/dist/sql-import-publication.js.map +1 -0
- package/dist/sql-setup-lifecycle.d.ts +15 -0
- package/dist/sql-setup-lifecycle.d.ts.map +1 -0
- package/dist/sql-setup-lifecycle.js +28 -0
- package/dist/sql-setup-lifecycle.js.map +1 -0
- package/dist/sql-setup-store.d.ts +7 -0
- package/dist/sql-setup-store.d.ts.map +1 -0
- package/dist/sql-setup-store.js +102 -0
- package/dist/sql-setup-store.js.map +1 -0
- package/dist/sql-startup-storage.d.ts +15 -0
- package/dist/sql-startup-storage.d.ts.map +1 -0
- package/dist/sql-startup-storage.js +75 -0
- package/dist/sql-startup-storage.js.map +1 -0
- package/dist/thread-delivery.d.ts +2 -2
- package/dist/thread-purge.d.ts +8 -2
- package/dist/thread-purge.d.ts.map +1 -1
- package/dist/thread-purge.js +37 -8
- package/dist/thread-purge.js.map +1 -1
- package/dist/thread-turn-services.d.ts +2 -2
- package/dist/thread-turn-services.d.ts.map +1 -1
- package/dist/thread-turn-services.js.map +1 -1
- package/package.json +25 -26
- package/dist/setup-job-store.d.ts.map +0 -1
- package/dist/setup-job-store.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql-daemon-runtime.d.ts","sourceRoot":"","sources":["../src/sql-daemon-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACX,KAAK,aAAa,EAElB,KAAK,SAAS,EACd,KAAK,uBAAuB,EAC7B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,EACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAGnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAC9D,KAAK,YAAY,GAAG,IAAI,CACtB,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAAC,CAAC,EACzC,SAAS,GAAG,UAAU,GAAG,QAAQ,GAAG,UAAU,GAAG,eAAe,GAAG,eAAe,CACnF,CAAC;AAEF;;mDAEmD;AACnD,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE;IACP,MAAM,EAAE,IAAI,CACV,aAAa,EACX,UAAU,GACV,QAAQ,GACR,qBAAqB,GACrB,mBAAmB,GACnB,eAAe,GACf,qBAAqB,CACxB,CAAC;IACF,aAAa,EAAE,MAAM,IAAI,CAAC,oBAAoB,EAAE,YAAY,CAAC,CAAC;IAC9D,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,GAAG,CAAC,EAAE,WAAW,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,uBAAuB,CAAC;IACvC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;;;;+BA6B4B,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAwDL,SAAS;2BACd,MAAM,aAAa,MAAM;kCAKlB,MAAM,WAAW,kBAAkB;;EAxDpE;AAED;+EAC+E;AAC/E,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE;IACP,MAAM,EAAE,iBAAiB,CAAC;IAC1B,SAAS,EAAE,yBAAyB,CAAC;IACrC,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,YAAY,GAAG,IAAI,CAAC;IAC/C,aAAa,EAAE,MAAM,IAAI,CAAC,oBAAoB,EAAE,YAAY,CAAC,CAAC;IAC9D,GAAG,EAAE,WAAW,CAAC;IACjB,sBAAsB,CAAC,EAAE,sBAAsB,CAAC;IAChD,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,uBAAuB,CAAC;IACvC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAkC6B,SAAS;2BACd,MAAM,aAAa,MAAM;kCAKlB,MAAM,WAAW,kBAAkB;;EASpE"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { DaemonLocalClient, DaemonServer, RunEventBus, } from "@claudexor/daemon";
|
|
2
|
+
import { isModelOperation, } from "@claudexor/schema";
|
|
3
|
+
import { createDaemonAgentRunner } from "./daemon-agent-runner.js";
|
|
4
|
+
import { createDelegationDaemonBinding } from "./delegation-daemon-binding.js";
|
|
5
|
+
import { createHarnessMaintenance } from "./harness-maintenance-service.js";
|
|
6
|
+
import { createModelServices } from "./model-services.js";
|
|
7
|
+
/** Compose the existing queue and runners with one SQL graph. This factory
|
|
8
|
+
* neither opens storage nor starts a listener; the startup owner admits it
|
|
9
|
+
* only after import and recovery have finished. */
|
|
10
|
+
export function createSqlDaemonRuntime(graph, options) {
|
|
11
|
+
const bus = options.bus ?? new RunEventBus();
|
|
12
|
+
const { authority, bind } = createDelegationDaemonBinding();
|
|
13
|
+
const client = new DaemonLocalClient(() => server);
|
|
14
|
+
const executors = createSqlDaemonExecutors(graph, {
|
|
15
|
+
...options,
|
|
16
|
+
client,
|
|
17
|
+
authority,
|
|
18
|
+
bus,
|
|
19
|
+
admission: (id) => server.admission(id),
|
|
20
|
+
runtimeConcurrencyCaps: options.server.runtimeConcurrencyCaps,
|
|
21
|
+
});
|
|
22
|
+
const server = new DaemonServer({
|
|
23
|
+
...options.server,
|
|
24
|
+
storeFacts: options.server.storeFacts ?? (() => graph.store.facts()),
|
|
25
|
+
commands: graph.commands,
|
|
26
|
+
delegationAuthority: authority,
|
|
27
|
+
onCommandTerminal: executors.onCommandTerminal,
|
|
28
|
+
onRunTerminal: executors.onRunTerminal,
|
|
29
|
+
onTurnEnqueueFailed: executors.onTurnEnqueueFailed,
|
|
30
|
+
runner: executors.runner,
|
|
31
|
+
});
|
|
32
|
+
bind(server);
|
|
33
|
+
return {
|
|
34
|
+
server,
|
|
35
|
+
client,
|
|
36
|
+
...executors,
|
|
37
|
+
bus,
|
|
38
|
+
terminalFilesPending: (id) => graph.terminalFiles.pending(id),
|
|
39
|
+
async stop() {
|
|
40
|
+
executors.models.close();
|
|
41
|
+
await server.stop();
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/** Storage-dependent executors bind after import; the already listening server
|
|
46
|
+
* keeps its one queue, cancellation owner and in-process client throughout. */
|
|
47
|
+
export function createSqlDaemonExecutors(graph, options) {
|
|
48
|
+
const models = createModelServices({
|
|
49
|
+
...options.models,
|
|
50
|
+
commands: graph.commands,
|
|
51
|
+
resourceQueries: graph.commands.queries,
|
|
52
|
+
resources: () => graph.resources,
|
|
53
|
+
quota: () => graph.quota,
|
|
54
|
+
client: options.client,
|
|
55
|
+
admission: options.admission,
|
|
56
|
+
warn: options.warn,
|
|
57
|
+
});
|
|
58
|
+
const harnessMaintenance = createHarnessMaintenance({
|
|
59
|
+
commands: graph.commands,
|
|
60
|
+
maintenanceQueries: graph.commands.queries,
|
|
61
|
+
client: options.client,
|
|
62
|
+
readiness: options.authReadiness,
|
|
63
|
+
});
|
|
64
|
+
const agent = (options.agent ?? createDaemonAgentRunner)({
|
|
65
|
+
delegationBudgetAuthority: options.authority,
|
|
66
|
+
quotaStore: () => graph.quota,
|
|
67
|
+
threads: graph.threads,
|
|
68
|
+
commands: graph.commands.queries,
|
|
69
|
+
interactions: graph.interactions,
|
|
70
|
+
liveInputs: graph.liveInputs,
|
|
71
|
+
resources: () => graph.resources,
|
|
72
|
+
bus: options.bus,
|
|
73
|
+
runtimeConcurrencyCaps: options.runtimeConcurrencyCaps,
|
|
74
|
+
terminalPersistence: (jobId) => (event, telemetry) => graph.threads.persistTerminal(jobId, event, telemetry),
|
|
75
|
+
});
|
|
76
|
+
return {
|
|
77
|
+
models,
|
|
78
|
+
harnessMaintenance,
|
|
79
|
+
onCommandTerminal: (record) => models.operations.onCommandTerminal(record),
|
|
80
|
+
onRunTerminal: (runId, threadId) => {
|
|
81
|
+
graph.interactions.dropForRun(runId);
|
|
82
|
+
graph.liveInputs.dropForRun(runId);
|
|
83
|
+
if (threadId)
|
|
84
|
+
graph.threads.pingThreadHead(threadId);
|
|
85
|
+
},
|
|
86
|
+
onTurnEnqueueFailed: (turnId, problem) => graph.threads.setTurnEnqueueError(turnId, problem),
|
|
87
|
+
runner: ((params, ctx) => isModelOperation(params)
|
|
88
|
+
? models.operations.execute(params, ctx)
|
|
89
|
+
: harnessMaintenance.owns(params)
|
|
90
|
+
? harnessMaintenance.execute(params, ctx)
|
|
91
|
+
: agent(params, ctx)),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=sql-daemon-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql-daemon-runtime.js","sourceRoot":"","sources":["../src/sql-daemon-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { EngineStateRecovery, createSqlDaemonServices, type PartitionControlPort } from "@claudexor/daemon";
|
|
2
|
+
import type { DaemonStoreFacts } from "@claudexor/schema";
|
|
3
|
+
type Graph = ReturnType<typeof createSqlDaemonServices>;
|
|
4
|
+
/** Storage ownership for the one daemon. Transport and setup retain their
|
|
5
|
+
* existing owners; a physical replacement closes them before closing SQL. */
|
|
6
|
+
export declare class SqlDaemonStorage {
|
|
7
|
+
private readonly options;
|
|
8
|
+
/** Acquisition precedes graph construction, which can fail on a SQL read. */
|
|
9
|
+
private storeValue;
|
|
10
|
+
private graphValue;
|
|
11
|
+
private problem;
|
|
12
|
+
private migration;
|
|
13
|
+
readonly engineRecovery: EngineStateRecovery;
|
|
14
|
+
constructor(options: {
|
|
15
|
+
rootDir: string;
|
|
16
|
+
graph: Parameters<typeof createSqlDaemonServices>[1];
|
|
17
|
+
advanceFloor(): void;
|
|
18
|
+
beforeClose(): Promise<void>;
|
|
19
|
+
onOpen(graph: Graph): void;
|
|
20
|
+
onCorrupt(error: Error): void;
|
|
21
|
+
log(message: string): void;
|
|
22
|
+
importWorkerEntry?: string;
|
|
23
|
+
flusherWorkerEntry?: string;
|
|
24
|
+
});
|
|
25
|
+
graph(): Graph;
|
|
26
|
+
facts(): DaemonStoreFacts;
|
|
27
|
+
readonly corrupt: (cause: unknown) => void;
|
|
28
|
+
open(signal?: AbortSignal): Promise<void>;
|
|
29
|
+
partition(name: string): PartitionControlPort;
|
|
30
|
+
/** A logical project fault is isolated by the registry/current-pid queries.
|
|
31
|
+
* Only the shared global authority blocks the whole product plane. */
|
|
32
|
+
blockedPartitions(): string[];
|
|
33
|
+
/** Always join every storage participant before reporting successful close. */
|
|
34
|
+
close(physicalRecovery?: boolean): Promise<void>;
|
|
35
|
+
private attach;
|
|
36
|
+
private createFresh;
|
|
37
|
+
private closeAfterFailedOpen;
|
|
38
|
+
}
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=sql-daemon-storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql-daemon-storage.d.ts","sourceRoot":"","sources":["../src/sql-daemon-storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,mBAAmB,EAInB,uBAAuB,EAKvB,KAAK,oBAAoB,EAC1B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,gBAAgB,EAA0B,MAAM,mBAAmB,CAAC;AAIlF,KAAK,KAAK,GAAG,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExD;6EAC6E;AAC7E,qBAAa,gBAAgB;IAQzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAP1B,6EAA6E;IAC7E,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,SAAS,CAAuC;IACxD,QAAQ,CAAC,cAAc,EAAE,mBAAmB,CAAC;IAC7C,YACmB,OAAO,EAAE;QACxB,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC;QACrD,YAAY,IAAI,IAAI,CAAC;QACrB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;QAC3B,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;QAC9B,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC7B,EAgCF;IACD,KAAK,IAAI,KAAK,CAGb;IACD,KAAK,IAAI,gBAAgB,CAcxB;IACD,QAAQ,CAAC,OAAO,UAAW,OAAO,KAAG,IAAI,CAIvC;IACI,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B9C;IACD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,CAc5C;IACD;0EACsE;IACtE,iBAAiB,IAAI,MAAM,EAAE,CAG5B;IACD,+EAA+E;IACzE,KAAK,CAAC,gBAAgB,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBnD;IACD,OAAO,CAAC,MAAM;YAMA,WAAW;YAkCX,oBAAoB;CAWnC"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { EngineStore, EngineStateRecovery, SqlPartitionRecovery, SqlEventLedger, createPartition, createSqlDaemonServices, globalGeneration, setGlobalGenerationInTx, sqlRecoveryProjections, recoveryOnlyRefusal, } from "@claudexor/daemon";
|
|
2
|
+
import { SqlSetupJobStore } from "./sql-setup-store.js";
|
|
3
|
+
import { openSqlStoreAfterTransport } from "./sql-startup-storage.js";
|
|
4
|
+
/** Storage ownership for the one daemon. Transport and setup retain their
|
|
5
|
+
* existing owners; a physical replacement closes them before closing SQL. */
|
|
6
|
+
export class SqlDaemonStorage {
|
|
7
|
+
options;
|
|
8
|
+
/** Acquisition precedes graph construction, which can fail on a SQL read. */
|
|
9
|
+
storeValue = null;
|
|
10
|
+
graphValue = null;
|
|
11
|
+
problem = null;
|
|
12
|
+
migration = null;
|
|
13
|
+
engineRecovery;
|
|
14
|
+
constructor(options) {
|
|
15
|
+
this.options = options;
|
|
16
|
+
this.engineRecovery = new EngineStateRecovery(options.rootDir, {
|
|
17
|
+
state: () => ({
|
|
18
|
+
generation: this.graphValue && !this.problem
|
|
19
|
+
? (globalGeneration(this.graphValue.store)?.pid ?? 0)
|
|
20
|
+
: 0,
|
|
21
|
+
recovery: this.problem
|
|
22
|
+
? {
|
|
23
|
+
status: "recovery_required",
|
|
24
|
+
location: { kind: "byte", byteOffset: 0 },
|
|
25
|
+
reason: this.problem.message,
|
|
26
|
+
discardedTailBytes: 0,
|
|
27
|
+
}
|
|
28
|
+
: { status: "ready", discardedTailBytes: 0 },
|
|
29
|
+
}),
|
|
30
|
+
validate: async () => {
|
|
31
|
+
if (!this.graphValue)
|
|
32
|
+
return { ok: false, detail: this.problem?.message ?? "engine store is not open" };
|
|
33
|
+
const result = await this.graphValue.maintenance.integrityCheck();
|
|
34
|
+
return {
|
|
35
|
+
ok: result.ok,
|
|
36
|
+
detail: result.problems.length ? result.problems.join("; ") : null,
|
|
37
|
+
};
|
|
38
|
+
},
|
|
39
|
+
close: async () => {
|
|
40
|
+
await options.beforeClose();
|
|
41
|
+
await this.close(true);
|
|
42
|
+
},
|
|
43
|
+
createFresh: (identity) => this.createFresh(identity),
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
graph() {
|
|
47
|
+
if (!this.graphValue)
|
|
48
|
+
throw recoveryOnlyRefusal("engine store");
|
|
49
|
+
return this.graphValue;
|
|
50
|
+
}
|
|
51
|
+
facts() {
|
|
52
|
+
return {
|
|
53
|
+
...(this.graphValue?.store.facts() ?? {
|
|
54
|
+
flusher: null,
|
|
55
|
+
flush_lag_ms: null,
|
|
56
|
+
last_barrier_at: null,
|
|
57
|
+
interval_ms: null,
|
|
58
|
+
wal_bytes: null,
|
|
59
|
+
busy_waits: null,
|
|
60
|
+
obligations_open: null,
|
|
61
|
+
integrity: this.problem ? "failed" : null,
|
|
62
|
+
}),
|
|
63
|
+
migration: this.migration,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
corrupt = (cause) => {
|
|
67
|
+
const error = cause instanceof Error ? cause : new Error(String(cause));
|
|
68
|
+
this.problem = error;
|
|
69
|
+
this.options.onCorrupt(error);
|
|
70
|
+
};
|
|
71
|
+
async open(signal) {
|
|
72
|
+
try {
|
|
73
|
+
// Accepted recovery intent outranks ordinary import/database selection.
|
|
74
|
+
const resumed = await this.engineRecovery.resumePending();
|
|
75
|
+
if (resumed)
|
|
76
|
+
return;
|
|
77
|
+
const store = await openSqlStoreAfterTransport({
|
|
78
|
+
daemonDir: this.options.rootDir,
|
|
79
|
+
advanceFloor: this.options.advanceFloor,
|
|
80
|
+
signal,
|
|
81
|
+
progress: (progress) => {
|
|
82
|
+
this.migration = progress;
|
|
83
|
+
},
|
|
84
|
+
log: this.options.log,
|
|
85
|
+
importWorkerEntry: this.options.importWorkerEntry,
|
|
86
|
+
flusherWorkerEntry: this.options.flusherWorkerEntry,
|
|
87
|
+
onCorrupt: this.corrupt,
|
|
88
|
+
});
|
|
89
|
+
this.storeValue = store;
|
|
90
|
+
try {
|
|
91
|
+
this.attach(store);
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
await this.closeAfterFailedOpen(error);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
if (error.code === "store_corrupt")
|
|
99
|
+
this.corrupt(error);
|
|
100
|
+
if (this.migration)
|
|
101
|
+
this.migration = { ...this.migration, phase: "failed" };
|
|
102
|
+
throw error;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
partition(name) {
|
|
106
|
+
if (name === "engine-state")
|
|
107
|
+
return this.engineRecovery;
|
|
108
|
+
const graph = this.graph();
|
|
109
|
+
return new SqlPartitionRecovery(graph.store, graph.blobs, graph.maintenance, name, {
|
|
110
|
+
projections: (generation) => sqlRecoveryProjections(graph.store, graph.blobs, generation, (value) => new SqlSetupJobStore(this.options.rootDir, graph.store, new SqlEventLedger(graph.store, graph.blobs, value)).validateProjection()),
|
|
111
|
+
onPhysicalCorruption: this.corrupt,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
/** A logical project fault is isolated by the registry/current-pid queries.
|
|
115
|
+
* Only the shared global authority blocks the whole product plane. */
|
|
116
|
+
blockedPartitions() {
|
|
117
|
+
const global = globalGeneration(this.graph().store);
|
|
118
|
+
return !global || global.status !== "ready" ? ["global"] : [];
|
|
119
|
+
}
|
|
120
|
+
/** Always join every storage participant before reporting successful close. */
|
|
121
|
+
async close(physicalRecovery = false) {
|
|
122
|
+
const store = this.storeValue, graph = this.graphValue;
|
|
123
|
+
if (!store)
|
|
124
|
+
return;
|
|
125
|
+
let failure;
|
|
126
|
+
try {
|
|
127
|
+
await graph?.close();
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
failure = error;
|
|
131
|
+
}
|
|
132
|
+
try {
|
|
133
|
+
await store.close();
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
failure ??= error;
|
|
137
|
+
}
|
|
138
|
+
if (store.isClosed) {
|
|
139
|
+
this.storeValue = null;
|
|
140
|
+
this.graphValue = null;
|
|
141
|
+
}
|
|
142
|
+
if (failure && !(physicalRecovery && store.isClosed && storageFailure(failure)))
|
|
143
|
+
throw failure;
|
|
144
|
+
if (failure)
|
|
145
|
+
this.options.log(`closed corrupt store: ${String(failure)}`);
|
|
146
|
+
}
|
|
147
|
+
attach(store) {
|
|
148
|
+
this.graphValue = createSqlDaemonServices(store, this.options.graph);
|
|
149
|
+
this.problem = null;
|
|
150
|
+
this.migration = null;
|
|
151
|
+
this.options.onOpen(this.graphValue);
|
|
152
|
+
}
|
|
153
|
+
async createFresh(identity) {
|
|
154
|
+
const store = await EngineStore.open({
|
|
155
|
+
daemonDir: this.options.rootDir,
|
|
156
|
+
workerEntry: this.options.flusherWorkerEntry,
|
|
157
|
+
onCorrupt: this.corrupt,
|
|
158
|
+
log: this.options.log,
|
|
159
|
+
});
|
|
160
|
+
this.storeValue = store;
|
|
161
|
+
try {
|
|
162
|
+
const current = globalGeneration(store);
|
|
163
|
+
const prior = store
|
|
164
|
+
.prepare("SELECT value FROM meta WHERE key='engine_recovery_operation'")
|
|
165
|
+
.get();
|
|
166
|
+
if (current) {
|
|
167
|
+
if (current.epoch !== identity.newEpoch || prior?.value !== identity.operationId)
|
|
168
|
+
throw new Error("fresh engine state does not match the accepted recovery operation");
|
|
169
|
+
}
|
|
170
|
+
else
|
|
171
|
+
store.transaction(() => {
|
|
172
|
+
setGlobalGenerationInTx(store, createPartition(store, "global", { epoch: identity.newEpoch }).pid);
|
|
173
|
+
store
|
|
174
|
+
.prepare("INSERT INTO meta(key,value) VALUES('engine_recovery_operation',?)")
|
|
175
|
+
.run(identity.operationId);
|
|
176
|
+
});
|
|
177
|
+
store.registerExternal(this.options.rootDir);
|
|
178
|
+
await store.flushed();
|
|
179
|
+
this.options.advanceFloor();
|
|
180
|
+
this.attach(store);
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
await this.closeAfterFailedOpen(error);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
async closeAfterFailedOpen(primary) {
|
|
187
|
+
try {
|
|
188
|
+
await this.close();
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
this.options.log(`engine store cleanup after failed open also failed: ${String(error)}`);
|
|
192
|
+
}
|
|
193
|
+
finally {
|
|
194
|
+
// Cleanup (including diagnostics) cannot replace the initiating failure.
|
|
195
|
+
// An unclosed store remains owned for the next explicit close.
|
|
196
|
+
throw primary;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
function storageFailure(error) {
|
|
201
|
+
return ["store_corrupt", "store_flush_unavailable"].includes(error?.code ?? "");
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=sql-daemon-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql-daemon-storage.js","sourceRoot":"","sources":["../src/sql-daemon-storage.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,uBAAuB,EACvB,gBAAgB,EAChB,uBAAuB,EACvB,sBAAsB,EACtB,mBAAmB,GAEpB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAItE;6EAC6E;AAC7E,MAAM,OAAO,gBAAgB;IAQR,OAAO;IAP1B,6EAA6E;IACrE,UAAU,GAAuB,IAAI,CAAC;IACtC,UAAU,GAAiB,IAAI,CAAC;IAChC,OAAO,GAAiB,IAAI,CAAC;IAC7B,SAAS,GAAkC,IAAI,CAAC;IAC/C,cAAc,CAAsB;IAC7C,YACmB,OAUhB;uBAVgB,OAAO;QAYxB,IAAI,CAAC,cAAc,GAAG,IAAI,mBAAmB,CAAC,OAAO,CAAC,OAAO,EAAE;YAC7D,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;gBACZ,UAAU,EACR,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,OAAO;oBAC9B,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;oBACrD,CAAC,CAAC,CAAC;gBACP,QAAQ,EAAE,IAAI,CAAC,OAAO;oBACpB,CAAC,CAAC;wBACE,MAAM,EAAE,mBAAmB;wBAC3B,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE;wBACzC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;wBAC5B,kBAAkB,EAAE,CAAC;qBACtB;oBACH,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC,EAAE;aAC/C,CAAC;YACF,QAAQ,EAAE,KAAK,IAAI,EAAE;gBACnB,IAAI,CAAC,IAAI,CAAC,UAAU;oBAClB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,CAAC;gBACpF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,cAAc,EAAE,CAAC;gBAClE,OAAO;oBACL,EAAE,EAAE,MAAM,CAAC,EAAE;oBACb,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;iBACnE,CAAC;YACJ,CAAC;YACD,KAAK,EAAE,KAAK,IAAI,EAAE;gBAChB,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC;gBAC5B,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;YACD,WAAW,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;SACtD,CAAC,CAAC;IACL,CAAC;IACD,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,MAAM,mBAAmB,CAAC,cAAc,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IACD,KAAK;QACH,OAAO;YACL,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI;gBACpC,OAAO,EAAE,IAAI;gBACb,YAAY,EAAE,IAAI;gBAClB,eAAe,EAAE,IAAI;gBACrB,WAAW,EAAE,IAAI;gBACjB,SAAS,EAAE,IAAI;gBACf,UAAU,EAAE,IAAI;gBAChB,gBAAgB,EAAE,IAAI;gBACtB,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAE,QAAkB,CAAC,CAAC,CAAC,IAAI;aACrD,CAAC;YACF,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC;IACJ,CAAC;IACQ,OAAO,GAAG,CAAC,KAAc,EAAQ,EAAE;QAC1C,MAAM,KAAK,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,MAAoB;QAC7B,IAAI,CAAC;YACH,wEAAwE;YACxE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC;YAC1D,IAAI,OAAO;gBAAE,OAAO;YACpB,MAAM,KAAK,GAAG,MAAM,0BAA0B,CAAC;gBAC7C,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;gBAC/B,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY;gBACvC,MAAM;gBACN,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE;oBACrB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;gBAC5B,CAAC;gBACD,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG;gBACrB,iBAAiB,EAAE,IAAI,CAAC,OAAO,CAAC,iBAAiB;gBACjD,kBAAkB,EAAE,IAAI,CAAC,OAAO,CAAC,kBAAkB;gBACnD,SAAS,EAAE,IAAI,CAAC,OAAO;aACxB,CAAC,CAAC;YACH,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YACxB,IAAI,CAAC;gBACH,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA2B,CAAC,IAAI,KAAK,eAAe;gBAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC/E,IAAI,IAAI,CAAC,SAAS;gBAAE,IAAI,CAAC,SAAS,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;YAC5E,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IACD,SAAS,CAAC,IAAY;QACpB,IAAI,IAAI,KAAK,cAAc;YAAE,OAAO,IAAI,CAAC,cAAc,CAAC;QACxD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC3B,OAAO,IAAI,oBAAoB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE;YACjF,WAAW,EAAE,CAAC,UAAU,EAAE,EAAE,CAC1B,sBAAsB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CACrE,IAAI,gBAAgB,CAClB,IAAI,CAAC,OAAO,CAAC,OAAO,EACpB,KAAK,CAAC,KAAK,EACX,IAAI,cAAc,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CACpD,CAAC,kBAAkB,EAAE,CACvB;YACH,oBAAoB,EAAE,IAAI,CAAC,OAAO;SACnC,CAAC,CAAC;IACL,CAAC;IACD;0EACsE;IACtE,iBAAiB;QACf,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC;QACpD,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,CAAC;IACD,+EAA+E;IAC/E,KAAK,CAAC,KAAK,CAAC,gBAAgB,GAAG,KAAK;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAC3B,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC;QAC1B,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,IAAI,OAAgB,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,KAAK,EAAE,KAAK,EAAE,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,GAAG,KAAK,CAAC;QAClB,CAAC;QACD,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;QACtB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,KAAK,KAAK,CAAC;QACpB,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;QACD,IAAI,OAAO,IAAI,CAAC,CAAC,gBAAgB,IAAI,KAAK,CAAC,QAAQ,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC;YAAE,MAAM,OAAO,CAAC;QAC/F,IAAI,OAAO;YAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC5E,CAAC;IACO,MAAM,CAAC,KAAkB;QAC/B,IAAI,CAAC,UAAU,GAAG,uBAAuB,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACrE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC;IACO,KAAK,CAAC,WAAW,CAAC,QAAmD;QAC3E,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC;YACnC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;YAC/B,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,kBAAkB;YAC5C,SAAS,EAAE,IAAI,CAAC,OAAO;YACvB,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG;SACtB,CAAC,CAAC;QACH,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;YACxC,MAAM,KAAK,GAAG,KAAK;iBAChB,OAAO,CAAC,8DAA8D,CAAC;iBACvE,GAAG,EAAmC,CAAC;YAC1C,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,OAAO,CAAC,KAAK,KAAK,QAAQ,CAAC,QAAQ,IAAI,KAAK,EAAE,KAAK,KAAK,QAAQ,CAAC,WAAW;oBAC9E,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;YACzF,CAAC;;gBACC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;oBACrB,uBAAuB,CACrB,KAAK,EACL,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,CACnE,CAAC;oBACF,KAAK;yBACF,OAAO,CAAC,mEAAmE,CAAC;yBAC5E,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;gBAC/B,CAAC,CAAC,CAAC;YACL,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC7C,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;YACtB,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IACO,KAAK,CAAC,oBAAoB,CAAC,OAAgB;QACjD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,uDAAuD,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC3F,CAAC;gBAAS,CAAC;YACT,yEAAyE;YACzE,+DAA+D;YAC/D,MAAM,OAAO,CAAC;QAChB,CAAC;IACH,CAAC;CACF;AACD,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,CAAC,eAAe,EAAE,yBAAyB,CAAC,CAAC,QAAQ,CACzD,KAA2B,EAAE,IAAI,IAAI,EAAE,CACzC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
type PublicationStep = "synced" | "floor" | "database" | "journal";
|
|
2
|
+
/** The import worker has closed its one connection and proved equivalence.
|
|
3
|
+
* This startup-only owner publishes the closed database under the existing
|
|
4
|
+
* root-authority lease. No request handler or background writer uses it. */
|
|
5
|
+
export declare function publishImportedStore(input: {
|
|
6
|
+
daemonDir: string;
|
|
7
|
+
externalDirectories: readonly string[];
|
|
8
|
+
advanceFloor(): void;
|
|
9
|
+
/** Crash-matrix test seam; production supplies no hook. */
|
|
10
|
+
afterStep?: (step: PublicationStep) => void;
|
|
11
|
+
}): {
|
|
12
|
+
databasePath: string;
|
|
13
|
+
legacyPath: string | null;
|
|
14
|
+
};
|
|
15
|
+
/** A crash after the database rename resumes here. The published database
|
|
16
|
+
* wins; historical journals are retained as evidence and never served. */
|
|
17
|
+
export declare function preserveLegacyJournal(daemonDir: string): string | null;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=sql-import-publication.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql-import-publication.d.ts","sourceRoot":"","sources":["../src/sql-import-publication.ts"],"names":[],"mappings":"AAKA,KAAK,eAAe,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;AAEnE;;4EAE4E;AAC5E,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,YAAY,IAAI,IAAI,CAAC;IACrB,2DAA2D;IAC3D,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;CAC7C,GAAG;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CA+BtD;AAED;0EAC0E;AAC1E,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQtE"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { closeSync, existsSync, fsyncSync, openSync, renameSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { randomUUID } from "node:crypto";
|
|
4
|
+
import { fsyncDirectory } from "@claudexor/util";
|
|
5
|
+
/** The import worker has closed its one connection and proved equivalence.
|
|
6
|
+
* This startup-only owner publishes the closed database under the existing
|
|
7
|
+
* root-authority lease. No request handler or background writer uses it. */
|
|
8
|
+
export function publishImportedStore(input) {
|
|
9
|
+
const temporary = join(input.daemonDir, "engine.sqlite.import");
|
|
10
|
+
const databasePath = join(input.daemonDir, "engine.sqlite");
|
|
11
|
+
if (existsSync(`${temporary}-wal`)) {
|
|
12
|
+
throw Object.assign(new Error("closed import still has a WAL; database was not published"), {
|
|
13
|
+
code: "store_import_wal_present",
|
|
14
|
+
status: 503,
|
|
15
|
+
retryable: true,
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
if (existsSync(databasePath)) {
|
|
19
|
+
throw new Error("an engine database is already published; use the existing-store startup path");
|
|
20
|
+
}
|
|
21
|
+
// Names of imported external bodies precede the device barrier on the
|
|
22
|
+
// database. Their bytes were written through by the import body writer.
|
|
23
|
+
for (const dir of new Set(input.externalDirectories))
|
|
24
|
+
fsyncDirectory(dir);
|
|
25
|
+
const fd = openSync(temporary, "r+");
|
|
26
|
+
try {
|
|
27
|
+
fsyncSync(fd);
|
|
28
|
+
}
|
|
29
|
+
finally {
|
|
30
|
+
closeSync(fd);
|
|
31
|
+
}
|
|
32
|
+
input.afterStep?.("synced");
|
|
33
|
+
input.advanceFloor();
|
|
34
|
+
input.afterStep?.("floor");
|
|
35
|
+
renameSync(temporary, databasePath);
|
|
36
|
+
input.afterStep?.("database");
|
|
37
|
+
const legacyPath = preserveLegacyJournal(input.daemonDir);
|
|
38
|
+
input.afterStep?.("journal");
|
|
39
|
+
fsyncDirectory(input.daemonDir);
|
|
40
|
+
return { databasePath, legacyPath };
|
|
41
|
+
}
|
|
42
|
+
/** A crash after the database rename resumes here. The published database
|
|
43
|
+
* wins; historical journals are retained as evidence and never served. */
|
|
44
|
+
export function preserveLegacyJournal(daemonDir) {
|
|
45
|
+
const journal = join(daemonDir, "journal");
|
|
46
|
+
if (!existsSync(journal))
|
|
47
|
+
return null;
|
|
48
|
+
const ordinary = join(daemonDir, "journal-legacy");
|
|
49
|
+
const target = existsSync(ordinary) ? `${ordinary}-${Date.now()}-${randomUUID()}` : ordinary;
|
|
50
|
+
renameSync(journal, target);
|
|
51
|
+
fsyncDirectory(daemonDir);
|
|
52
|
+
return target;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=sql-import-publication.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql-import-publication.js","sourceRoot":"","sources":["../src/sql-import-publication.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACjF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAIjD;;4EAE4E;AAC5E,MAAM,UAAU,oBAAoB,CAAC,KAMpC;IACC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAAC;IAChE,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IAC5D,IAAI,UAAU,CAAC,GAAG,SAAS,MAAM,CAAC,EAAE,CAAC;QACnC,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,2DAA2D,CAAC,EAAE;YAC1F,IAAI,EAAE,0BAA0B;YAChC,MAAM,EAAE,GAAG;YACX,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;IACL,CAAC;IACD,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAC;IAClG,CAAC;IACD,sEAAsE;IACtE,wEAAwE;IACxE,KAAK,MAAM,GAAG,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,mBAAmB,CAAC;QAAE,cAAc,CAAC,GAAG,CAAC,CAAC;IAC1E,MAAM,EAAE,GAAG,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACrC,IAAI,CAAC;QACH,SAAS,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;YAAS,CAAC;QACT,SAAS,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;IACD,KAAK,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC;IAC5B,KAAK,CAAC,YAAY,EAAE,CAAC;IACrB,KAAK,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC;IAC3B,UAAU,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACpC,KAAK,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,CAAC;IAC9B,MAAM,UAAU,GAAG,qBAAqB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC1D,KAAK,CAAC,SAAS,EAAE,CAAC,SAAS,CAAC,CAAC;IAC7B,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;AACtC,CAAC;AAED;0EAC0E;AAC1E,MAAM,UAAU,qBAAqB,CAAC,SAAiB;IACrD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAC3C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC7F,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC5B,cAAc,CAAC,SAAS,CAAC,CAAC;IAC1B,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { createSqlDaemonServices } from "@claudexor/daemon";
|
|
2
|
+
import type { SetupProjectionSlot } from "./setup-lifecycle-binding.js";
|
|
3
|
+
import { SqlSetupJobStore } from "./sql-setup-store.js";
|
|
4
|
+
/** The existing setup supervisor binding observes SQL's global pid as its
|
|
5
|
+
* generation. No second supervisor or durable generation counter is added. */
|
|
6
|
+
export declare class SqlSetupLifecycleSlot implements SetupProjectionSlot<SqlSetupJobStore> {
|
|
7
|
+
private readonly rootDir;
|
|
8
|
+
private readonly graph;
|
|
9
|
+
private value;
|
|
10
|
+
private boundPid;
|
|
11
|
+
constructor(rootDir: string, graph: ReturnType<typeof createSqlDaemonServices>);
|
|
12
|
+
generation(): number;
|
|
13
|
+
current(): SqlSetupJobStore;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=sql-setup-lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql-setup-lifecycle.d.ts","sourceRoot":"","sources":["../src/sql-setup-lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD;8EAC8E;AAC9E,qBAAa,qBAAsB,YAAW,mBAAmB,CAAC,gBAAgB,CAAC;IAI/E,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAJxB,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,QAAQ,CAAuB;IACvC,YACmB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,UAAU,CAAC,OAAO,uBAAuB,CAAC,EAChE;IACJ,UAAU,IAAI,MAAM,CAEnB;IACD,OAAO,IAAI,gBAAgB,CAU1B;CACF"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { SqlSetupJobStore } from "./sql-setup-store.js";
|
|
2
|
+
/** The existing setup supervisor binding observes SQL's global pid as its
|
|
3
|
+
* generation. No second supervisor or durable generation counter is added. */
|
|
4
|
+
export class SqlSetupLifecycleSlot {
|
|
5
|
+
rootDir;
|
|
6
|
+
graph;
|
|
7
|
+
value = null;
|
|
8
|
+
boundPid = null;
|
|
9
|
+
constructor(rootDir, graph) {
|
|
10
|
+
this.rootDir = rootDir;
|
|
11
|
+
this.graph = graph;
|
|
12
|
+
}
|
|
13
|
+
generation() {
|
|
14
|
+
return this.graph.projects.global().pid;
|
|
15
|
+
}
|
|
16
|
+
current() {
|
|
17
|
+
const pid = this.generation();
|
|
18
|
+
if (this.boundPid !== pid) {
|
|
19
|
+
this.graph.rebindGlobal();
|
|
20
|
+
const next = new SqlSetupJobStore(this.rootDir, this.graph.store, this.graph.globalEvents);
|
|
21
|
+
next.validateProjection();
|
|
22
|
+
this.value = next;
|
|
23
|
+
this.boundPid = pid;
|
|
24
|
+
}
|
|
25
|
+
return this.value;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=sql-setup-lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql-setup-lifecycle.js","sourceRoot":"","sources":["../src/sql-setup-lifecycle.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD;8EAC8E;AAC9E,MAAM,OAAO,qBAAqB;IAIb,OAAO;IACP,KAAK;IAJhB,KAAK,GAA4B,IAAI,CAAC;IACtC,QAAQ,GAAkB,IAAI,CAAC;IACvC,YACmB,OAAe,EACf,KAAiD;uBADjD,OAAO;qBACP,KAAK;IACrB,CAAC;IACJ,UAAU;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC;IAC1C,CAAC;IACD,OAAO;QACL,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;YAC1B,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAC3F,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;QACtB,CAAC;QACD,OAAO,IAAI,CAAC,KAAM,CAAC;IACrB,CAAC;CACF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { SqlEventLedger, type EngineStore } from "@claudexor/daemon";
|
|
2
|
+
import { SetupJobProjection } from "./setup-job-projection.js";
|
|
3
|
+
/** The existing setup projection over a supplied SQL global generation. No journal is opened. */
|
|
4
|
+
export declare class SqlSetupJobStore extends SetupJobProjection {
|
|
5
|
+
constructor(rootDir: string, store: EngineStore, ledger: SqlEventLedger);
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=sql-setup-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql-setup-store.d.ts","sourceRoot":"","sources":["../src/sql-setup-store.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EAOd,KAAK,WAAW,EAEjB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAU/D,iGAAiG;AACjG,qBAAa,gBAAiB,SAAQ,kBAAkB;IACtD,YAAY,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,cAAc,EAEtE;CACF"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { bindSetupInTx, lookupIdempotency, runMutation, currentGeneration, encodeJournalCursor, decodeJournalCursor, } from "@claudexor/daemon";
|
|
2
|
+
import { JournalRecoveryRequiredError } from "@claudexor/daemon";
|
|
3
|
+
import { SetupJobProjection } from "./setup-job-projection.js";
|
|
4
|
+
import { idempotencyConflict, parseBinding, } from "./setup-job-persistence.js";
|
|
5
|
+
/** The existing setup projection over a supplied SQL global generation. No journal is opened. */
|
|
6
|
+
export class SqlSetupJobStore extends SetupJobProjection {
|
|
7
|
+
constructor(rootDir, store, ledger) {
|
|
8
|
+
super(rootDir, () => new SqlSetupPersistence(store, ledger), store.now);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
class SqlSetupPersistence {
|
|
12
|
+
store;
|
|
13
|
+
ledger;
|
|
14
|
+
constructor(store, ledger) {
|
|
15
|
+
this.store = store;
|
|
16
|
+
this.ledger = ledger;
|
|
17
|
+
if (ledger.generation.name !== "global")
|
|
18
|
+
throw new Error("setup lifecycle requires the global SQL generation");
|
|
19
|
+
}
|
|
20
|
+
state() {
|
|
21
|
+
const current = currentGeneration(this.store, "global");
|
|
22
|
+
if (current?.pid === this.ledger.generation.pid)
|
|
23
|
+
return { status: "ready", discardedTailBytes: 0 };
|
|
24
|
+
return {
|
|
25
|
+
status: "recovery_required",
|
|
26
|
+
location: { kind: "cursor", epoch: this.ledger.generation.epoch, seq: 0 },
|
|
27
|
+
reason: "setup SQL generation is not the current global generation",
|
|
28
|
+
discardedTailBytes: 0,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
append(type, payload, operation) {
|
|
32
|
+
const prepared = this.ledger.prepare(type, payload);
|
|
33
|
+
runMutation(this.store, (tx) => {
|
|
34
|
+
if (payload.binding !== undefined) {
|
|
35
|
+
const binding = parseBinding(payload.binding);
|
|
36
|
+
if (!binding || !operation)
|
|
37
|
+
throw new Error("invalid setup binding mutation");
|
|
38
|
+
bindSetupInTx(tx, this.ledger.generation.pid, binding, operation, prepared.time);
|
|
39
|
+
}
|
|
40
|
+
this.ledger.appendInTx(tx, prepared);
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
records(afterSeq, types) {
|
|
44
|
+
return this.ledger.records(afterSeq, types);
|
|
45
|
+
}
|
|
46
|
+
savedEvents(jobId, afterSeq) {
|
|
47
|
+
return this.ledger.recordsInGroup(`s:${jobId}:saved`, afterSeq, [
|
|
48
|
+
"setup.job.saved",
|
|
49
|
+
]);
|
|
50
|
+
}
|
|
51
|
+
currentSequence() {
|
|
52
|
+
const row = this.store
|
|
53
|
+
.prepare("SELECT next_seq FROM partition WHERE id = ?")
|
|
54
|
+
.get(this.ledger.generation.pid);
|
|
55
|
+
return Number(row.next_seq) - 1;
|
|
56
|
+
}
|
|
57
|
+
currentCursor() {
|
|
58
|
+
const { name, epoch } = this.ledger.generation;
|
|
59
|
+
return encodeJournalCursor(name, epoch, this.currentSequence());
|
|
60
|
+
}
|
|
61
|
+
sequenceAfter(cursor) {
|
|
62
|
+
const { name, epoch } = this.ledger.generation;
|
|
63
|
+
return decodeJournalCursor(cursor, name, epoch, this.currentSequence() + 1);
|
|
64
|
+
}
|
|
65
|
+
cursorFor(record) {
|
|
66
|
+
return this.ledger.cursorFor(record);
|
|
67
|
+
}
|
|
68
|
+
resolveBinding(binding) {
|
|
69
|
+
let prior;
|
|
70
|
+
try {
|
|
71
|
+
prior = lookupIdempotency(this.store, { owner: "setup", pid: this.ledger.generation.pid, keyDigest: binding.keyDigest }, binding.requestDigest);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
if (error.code === "idempotency_conflict")
|
|
75
|
+
throw idempotencyConflict();
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
return prior
|
|
79
|
+
? { keyDigest: prior.keyDigest, requestDigest: prior.requestDigest, jobId: prior.targetId }
|
|
80
|
+
: undefined;
|
|
81
|
+
}
|
|
82
|
+
rememberBinding(binding, record) {
|
|
83
|
+
// The SQL row is the replay authority; constructor replay validates it and
|
|
84
|
+
// never synthesizes missing bindings from saved events.
|
|
85
|
+
try {
|
|
86
|
+
const prior = this.resolveBinding(binding);
|
|
87
|
+
if (!prior || prior.jobId !== binding.jobId)
|
|
88
|
+
throw new Error("setup event has no matching SQL binding");
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
if (!record)
|
|
92
|
+
throw error;
|
|
93
|
+
throw new JournalRecoveryRequiredError({
|
|
94
|
+
status: "recovery_required",
|
|
95
|
+
location: { kind: "cursor", epoch: record.epoch, seq: record.seq },
|
|
96
|
+
reason: `invalid setup SQL binding: ${error instanceof Error ? error.message : String(error)}`,
|
|
97
|
+
discardedTailBytes: 0,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=sql-setup-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql-setup-store.js","sourceRoot":"","sources":["../src/sql-setup-store.ts"],"names":[],"mappings":"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"}
|