pi-amq 0.1.1
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/CHANGELOG.md +66 -0
- package/LICENSE +21 -0
- package/README.md +92 -0
- package/THIRD_PARTY_NOTICES.md +33 -0
- package/dist/extension/guidance.d.ts +25 -0
- package/dist/extension/guidance.d.ts.map +1 -0
- package/dist/extension/guidance.js +121 -0
- package/dist/extension/guidance.js.map +1 -0
- package/dist/extension/guide.d.ts +30 -0
- package/dist/extension/guide.d.ts.map +1 -0
- package/dist/extension/guide.js +128 -0
- package/dist/extension/guide.js.map +1 -0
- package/dist/extension/index.d.ts +4 -0
- package/dist/extension/index.d.ts.map +1 -0
- package/dist/extension/index.js +6 -0
- package/dist/extension/index.js.map +1 -0
- package/dist/extension/runtime.d.ts +48 -0
- package/dist/extension/runtime.d.ts.map +1 -0
- package/dist/extension/runtime.js +1095 -0
- package/dist/extension/runtime.js.map +1 -0
- package/dist/extension/tools.d.ts +12 -0
- package/dist/extension/tools.d.ts.map +1 -0
- package/dist/extension/tools.js +198 -0
- package/dist/extension/tools.js.map +1 -0
- package/dist/extension/worker-runtime.d.ts +34 -0
- package/dist/extension/worker-runtime.d.ts.map +1 -0
- package/dist/extension/worker-runtime.js +974 -0
- package/dist/extension/worker-runtime.js.map +1 -0
- package/dist/extension/worker-tools.d.ts +140 -0
- package/dist/extension/worker-tools.d.ts.map +1 -0
- package/dist/extension/worker-tools.js +217 -0
- package/dist/extension/worker-tools.js.map +1 -0
- package/dist/integration/confirmed-bind-onboarding.d.ts +44 -0
- package/dist/integration/confirmed-bind-onboarding.d.ts.map +1 -0
- package/dist/integration/confirmed-bind-onboarding.js +199 -0
- package/dist/integration/confirmed-bind-onboarding.js.map +1 -0
- package/dist/integration/fleet-view.d.ts +66 -0
- package/dist/integration/fleet-view.d.ts.map +1 -0
- package/dist/integration/fleet-view.js +238 -0
- package/dist/integration/fleet-view.js.map +1 -0
- package/dist/integration/fresh-session-dispatcher.d.ts +66 -0
- package/dist/integration/fresh-session-dispatcher.d.ts.map +1 -0
- package/dist/integration/fresh-session-dispatcher.js +103 -0
- package/dist/integration/fresh-session-dispatcher.js.map +1 -0
- package/dist/integration/launch-preview.d.ts +31 -0
- package/dist/integration/launch-preview.d.ts.map +1 -0
- package/dist/integration/launch-preview.js +325 -0
- package/dist/integration/launch-preview.js.map +1 -0
- package/dist/integration/transport-port.d.ts +39 -0
- package/dist/integration/transport-port.d.ts.map +1 -0
- package/dist/integration/transport-port.js +2 -0
- package/dist/integration/transport-port.js.map +1 -0
- package/dist/integration/worker-completion-notifier.d.ts +22 -0
- package/dist/integration/worker-completion-notifier.d.ts.map +1 -0
- package/dist/integration/worker-completion-notifier.js +81 -0
- package/dist/integration/worker-completion-notifier.js.map +1 -0
- package/dist/transport/amq-cli-adapter.d.ts +41 -0
- package/dist/transport/amq-cli-adapter.d.ts.map +1 -0
- package/dist/transport/amq-cli-adapter.js +291 -0
- package/dist/transport/amq-cli-adapter.js.map +1 -0
- package/dist/transport/amq-message.d.ts +47 -0
- package/dist/transport/amq-message.d.ts.map +1 -0
- package/dist/transport/amq-message.js +173 -0
- package/dist/transport/amq-message.js.map +1 -0
- package/dist/transport/amq-operations.d.ts +105 -0
- package/dist/transport/amq-operations.d.ts.map +1 -0
- package/dist/transport/amq-operations.js +320 -0
- package/dist/transport/amq-operations.js.map +1 -0
- package/dist/transport/atomic-json.d.ts +18 -0
- package/dist/transport/atomic-json.d.ts.map +1 -0
- package/dist/transport/atomic-json.js +90 -0
- package/dist/transport/atomic-json.js.map +1 -0
- package/dist/transport/binding-resolver.d.ts +46 -0
- package/dist/transport/binding-resolver.d.ts.map +1 -0
- package/dist/transport/binding-resolver.js +389 -0
- package/dist/transport/binding-resolver.js.map +1 -0
- package/dist/transport/bridge-journal.d.ts +100 -0
- package/dist/transport/bridge-journal.d.ts.map +1 -0
- package/dist/transport/bridge-journal.js +459 -0
- package/dist/transport/bridge-journal.js.map +1 -0
- package/dist/transport/dlq-retry-audit.d.ts +28 -0
- package/dist/transport/dlq-retry-audit.d.ts.map +1 -0
- package/dist/transport/dlq-retry-audit.js +66 -0
- package/dist/transport/dlq-retry-audit.js.map +1 -0
- package/dist/transport/inbox-pump.d.ts +81 -0
- package/dist/transport/inbox-pump.d.ts.map +1 -0
- package/dist/transport/inbox-pump.js +558 -0
- package/dist/transport/inbox-pump.js.map +1 -0
- package/dist/transport/index.d.ts +12 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +12 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/transport/presence-projector.d.ts +29 -0
- package/dist/transport/presence-projector.d.ts.map +1 -0
- package/dist/transport/presence-projector.js +73 -0
- package/dist/transport/presence-projector.js.map +1 -0
- package/dist/transport/priority-delivery-scheduler.d.ts +85 -0
- package/dist/transport/priority-delivery-scheduler.d.ts.map +1 -0
- package/dist/transport/priority-delivery-scheduler.js +210 -0
- package/dist/transport/priority-delivery-scheduler.js.map +1 -0
- package/dist/transport/receiver-lease.d.ts +102 -0
- package/dist/transport/receiver-lease.d.ts.map +1 -0
- package/dist/transport/receiver-lease.js +778 -0
- package/dist/transport/receiver-lease.js.map +1 -0
- package/dist/transport/runtime-status.d.ts +48 -0
- package/dist/transport/runtime-status.d.ts.map +1 -0
- package/dist/transport/runtime-status.js +71 -0
- package/dist/transport/runtime-status.js.map +1 -0
- package/dist/workflow/atomic-storage.d.ts +12 -0
- package/dist/workflow/atomic-storage.d.ts.map +1 -0
- package/dist/workflow/atomic-storage.js +104 -0
- package/dist/workflow/atomic-storage.js.map +1 -0
- package/dist/workflow/budget.d.ts +18 -0
- package/dist/workflow/budget.d.ts.map +1 -0
- package/dist/workflow/budget.js +74 -0
- package/dist/workflow/budget.js.map +1 -0
- package/dist/workflow/index.d.ts +17 -0
- package/dist/workflow/index.d.ts.map +1 -0
- package/dist/workflow/index.js +17 -0
- package/dist/workflow/index.js.map +1 -0
- package/dist/workflow/lifecycle-projection.d.ts +18 -0
- package/dist/workflow/lifecycle-projection.d.ts.map +1 -0
- package/dist/workflow/lifecycle-projection.js +22 -0
- package/dist/workflow/lifecycle-projection.js.map +1 -0
- package/dist/workflow/model-fallback.d.ts +2 -0
- package/dist/workflow/model-fallback.d.ts.map +1 -0
- package/dist/workflow/model-fallback.js +17 -0
- package/dist/workflow/model-fallback.js.map +1 -0
- package/dist/workflow/pi-session-fork.d.ts +18 -0
- package/dist/workflow/pi-session-fork.d.ts.map +1 -0
- package/dist/workflow/pi-session-fork.js +80 -0
- package/dist/workflow/pi-session-fork.js.map +1 -0
- package/dist/workflow/run-artifacts.d.ts +5 -0
- package/dist/workflow/run-artifacts.d.ts.map +1 -0
- package/dist/workflow/run-artifacts.js +25 -0
- package/dist/workflow/run-artifacts.js.map +1 -0
- package/dist/workflow/run-cleanup.d.ts +70 -0
- package/dist/workflow/run-cleanup.d.ts.map +1 -0
- package/dist/workflow/run-cleanup.js +222 -0
- package/dist/workflow/run-cleanup.js.map +1 -0
- package/dist/workflow/run-gate.d.ts +43 -0
- package/dist/workflow/run-gate.d.ts.map +1 -0
- package/dist/workflow/run-gate.js +70 -0
- package/dist/workflow/run-gate.js.map +1 -0
- package/dist/workflow/run-store.d.ts +208 -0
- package/dist/workflow/run-store.d.ts.map +1 -0
- package/dist/workflow/run-store.js +2965 -0
- package/dist/workflow/run-store.js.map +1 -0
- package/dist/workflow/spawn-confirmation.d.ts +44 -0
- package/dist/workflow/spawn-confirmation.d.ts.map +1 -0
- package/dist/workflow/spawn-confirmation.js +228 -0
- package/dist/workflow/spawn-confirmation.js.map +1 -0
- package/dist/workflow/system-process-inspector.d.ts +9 -0
- package/dist/workflow/system-process-inspector.d.ts.map +1 -0
- package/dist/workflow/system-process-inspector.js +129 -0
- package/dist/workflow/system-process-inspector.js.map +1 -0
- package/dist/workflow/worker-child-extension.d.ts +3 -0
- package/dist/workflow/worker-child-extension.d.ts.map +1 -0
- package/dist/workflow/worker-child-extension.js +182 -0
- package/dist/workflow/worker-child-extension.js.map +1 -0
- package/dist/workflow/worker-gate.d.ts +74 -0
- package/dist/workflow/worker-gate.d.ts.map +1 -0
- package/dist/workflow/worker-gate.js +165 -0
- package/dist/workflow/worker-gate.js.map +1 -0
- package/dist/workflow/worker-launch.d.ts +65 -0
- package/dist/workflow/worker-launch.d.ts.map +1 -0
- package/dist/workflow/worker-launch.js +338 -0
- package/dist/workflow/worker-launch.js.map +1 -0
- package/dist/workflow/worker-model-catalog.d.ts +36 -0
- package/dist/workflow/worker-model-catalog.d.ts.map +1 -0
- package/dist/workflow/worker-model-catalog.js +105 -0
- package/dist/workflow/worker-model-catalog.js.map +1 -0
- package/dist/workflow/worker-process-supervisor.d.ts +110 -0
- package/dist/workflow/worker-process-supervisor.d.ts.map +1 -0
- package/dist/workflow/worker-process-supervisor.js +1188 -0
- package/dist/workflow/worker-process-supervisor.js.map +1 -0
- package/dist/workflow/worker-prompt-capsule.d.ts +32 -0
- package/dist/workflow/worker-prompt-capsule.d.ts.map +1 -0
- package/dist/workflow/worker-prompt-capsule.js +52 -0
- package/dist/workflow/worker-prompt-capsule.js.map +1 -0
- package/dist/workflow/worker-role-presets.d.ts +38 -0
- package/dist/workflow/worker-role-presets.d.ts.map +1 -0
- package/dist/workflow/worker-role-presets.js +201 -0
- package/dist/workflow/worker-role-presets.js.map +1 -0
- package/dist/workflow/workflow-doctor.d.ts +57 -0
- package/dist/workflow/workflow-doctor.d.ts.map +1 -0
- package/dist/workflow/workflow-doctor.js +289 -0
- package/dist/workflow/workflow-doctor.js.map +1 -0
- package/dist/workflow/workflow-lease.d.ts +125 -0
- package/dist/workflow/workflow-lease.d.ts.map +1 -0
- package/dist/workflow/workflow-lease.js +689 -0
- package/dist/workflow/workflow-lease.js.map +1 -0
- package/dist/workflow/workflow-types.d.ts +335 -0
- package/dist/workflow/workflow-types.d.ts.map +1 -0
- package/dist/workflow/workflow-types.js +11 -0
- package/dist/workflow/workflow-types.js.map +1 -0
- package/dist/workflow/workspace-paths.d.ts +4 -0
- package/dist/workflow/workspace-paths.d.ts.map +1 -0
- package/dist/workflow/workspace-paths.js +22 -0
- package/dist/workflow/workspace-paths.js.map +1 -0
- package/docs/conformance.md +116 -0
- package/docs/demo-transcript.md +34 -0
- package/docs/design.md +1481 -0
- package/docs/operator-guide.md +100 -0
- package/extension/guidance.ts +162 -0
- package/extension/guide.ts +155 -0
- package/extension/index.ts +8 -0
- package/extension/runtime.ts +1224 -0
- package/extension/tools.ts +221 -0
- package/extension/worker-runtime.ts +1150 -0
- package/extension/worker-tools.ts +276 -0
- package/integration/confirmed-bind-onboarding.ts +296 -0
- package/integration/fleet-view.ts +286 -0
- package/integration/fresh-session-dispatcher.ts +166 -0
- package/integration/launch-preview.ts +396 -0
- package/integration/transport-port.ts +29 -0
- package/integration/worker-completion-notifier.ts +98 -0
- package/package.json +55 -0
- package/roles/oracle.md +9 -0
- package/roles/researcher.md +8 -0
- package/roles/reviewer.md +9 -0
- package/roles/scout.md +8 -0
- package/roles/worker.md +10 -0
- package/scripts/demo-two-terminal.sh +59 -0
- package/skills/coordination-patterns/SKILL.md +41 -0
- package/skills/coordination-patterns/references/supervised-worker-fan-out.md +12 -0
- package/skills/coordination-patterns/references/today-mail-team.md +36 -0
- package/transport/amq-cli-adapter.ts +381 -0
- package/transport/amq-message.ts +218 -0
- package/transport/amq-operations.ts +482 -0
- package/transport/atomic-json.ts +115 -0
- package/transport/binding-resolver.ts +565 -0
- package/transport/bridge-journal.ts +588 -0
- package/transport/dlq-retry-audit.ts +97 -0
- package/transport/inbox-pump.ts +729 -0
- package/transport/index.ts +11 -0
- package/transport/presence-projector.ts +104 -0
- package/transport/priority-delivery-scheduler.ts +328 -0
- package/transport/receiver-lease.ts +945 -0
- package/transport/runtime-status.ts +112 -0
- package/workflow/.gitkeep +1 -0
- package/workflow/atomic-storage.ts +120 -0
- package/workflow/budget.ts +90 -0
- package/workflow/index.ts +16 -0
- package/workflow/lifecycle-projection.ts +37 -0
- package/workflow/model-fallback.ts +17 -0
- package/workflow/pi-session-fork.ts +96 -0
- package/workflow/run-artifacts.ts +36 -0
- package/workflow/run-cleanup.ts +315 -0
- package/workflow/run-gate.ts +122 -0
- package/workflow/run-store.ts +3890 -0
- package/workflow/spawn-confirmation.ts +305 -0
- package/workflow/system-process-inspector.ts +142 -0
- package/workflow/worker-child-extension.ts +193 -0
- package/workflow/worker-gate.ts +238 -0
- package/workflow/worker-launch.ts +485 -0
- package/workflow/worker-model-catalog.ts +165 -0
- package/workflow/worker-process-supervisor.ts +1504 -0
- package/workflow/worker-prompt-capsule.ts +81 -0
- package/workflow/worker-role-presets.ts +241 -0
- package/workflow/workflow-doctor.ts +400 -0
- package/workflow/workflow-lease.ts +905 -0
- package/workflow/workflow-types.ts +367 -0
- package/workflow/workspace-paths.ts +32 -0
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
import { lstat, readdir } from "node:fs/promises";
|
|
2
|
+
import { basename, isAbsolute, join, normalize } from "node:path";
|
|
3
|
+
export class WorkflowDoctor {
|
|
4
|
+
#namespaceDirectory;
|
|
5
|
+
#runs;
|
|
6
|
+
#leases;
|
|
7
|
+
#inspector;
|
|
8
|
+
#now;
|
|
9
|
+
constructor(options) {
|
|
10
|
+
if (!isAbsolute(options.namespaceDirectory)) {
|
|
11
|
+
throw new TypeError("Workflow doctor namespace must be absolute");
|
|
12
|
+
}
|
|
13
|
+
this.#namespaceDirectory = normalize(options.namespaceDirectory);
|
|
14
|
+
this.#runs = options.runs;
|
|
15
|
+
this.#leases = options.leases;
|
|
16
|
+
this.#inspector = options.inspector;
|
|
17
|
+
this.#now = options.now ?? (() => new Date());
|
|
18
|
+
}
|
|
19
|
+
async inspect() {
|
|
20
|
+
const records = await this.#runs.diagnoseRunRecords();
|
|
21
|
+
const healthy = records.filter((record) => record.kind === "healthy");
|
|
22
|
+
const findings = [];
|
|
23
|
+
const orphanProcessIds = new Set();
|
|
24
|
+
for (const record of records) {
|
|
25
|
+
if (record.kind !== "corrupt")
|
|
26
|
+
continue;
|
|
27
|
+
findings.push({
|
|
28
|
+
severity: "error",
|
|
29
|
+
code: "corrupt-run-record",
|
|
30
|
+
message: record.diagnostic,
|
|
31
|
+
paths: [record.directory],
|
|
32
|
+
commands: [quarantineCommand(this.#namespaceDirectory, "run-record", record.directory)],
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
const attempts = healthy.flatMap((record) => attemptsIn(record.projection));
|
|
36
|
+
let workerProcessesChecked = 0;
|
|
37
|
+
for (const reference of attempts) {
|
|
38
|
+
const pid = reference.attempt.pidStartEvidence.pid;
|
|
39
|
+
if (pid === null)
|
|
40
|
+
continue;
|
|
41
|
+
workerProcessesChecked += 1;
|
|
42
|
+
const inspection = await this.#inspector.inspect(pid);
|
|
43
|
+
const matches = inspection.kind === "live"
|
|
44
|
+
&& processIdentityMatchesAttempt(inspection.identity, reference.attempt);
|
|
45
|
+
if (matches && reference.attempt.pidStartEvidence.observedExitAt !== null) {
|
|
46
|
+
orphanProcessIds.add(pid);
|
|
47
|
+
findings.push(orphanProcessFinding(pid, reference.attempt.session.path, `Process ${pid} still matches terminal ledger attempt ${reference.attempt.attemptId}`));
|
|
48
|
+
}
|
|
49
|
+
else if (!matches && reference.attempt.pidStartEvidence.observedExitAt === null) {
|
|
50
|
+
findings.push({
|
|
51
|
+
severity: "warning",
|
|
52
|
+
code: "ledger-process-missing",
|
|
53
|
+
message: processMismatchDiagnostic(pid, inspection, reference.attempt),
|
|
54
|
+
paths: [reference.attempt.session.path],
|
|
55
|
+
commands: [inspectProcessCommand(pid)],
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
let currentIdentity;
|
|
60
|
+
try {
|
|
61
|
+
currentIdentity = await this.#inspector.current();
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// Individual records stay visible as abandoned/unverifiable below.
|
|
65
|
+
}
|
|
66
|
+
const leaseRecords = await this.#leases.diagnoseWorkerSessionLeases();
|
|
67
|
+
for (const record of leaseRecords) {
|
|
68
|
+
if (record.projection.kind === "empty")
|
|
69
|
+
continue;
|
|
70
|
+
if (record.projection.kind === "corrupt") {
|
|
71
|
+
findings.push({
|
|
72
|
+
severity: "error",
|
|
73
|
+
code: "corrupt-session-lease",
|
|
74
|
+
message: record.projection.diagnostic,
|
|
75
|
+
paths: [record.path],
|
|
76
|
+
commands: [quarantineCommand(this.#namespaceDirectory, "session-lease", record.path)],
|
|
77
|
+
});
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
const owner = record.projection.owner;
|
|
81
|
+
const reference = attempts.find((candidate) => leaseOwnerReferences(owner, candidate));
|
|
82
|
+
const inspection = await inspectLeaseOwner(owner, currentIdentity, this.#inspector);
|
|
83
|
+
const live = inspection.kind === "live" && processIdentityMatchesOwner(inspection.identity, owner);
|
|
84
|
+
if (live && (reference === undefined || !leaseOwnerConsistentWithLedger(owner, reference))) {
|
|
85
|
+
if (!orphanProcessIds.has(owner.pid)) {
|
|
86
|
+
orphanProcessIds.add(owner.pid);
|
|
87
|
+
findings.push(orphanProcessFinding(owner.pid, record.path, reference === undefined
|
|
88
|
+
? `Live lease process ${owner.pid} has no matching readable ledger attempt`
|
|
89
|
+
: `Live lease process ${owner.pid} conflicts with ledger attempt ${reference.attempt.attemptId}`));
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
else if (!live && inspection.kind !== "unknown") {
|
|
93
|
+
findings.push({
|
|
94
|
+
severity: "warning",
|
|
95
|
+
code: "stale-session-lease",
|
|
96
|
+
message: leaseMismatchDiagnostic(owner, inspection),
|
|
97
|
+
paths: [record.path, ...(owner.sessionPath ? [owner.sessionPath] : [])],
|
|
98
|
+
commands: [quarantineCommand(this.#namespaceDirectory, "session-lease", record.path)],
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
else if (inspection.kind === "unknown") {
|
|
102
|
+
findings.push({
|
|
103
|
+
severity: "warning",
|
|
104
|
+
code: "abandoned-session-lease",
|
|
105
|
+
message: inspection.diagnostic,
|
|
106
|
+
paths: [record.path, ...(owner.sessionPath ? [owner.sessionPath] : [])],
|
|
107
|
+
commands: [inspectProcessCommand(owner.pid)],
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
const referencedSessions = new Set(attempts.map((reference) => normalize(reference.attempt.session.path)));
|
|
112
|
+
for (const path of await sessionDirectories(this.#namespaceDirectory)) {
|
|
113
|
+
if (referencedSessions.has(path))
|
|
114
|
+
continue;
|
|
115
|
+
findings.push({
|
|
116
|
+
severity: "warning",
|
|
117
|
+
code: "dangling-session",
|
|
118
|
+
message: records.some((record) => record.kind === "corrupt")
|
|
119
|
+
? "Session is not referenced by a readable run; corrupt run records make ownership uncertain"
|
|
120
|
+
: "Session is not referenced by any workflow run",
|
|
121
|
+
paths: [path],
|
|
122
|
+
commands: [quarantineCommand(this.#namespaceDirectory, "session", path)],
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
findings.sort((left, right) => left.code.localeCompare(right.code) || left.paths[0].localeCompare(right.paths[0]));
|
|
126
|
+
const byArea = await topLevelDiskUsage(this.#namespaceDirectory);
|
|
127
|
+
return {
|
|
128
|
+
schema: 1,
|
|
129
|
+
checkedAt: this.#now().toISOString(),
|
|
130
|
+
status: findings.length === 0 ? "ok" : "attention",
|
|
131
|
+
summary: {
|
|
132
|
+
healthyRuns: healthy.length,
|
|
133
|
+
corruptRuns: records.length - healthy.length,
|
|
134
|
+
workerProcessesChecked,
|
|
135
|
+
orphanProcesses: orphanProcessIds.size,
|
|
136
|
+
staleOrAbandonedLeases: findings.filter((finding) => finding.code === "stale-session-lease"
|
|
137
|
+
|| finding.code === "abandoned-session-lease"
|
|
138
|
+
|| finding.code === "corrupt-session-lease").length,
|
|
139
|
+
danglingSessions: findings.filter((finding) => finding.code === "dangling-session").length,
|
|
140
|
+
},
|
|
141
|
+
diskUsage: {
|
|
142
|
+
totalBytes: byArea.reduce((sum, area) => sum + area.bytes, 0),
|
|
143
|
+
byArea,
|
|
144
|
+
},
|
|
145
|
+
findings,
|
|
146
|
+
suggestedCommands: [{
|
|
147
|
+
kind: "pi",
|
|
148
|
+
argv: ["/pi-amq-cleanup", "--older-than", "7d"],
|
|
149
|
+
purpose: "Preview explicit cleanup of old terminal workflow state",
|
|
150
|
+
}],
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
function attemptsIn(run) {
|
|
155
|
+
return Object.values(run.workers).flatMap((worker) => worker.attempts.map((attempt) => ({ run, worker, attempt })));
|
|
156
|
+
}
|
|
157
|
+
function leaseOwnerReferences(owner, reference) {
|
|
158
|
+
return owner.runId === reference.run.runId
|
|
159
|
+
&& owner.workerId === reference.worker.workerId
|
|
160
|
+
&& owner.attemptId === reference.attempt.attemptId
|
|
161
|
+
&& owner.workerAttemptGeneration === reference.attempt.workerAttemptGeneration
|
|
162
|
+
&& owner.sessionPath === reference.attempt.session.path;
|
|
163
|
+
}
|
|
164
|
+
function leaseOwnerConsistentWithLedger(owner, reference) {
|
|
165
|
+
if (owner.stage === "reserved") {
|
|
166
|
+
return reference.attempt.state === "pending"
|
|
167
|
+
&& reference.attempt.pidStartEvidence.pid === null
|
|
168
|
+
&& reference.attempt.session.leaseGeneration === null;
|
|
169
|
+
}
|
|
170
|
+
return reference.attempt.pidStartEvidence.observedExitAt === null
|
|
171
|
+
&& reference.attempt.session.leaseGeneration === owner.generation
|
|
172
|
+
&& processIdentityMatchesAttempt({
|
|
173
|
+
pid: owner.pid,
|
|
174
|
+
processStartIdentity: owner.processStartIdentity,
|
|
175
|
+
bootIdentity: owner.bootIdentity,
|
|
176
|
+
executable: owner.executable,
|
|
177
|
+
hostname: owner.hostname,
|
|
178
|
+
}, reference.attempt);
|
|
179
|
+
}
|
|
180
|
+
async function inspectLeaseOwner(owner, current, inspector) {
|
|
181
|
+
if (!current)
|
|
182
|
+
return { kind: "unknown", diagnostic: "Current process identity is unavailable" };
|
|
183
|
+
if (owner.hostname !== current.hostname) {
|
|
184
|
+
return { kind: "unknown", diagnostic: `Lease belongs to remote host ${owner.hostname}` };
|
|
185
|
+
}
|
|
186
|
+
return inspector.inspect(owner.pid);
|
|
187
|
+
}
|
|
188
|
+
function processIdentityMatchesAttempt(identity, attempt) {
|
|
189
|
+
const recorded = attempt.pidStartEvidence;
|
|
190
|
+
return identity.pid === recorded.pid
|
|
191
|
+
&& identity.processStartIdentity === recorded.processStartIdentity
|
|
192
|
+
&& identity.bootIdentity === recorded.bootIdentity
|
|
193
|
+
&& identity.executable === recorded.executable
|
|
194
|
+
&& identity.hostname === recorded.hostname;
|
|
195
|
+
}
|
|
196
|
+
function processIdentityMatchesOwner(identity, owner) {
|
|
197
|
+
return identity.pid === owner.pid
|
|
198
|
+
&& identity.processStartIdentity === owner.processStartIdentity
|
|
199
|
+
&& identity.bootIdentity === owner.bootIdentity
|
|
200
|
+
&& identity.executable === owner.executable
|
|
201
|
+
&& identity.hostname === owner.hostname;
|
|
202
|
+
}
|
|
203
|
+
function processMismatchDiagnostic(pid, inspection, attempt) {
|
|
204
|
+
if (inspection.kind === "absent")
|
|
205
|
+
return `Ledger attempt ${attempt.attemptId} has no process ${pid}`;
|
|
206
|
+
if (inspection.kind === "unknown") {
|
|
207
|
+
return `Ledger attempt ${attempt.attemptId} process ${pid} is unverifiable: ${inspection.diagnostic}`;
|
|
208
|
+
}
|
|
209
|
+
return `Ledger attempt ${attempt.attemptId} PID ${pid} now has different process identity`;
|
|
210
|
+
}
|
|
211
|
+
function leaseMismatchDiagnostic(owner, inspection) {
|
|
212
|
+
return inspection.kind === "absent"
|
|
213
|
+
? `Lease owner process ${owner.pid} is absent`
|
|
214
|
+
: `Lease owner PID ${owner.pid} now has different process identity`;
|
|
215
|
+
}
|
|
216
|
+
function orphanProcessFinding(pid, path, message) {
|
|
217
|
+
return {
|
|
218
|
+
severity: "error",
|
|
219
|
+
code: "orphan-process",
|
|
220
|
+
message,
|
|
221
|
+
paths: [path],
|
|
222
|
+
commands: [inspectProcessCommand(pid)],
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
function inspectProcessCommand(pid) {
|
|
226
|
+
return {
|
|
227
|
+
kind: "exec",
|
|
228
|
+
argv: ["ps", "-p", String(pid), "-o", "pid=,lstart=,comm="],
|
|
229
|
+
purpose: "Re-inspect PID identity before any operator action",
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
function quarantineCommand(namespaceDirectory, prefix, path) {
|
|
233
|
+
return {
|
|
234
|
+
kind: "exec",
|
|
235
|
+
argv: ["mv", "--", path, join(namespaceDirectory, "quarantine", `doctor-${prefix}-${basename(path)}`)],
|
|
236
|
+
purpose: "Quarantine the record for manual recovery instead of deleting it",
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
async function sessionDirectories(namespaceDirectory) {
|
|
240
|
+
const parent = join(namespaceDirectory, "worker-sessions");
|
|
241
|
+
try {
|
|
242
|
+
return (await readdir(parent, { withFileTypes: true }))
|
|
243
|
+
.filter((entry) => !entry.name.startsWith("."))
|
|
244
|
+
.map((entry) => normalize(join(parent, entry.name)))
|
|
245
|
+
.sort();
|
|
246
|
+
}
|
|
247
|
+
catch (error) {
|
|
248
|
+
if (isNodeError(error) && error.code === "ENOENT")
|
|
249
|
+
return [];
|
|
250
|
+
throw error;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
async function topLevelDiskUsage(namespaceDirectory) {
|
|
254
|
+
let entries;
|
|
255
|
+
try {
|
|
256
|
+
entries = await readdir(namespaceDirectory);
|
|
257
|
+
}
|
|
258
|
+
catch (error) {
|
|
259
|
+
if (isNodeError(error) && error.code === "ENOENT")
|
|
260
|
+
return [];
|
|
261
|
+
throw error;
|
|
262
|
+
}
|
|
263
|
+
const areas = await Promise.all(entries.filter((entry) => !entry.startsWith(".")).sort().map(async (name) => {
|
|
264
|
+
const path = join(namespaceDirectory, name);
|
|
265
|
+
return { name, path, bytes: await pathBytes(path) };
|
|
266
|
+
}));
|
|
267
|
+
return areas;
|
|
268
|
+
}
|
|
269
|
+
async function pathBytes(path) {
|
|
270
|
+
let info;
|
|
271
|
+
try {
|
|
272
|
+
info = await lstat(path);
|
|
273
|
+
}
|
|
274
|
+
catch (error) {
|
|
275
|
+
if (isNodeError(error) && error.code === "ENOENT")
|
|
276
|
+
return 0;
|
|
277
|
+
throw error;
|
|
278
|
+
}
|
|
279
|
+
if (!info.isDirectory())
|
|
280
|
+
return info.size;
|
|
281
|
+
let total = info.size;
|
|
282
|
+
for (const entry of await readdir(path))
|
|
283
|
+
total += await pathBytes(join(path, entry));
|
|
284
|
+
return total;
|
|
285
|
+
}
|
|
286
|
+
function isNodeError(error) {
|
|
287
|
+
return error instanceof Error && "code" in error;
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=workflow-doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-doctor.js","sourceRoot":"","sources":["../../workflow/workflow-doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
export interface ProcessIdentity {
|
|
2
|
+
readonly pid: number;
|
|
3
|
+
readonly processStartIdentity: string;
|
|
4
|
+
readonly bootIdentity: string | null;
|
|
5
|
+
readonly executable: string;
|
|
6
|
+
readonly hostname: string;
|
|
7
|
+
}
|
|
8
|
+
export type ProcessInspection = {
|
|
9
|
+
readonly kind: "live";
|
|
10
|
+
readonly identity: ProcessIdentity;
|
|
11
|
+
} | {
|
|
12
|
+
readonly kind: "absent";
|
|
13
|
+
} | {
|
|
14
|
+
readonly kind: "unknown";
|
|
15
|
+
readonly diagnostic: string;
|
|
16
|
+
};
|
|
17
|
+
export interface ProcessIdentityInspector {
|
|
18
|
+
current(): Promise<ProcessIdentity>;
|
|
19
|
+
inspect(pid: number): Promise<ProcessInspection>;
|
|
20
|
+
}
|
|
21
|
+
export interface WorkflowLeaseOwnerV1 {
|
|
22
|
+
readonly schema: 1;
|
|
23
|
+
readonly kind: "supervisor" | "worker-session";
|
|
24
|
+
readonly stage: "active" | "reserved";
|
|
25
|
+
readonly generation: string;
|
|
26
|
+
readonly workspaceId: string;
|
|
27
|
+
readonly resourceId: string;
|
|
28
|
+
readonly runId: string | null;
|
|
29
|
+
readonly workerId: string | null;
|
|
30
|
+
readonly attemptId: string | null;
|
|
31
|
+
readonly workerAttemptGeneration: string | null;
|
|
32
|
+
readonly supervisorGeneration: string | null;
|
|
33
|
+
readonly sessionPath: string | null;
|
|
34
|
+
readonly pid: number;
|
|
35
|
+
readonly processStartIdentity: string;
|
|
36
|
+
readonly bootIdentity: string | null;
|
|
37
|
+
readonly executable: string;
|
|
38
|
+
readonly hostname: string;
|
|
39
|
+
readonly createdAt: string;
|
|
40
|
+
}
|
|
41
|
+
export interface WorkflowLeaseManagerOptions {
|
|
42
|
+
readonly namespaceDirectory: string;
|
|
43
|
+
readonly workspaceId: string;
|
|
44
|
+
readonly inspector: ProcessIdentityInspector;
|
|
45
|
+
readonly randomUUID?: () => string;
|
|
46
|
+
readonly now?: () => Date;
|
|
47
|
+
readonly guardWaitMs?: number;
|
|
48
|
+
}
|
|
49
|
+
export interface AcquireWorkerSessionInput {
|
|
50
|
+
readonly sessionPath: string;
|
|
51
|
+
readonly runId: string;
|
|
52
|
+
readonly workerId: string;
|
|
53
|
+
readonly attemptId: string;
|
|
54
|
+
readonly workerAttemptGeneration: string;
|
|
55
|
+
readonly supervisorGeneration: string;
|
|
56
|
+
readonly processIdentity: ProcessIdentity;
|
|
57
|
+
}
|
|
58
|
+
export type WorkflowLeaseRefusalReason = "remote-owner" | "unverifiable-owner" | "corrupt-owner" | "lifecycle-busy" | "lifecycle-unverifiable";
|
|
59
|
+
export type WorkflowLeaseAcquireResult = {
|
|
60
|
+
readonly kind: "acquired";
|
|
61
|
+
readonly owner: WorkflowLeaseOwnerV1;
|
|
62
|
+
readonly reclaimed?: {
|
|
63
|
+
readonly owner: WorkflowLeaseOwnerV1;
|
|
64
|
+
readonly quarantinePath: string;
|
|
65
|
+
};
|
|
66
|
+
} | {
|
|
67
|
+
readonly kind: "held";
|
|
68
|
+
readonly owner: WorkflowLeaseOwnerV1;
|
|
69
|
+
} | {
|
|
70
|
+
readonly kind: "refused";
|
|
71
|
+
readonly reason: WorkflowLeaseRefusalReason;
|
|
72
|
+
readonly diagnostic: string;
|
|
73
|
+
};
|
|
74
|
+
export type WorkflowLeaseReleaseResult = {
|
|
75
|
+
readonly kind: "released";
|
|
76
|
+
} | {
|
|
77
|
+
readonly kind: "not-owner";
|
|
78
|
+
readonly owner?: WorkflowLeaseOwnerV1;
|
|
79
|
+
} | {
|
|
80
|
+
readonly kind: "refused";
|
|
81
|
+
readonly diagnostic: string;
|
|
82
|
+
};
|
|
83
|
+
export type WorkflowLeaseProjection = {
|
|
84
|
+
readonly kind: "empty";
|
|
85
|
+
} | {
|
|
86
|
+
readonly kind: "owned";
|
|
87
|
+
readonly owner: WorkflowLeaseOwnerV1;
|
|
88
|
+
} | {
|
|
89
|
+
readonly kind: "corrupt";
|
|
90
|
+
readonly diagnostic: string;
|
|
91
|
+
};
|
|
92
|
+
export interface WorkerSessionLeaseDiagnostic {
|
|
93
|
+
readonly resourceId: string;
|
|
94
|
+
readonly path: string;
|
|
95
|
+
readonly projection: WorkflowLeaseProjection;
|
|
96
|
+
}
|
|
97
|
+
export declare class WorkflowLeaseFenceError extends Error {
|
|
98
|
+
constructor(message: string);
|
|
99
|
+
}
|
|
100
|
+
export declare class WorkflowLeaseManager {
|
|
101
|
+
#private;
|
|
102
|
+
constructor(options: WorkflowLeaseManagerOptions);
|
|
103
|
+
acquireSupervisor(): Promise<WorkflowLeaseAcquireResult>;
|
|
104
|
+
releaseSupervisor(generation: string): Promise<WorkflowLeaseReleaseResult>;
|
|
105
|
+
withCurrentSupervisor<T>(generation: string, operation: () => Promise<T>): Promise<T>;
|
|
106
|
+
inspectSupervisor(): Promise<WorkflowLeaseProjection>;
|
|
107
|
+
acquireWorkerSession(input: AcquireWorkerSessionInput): Promise<WorkflowLeaseAcquireResult>;
|
|
108
|
+
reserveWorkerSession(input: Omit<AcquireWorkerSessionInput, "processIdentity">): Promise<WorkflowLeaseAcquireResult>;
|
|
109
|
+
activateWorkerSession(input: {
|
|
110
|
+
readonly sessionPath: string;
|
|
111
|
+
readonly generation: string;
|
|
112
|
+
readonly supervisorGeneration: string;
|
|
113
|
+
readonly workerAttemptGeneration: string;
|
|
114
|
+
readonly processIdentity: ProcessIdentity;
|
|
115
|
+
}): Promise<WorkflowLeaseOwnerV1>;
|
|
116
|
+
releaseWorkerSession(input: {
|
|
117
|
+
readonly sessionPath: string;
|
|
118
|
+
readonly generation: string;
|
|
119
|
+
readonly supervisorGeneration: string;
|
|
120
|
+
}): Promise<WorkflowLeaseReleaseResult>;
|
|
121
|
+
inspectWorkerSession(sessionPath: string): Promise<WorkflowLeaseProjection>;
|
|
122
|
+
diagnoseWorkerSessionLeases(): Promise<readonly WorkerSessionLeaseDiagnostic[]>;
|
|
123
|
+
}
|
|
124
|
+
export declare function parseWorkflowLeaseOwnerV1(value: unknown): WorkflowLeaseOwnerV1;
|
|
125
|
+
//# sourceMappingURL=workflow-lease.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-lease.d.ts","sourceRoot":"","sources":["../../workflow/workflow-lease.ts"],"names":[],"mappings":"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"}
|