@codetreker/daynight 0.27.2 → 0.31.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/README.md +165 -36
- package/dist/api/client.d.ts +5 -1
- package/dist/api/client.js +38 -14
- package/dist/api/client.js.map +1 -1
- package/dist/api/index.d.ts +1 -0
- package/dist/api/index.js +1 -0
- package/dist/api/index.js.map +1 -1
- package/dist/api/json.js +27 -6
- package/dist/api/json.js.map +1 -1
- package/dist/api/parse.d.ts +1 -4
- package/dist/api/parse.js +8 -87
- package/dist/api/parse.js.map +1 -1
- package/dist/api/resource-path.d.ts +1 -0
- package/dist/api/resource-path.js +8 -0
- package/dist/api/resource-path.js.map +1 -0
- package/dist/api/task-properties.d.ts +8 -0
- package/dist/api/task-properties.js +86 -0
- package/dist/api/task-properties.js.map +1 -0
- package/dist/api/types.d.ts +24 -6
- package/dist/api/validation.d.ts +15 -0
- package/dist/api/validation.js +43 -0
- package/dist/api/validation.js.map +1 -0
- package/dist/cli/schema.d.ts +3 -0
- package/dist/cli/schema.js +14 -4
- package/dist/cli/schema.js.map +1 -1
- package/dist/commands/completion/bash.d.ts +1 -1
- package/dist/commands/completion/bash.js +6 -3
- package/dist/commands/completion/bash.js.map +1 -1
- package/dist/commands/completion/zsh.d.ts +1 -1
- package/dist/commands/completion/zsh.js +7 -7
- package/dist/commands/completion/zsh.js.map +1 -1
- package/dist/commands/controller/independent.js +31 -15
- package/dist/commands/controller/independent.js.map +1 -1
- package/dist/commands/controller/journal-format.d.ts +4 -0
- package/dist/commands/controller/journal-format.js +42 -0
- package/dist/commands/controller/journal-format.js.map +1 -0
- package/dist/commands/controller/lifecycle-store.d.ts +7 -5
- package/dist/commands/controller/lifecycle-store.js +114 -85
- package/dist/commands/controller/lifecycle-store.js.map +1 -1
- package/dist/commands/controller/local-content.d.ts +10 -5
- package/dist/commands/controller/local-content.js +8 -2
- package/dist/commands/controller/local-content.js.map +1 -1
- package/dist/commands/controller/resume-lease-format.d.ts +4 -0
- package/dist/commands/controller/resume-lease-format.js +35 -0
- package/dist/commands/controller/resume-lease-format.js.map +1 -0
- package/dist/commands/controller/resume.js +85 -21
- package/dist/commands/controller/resume.js.map +1 -1
- package/dist/commands/controller/sqlite/journal/001-baseline.sql +17 -0
- package/dist/commands/controller/sqlite/journal/002-projection.sql +8 -0
- package/dist/commands/controller/sqlite/journal/003-operation-acknowledgements.sql +1 -0
- package/dist/commands/controller/sqlite/journal/004-projection-gap.sql +1 -0
- package/dist/commands/controller/sqlite/journal/005-resources.sql +7 -0
- package/dist/commands/controller/sqlite/resume-lease/001-baseline.sql +7 -0
- package/dist/commands/review/listing.js +1 -1
- package/dist/commands/review/listing.js.map +1 -1
- package/dist/commands/review/runtime.js +3 -1
- package/dist/commands/review/runtime.js.map +1 -1
- package/dist/commands/review/sqlite/001-baseline.sql +65 -0
- package/dist/commands/review/sqlite/002-publications.sql +15 -0
- package/dist/commands/review/store-format.d.ts +2 -0
- package/dist/commands/review/store-format.js +35 -0
- package/dist/commands/review/store-format.js.map +1 -0
- package/dist/commands/review/store.d.ts +8 -1
- package/dist/commands/review/store.js +46 -176
- package/dist/commands/review/store.js.map +1 -1
- package/dist/commands/skill/skills/using-daynight/SKILL.md +2 -2
- package/dist/commands/skill/skills/using-daynight/references/autopilot-managed-task.md +19 -7
- package/dist/commands/skill/skills/using-daynight/references/handbook.md +2 -1
- package/dist/commands/skill/skills/using-daynight/references/task-execution.md +1 -1
- package/dist/commands/skill/skills/using-daynight/references/task-management.md +29 -2
- package/dist/commands/skill/skills/using-daynight/references/write-safety.md +1 -1
- package/dist/commands/task/command.js +7 -11
- package/dist/commands/task/command.js.map +1 -1
- package/dist/commands/task/definition.js +28 -11
- package/dist/commands/task/definition.js.map +1 -1
- package/dist/commands/task/property.d.ts +6 -0
- package/dist/commands/task/property.js +51 -0
- package/dist/commands/task/property.js.map +1 -0
- package/dist/commands/task/rendering.d.ts +3 -1
- package/dist/commands/task/rendering.js +25 -8
- package/dist/commands/task/rendering.js.map +1 -1
- package/dist/commands/worker/backends/sqlite/001-baseline.sql +4 -0
- package/dist/commands/worker/backends/web-process.js +6 -3
- package/dist/commands/worker/backends/web-process.js.map +1 -1
- package/dist/commands/worker/backends/web-record.d.ts +11 -0
- package/dist/commands/worker/backends/web-record.js +151 -0
- package/dist/commands/worker/backends/web-record.js.map +1 -0
- package/dist/commands/worker/backends/web-store-format.d.ts +2 -0
- package/dist/commands/worker/backends/web-store-format.js +33 -0
- package/dist/commands/worker/backends/web-store-format.js.map +1 -0
- package/dist/commands/worker/backends/web-store.d.ts +4 -1
- package/dist/commands/worker/backends/web-store.js +43 -170
- package/dist/commands/worker/backends/web-store.js.map +1 -1
- package/dist/commands/worker/backends/web.js +5 -4
- package/dist/commands/worker/backends/web.js.map +1 -1
- package/dist/commands/worker/cleanup.d.ts +1 -1
- package/dist/commands/worker/cleanup.js.map +1 -1
- package/dist/commands/worker/control.js +10 -6
- package/dist/commands/worker/control.js.map +1 -1
- package/dist/commands/worker/coordinator.js +15 -14
- package/dist/commands/worker/coordinator.js.map +1 -1
- package/dist/commands/worker/diagnostics.d.ts +3 -0
- package/dist/commands/worker/diagnostics.js +15 -0
- package/dist/commands/worker/diagnostics.js.map +1 -1
- package/dist/commands/worker/execution.d.ts +2 -0
- package/dist/commands/worker/execution.js +17 -4
- package/dist/commands/worker/execution.js.map +1 -1
- package/dist/commands/worker/herdr/agents.d.ts +6 -1
- package/dist/commands/worker/herdr/agents.js +8 -3
- package/dist/commands/worker/herdr/agents.js.map +1 -1
- package/dist/commands/worker/herdr.d.ts +2 -2
- package/dist/commands/worker/herdr.js.map +1 -1
- package/dist/commands/worker/prompts.js +7 -2
- package/dist/commands/worker/prompts.js.map +1 -1
- package/dist/commands/worker/remote.js +7 -6
- package/dist/commands/worker/remote.js.map +1 -1
- package/dist/commands/worker/runtime.js +8 -3
- package/dist/commands/worker/runtime.js.map +1 -1
- package/dist/commands/worker/sqlite/005-baseline.sql +18 -0
- package/dist/commands/worker/store-format.d.ts +2 -0
- package/dist/commands/worker/store-format.js +35 -0
- package/dist/commands/worker/store-format.js.map +1 -0
- package/dist/commands/worker/store.d.ts +2 -0
- package/dist/commands/worker/store.js +36 -69
- package/dist/commands/worker/store.js.map +1 -1
- package/dist/platform/diagnostics.js +3 -0
- package/dist/platform/diagnostics.js.map +1 -1
- package/dist/platform/instance-lock.d.ts +15 -0
- package/dist/platform/instance-lock.js +45 -3
- package/dist/platform/instance-lock.js.map +1 -1
- package/dist/platform/sqlite-access.d.ts +40 -0
- package/dist/platform/sqlite-access.js +333 -0
- package/dist/platform/sqlite-access.js.map +1 -0
- package/dist/platform/sqlite-error.d.ts +39 -0
- package/dist/platform/sqlite-error.js +36 -0
- package/dist/platform/sqlite-error.js.map +1 -0
- package/dist/platform/sqlite-format.d.ts +31 -0
- package/dist/platform/sqlite-format.js +98 -0
- package/dist/platform/sqlite-format.js.map +1 -0
- package/dist/platform/sqlite-sql.d.ts +12 -0
- package/dist/platform/sqlite-sql.js +61 -0
- package/dist/platform/sqlite-sql.js.map +1 -0
- package/package.json +3 -3
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
|
-
import
|
|
2
|
+
import { openSqliteDatabase, closeSqliteDatabase } from "../../platform/sqlite-access.js";
|
|
3
|
+
import { assertCurrentSqlite } from "../../platform/sqlite-format.js";
|
|
4
|
+
import { workerStoreFormat } from "./store-format.js";
|
|
3
5
|
import { canonicalId } from "../../api/parse.js";
|
|
4
6
|
const text = (value, name) => {
|
|
5
7
|
if (typeof value !== "string" || value.trim().length === 0)
|
|
@@ -36,83 +38,48 @@ const asTask = (row) => {
|
|
|
36
38
|
throw new TypeError("Worker task status must be pending, active or done.");
|
|
37
39
|
return { ...claimKey(row), status: row.status, agent: agent(row.agent), agentControlMode: mode(row.agentControlMode), sessionId: row.sessionId === null ? null : id(row.sessionId, "Native session ID") };
|
|
38
40
|
};
|
|
39
|
-
const schema = `
|
|
40
|
-
CREATE TABLE projects (
|
|
41
|
-
project_id TEXT PRIMARY KEY NOT NULL,
|
|
42
|
-
repo_url TEXT NOT NULL,
|
|
43
|
-
local_path TEXT NOT NULL
|
|
44
|
-
) STRICT;
|
|
45
|
-
CREATE TABLE tasks (
|
|
46
|
-
project_id TEXT NOT NULL,
|
|
47
|
-
task_id TEXT NOT NULL,
|
|
48
|
-
claim_id TEXT NOT NULL,
|
|
49
|
-
status TEXT NOT NULL CHECK(status IN ('pending', 'active', 'done')),
|
|
50
|
-
agent TEXT NOT NULL CHECK(agent IN ('copilot', 'codex', 'claude')),
|
|
51
|
-
session_id TEXT,
|
|
52
|
-
agent_control_mode TEXT NOT NULL DEFAULT 'herdr' CHECK(agent_control_mode IN ('herdr', 'web')),
|
|
53
|
-
PRIMARY KEY(project_id, task_id, claim_id)
|
|
54
|
-
) STRICT;
|
|
55
|
-
CREATE UNIQUE INDEX tasks_one_active_per_task ON tasks(project_id, task_id) WHERE status = 'active';
|
|
56
|
-
`;
|
|
57
|
-
const expectedColumns = {
|
|
58
|
-
projects: ["project_id", "repo_url", "local_path"],
|
|
59
|
-
tasks: ["project_id", "task_id", "claim_id", "status", "agent", "session_id", "agent_control_mode"],
|
|
60
|
-
};
|
|
61
|
-
const unsupportedSchema = () => new Error("The worker SQLite schema is incompatible. Stop the worker and delete its old state.sqlite before starting this version.");
|
|
62
41
|
export const openWorkerStore = (databaseFile, options = {}) => {
|
|
63
42
|
absolutePath(databaseFile, "The SQLite database path");
|
|
64
43
|
const busyTimeoutMs = options.busyTimeoutMs === undefined ? 5000 : options.busyTimeoutMs;
|
|
65
44
|
if (!Number.isSafeInteger(busyTimeoutMs) || busyTimeoutMs < 1 || busyTimeoutMs > 60_000)
|
|
66
45
|
throw new TypeError("SQLite busy timeout must be a safe integer between 1 and 60000 milliseconds.");
|
|
67
|
-
const db =
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
const tables = db.prepare("SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name").all();
|
|
76
|
-
if (tables.length === 0)
|
|
77
|
-
db.exec(schema);
|
|
78
|
-
else {
|
|
79
|
-
if (tables.length !== 2 || tables[0].name !== "projects" || tables[1].name !== "tasks")
|
|
80
|
-
throw unsupportedSchema();
|
|
81
|
-
const taskColumns = db.pragma("table_info(tasks)");
|
|
82
|
-
if (taskColumns.map(column => column.name).join(",") === "project_id,task_id,claim_id,status,agent,session_id") {
|
|
83
|
-
db.exec("ALTER TABLE tasks RENAME TO legacy_tasks; DROP INDEX tasks_one_active_per_task;");
|
|
84
|
-
db.exec(schema.slice(schema.indexOf("CREATE TABLE tasks")));
|
|
85
|
-
db.exec("INSERT INTO tasks(project_id, task_id, claim_id, status, agent, session_id) SELECT project_id, task_id, claim_id, status, agent, session_id FROM legacy_tasks; DROP TABLE legacy_tasks;");
|
|
46
|
+
const db = openSqliteDatabase({ file: databaseFile, format: workerStoreFormat, allowCreate: true, timeoutMs: busyTimeoutMs,
|
|
47
|
+
...(options.onMigration === undefined ? {} : { onMigration: options.onMigration }) });
|
|
48
|
+
const atomic = (operation) => {
|
|
49
|
+
let guardFailure;
|
|
50
|
+
try {
|
|
51
|
+
return db.transaction(() => {
|
|
52
|
+
try {
|
|
53
|
+
assertCurrentSqlite(db, workerStoreFormat);
|
|
86
54
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
throw unsupportedSchema();
|
|
55
|
+
catch (error) {
|
|
56
|
+
guardFailure = error;
|
|
57
|
+
throw error;
|
|
91
58
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
throw unsupportedSchema();
|
|
95
|
-
}
|
|
96
|
-
}).immediate();
|
|
97
|
-
}
|
|
98
|
-
catch (error) {
|
|
99
|
-
try {
|
|
100
|
-
db.close();
|
|
59
|
+
return operation();
|
|
60
|
+
}).immediate();
|
|
101
61
|
}
|
|
102
|
-
catch (
|
|
103
|
-
|
|
62
|
+
catch (error) {
|
|
63
|
+
if (guardFailure !== undefined && error !== guardFailure)
|
|
64
|
+
throw new AggregateError([guardFailure, error], "Worker SQLite format assertion and rollback failed.");
|
|
65
|
+
throw error;
|
|
104
66
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
67
|
+
};
|
|
68
|
+
const read = (operation) => {
|
|
69
|
+
if (db.inTransaction) {
|
|
70
|
+
assertCurrentSqlite(db, workerStoreFormat);
|
|
71
|
+
return operation();
|
|
72
|
+
}
|
|
73
|
+
return db.transaction(() => { assertCurrentSqlite(db, workerStoreFormat); return operation(); }).deferred();
|
|
74
|
+
};
|
|
75
|
+
const getProject = (identity) => read(() => {
|
|
109
76
|
const row = db.prepare(`SELECT ${projectColumns} FROM projects WHERE project_id = @projectId`).get(projectKey(identity));
|
|
110
77
|
return row === undefined ? null : asProject(row);
|
|
111
|
-
};
|
|
112
|
-
const getTask = (identity) => {
|
|
78
|
+
});
|
|
79
|
+
const getTask = (identity) => read(() => {
|
|
113
80
|
const row = db.prepare(`SELECT ${taskColumns} FROM tasks WHERE project_id = @projectId AND task_id = @taskId AND claim_id = @claimId`).get(claimKey(identity));
|
|
114
81
|
return row === undefined ? null : asTask(row);
|
|
115
|
-
};
|
|
82
|
+
});
|
|
116
83
|
const needTask = (identity) => {
|
|
117
84
|
const task = getTask(identity);
|
|
118
85
|
if (task === null)
|
|
@@ -120,9 +87,9 @@ export const openWorkerStore = (databaseFile, options = {}) => {
|
|
|
120
87
|
return task;
|
|
121
88
|
};
|
|
122
89
|
return {
|
|
123
|
-
close: () => { db
|
|
90
|
+
close: () => { closeSqliteDatabase(db, { file: databaseFile, format: workerStoreFormat }); },
|
|
124
91
|
getProject,
|
|
125
|
-
listProjects: () => db.prepare(`SELECT ${projectColumns} FROM projects ORDER BY project_id`).all().map(asProject),
|
|
92
|
+
listProjects: () => read(() => db.prepare(`SELECT ${projectColumns} FROM projects ORDER BY project_id`).all().map(asProject)),
|
|
126
93
|
registerProject: (input) => atomic(() => {
|
|
127
94
|
const project = asProject(input);
|
|
128
95
|
const existing = getProject(project);
|
|
@@ -136,8 +103,8 @@ export const openWorkerStore = (databaseFile, options = {}) => {
|
|
|
136
103
|
return getProject(project);
|
|
137
104
|
}),
|
|
138
105
|
getTask,
|
|
139
|
-
listTasks: () => db.prepare(`SELECT ${taskColumns} FROM tasks ORDER BY project_id, task_id, claim_id`).all().map(asTask),
|
|
140
|
-
listUnfinishedTasks: () => db.prepare(`SELECT ${taskColumns} FROM tasks WHERE status <> 'done' ORDER BY project_id, task_id, claim_id`).all().map(asTask),
|
|
106
|
+
listTasks: () => read(() => db.prepare(`SELECT ${taskColumns} FROM tasks ORDER BY project_id, task_id, claim_id`).all().map(asTask)),
|
|
107
|
+
listUnfinishedTasks: () => read(() => db.prepare(`SELECT ${taskColumns} FROM tasks WHERE status <> 'done' ORDER BY project_id, task_id, claim_id`).all().map(asTask)),
|
|
141
108
|
registerPending: (input) => atomic(() => {
|
|
142
109
|
const key = claimKey(input);
|
|
143
110
|
const tool = agent(input.agent);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/commands/worker/store.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/commands/worker/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/platform/diagnostics.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAc,EAAU,EAAE;IACpD,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IACD,MAAM,OAAO,GAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;QACpC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,cAAc,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/platform/diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEzE,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAc,EAAU,EAAE;IACpD,IAAI,KAAK,YAAY,iBAAiB;QAAE,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACxE,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IACD,MAAM,OAAO,GAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;QACpC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,cAAc,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC,CAAC"}
|
|
@@ -7,3 +7,18 @@ export declare const acquireInstanceLock: (lockFile: string, ownershipGateFile:
|
|
|
7
7
|
previousProcessesExcluded: boolean;
|
|
8
8
|
release: () => Promise<void>;
|
|
9
9
|
}>;
|
|
10
|
+
export declare class MaintenanceLockHeldError extends Error {
|
|
11
|
+
readonly lockFile: string;
|
|
12
|
+
constructor(lockFile: string);
|
|
13
|
+
}
|
|
14
|
+
export type MaintenancePaths = {
|
|
15
|
+
lockFile: string;
|
|
16
|
+
ownershipGateFile: string;
|
|
17
|
+
gateFileMustExist: boolean;
|
|
18
|
+
};
|
|
19
|
+
export type MaintenancePermit = {
|
|
20
|
+
owner: string;
|
|
21
|
+
release(): void;
|
|
22
|
+
};
|
|
23
|
+
/** Maintenance cannot consume the predecessor uncertainty carried by an existing lock. */
|
|
24
|
+
export declare const acquireMaintenanceLock: (paths: MaintenancePaths) => MaintenancePermit;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
|
-
import { closeSync, fsyncSync, openSync, readFileSync, renameSync, unlinkSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { closeSync, fsyncSync, lstatSync, openSync, readFileSync, renameSync, unlinkSync, writeFileSync } from "node:fs";
|
|
3
3
|
import Database from "better-sqlite3";
|
|
4
4
|
export class InstanceLockHeldError extends Error {
|
|
5
5
|
pid;
|
|
@@ -10,8 +10,8 @@ export class InstanceLockHeldError extends Error {
|
|
|
10
10
|
}
|
|
11
11
|
}
|
|
12
12
|
const isMissing = (error) => error instanceof Error && "code" in error && error.code === "ENOENT";
|
|
13
|
-
const withOwnershipGate = (databaseFile, operation) => {
|
|
14
|
-
const database = new Database(databaseFile, { timeout: 5_000 });
|
|
13
|
+
const withOwnershipGate = (databaseFile, operation, fileMustExist = false) => {
|
|
14
|
+
const database = new Database(databaseFile, { timeout: 5_000, fileMustExist });
|
|
15
15
|
let result;
|
|
16
16
|
try {
|
|
17
17
|
result = database.transaction(operation).immediate();
|
|
@@ -120,4 +120,46 @@ export const acquireInstanceLock = async (lockFile, ownershipGateFile, owner = r
|
|
|
120
120
|
},
|
|
121
121
|
};
|
|
122
122
|
};
|
|
123
|
+
export class MaintenanceLockHeldError extends Error {
|
|
124
|
+
lockFile;
|
|
125
|
+
constructor(lockFile) {
|
|
126
|
+
super(`An existing instance lock blocks SQLite maintenance: ${lockFile}. Its ownership evidence was retained.`);
|
|
127
|
+
this.lockFile = lockFile;
|
|
128
|
+
this.name = "MaintenanceLockHeldError";
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/** Maintenance cannot consume the predecessor uncertainty carried by an existing lock. */
|
|
132
|
+
export const acquireMaintenanceLock = (paths) => {
|
|
133
|
+
const owner = randomUUID();
|
|
134
|
+
const content = JSON.stringify({ owner, pid: process.pid, startedAt: new Date().toISOString() });
|
|
135
|
+
withOwnershipGate(paths.ownershipGateFile, () => {
|
|
136
|
+
try {
|
|
137
|
+
lstatSync(paths.lockFile);
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
if (!isMissing(error))
|
|
141
|
+
throw error;
|
|
142
|
+
replaceOwner(paths.lockFile, content);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
throw new MaintenanceLockHeldError(paths.lockFile);
|
|
146
|
+
}, paths.gateFileMustExist);
|
|
147
|
+
let released = false;
|
|
148
|
+
const verify = () => {
|
|
149
|
+
if (readFileSync(paths.lockFile, "utf8").trim() !== content)
|
|
150
|
+
throw new Error(`Maintenance lock ${paths.lockFile} no longer belongs to this CLI; it was retained.`);
|
|
151
|
+
};
|
|
152
|
+
return {
|
|
153
|
+
owner,
|
|
154
|
+
release: () => {
|
|
155
|
+
if (released)
|
|
156
|
+
return;
|
|
157
|
+
// A cooperating acquisition cannot replace our live PID while this lock remains.
|
|
158
|
+
withOwnershipGate(paths.ownershipGateFile, verify, paths.gateFileMustExist);
|
|
159
|
+
verify();
|
|
160
|
+
unlinkSync(paths.lockFile);
|
|
161
|
+
released = true;
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
};
|
|
123
165
|
//# sourceMappingURL=instance-lock.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instance-lock.js","sourceRoot":"","sources":["../../src/platform/instance-lock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"instance-lock.js","sourceRoot":"","sources":["../../src/platform/instance-lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import Database from "better-sqlite3";
|
|
2
|
+
import { type MaintenancePermit } from "./instance-lock.js";
|
|
3
|
+
import { type SqliteFormat, type SqliteSource } from "./sqlite-format.js";
|
|
4
|
+
import { type SqliteOutcome } from "./sqlite-error.js";
|
|
5
|
+
export type SqliteMigrationEvent = {
|
|
6
|
+
readonly migrationId: string;
|
|
7
|
+
readonly database: string;
|
|
8
|
+
readonly file: string;
|
|
9
|
+
readonly kind: "started" | "completed" | "failed";
|
|
10
|
+
readonly phase: string;
|
|
11
|
+
readonly fromVersion: number;
|
|
12
|
+
readonly toVersion: number;
|
|
13
|
+
readonly stepVersion?: number;
|
|
14
|
+
readonly durationMs: number;
|
|
15
|
+
readonly outcome: SqliteOutcome;
|
|
16
|
+
};
|
|
17
|
+
export type SqliteMigrationReporter = (event: SqliteMigrationEvent) => undefined;
|
|
18
|
+
type CommonOptions = {
|
|
19
|
+
file: string;
|
|
20
|
+
format: SqliteFormat;
|
|
21
|
+
timeoutMs?: number;
|
|
22
|
+
onMigration?: SqliteMigrationReporter;
|
|
23
|
+
assertMigrationAllowed?: (db: Database.Database, source: SqliteSource) => void;
|
|
24
|
+
};
|
|
25
|
+
export type OpenSqliteOptions = CommonOptions & {
|
|
26
|
+
allowCreate: boolean;
|
|
27
|
+
onReady?: (db: Database.Database) => void;
|
|
28
|
+
};
|
|
29
|
+
export type ReadSqliteOptions<T> = CommonOptions & {
|
|
30
|
+
onMissing: () => T;
|
|
31
|
+
acquireMaintenance?: () => MaintenancePermit;
|
|
32
|
+
};
|
|
33
|
+
export declare const sqliteTransactionOutcome: (error: unknown) => SqliteOutcome;
|
|
34
|
+
/** Migration boundaries own the whole transaction; domain savepoints remain outside this helper. */
|
|
35
|
+
export declare const runSqliteImmediate: <T>(db: Database.Database, action: () => T) => T;
|
|
36
|
+
export declare const sqliteDatabaseIsMissing: (file: string) => boolean;
|
|
37
|
+
export declare const closeSqliteDatabase: (db: Database.Database, options: Pick<CommonOptions, "file" | "format">, outcome?: SqliteOutcome) => void;
|
|
38
|
+
export declare const openSqliteDatabase: (options: OpenSqliteOptions) => Database.Database;
|
|
39
|
+
export declare const readSqliteDatabase: <T>(options: ReadSqliteOptions<T>, read: (db: Database.Database) => T) => T;
|
|
40
|
+
export {};
|