opencode-supertask 0.1.26 → 0.1.27
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 +41 -17
- package/dist/cli/index.js +3464 -1089
- package/dist/cli/index.js.map +1 -1
- package/dist/daemon/pm2-supervisor.d.ts +3 -0
- package/dist/daemon/pm2-supervisor.js +145 -0
- package/dist/daemon/pm2-supervisor.js.map +1 -0
- package/dist/gateway/index.d.ts +8 -1
- package/dist/gateway/index.js +2131 -681
- package/dist/gateway/index.js.map +1 -1
- package/dist/plugin/supertask.d.ts +2 -1
- package/dist/plugin/supertask.js +1352 -345
- package/dist/plugin/supertask.js.map +1 -1
- package/dist/web/index.d.ts +1 -0
- package/dist/web/index.js +1042 -264
- package/dist/web/index.js.map +1 -1
- package/dist/worker/index.d.ts +17 -3
- package/dist/worker/index.js +1204 -247
- package/dist/worker/index.js.map +1 -1
- package/dist/worker/launcher.d.ts +9 -0
- package/dist/worker/launcher.js +164 -0
- package/dist/worker/launcher.js.map +1 -0
- package/drizzle/0005_natural_ma_gnuci.sql +1 -0
- package/drizzle/0006_worried_agent_zero.sql +2 -0
- package/drizzle/0007_lean_titanium_man.sql +1 -0
- package/drizzle/meta/0005_snapshot.json +559 -0
- package/drizzle/meta/0006_snapshot.json +575 -0
- package/drizzle/meta/0007_snapshot.json +585 -0
- package/drizzle/meta/_journal.json +21 -0
- package/package.json +1 -1
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
// src/daemon/pm2-supervisor.ts
|
|
2
|
+
import { spawnSync } from "child_process";
|
|
3
|
+
import { readFileSync } from "fs";
|
|
4
|
+
import { homedir } from "os";
|
|
5
|
+
import { join, resolve } from "path";
|
|
6
|
+
|
|
7
|
+
// src/daemon/management-lock.ts
|
|
8
|
+
import { Database } from "bun:sqlite";
|
|
9
|
+
import { mkdirSync } from "fs";
|
|
10
|
+
import { dirname } from "path";
|
|
11
|
+
var ManagementLockBusyError = class extends Error {
|
|
12
|
+
constructor() {
|
|
13
|
+
super("Gateway management lock is busy");
|
|
14
|
+
this.name = "ManagementLockBusyError";
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
function isBusyError(error) {
|
|
18
|
+
if (!(error instanceof Error)) return false;
|
|
19
|
+
const code = error.code;
|
|
20
|
+
return code === "SQLITE_BUSY" || /database is locked/i.test(error.message);
|
|
21
|
+
}
|
|
22
|
+
function withExclusiveManagementLock(path, timeoutMs, action) {
|
|
23
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
24
|
+
const database = new Database(path, { create: true });
|
|
25
|
+
const normalizedTimeout = Number.isFinite(timeoutMs) && timeoutMs >= 0 ? Math.floor(timeoutMs) : 0;
|
|
26
|
+
database.exec(`PRAGMA busy_timeout = ${normalizedTimeout}`);
|
|
27
|
+
try {
|
|
28
|
+
try {
|
|
29
|
+
database.exec("BEGIN IMMEDIATE");
|
|
30
|
+
} catch (error) {
|
|
31
|
+
if (isBusyError(error)) throw new ManagementLockBusyError();
|
|
32
|
+
throw error;
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
const result = action();
|
|
36
|
+
database.exec("COMMIT");
|
|
37
|
+
return result;
|
|
38
|
+
} catch (error) {
|
|
39
|
+
try {
|
|
40
|
+
database.exec("ROLLBACK");
|
|
41
|
+
} catch {
|
|
42
|
+
}
|
|
43
|
+
throw error;
|
|
44
|
+
}
|
|
45
|
+
} finally {
|
|
46
|
+
database.close();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// src/daemon/pm2-supervisor.ts
|
|
51
|
+
var PROCESS_NAME = "supertask-gateway";
|
|
52
|
+
var POLL_INTERVAL_MS = 5e3;
|
|
53
|
+
function pm2Home(env) {
|
|
54
|
+
const home = resolve(env.HOME || homedir());
|
|
55
|
+
return env.PM2_HOME ? resolve(env.PM2_HOME) : join(home, ".pm2");
|
|
56
|
+
}
|
|
57
|
+
function managementLockPaths(env) {
|
|
58
|
+
const canonical = join(pm2Home(env), "supertask-gateway.manage.sqlite");
|
|
59
|
+
const legacy = env.SUPERTASK_PM2_MANAGEMENT_LOCK ? resolve(env.SUPERTASK_PM2_MANAGEMENT_LOCK) : canonical;
|
|
60
|
+
return [canonical, ...[legacy].filter((path) => path !== canonical).sort()];
|
|
61
|
+
}
|
|
62
|
+
function withManagementLocks(paths, timeoutMs, action, index = 0) {
|
|
63
|
+
const path = paths[index];
|
|
64
|
+
if (!path) return action();
|
|
65
|
+
return withExclusiveManagementLock(
|
|
66
|
+
path,
|
|
67
|
+
timeoutMs,
|
|
68
|
+
() => withManagementLocks(paths, timeoutMs, action, index + 1)
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
function commandTimeoutMs(env) {
|
|
72
|
+
const configured = Number(
|
|
73
|
+
env.SUPERTASK_PM2_SUPERVISOR_COMMAND_TIMEOUT_MS ?? env.SUPERTASK_PM2_COMMAND_TIMEOUT_MS ?? 15e3
|
|
74
|
+
);
|
|
75
|
+
return Number.isFinite(configured) && configured > 0 ? configured : 15e3;
|
|
76
|
+
}
|
|
77
|
+
function dumpContainsGateway(env) {
|
|
78
|
+
try {
|
|
79
|
+
const parsed = JSON.parse(readFileSync(join(pm2Home(env), "dump.pm2"), "utf8"));
|
|
80
|
+
if (!Array.isArray(parsed)) return null;
|
|
81
|
+
return parsed.some((item) => item.name === PROCESS_NAME);
|
|
82
|
+
} catch (error) {
|
|
83
|
+
return error.code === "ENOENT" ? false : null;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function superviseUnlocked(pm2Path, env) {
|
|
87
|
+
const list = spawnSync(pm2Path, ["jlist"], {
|
|
88
|
+
encoding: "utf8",
|
|
89
|
+
env,
|
|
90
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
91
|
+
timeout: commandTimeoutMs(env),
|
|
92
|
+
killSignal: "SIGKILL"
|
|
93
|
+
});
|
|
94
|
+
if (list.status !== 0 || list.error) return false;
|
|
95
|
+
let parsed;
|
|
96
|
+
try {
|
|
97
|
+
parsed = JSON.parse(list.stdout);
|
|
98
|
+
} catch {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
if (!Array.isArray(parsed)) return false;
|
|
102
|
+
const gateway = parsed.find((item) => item.name === PROCESS_NAME);
|
|
103
|
+
if (!gateway) {
|
|
104
|
+
const savedGateway = dumpContainsGateway(env);
|
|
105
|
+
if (savedGateway !== true) return savedGateway === false;
|
|
106
|
+
const resurrect = spawnSync(pm2Path, ["resurrect"], {
|
|
107
|
+
env,
|
|
108
|
+
stdio: "inherit",
|
|
109
|
+
timeout: commandTimeoutMs(env),
|
|
110
|
+
killSignal: "SIGKILL"
|
|
111
|
+
});
|
|
112
|
+
return resurrect.status === 0 && !resurrect.error;
|
|
113
|
+
}
|
|
114
|
+
const status = gateway.pm2_env?.status;
|
|
115
|
+
return status === "online" || status === "launching" || status === "waiting restart" || status === "stopping" || status === "stopped" || status === "errored";
|
|
116
|
+
}
|
|
117
|
+
function superviseOnce(pm2Path, env = process.env) {
|
|
118
|
+
try {
|
|
119
|
+
return withManagementLocks(
|
|
120
|
+
managementLockPaths(env),
|
|
121
|
+
0,
|
|
122
|
+
() => superviseUnlocked(pm2Path, env)
|
|
123
|
+
);
|
|
124
|
+
} catch (error) {
|
|
125
|
+
if (error instanceof ManagementLockBusyError) return true;
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function run() {
|
|
130
|
+
const pm2Path = Bun.argv[2];
|
|
131
|
+
if (!pm2Path) throw new Error("pm2 supervisor requires an absolute pm2 executable path");
|
|
132
|
+
superviseOnce(pm2Path);
|
|
133
|
+
const timer = setInterval(() => superviseOnce(pm2Path), POLL_INTERVAL_MS);
|
|
134
|
+
const shutdown = () => {
|
|
135
|
+
clearInterval(timer);
|
|
136
|
+
process.exit(0);
|
|
137
|
+
};
|
|
138
|
+
process.once("SIGTERM", shutdown);
|
|
139
|
+
process.once("SIGINT", shutdown);
|
|
140
|
+
}
|
|
141
|
+
if (import.meta.main) run();
|
|
142
|
+
export {
|
|
143
|
+
superviseOnce
|
|
144
|
+
};
|
|
145
|
+
//# sourceMappingURL=pm2-supervisor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/daemon/pm2-supervisor.ts","../../src/daemon/management-lock.ts"],"sourcesContent":["import { spawnSync } from 'child_process';\nimport { readFileSync } from 'fs';\nimport { homedir } from 'os';\nimport { join, resolve } from 'path';\nimport { ManagementLockBusyError, withExclusiveManagementLock } from './management-lock';\n\nconst PROCESS_NAME = 'supertask-gateway';\nconst POLL_INTERVAL_MS = 5_000;\n\ninterface Pm2ProcessSnapshot {\n name?: unknown;\n pm2_env?: { status?: unknown };\n}\n\nfunction pm2Home(env: NodeJS.ProcessEnv): string {\n const home = resolve(env.HOME || homedir());\n return env.PM2_HOME ? resolve(env.PM2_HOME) : join(home, '.pm2');\n}\n\nfunction managementLockPaths(env: NodeJS.ProcessEnv): string[] {\n const canonical = join(pm2Home(env), 'supertask-gateway.manage.sqlite');\n const legacy = env.SUPERTASK_PM2_MANAGEMENT_LOCK\n ? resolve(env.SUPERTASK_PM2_MANAGEMENT_LOCK)\n : canonical;\n return [canonical, ...[legacy].filter((path) => path !== canonical).sort()];\n}\n\nfunction withManagementLocks<T>(\n paths: string[],\n timeoutMs: number,\n action: () => T,\n index = 0,\n): T {\n const path = paths[index];\n if (!path) return action();\n return withExclusiveManagementLock(\n path,\n timeoutMs,\n () => withManagementLocks(paths, timeoutMs, action, index + 1),\n );\n}\n\nfunction commandTimeoutMs(env: NodeJS.ProcessEnv): number {\n const configured = Number(\n env.SUPERTASK_PM2_SUPERVISOR_COMMAND_TIMEOUT_MS\n ?? env.SUPERTASK_PM2_COMMAND_TIMEOUT_MS\n ?? 15_000,\n );\n return Number.isFinite(configured) && configured > 0 ? configured : 15_000;\n}\n\nfunction dumpContainsGateway(env: NodeJS.ProcessEnv): boolean | null {\n try {\n const parsed = JSON.parse(readFileSync(join(pm2Home(env), 'dump.pm2'), 'utf8')) as unknown;\n if (!Array.isArray(parsed)) return null;\n return (parsed as Pm2ProcessSnapshot[]).some((item) => item.name === PROCESS_NAME);\n } catch (error) {\n return (error as NodeJS.ErrnoException).code === 'ENOENT' ? false : null;\n }\n}\n\nfunction superviseUnlocked(pm2Path: string, env: NodeJS.ProcessEnv): boolean {\n const list = spawnSync(pm2Path, ['jlist'], {\n encoding: 'utf8',\n env,\n stdio: ['ignore', 'pipe', 'pipe'],\n timeout: commandTimeoutMs(env),\n killSignal: 'SIGKILL',\n });\n if (list.status !== 0 || list.error) return false;\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(list.stdout) as unknown;\n } catch {\n return false;\n }\n if (!Array.isArray(parsed)) return false;\n\n const gateway = (parsed as Pm2ProcessSnapshot[]).find((item) => item.name === PROCESS_NAME);\n if (!gateway) {\n const savedGateway = dumpContainsGateway(env);\n if (savedGateway !== true) return savedGateway === false;\n const resurrect = spawnSync(pm2Path, ['resurrect'], {\n env,\n stdio: 'inherit',\n timeout: commandTimeoutMs(env),\n killSignal: 'SIGKILL',\n });\n return resurrect.status === 0 && !resurrect.error;\n }\n\n const status = gateway.pm2_env?.status;\n return status === 'online'\n || status === 'launching'\n || status === 'waiting restart'\n || status === 'stopping'\n || status === 'stopped'\n || status === 'errored';\n}\n\nexport function superviseOnce(pm2Path: string, env: NodeJS.ProcessEnv = process.env): boolean {\n try {\n return withManagementLocks(\n managementLockPaths(env),\n 0,\n () => superviseUnlocked(pm2Path, env),\n );\n } catch (error) {\n if (error instanceof ManagementLockBusyError) return true;\n return false;\n }\n}\n\nfunction run(): void {\n const pm2Path = Bun.argv[2];\n if (!pm2Path) throw new Error('pm2 supervisor requires an absolute pm2 executable path');\n\n superviseOnce(pm2Path);\n const timer = setInterval(() => superviseOnce(pm2Path), POLL_INTERVAL_MS);\n const shutdown = () => {\n clearInterval(timer);\n process.exit(0);\n };\n process.once('SIGTERM', shutdown);\n process.once('SIGINT', shutdown);\n}\n\nif (import.meta.main) run();\n","import { Database } from 'bun:sqlite';\nimport { mkdirSync } from 'fs';\nimport { dirname } from 'path';\n\nexport class ManagementLockBusyError extends Error {\n constructor() {\n super('Gateway management lock is busy');\n this.name = 'ManagementLockBusyError';\n }\n}\n\nfunction isBusyError(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n const code = (error as Error & { code?: string }).code;\n return code === 'SQLITE_BUSY' || /database is locked/i.test(error.message);\n}\n\n/**\n * Serializes PM2 lifecycle changes with an OS-backed SQLite write lock.\n * The transaction is held for the complete action and is released by SQLite\n * automatically if the owning process exits or is killed.\n */\nexport function withExclusiveManagementLock<T>(\n path: string,\n timeoutMs: number,\n action: () => T,\n): T {\n mkdirSync(dirname(path), { recursive: true });\n const database = new Database(path, { create: true });\n const normalizedTimeout = Number.isFinite(timeoutMs) && timeoutMs >= 0\n ? Math.floor(timeoutMs)\n : 0;\n database.exec(`PRAGMA busy_timeout = ${normalizedTimeout}`);\n\n try {\n try {\n database.exec('BEGIN IMMEDIATE');\n } catch (error) {\n if (isBusyError(error)) throw new ManagementLockBusyError();\n throw error;\n }\n\n try {\n const result = action();\n database.exec('COMMIT');\n return result;\n } catch (error) {\n try {\n database.exec('ROLLBACK');\n } catch {}\n throw error;\n }\n } finally {\n database.close();\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/gateway/index.d.ts
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
|
+
interface GatewayShutdownFailure {
|
|
2
|
+
step: string;
|
|
3
|
+
error: string;
|
|
4
|
+
}
|
|
5
|
+
declare function runGatewayShutdownStep(failures: GatewayShutdownFailure[], step: string, operation: () => void | Promise<void>): Promise<void>;
|
|
6
|
+
declare function resolveGatewayShutdownExitCode(requestedExitCode: number, failures: GatewayShutdownFailure[]): number;
|
|
1
7
|
declare function acquireLock(): boolean;
|
|
2
8
|
declare function releaseLock(): void;
|
|
9
|
+
declare function updateLockHeartbeat(): boolean;
|
|
3
10
|
declare function main(): Promise<void>;
|
|
4
11
|
|
|
5
|
-
export { acquireLock, main, releaseLock };
|
|
12
|
+
export { type GatewayShutdownFailure, acquireLock, main, releaseLock, resolveGatewayShutdownExitCode, runGatewayShutdownStep, updateLockHeartbeat };
|