@wjarka/cezarion 0.14.8 → 0.14.9-dev.842
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 +76 -2
- package/dist/application-update/bin-recovery.d.ts +5 -0
- package/dist/application-update/bin-recovery.js +96 -0
- package/dist/application-update/bin-recovery.js.map +1 -0
- package/dist/application-update/discovery.d.ts +22 -0
- package/dist/application-update/discovery.js +91 -0
- package/dist/application-update/discovery.js.map +1 -0
- package/dist/application-update/helper.d.ts +57 -0
- package/dist/application-update/helper.js +374 -0
- package/dist/application-update/helper.js.map +1 -0
- package/dist/application-update/launcher.d.ts +8 -0
- package/dist/application-update/launcher.js +53 -0
- package/dist/application-update/launcher.js.map +1 -0
- package/dist/application-update/lock.d.ts +4 -0
- package/dist/application-update/lock.js +70 -0
- package/dist/application-update/lock.js.map +1 -0
- package/dist/application-update/npm-process.d.ts +17 -0
- package/dist/application-update/npm-process.js +133 -0
- package/dist/application-update/npm-process.js.map +1 -0
- package/dist/application-update/service.d.ts +69 -0
- package/dist/application-update/service.js +456 -0
- package/dist/application-update/service.js.map +1 -0
- package/dist/artifacts/cli.d.ts +1 -0
- package/dist/artifacts/cli.js +32 -0
- package/dist/artifacts/cli.js.map +1 -0
- package/dist/artifacts/lifecycle.d.ts +4 -0
- package/dist/artifacts/lifecycle.js +42 -0
- package/dist/artifacts/lifecycle.js.map +1 -0
- package/dist/artifacts/resolve.d.ts +18 -0
- package/dist/artifacts/resolve.js +102 -0
- package/dist/artifacts/resolve.js.map +1 -0
- package/dist/artifacts/store.d.ts +8 -0
- package/dist/artifacts/store.js +323 -0
- package/dist/artifacts/store.js.map +1 -0
- package/dist/ci-wait/mcp.d.ts +3 -0
- package/dist/ci-wait/mcp.js +14 -3
- package/dist/ci-wait/mcp.js.map +1 -1
- package/dist/contract/application-update.d.ts +32 -0
- package/dist/contract/artifacts.d.ts +83 -0
- package/dist/contract/ask-schema.d.ts +32 -0
- package/dist/contract/ask.d.ts +2 -32
- package/dist/contract/conversations.d.ts +165 -0
- package/dist/contract/delegation.d.ts +39 -0
- package/dist/contract/events.d.ts +49 -0
- package/dist/contract/health.d.ts +12 -0
- package/dist/contract/index.d.ts +2 -0
- package/dist/contract/index.js +1374 -1247
- package/dist/contract/runs.d.ts +143 -0
- package/dist/contract/skills.d.ts +28 -0
- package/dist/core/agent-runner.d.ts +33 -4
- package/dist/core/agent-runner.js +5 -0
- package/dist/core/agent-runner.js.map +1 -1
- package/dist/core/claude-cli-runner.d.ts +6 -12
- package/dist/core/claude-cli-runner.js +89 -19
- package/dist/core/claude-cli-runner.js.map +1 -1
- package/dist/core/codex-app-server-runner.d.ts +2 -1
- package/dist/core/codex-app-server-runner.js +327 -92
- package/dist/core/codex-app-server-runner.js.map +1 -1
- package/dist/core/codex-app-server-transport.d.ts +13 -1
- package/dist/core/codex-app-server-transport.js +58 -17
- package/dist/core/codex-app-server-transport.js.map +1 -1
- package/dist/core/cursor-acp-runner.d.ts +4 -1
- package/dist/core/cursor-acp-runner.js +3 -0
- package/dist/core/cursor-acp-runner.js.map +1 -1
- package/dist/core/cursor-provider-error.js +6 -1
- package/dist/core/cursor-provider-error.js.map +1 -1
- package/dist/core/input-submissions.d.ts +14 -0
- package/dist/core/input-submissions.js +26 -0
- package/dist/core/input-submissions.js.map +1 -0
- package/dist/core/opencode-server-runner.d.ts +4 -1
- package/dist/core/opencode-server-runner.js +144 -21
- package/dist/core/opencode-server-runner.js.map +1 -1
- package/dist/core/pi-runner.d.ts +2 -1
- package/dist/core/pi-runner.js +72 -7
- package/dist/core/pi-runner.js.map +1 -1
- package/dist/delegation/cli.js +102 -6
- package/dist/delegation/cli.js.map +1 -1
- package/dist/delegation/conversations.js +13 -5
- package/dist/delegation/conversations.js.map +1 -1
- package/dist/delegation/input.d.ts +2 -1
- package/dist/delegation/input.js +6 -1
- package/dist/delegation/input.js.map +1 -1
- package/dist/delegation/provision.js +5 -3
- package/dist/delegation/provision.js.map +1 -1
- package/dist/delegation/questions.d.ts +19 -0
- package/dist/delegation/questions.js +45 -0
- package/dist/delegation/questions.js.map +1 -0
- package/dist/delegation/results.d.ts +1 -1
- package/dist/delegation/results.js +23 -13
- package/dist/delegation/results.js.map +1 -1
- package/dist/delegation/routes.d.ts +142 -15
- package/dist/delegation/routes.js +4 -1
- package/dist/delegation/routes.js.map +1 -1
- package/dist/delegation/service.d.ts +9 -5
- package/dist/delegation/service.js +106 -7
- package/dist/delegation/service.js.map +1 -1
- package/dist/delegation/transport.d.ts +188 -61
- package/dist/index.js +72 -26
- package/dist/index.js.map +1 -1
- package/dist/open-url.d.ts +2 -0
- package/dist/open-url.js +20 -0
- package/dist/open-url.js.map +1 -0
- package/dist/release/snapshot.d.ts +3 -3
- package/dist/release/snapshot.js +6 -6
- package/dist/release/snapshot.js.map +1 -1
- package/dist/runs/client-request.d.ts +11 -0
- package/dist/runs/client-request.js +26 -0
- package/dist/runs/client-request.js.map +1 -0
- package/dist/runs/delegation-state.d.ts +17 -0
- package/dist/runs/event-history.js +6 -0
- package/dist/runs/event-history.js.map +1 -1
- package/dist/runs/store.d.ts +78 -6
- package/dist/runs/store.js +163 -1
- package/dist/runs/store.js.map +1 -1
- package/dist/server/server.d.ts +3761 -1648
- package/dist/server/server.js +170 -4
- package/dist/server/server.js.map +1 -1
- package/dist/task-cli/cli.d.ts +38 -0
- package/dist/task-cli/cli.js +463 -0
- package/dist/task-cli/cli.js.map +1 -0
- package/dist/task-cli/discovery.d.ts +22 -0
- package/dist/task-cli/discovery.js +95 -0
- package/dist/task-cli/discovery.js.map +1 -0
- package/dist/task-cli/http.d.ts +43 -0
- package/dist/task-cli/http.js +101 -0
- package/dist/task-cli/http.js.map +1 -0
- package/dist/task-cli/projections.d.ts +40 -0
- package/dist/task-cli/projections.js +45 -0
- package/dist/task-cli/projections.js.map +1 -0
- package/dist/task-cli/watch.d.ts +78 -0
- package/dist/task-cli/watch.js +336 -0
- package/dist/task-cli/watch.js.map +1 -0
- package/dist/workflows/run.d.ts +93 -0
- package/dist/workflows/run.js +816 -81
- package/dist/workflows/run.js.map +1 -1
- package/dist/workspace/projects-cli.js +1 -1
- package/package.json +3 -3
- package/scripts/mock-claude.mjs +38 -2
- package/scripts/mock-codex-app-server.mjs +98 -1
- package/scripts/mock-cursor-acp.mjs +8 -0
- package/scripts/mock-opencode-serve.mjs +69 -2
- package/scripts/mock-pi-rpc.mjs +63 -2
- package/web/dist/assets/agent-accounts-JPfZPgKn.js +1 -0
- package/web/dist/assets/centered-state-HwCqQkH3.js +43 -0
- package/web/dist/assets/collapsible-CTymFdL7.js +1 -0
- package/web/dist/assets/commit-list-BZpYGQl2.js +1 -0
- package/web/dist/assets/compare-variants-9VkybaQ7.js +1 -0
- package/web/dist/assets/{diff-tRE59UNb2.js → diff-CZcD4D1r2.js} +2 -2
- package/web/dist/assets/diff-controls-CpcHG3Mm.js +1 -0
- package/web/dist/assets/{diff-stat-Cgnl_hYF.js → diff-stat-Cn7rzy1H.js} +1 -1
- package/web/dist/assets/{diff-view-DN1ort7Q.js → diff-view-C46nHiP2.js} +2 -2
- package/web/dist/assets/dropdown-menu-_YAzCaoQ.js +1 -0
- package/web/dist/assets/git-toolbar-BvKDz6uS.js +1 -0
- package/web/dist/assets/github-CgjJCGrD.js +1 -0
- package/web/dist/assets/{image-preview-C2JGcBlC.js → image-preview-B618kDBH.js} +1 -1
- package/web/dist/assets/index-BJtve0Pm.js +7 -0
- package/web/dist/assets/index-D0WAgmTQ.css +1 -0
- package/web/dist/assets/markdown-CFWZnvMh.js +2 -0
- package/web/dist/assets/pill-QfwkuR50.js +1 -0
- package/web/dist/assets/project-router-CkAA39N5.js +1 -0
- package/web/dist/assets/prompt-templates-Cfna_S0T.js +15 -0
- package/web/dist/assets/repo-git-DgzgJ0cP.js +1 -0
- package/web/dist/assets/{run-diff-CyG0Nciv.js → run-diff-YbCEQn5I.js} +2 -2
- package/web/dist/assets/run-header-DMgIbr1d.js +1 -0
- package/web/dist/assets/skills-BW79kUTd.js +1 -0
- package/web/dist/assets/{tab-link-BWNp3mLY.js → tab-link-MIHvczEm.js} +1 -1
- package/web/dist/assets/task-changes-C96ekt94.js +1 -0
- package/web/dist/assets/task-commits-DBfcMZyG.js +1 -0
- package/web/dist/assets/task-files-BKpH8dKQ.js +2 -0
- package/web/dist/assets/task-thread-Bw_nQuTx.css +1 -0
- package/web/dist/assets/task-thread-Dnq7Ek6W.js +9 -0
- package/web/dist/assets/textarea-D2vAVgYW.js +1 -0
- package/web/dist/assets/thread-loading-NW8Mthco.js +1 -0
- package/web/dist/assets/token-metrics-D188e6_0.js +1 -0
- package/web/dist/assets/utils-DKheTxGD.js +64 -0
- package/web/dist/assets/workflows-BFY1hgp3.js +11 -0
- package/web/dist/assets/{zoomable-image-Z3JDnm0b.js → zoomable-image-YW3Qdrr_.js} +1 -1
- package/web/dist/index.html +14 -14
- package/web/dist/assets/agent-accounts-BZm_2WAv.js +0 -1
- package/web/dist/assets/alert-dialog-B422RI-k.js +0 -43
- package/web/dist/assets/collapsible-Cy_Fmkrd.js +0 -1
- package/web/dist/assets/commit-list-Dcnk7TnI.js +0 -1
- package/web/dist/assets/compare-variants-Ciqwvd_f.js +0 -1
- package/web/dist/assets/diff-controls-BGrXGi7O.js +0 -1
- package/web/dist/assets/dropdown-menu-dwDGT8MM.js +0 -1
- package/web/dist/assets/git-toolbar-UiHnGvE0.js +0 -1
- package/web/dist/assets/github-D-MrkbJ7.js +0 -1
- package/web/dist/assets/ibm-plex-mono-regular-BF3vfe7_.ttf +0 -0
- package/web/dist/assets/index-BszfYvBq.js +0 -7
- package/web/dist/assets/index-CWh4pKP3.css +0 -1
- package/web/dist/assets/markdown-C_IcKVQd.js +0 -2
- package/web/dist/assets/pill-BsbO6G7y.js +0 -1
- package/web/dist/assets/project-router-DbLkll25.js +0 -1
- package/web/dist/assets/prompt-templates-BlTGJB5W.js +0 -15
- package/web/dist/assets/repo-git-Bm3s6Why.js +0 -1
- package/web/dist/assets/run-header-IFyIGCey.js +0 -1
- package/web/dist/assets/skills-C-C4DVFY.js +0 -1
- package/web/dist/assets/task-changes-D2PHtWUW.js +0 -1
- package/web/dist/assets/task-commits-N5u9U0_R.js +0 -1
- package/web/dist/assets/task-files-BS7c7CFm.js +0 -2
- package/web/dist/assets/task-thread-BQFdz1dJ.css +0 -1
- package/web/dist/assets/task-thread-DGM2dZV-.js +0 -9
- package/web/dist/assets/textarea-FjaU370i.js +0 -1
- package/web/dist/assets/thread-loading-77sJ8Yu_.js +0 -1
- package/web/dist/assets/token-metrics-Clxh03bE.js +0 -1
- package/web/dist/assets/utils-PYYcpCFZ.js +0 -64
- package/web/dist/assets/workflows-Czl0ZfXH.js +0 -11
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { cp, readFile, readdir, rename, rm, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
4
|
+
import { dirname, join } from 'node:path';
|
|
5
|
+
import { isIP } from 'node:net';
|
|
6
|
+
import { Agent, get } from 'node:http';
|
|
7
|
+
import { withDirectoryLock } from './lock.js';
|
|
8
|
+
import { runOwnedNpm } from './npm-process.js';
|
|
9
|
+
import { restoreGlobalBins, windowsGlobalLayout } from './bin-recovery.js';
|
|
10
|
+
const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
11
|
+
/** Only a listening TCP server can supply the private restart destination. */
|
|
12
|
+
export function restartEndpoint(address) {
|
|
13
|
+
if (!address || typeof address === 'string' || !Number.isInteger(address.port) || address.port < 1 || address.port > 65535
|
|
14
|
+
|| !(isIP(address.address) === 4 && address.address.split('.')[0] === '127' || address.address === '::1')) {
|
|
15
|
+
throw new Error('restart requires a bound loopback endpoint');
|
|
16
|
+
}
|
|
17
|
+
return { host: address.address, port: address.port };
|
|
18
|
+
}
|
|
19
|
+
export function restartHealthUrl(endpoint) {
|
|
20
|
+
const { host, port } = restartEndpoint({ address: endpoint.host, port: endpoint.port, family: '' });
|
|
21
|
+
return `http://${host.includes(':') ? `[${host}]` : host}:${port}/api/v1/health`;
|
|
22
|
+
}
|
|
23
|
+
/** A private loopback probe must not use Node's environment-proxied global agent. */
|
|
24
|
+
export async function requestRestartHealth(endpoint, signal) {
|
|
25
|
+
const agent = new Agent();
|
|
26
|
+
try {
|
|
27
|
+
return await new Promise((resolve, reject) => {
|
|
28
|
+
const request = get(restartHealthUrl(endpoint), { agent, signal }, (response) => {
|
|
29
|
+
response.once('error', reject);
|
|
30
|
+
if (!response.statusCode || response.statusCode < 200 || response.statusCode >= 300) {
|
|
31
|
+
response.resume();
|
|
32
|
+
resolve(undefined);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
let body = '';
|
|
36
|
+
response.setEncoding('utf8');
|
|
37
|
+
response.on('data', (chunk) => { body += chunk; });
|
|
38
|
+
response.once('end', () => {
|
|
39
|
+
try {
|
|
40
|
+
resolve(JSON.parse(body));
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
reject(error);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
request.once('error', reject);
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
finally {
|
|
51
|
+
agent.destroy();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/** Only the helper owns the promotion transaction. Rollback waits for its child to exit. */
|
|
55
|
+
export async function runRestartWorkflow(io) {
|
|
56
|
+
await io.waitForOldExit();
|
|
57
|
+
await io.assertOwned?.();
|
|
58
|
+
let replacementLaunched = false;
|
|
59
|
+
try {
|
|
60
|
+
await io.assertOwned?.();
|
|
61
|
+
await io.promote();
|
|
62
|
+
await io.assertOwned?.();
|
|
63
|
+
await io.validateOriginal();
|
|
64
|
+
await io.assertOwned?.();
|
|
65
|
+
await io.launch();
|
|
66
|
+
replacementLaunched = true;
|
|
67
|
+
await io.assertOwned?.();
|
|
68
|
+
await io.verifyHealth();
|
|
69
|
+
await io.assertOwned?.();
|
|
70
|
+
await io.reportSuccess();
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
if (replacementLaunched) {
|
|
74
|
+
try {
|
|
75
|
+
await io.reapReplacement();
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// Never mutate the installation or launch another process until the
|
|
79
|
+
// helper has confirmed its replacement is gone.
|
|
80
|
+
await io.assertOwned?.();
|
|
81
|
+
await io.reportFailure(true);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// A foreign owner may now be installing into the same tree. Preserve the
|
|
86
|
+
// recovery copy and leave the stale claim for the next boot to salvage.
|
|
87
|
+
await io.assertOwned?.();
|
|
88
|
+
let rollbackFailed = false;
|
|
89
|
+
try {
|
|
90
|
+
await io.assertOwned?.();
|
|
91
|
+
await io.restore();
|
|
92
|
+
await io.assertOwned?.();
|
|
93
|
+
await io.launchPrevious();
|
|
94
|
+
await io.assertOwned?.();
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
await io.reapReplacement().catch(() => undefined);
|
|
98
|
+
await io.assertOwned?.();
|
|
99
|
+
rollbackFailed = true;
|
|
100
|
+
}
|
|
101
|
+
await io.assertOwned?.();
|
|
102
|
+
await io.reportFailure(rollbackFailed);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
function scopedPath(plan) {
|
|
106
|
+
if (plan.installation.outerPackage === '@wjarka/cezarion')
|
|
107
|
+
return plan.installation.packageRoot;
|
|
108
|
+
const nested = join(plan.installation.outerRoot, 'node_modules/@wjarka/cezarion');
|
|
109
|
+
if (existsSync(nested))
|
|
110
|
+
return nested;
|
|
111
|
+
const modules = plan.installation.kind === 'npx' ? join(plan.installation.installRoot, 'node_modules')
|
|
112
|
+
: dirname(plan.installation.outerRoot);
|
|
113
|
+
return join(modules, '@wjarka/cezarion');
|
|
114
|
+
}
|
|
115
|
+
function validateOriginal(plan, expected) {
|
|
116
|
+
const pkg = JSON.parse(readFileSync(join(scopedPath(plan), 'package.json'), 'utf8'));
|
|
117
|
+
if (pkg.name !== '@wjarka/cezarion' || pkg.version !== expected || !existsSync(join(scopedPath(plan), 'dist/index.js')) || !existsSync(join(scopedPath(plan), 'web/dist/index.html'))) {
|
|
118
|
+
throw new Error('promoted installation did not validate');
|
|
119
|
+
}
|
|
120
|
+
if (!existsSync(plan.installation.launchEntry))
|
|
121
|
+
throw new Error('original launch entry missing');
|
|
122
|
+
if (plan.installation.kind === 'npx') {
|
|
123
|
+
const root = JSON.parse(readFileSync(join(plan.installation.installRoot, 'package.json'), 'utf8'));
|
|
124
|
+
if (root._npx?.packages?.[0] !== plan.installation.request || root._npx.packages.length !== 1)
|
|
125
|
+
throw new Error('npx request metadata changed');
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
export function manualRepairCommand(installation, version) {
|
|
129
|
+
if (!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(version))
|
|
130
|
+
throw new Error('invalid repair version');
|
|
131
|
+
const quote = (value) => `'${value.replaceAll("'", "'\\''")}'`;
|
|
132
|
+
const prefix = installation.kind === 'global' ? installation.prefix : installation.installRoot;
|
|
133
|
+
return `npm install ${installation.kind === 'global' ? '--global ' : ''}--prefix ${quote(prefix)} ${installation.outerPackage}@${version}`;
|
|
134
|
+
}
|
|
135
|
+
async function writeState(plan, state, repairCommand) {
|
|
136
|
+
const current = JSON.parse(await readFile(plan.recordPath, 'utf8'));
|
|
137
|
+
const temp = `${plan.recordPath}.${process.pid}.tmp`;
|
|
138
|
+
await writeFile(temp, JSON.stringify({ ...current, state, ownerPid: undefined, claimId: undefined,
|
|
139
|
+
startedAt: undefined, repairCommand }), { mode: 0o600 });
|
|
140
|
+
await rename(temp, plan.recordPath);
|
|
141
|
+
}
|
|
142
|
+
function alive(pid) {
|
|
143
|
+
try {
|
|
144
|
+
process.kill(pid, 0);
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
async function waitExit(pid, timeoutMs) {
|
|
152
|
+
const until = Date.now() + timeoutMs;
|
|
153
|
+
while (alive(pid) && Date.now() < until)
|
|
154
|
+
await delay(100);
|
|
155
|
+
if (alive(pid))
|
|
156
|
+
throw new Error('old server did not exit');
|
|
157
|
+
}
|
|
158
|
+
export async function promoteOriginal(plan, npxLockAlreadyHeld = false, signal) {
|
|
159
|
+
const { installation } = plan;
|
|
160
|
+
const args = installation.kind === 'global'
|
|
161
|
+
? ['install', '--global', '--prefix', installation.prefix]
|
|
162
|
+
: ['install', '--prefix', installation.installRoot];
|
|
163
|
+
args.push('--engine-strict', '--no-audit', '--no-fund', '--ignore-scripts', '--prefer-online', '--fetch-retries=1', `${installation.outerPackage}@${plan.targetVersion}`);
|
|
164
|
+
const run = async () => {
|
|
165
|
+
await runOwnedNpm(plan.npmBin, args, { ...process.env, npm_config_cache: installation.cache }, signal);
|
|
166
|
+
};
|
|
167
|
+
if (installation.kind === 'npx' && !npxLockAlreadyHeld) {
|
|
168
|
+
await withDirectoryLock(join(installation.installRoot, 'concurrency.lock'), async (assertOwned, lockSignal) => { await promoteOriginal(plan, true, lockSignal); await assertOwned(); }, 30_000);
|
|
169
|
+
}
|
|
170
|
+
else
|
|
171
|
+
await run();
|
|
172
|
+
}
|
|
173
|
+
function launch(plan) {
|
|
174
|
+
const args = [...plan.nodeArgs, plan.installation.launchEntry, ...plan.cliArgs,
|
|
175
|
+
'--bind-host', plan.host, '--port', String(plan.port), '--repo', plan.repoRoot, '--no-open', '--restart-exact'];
|
|
176
|
+
return spawn(plan.nodeExecutable, args, { cwd: plan.cwd, env: process.env,
|
|
177
|
+
stdio: ['ignore', 'ignore', 'ignore', 'ipc'], detached: true });
|
|
178
|
+
}
|
|
179
|
+
async function verifyHealth(plan, expectedVersion, child, signal) {
|
|
180
|
+
// The private IPC channel belongs to this exact child. An unrelated healthy
|
|
181
|
+
// server on the port cannot send this acknowledgement.
|
|
182
|
+
await new Promise((resolve, reject) => {
|
|
183
|
+
let finished = false;
|
|
184
|
+
const timer = setTimeout(() => finish(new Error('replacement listener acknowledgement timed out')), 20_000);
|
|
185
|
+
const finish = (error) => {
|
|
186
|
+
if (finished)
|
|
187
|
+
return;
|
|
188
|
+
finished = true;
|
|
189
|
+
clearTimeout(timer);
|
|
190
|
+
child.off('message', onMessage);
|
|
191
|
+
child.off('exit', onExit);
|
|
192
|
+
child.off('error', onExit);
|
|
193
|
+
signal?.removeEventListener('abort', onAbort);
|
|
194
|
+
if (error)
|
|
195
|
+
reject(error);
|
|
196
|
+
else
|
|
197
|
+
resolve();
|
|
198
|
+
};
|
|
199
|
+
const onExit = () => finish(new Error('replacement exited before listener acknowledgement'));
|
|
200
|
+
const onAbort = () => finish(new Error('update lock ownership changed'));
|
|
201
|
+
const onMessage = (value) => {
|
|
202
|
+
const message = value;
|
|
203
|
+
if (message?.type !== 'application-update-listening')
|
|
204
|
+
return;
|
|
205
|
+
if (message.host !== plan.host || message.port !== plan.port || message.repoRoot !== plan.repoRoot || message.version !== expectedVersion) {
|
|
206
|
+
finish(new Error('replacement listener identity mismatch'));
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
finish();
|
|
210
|
+
};
|
|
211
|
+
child.on('message', onMessage);
|
|
212
|
+
child.once('exit', onExit);
|
|
213
|
+
child.once('error', onExit);
|
|
214
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
215
|
+
if (signal?.aborted)
|
|
216
|
+
onAbort();
|
|
217
|
+
if (child.exitCode !== null)
|
|
218
|
+
onExit();
|
|
219
|
+
});
|
|
220
|
+
const until = Date.now() + 20_000;
|
|
221
|
+
while (Date.now() < until) {
|
|
222
|
+
if (signal?.aborted)
|
|
223
|
+
throw new Error('update lock ownership changed');
|
|
224
|
+
if (child.exitCode !== null)
|
|
225
|
+
throw new Error('replacement exited before health');
|
|
226
|
+
try {
|
|
227
|
+
const health = await requestRestartHealth(plan, signal ? AbortSignal.any([signal, AbortSignal.timeout(1000)]) : AbortSignal.timeout(1000));
|
|
228
|
+
if (health) {
|
|
229
|
+
if (health.version === expectedVersion && health.repoRoot === plan.repoRoot) {
|
|
230
|
+
if (child.connected)
|
|
231
|
+
child.disconnect();
|
|
232
|
+
child.unref();
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
throw new Error('health identity mismatch');
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
catch (error) {
|
|
239
|
+
if (error instanceof Error && error.message === 'health identity mismatch')
|
|
240
|
+
throw error;
|
|
241
|
+
}
|
|
242
|
+
await delay(150);
|
|
243
|
+
}
|
|
244
|
+
throw new Error('replacement health timed out');
|
|
245
|
+
}
|
|
246
|
+
async function reap(child) {
|
|
247
|
+
if (!child?.pid || child.exitCode !== null)
|
|
248
|
+
return;
|
|
249
|
+
process.kill(child.pid, 'SIGTERM');
|
|
250
|
+
try {
|
|
251
|
+
await waitExit(child.pid, 3000);
|
|
252
|
+
}
|
|
253
|
+
catch {
|
|
254
|
+
process.kill(child.pid, 'SIGKILL');
|
|
255
|
+
await waitExit(child.pid, 3000);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
export async function restoreOriginal(plan, assertOwned = async () => { }) {
|
|
259
|
+
const { installation } = plan;
|
|
260
|
+
const copy = async (from, to) => cp(from, to, { recursive: true, dereference: false,
|
|
261
|
+
filter: async () => { await assertOwned(); return true; } });
|
|
262
|
+
await assertOwned();
|
|
263
|
+
const hoisted = installation.kind === 'global' && installation.outerPackage === 'cezarion'
|
|
264
|
+
&& installation.packageRoot === join(dirname(installation.outerRoot), '@wjarka/cezarion');
|
|
265
|
+
if (hoisted || plan.recoveryPackage !== undefined) {
|
|
266
|
+
// No destination list from disk: only the discovery-owned scoped sibling
|
|
267
|
+
// and one fixed private backup are allowed. Validate before removing roots.
|
|
268
|
+
if (!hoisted || plan.recoveryPackage !== join(dirname(plan.recordPath), 'recovery-package')) {
|
|
269
|
+
throw new Error('invalid hoisted package recovery');
|
|
270
|
+
}
|
|
271
|
+
const pkg = JSON.parse(await readFile(join(plan.recoveryPackage, 'package.json'), 'utf8'));
|
|
272
|
+
if (pkg.name !== '@wjarka/cezarion' || pkg.version !== plan.oldVersion
|
|
273
|
+
|| !existsSync(join(plan.recoveryPackage, 'dist/index.js')) || !existsSync(join(plan.recoveryPackage, 'web/dist/index.html'))) {
|
|
274
|
+
throw new Error('invalid hoisted package recovery');
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
if (installation.kind === 'npx') {
|
|
278
|
+
// Preserve the live concurrency.lock directory while restoring the rest of
|
|
279
|
+
// the npx root. Removing the root would compromise our own npm lock.
|
|
280
|
+
for (const name of await readdir(installation.installRoot)) {
|
|
281
|
+
await assertOwned();
|
|
282
|
+
if (name !== 'concurrency.lock')
|
|
283
|
+
await rm(join(installation.installRoot, name), { recursive: true, force: true });
|
|
284
|
+
}
|
|
285
|
+
for (const name of await readdir(plan.recovery)) {
|
|
286
|
+
await assertOwned();
|
|
287
|
+
if (name !== 'concurrency.lock')
|
|
288
|
+
await copy(join(plan.recovery, name), join(installation.installRoot, name));
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
const outer = installation.outerRoot;
|
|
293
|
+
await assertOwned();
|
|
294
|
+
await rm(outer, { recursive: true, force: true });
|
|
295
|
+
await assertOwned();
|
|
296
|
+
await copy(plan.recovery, outer);
|
|
297
|
+
if (hoisted) {
|
|
298
|
+
await assertOwned();
|
|
299
|
+
await rm(installation.packageRoot, { recursive: true, force: true });
|
|
300
|
+
await assertOwned();
|
|
301
|
+
await copy(plan.recoveryPackage, installation.packageRoot);
|
|
302
|
+
}
|
|
303
|
+
if (plan.binLinks) {
|
|
304
|
+
const outerManifest = JSON.parse(await readFile(join(plan.recovery, 'package.json'), 'utf8'));
|
|
305
|
+
await restoreGlobalBins(installation.prefix, Object.keys(outerManifest.bin ?? {}), windowsGlobalLayout(installation.prefix, installation.outerRoot, installation.outerPackage), plan.binLinks, assertOwned);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
await assertOwned();
|
|
309
|
+
validateOriginal(plan, plan.oldVersion);
|
|
310
|
+
}
|
|
311
|
+
export async function runHelper(plan, onArmed) {
|
|
312
|
+
restartHealthUrl(plan); // Reject an invalid destination before claiming or mutating the installation.
|
|
313
|
+
let replacement;
|
|
314
|
+
let transactionSignal;
|
|
315
|
+
const assertClaim = async () => {
|
|
316
|
+
const record = JSON.parse(await readFile(plan.recordPath, 'utf8'));
|
|
317
|
+
if (record?.state?.status !== 'restarting' || record.state.targetVersion !== plan.targetVersion || record.claimId !== plan.claimId) {
|
|
318
|
+
throw new Error('stale application update claim');
|
|
319
|
+
}
|
|
320
|
+
};
|
|
321
|
+
const io = {
|
|
322
|
+
waitForOldExit: () => waitExit(plan.oldPid, 20_000),
|
|
323
|
+
promote: () => promoteOriginal(plan, plan.installation.kind === 'npx', transactionSignal),
|
|
324
|
+
validateOriginal: async () => validateOriginal(plan, plan.targetVersion),
|
|
325
|
+
launch: async () => { replacement = launch(plan); },
|
|
326
|
+
verifyHealth: () => verifyHealth(plan, plan.targetVersion, replacement, transactionSignal),
|
|
327
|
+
reapReplacement: () => reap(replacement),
|
|
328
|
+
restore: () => restoreOriginal(plan, io.assertOwned),
|
|
329
|
+
launchPrevious: async () => { replacement = launch(plan); await verifyHealth(plan, plan.oldVersion, replacement, transactionSignal); },
|
|
330
|
+
reportSuccess: async () => {
|
|
331
|
+
await writeState(plan, { status: 'idle', supported: true });
|
|
332
|
+
// Keep the recovery copy until a later preparation has the lock. This
|
|
333
|
+
// avoids a crash gap between committing success and deleting recovery.
|
|
334
|
+
},
|
|
335
|
+
reportFailure: (rollbackFailed) => writeState(plan, {
|
|
336
|
+
status: 'error', supported: true, targetVersion: plan.targetVersion,
|
|
337
|
+
message: rollbackFailed ? 'Update and recovery failed. Reinstall cezarion manually.' : 'Update failed; previous release was restored. Retry Update.',
|
|
338
|
+
}, rollbackFailed ? manualRepairCommand(plan.installation, plan.oldVersion) : undefined),
|
|
339
|
+
};
|
|
340
|
+
await withDirectoryLock(join(dirname(plan.recordPath), 'operation.lock'), async (assertInstallationOwned, installationSignal) => {
|
|
341
|
+
const run = async (assertNpxOwned, npxSignal) => {
|
|
342
|
+
transactionSignal = npxSignal ? AbortSignal.any([installationSignal, npxSignal]) : installationSignal;
|
|
343
|
+
io.assertOwned = async () => {
|
|
344
|
+
await assertInstallationOwned();
|
|
345
|
+
await assertNpxOwned?.();
|
|
346
|
+
if (transactionSignal?.aborted)
|
|
347
|
+
throw new Error('update lock ownership changed');
|
|
348
|
+
await assertClaim();
|
|
349
|
+
};
|
|
350
|
+
await io.assertOwned();
|
|
351
|
+
const record = JSON.parse(await readFile(plan.recordPath, 'utf8'));
|
|
352
|
+
const ownerTemp = `${plan.recordPath}.${process.pid}.owner.tmp`;
|
|
353
|
+
await writeFile(ownerTemp, JSON.stringify({ ...record, ownerPid: process.pid }), { mode: 0o600 });
|
|
354
|
+
await io.assertOwned();
|
|
355
|
+
await rename(ownerTemp, plan.recordPath);
|
|
356
|
+
await io.assertOwned();
|
|
357
|
+
onArmed?.();
|
|
358
|
+
await runRestartWorkflow(io);
|
|
359
|
+
};
|
|
360
|
+
if (plan.installation.kind === 'npx') {
|
|
361
|
+
await withDirectoryLock(join(plan.installation.installRoot, 'concurrency.lock'), run, 30_000);
|
|
362
|
+
}
|
|
363
|
+
else
|
|
364
|
+
await run();
|
|
365
|
+
}, 30_000);
|
|
366
|
+
}
|
|
367
|
+
if (process.send && process.argv[2] === '--application-update-helper') {
|
|
368
|
+
process.once('message', (message) => {
|
|
369
|
+
const plan = message;
|
|
370
|
+
void runHelper(plan, () => process.send?.({ type: 'armed' }, () => process.disconnect?.()))
|
|
371
|
+
.catch(() => process.exit(1));
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
//# sourceMappingURL=helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helper.js","sourceRoot":"","sources":["../../src/application-update/helper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { RestartPlan } from './service.ts';
|
|
2
|
+
/** Copy the helper out of the package npm will replace; pass credentials only via inherited env. */
|
|
3
|
+
export declare function armRestartHelper(plan: RestartPlan, launch: {
|
|
4
|
+
repoRoot: string;
|
|
5
|
+
host: string;
|
|
6
|
+
port: number;
|
|
7
|
+
npmBin: string;
|
|
8
|
+
}): Promise<number>;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { copyFile, mkdir, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { assertCezarHomeWriteIsSandboxed } from '../paths.js';
|
|
6
|
+
/** Copy the helper out of the package npm will replace; pass credentials only via inherited env. */
|
|
7
|
+
export async function armRestartHelper(plan, launch) {
|
|
8
|
+
const source = dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
const target = join(dirname(plan.recordPath), 'helper');
|
|
10
|
+
assertCezarHomeWriteIsSandboxed(target);
|
|
11
|
+
await mkdir(target, { recursive: true, mode: 0o700 });
|
|
12
|
+
await copyFile(join(source, 'helper.js'), join(target, 'helper.js'));
|
|
13
|
+
await copyFile(join(source, 'lock.js'), join(target, 'lock.js'));
|
|
14
|
+
await copyFile(join(source, 'npm-process.js'), join(target, 'npm-process.js'));
|
|
15
|
+
await copyFile(join(source, 'bin-recovery.js'), join(target, 'bin-recovery.js'));
|
|
16
|
+
await writeFile(join(target, 'package.json'), '{"type":"module"}', { mode: 0o600 });
|
|
17
|
+
const child = spawn(process.execPath, [join(target, 'helper.js'), '--application-update-helper'], {
|
|
18
|
+
cwd: process.cwd(), env: process.env, detached: true, stdio: ['ignore', 'ignore', 'ignore', 'ipc'],
|
|
19
|
+
});
|
|
20
|
+
if (!child.pid)
|
|
21
|
+
throw new Error('restart helper did not start');
|
|
22
|
+
const message = {
|
|
23
|
+
...plan, oldPid: process.pid, nodeExecutable: process.execPath, nodeArgs: process.execArgv,
|
|
24
|
+
cliArgs: process.argv.slice(2), cwd: process.cwd(), repoRoot: launch.repoRoot,
|
|
25
|
+
host: launch.host, port: launch.port, npmBin: launch.npmBin,
|
|
26
|
+
};
|
|
27
|
+
await new Promise((resolve, reject) => {
|
|
28
|
+
let settled = false;
|
|
29
|
+
const fail = (error) => {
|
|
30
|
+
if (settled)
|
|
31
|
+
return;
|
|
32
|
+
settled = true;
|
|
33
|
+
clearTimeout(timer);
|
|
34
|
+
child.kill('SIGTERM');
|
|
35
|
+
reject(error);
|
|
36
|
+
};
|
|
37
|
+
const timer = setTimeout(() => fail(new Error('restart helper did not acknowledge')), 35_000);
|
|
38
|
+
child.once('error', (error) => fail(error));
|
|
39
|
+
child.once('exit', () => fail(new Error('restart helper exited before acknowledgement')));
|
|
40
|
+
child.on('message', (response) => {
|
|
41
|
+
if (response?.type !== 'armed' || settled)
|
|
42
|
+
return;
|
|
43
|
+
settled = true;
|
|
44
|
+
clearTimeout(timer);
|
|
45
|
+
child.unref();
|
|
46
|
+
resolve();
|
|
47
|
+
});
|
|
48
|
+
child.send(message, (error) => { if (error)
|
|
49
|
+
fail(error); });
|
|
50
|
+
});
|
|
51
|
+
return child.pid;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=launcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launcher.js","sourceRoot":"","sources":["../../src/application-update/launcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare class LockBusyError extends Error {
|
|
2
|
+
}
|
|
3
|
+
/** npm libnpmexec's concurrency.lock protocol: mkdir, 1s heartbeat, 60s stale mtime. */
|
|
4
|
+
export declare function withDirectoryLock<T>(path: string, operation: (assertOwned: () => Promise<void>, signal: AbortSignal) => Promise<T>, waitMs?: number): Promise<T>;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { mkdir, rmdir, stat, utimes } from 'node:fs/promises';
|
|
2
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
3
|
+
export class LockBusyError extends Error {
|
|
4
|
+
}
|
|
5
|
+
/** npm libnpmexec's concurrency.lock protocol: mkdir, 1s heartbeat, 60s stale mtime. */
|
|
6
|
+
export async function withDirectoryLock(path, operation, waitMs = 15_000) {
|
|
7
|
+
const started = Date.now();
|
|
8
|
+
while (true) {
|
|
9
|
+
if (Date.now() - started > waitMs)
|
|
10
|
+
throw new LockBusyError('update lock is busy; retry shortly');
|
|
11
|
+
try {
|
|
12
|
+
await mkdir(path);
|
|
13
|
+
break;
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
if (error.code !== 'EEXIST')
|
|
17
|
+
throw error;
|
|
18
|
+
const current = await stat(path).catch(() => undefined);
|
|
19
|
+
if (current && Date.now() - current.mtimeMs > 60_000) {
|
|
20
|
+
await rmdir(path).catch(() => undefined);
|
|
21
|
+
}
|
|
22
|
+
if (Date.now() - started > waitMs)
|
|
23
|
+
throw new LockBusyError('update lock is busy; retry shortly');
|
|
24
|
+
await sleep(Math.min(100, Math.max(1, waitMs - (Date.now() - started))));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const acquired = await stat(path);
|
|
28
|
+
const controller = new AbortController();
|
|
29
|
+
let expectedMtime = Math.round(acquired.mtimeMs / 1000);
|
|
30
|
+
let compromised = false;
|
|
31
|
+
const rawCheck = async () => {
|
|
32
|
+
if (compromised)
|
|
33
|
+
throw new Error('update lock ownership changed');
|
|
34
|
+
const current = await stat(path).catch(() => undefined);
|
|
35
|
+
if (!current || current.ino !== acquired.ino || Math.round(current.mtimeMs / 1000) !== expectedMtime) {
|
|
36
|
+
compromised = true;
|
|
37
|
+
controller.abort();
|
|
38
|
+
throw new Error('update lock ownership changed');
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
let heartbeat = Promise.resolve();
|
|
42
|
+
const assertOwned = async () => { await heartbeat; await rawCheck(); };
|
|
43
|
+
const timer = setInterval(() => {
|
|
44
|
+
heartbeat = heartbeat.then(async () => {
|
|
45
|
+
try {
|
|
46
|
+
await rawCheck();
|
|
47
|
+
const next = Math.round(Date.now() / 1000);
|
|
48
|
+
await utimes(path, next, next);
|
|
49
|
+
expectedMtime = next;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
compromised = true;
|
|
53
|
+
controller.abort();
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}, 1000);
|
|
57
|
+
timer.unref?.();
|
|
58
|
+
try {
|
|
59
|
+
const result = await operation(assertOwned, controller.signal);
|
|
60
|
+
await assertOwned();
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
clearInterval(timer);
|
|
65
|
+
await heartbeat;
|
|
66
|
+
if (!compromised)
|
|
67
|
+
await rmdir(path).catch(() => undefined);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.js","sourceRoot":"","sources":["../../src/application-update/lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface NpmInvocation {
|
|
2
|
+
command: string;
|
|
3
|
+
args: string[];
|
|
4
|
+
}
|
|
5
|
+
export declare function resolveNpmInvocation(command?: string, options?: {
|
|
6
|
+
nodeExecutable?: string;
|
|
7
|
+
platform?: NodeJS.Platform;
|
|
8
|
+
searchPath?: string;
|
|
9
|
+
}): NpmInvocation;
|
|
10
|
+
/** Discovery and both mutating phases use the exact same shell-free invocation. */
|
|
11
|
+
export declare function readNpmConfiguration(command?: string): {
|
|
12
|
+
npmBin: string;
|
|
13
|
+
prefix: string;
|
|
14
|
+
cache: string;
|
|
15
|
+
} | undefined;
|
|
16
|
+
/** A lock abort is complete only after the npm process has actually exited. */
|
|
17
|
+
export declare function runOwnedNpm(command: string, args: string[], env: NodeJS.ProcessEnv, signal?: AbortSignal): Promise<void>;
|