harnery 0.45.1 → 0.46.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commander.d.ts +13 -0
- package/dist/commander.d.ts.map +1 -1
- package/dist/commands/admission.d.ts.map +1 -1
- package/dist/commands/admission.js +214 -27
- package/dist/commands/agents.d.ts +4 -0
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +102 -25
- package/dist/commands/browse.d.ts +3 -0
- package/dist/commands/browse.d.ts.map +1 -1
- package/dist/commands/browse.js +172 -8
- package/dist/commands/fetch.js +1 -0
- package/dist/commands/ledger-v3.d.ts.map +1 -1
- package/dist/commands/ledger-v3.js +8 -2
- package/dist/commands/presence.d.ts.map +1 -1
- package/dist/commands/presence.js +40 -0
- package/dist/commands/qa-run.d.ts.map +1 -1
- package/dist/commands/qa-run.js +4 -3
- package/dist/commands/review-pack.d.ts.map +1 -1
- package/dist/commands/review-pack.js +33 -6
- package/dist/commands/workflow.d.ts.map +1 -1
- package/dist/commands/workflow.js +6 -45
- package/dist/core/agents/coord-client.d.ts.map +1 -1
- package/dist/core/agents/coord-client.js +0 -18
- package/dist/core/agents/index.d.ts +1 -0
- package/dist/core/agents/index.d.ts.map +1 -1
- package/dist/core/agents/index.js +1 -0
- package/dist/core/agents/live-authority-v3.d.ts.map +1 -1
- package/dist/core/agents/live-authority-v3.js +11 -4
- package/dist/core/agents/render/session-context.d.ts +0 -6
- package/dist/core/agents/render/session-context.d.ts.map +1 -1
- package/dist/core/agents/render/session-context.js +1 -6
- package/dist/core/agents/session-events.d.ts.map +1 -1
- package/dist/core/agents/session-events.js +12 -4
- package/dist/core/agents/state/heartbeat-reader.d.ts +3 -0
- package/dist/core/agents/state/heartbeat-reader.d.ts.map +1 -1
- package/dist/core/agents/state/live-coordination-view.d.ts +3 -1
- package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -1
- package/dist/core/agents/state/live-coordination-view.js +6 -2
- package/dist/core/agents/state/parent-reference-contract.d.ts +16 -0
- package/dist/core/agents/state/parent-reference-contract.d.ts.map +1 -0
- package/dist/core/agents/state/parent-reference-contract.js +1 -0
- package/dist/core/agents/state/parent-reference.d.ts +18 -0
- package/dist/core/agents/state/parent-reference.d.ts.map +1 -0
- package/dist/core/agents/state/parent-reference.js +119 -0
- package/dist/core/agents/state/pidmap.js +2 -2
- package/dist/core/agents/state/proc-start.d.ts +20 -31
- package/dist/core/agents/state/proc-start.d.ts.map +1 -1
- package/dist/core/agents/state/proc-start.js +37 -70
- package/dist/core/agents/state/service-process.d.ts +61 -0
- package/dist/core/agents/state/service-process.d.ts.map +1 -0
- package/dist/core/agents/state/service-process.js +143 -0
- package/dist/core/config.d.ts +39 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +63 -0
- package/dist/core/context/index.d.ts +6 -4
- package/dist/core/context/index.d.ts.map +1 -1
- package/dist/core/context/index.js +194 -256
- package/dist/core/context/observation.d.ts +9 -9
- package/dist/core/context/observation.d.ts.map +1 -1
- package/dist/core/context/observation.js +37 -6
- package/dist/core/diagnostics/path-identity.d.ts +1 -1
- package/dist/core/diagnostics/path-identity.d.ts.map +1 -1
- package/dist/core/diagnostics/path-identity.js +51 -6
- package/dist/core/events/v3/canonical.js +43 -14
- package/dist/core/events/v3/index.d.ts +1 -1
- package/dist/core/events/v3/index.d.ts.map +1 -1
- package/dist/core/events/v3/index.js +1 -1
- package/dist/core/events/v3/producers/recorder.d.ts +34 -0
- package/dist/core/events/v3/producers/recorder.d.ts.map +1 -1
- package/dist/core/events/v3/producers/recorder.js +117 -13
- package/dist/core/events/v3/reader.d.ts.map +1 -1
- package/dist/core/events/v3/reader.js +53 -13
- package/dist/core/events/v3/runtime-build.d.ts +14 -0
- package/dist/core/events/v3/runtime-build.d.ts.map +1 -1
- package/dist/core/events/v3/runtime-build.js +44 -0
- package/dist/core/events/v3/validate.d.ts.map +1 -1
- package/dist/core/events/v3/validate.js +36 -1
- package/dist/core/governor/index.d.ts +2 -1
- package/dist/core/governor/index.d.ts.map +1 -1
- package/dist/core/governor/index.js +2 -1
- package/dist/core/governor/service-read.d.ts +3 -10
- package/dist/core/governor/service-read.d.ts.map +1 -1
- package/dist/core/governor/service-read.js +10 -94
- package/dist/core/governor/service.d.ts +3 -7
- package/dist/core/governor/service.d.ts.map +1 -1
- package/dist/core/governor/service.js +17 -182
- package/dist/core/hooks/adapter/native-parent.d.ts +23 -0
- package/dist/core/hooks/adapter/native-parent.d.ts.map +1 -0
- package/dist/core/hooks/adapter/native-parent.js +91 -0
- package/dist/core/hooks/cli.js +79 -4
- package/dist/core/hooks/resolve/owner.d.ts +0 -11
- package/dist/core/hooks/resolve/owner.d.ts.map +1 -1
- package/dist/core/hooks/resolve/owner.js +2 -25
- package/dist/core/hooks/shell-admission.d.ts +84 -0
- package/dist/core/hooks/shell-admission.d.ts.map +1 -0
- package/dist/core/hooks/shell-admission.js +622 -0
- package/dist/core/hooks/shell-commit-tree.d.ts +2 -0
- package/dist/core/hooks/shell-commit-tree.d.ts.map +1 -0
- package/dist/core/hooks/shell-commit-tree.js +104 -0
- package/dist/core/inbox/contract.d.ts +12 -0
- package/dist/core/inbox/contract.d.ts.map +1 -1
- package/dist/core/inbox/contract.js +16 -0
- package/dist/core/inbox/peer-messages.d.ts +41 -16
- package/dist/core/inbox/peer-messages.d.ts.map +1 -1
- package/dist/core/inbox/peer-messages.js +372 -15
- package/dist/core/inbox/service.d.ts +8 -1
- package/dist/core/inbox/service.d.ts.map +1 -1
- package/dist/core/inbox/service.js +83 -3
- package/dist/core/inbox/targets.d.ts +17 -3
- package/dist/core/inbox/targets.d.ts.map +1 -1
- package/dist/core/inbox/targets.js +77 -2
- package/dist/core/presence/git.d.ts +18 -12
- package/dist/core/presence/git.d.ts.map +1 -1
- package/dist/core/presence/git.js +32 -38
- package/dist/core/presence/index.d.ts +2 -2
- package/dist/core/presence/index.d.ts.map +1 -1
- package/dist/core/presence/index.js +8 -6
- package/dist/core/presence/mail.d.ts +133 -0
- package/dist/core/presence/mail.d.ts.map +1 -0
- package/dist/core/presence/mail.js +464 -0
- package/dist/core/resources/sampler.js +2 -2
- package/dist/core/resources/service-status.d.ts +2 -14
- package/dist/core/resources/service-status.d.ts.map +1 -1
- package/dist/core/resources/service-status.js +3 -23
- package/dist/core/resources/service.d.ts +3 -7
- package/dist/core/resources/service.d.ts.map +1 -1
- package/dist/core/resources/service.js +12 -101
- package/dist/core/resources/status.d.ts.map +1 -1
- package/dist/core/resources/status.js +3 -2
- package/dist/core/semantic/contract.d.ts +5 -5
- package/dist/core/semantic/service.d.ts.map +1 -1
- package/dist/core/semantic/service.js +9 -2
- package/dist/core/servers/index.d.ts +0 -2
- package/dist/core/servers/index.d.ts.map +1 -1
- package/dist/core/servers/index.js +3 -18
- package/dist/core/storage/modes.d.ts +4 -0
- package/dist/core/storage/modes.d.ts.map +1 -1
- package/dist/core/storage/modes.js +4 -0
- package/dist/core/storage/segments.d.ts.map +1 -1
- package/dist/core/storage/segments.js +5 -4
- package/dist/core/supervisor/service.d.ts +4 -7
- package/dist/core/supervisor/service.d.ts.map +1 -1
- package/dist/core/supervisor/service.js +23 -122
- package/dist/core/supervisor/services.js +2 -2
- package/dist/core/supervisor/status.d.ts +3 -17
- package/dist/core/supervisor/status.d.ts.map +1 -1
- package/dist/core/supervisor/status.js +7 -70
- package/dist/core/workflow/engine.js +2 -1
- package/dist/core/workflow/index.d.ts +3 -4
- package/dist/core/workflow/index.d.ts.map +1 -1
- package/dist/core/workflow/index.js +2 -2
- package/dist/core/workflow/proof.d.ts.map +1 -1
- package/dist/core/workflow/proof.js +30 -74
- package/dist/core/workflow/resume-lock.d.ts +17 -0
- package/dist/core/workflow/resume-lock.d.ts.map +1 -0
- package/dist/core/workflow/resume-lock.js +158 -0
- package/dist/core/workflow/run-state.d.ts +0 -21
- package/dist/core/workflow/run-state.d.ts.map +1 -1
- package/dist/core/workflow/run-state.js +3 -174
- package/dist/core/workflow/workspaces/leases.d.ts +4 -0
- package/dist/core/workflow/workspaces/leases.d.ts.map +1 -1
- package/dist/core/workflow/workspaces/leases.js +1 -1
- package/dist/core/workflow/workspaces/local-git.js +91 -210
- package/dist/core/workflow/workspaces/ownership.d.ts +0 -7
- package/dist/core/workflow/workspaces/ownership.d.ts.map +1 -1
- package/dist/core/workflow/workspaces/ownership.js +3 -130
- package/dist/core/workflow/workspaces/reclaim.d.ts +4 -7
- package/dist/core/workflow/workspaces/reclaim.d.ts.map +1 -1
- package/dist/core/workflow/workspaces/reclaim.js +0 -4
- package/dist/core/workflow/workspaces/recovery.d.ts +1 -1
- package/dist/core/workflow/workspaces/recovery.d.ts.map +1 -1
- package/dist/core/workflow/workspaces/recovery.js +1 -1
- package/dist/core/workflow/workspaces/state.d.ts.map +1 -1
- package/dist/core/workflow/workspaces/state.js +1 -4
- package/dist/lib/admission-history.d.ts +96 -0
- package/dist/lib/admission-history.d.ts.map +1 -0
- package/dist/lib/admission-history.js +196 -0
- package/dist/lib/admission.d.ts +56 -7
- package/dist/lib/admission.d.ts.map +1 -1
- package/dist/lib/admission.js +161 -19
- package/dist/lib/browser/client.d.ts +18 -0
- package/dist/lib/browser/client.d.ts.map +1 -1
- package/dist/lib/browser/client.js +100 -12
- package/dist/lib/browser/content-checks.d.ts +3 -1
- package/dist/lib/browser/content-checks.d.ts.map +1 -1
- package/dist/lib/browser/content-checks.js +10 -2
- package/dist/lib/browser/critique.d.ts +32 -0
- package/dist/lib/browser/critique.d.ts.map +1 -1
- package/dist/lib/browser/critique.js +72 -3
- package/dist/lib/browser/geometry.d.ts +2 -0
- package/dist/lib/browser/geometry.d.ts.map +1 -1
- package/dist/lib/browser/geometry.js +61 -15
- package/dist/lib/browser/index.d.ts +1 -1
- package/dist/lib/browser/index.d.ts.map +1 -1
- package/dist/lib/browser/index.js +1 -1
- package/dist/lib/browser/page-review-contracts.d.ts +6 -1
- package/dist/lib/browser/page-review-contracts.d.ts.map +1 -1
- package/dist/lib/browser/page-review-contracts.js +6 -1
- package/dist/lib/browser/page-review-judge.d.ts +3 -1
- package/dist/lib/browser/page-review-judge.d.ts.map +1 -1
- package/dist/lib/browser/page-review-judge.js +41 -11
- package/dist/lib/browser/page-review-pack.d.ts +3 -0
- package/dist/lib/browser/page-review-pack.d.ts.map +1 -1
- package/dist/lib/browser/page-review-pack.js +5 -2
- package/dist/lib/browser/qa-run-contracts.d.ts +11 -0
- package/dist/lib/browser/qa-run-contracts.d.ts.map +1 -1
- package/dist/lib/browser/qa-run-contracts.js +11 -4
- package/dist/lib/browser/qa-run.d.ts.map +1 -1
- package/dist/lib/browser/qa-run.js +73 -16
- package/dist/lib/browser/runts.d.ts +4 -2
- package/dist/lib/browser/runts.d.ts.map +1 -1
- package/dist/lib/browser/runts.js +84 -33
- package/dist/lib/browser/windows-chrome.d.ts +14 -0
- package/dist/lib/browser/windows-chrome.d.ts.map +1 -1
- package/dist/lib/browser/windows-chrome.js +42 -0
- package/dist/lib/browser/windows-login-sync.d.ts +110 -0
- package/dist/lib/browser/windows-login-sync.d.ts.map +1 -0
- package/dist/lib/browser/windows-login-sync.js +171 -0
- package/dist/lib/cookies/client.d.ts +30 -5
- package/dist/lib/cookies/client.d.ts.map +1 -1
- package/dist/lib/cookies/client.js +55 -10
- package/dist/lib/cookies/index.d.ts +1 -1
- package/dist/lib/cookies/index.d.ts.map +1 -1
- package/dist/lib/cookies/index.js +1 -1
- package/dist/lib/docs-metadata-sync.d.ts.map +1 -1
- package/dist/lib/docs-metadata-sync.js +41 -2
- package/dist/lib/durable-job.d.ts +8 -0
- package/dist/lib/durable-job.d.ts.map +1 -1
- package/dist/lib/durable-job.js +10 -0
- package/dist/lib/http/client.d.ts +9 -8
- package/dist/lib/http/client.d.ts.map +1 -1
- package/dist/lib/http/client.js +44 -2
- package/dist/lib/instructions/templates.js +4 -4
- package/package.json +2 -2
- package/src/commander.ts +13 -0
- package/src/commands/admission.ts +272 -29
- package/src/commands/agents.ts +132 -27
- package/src/commands/browse.ts +208 -6
- package/src/commands/fetch.ts +1 -0
- package/src/commands/ledger-v3.ts +8 -2
- package/src/commands/presence.ts +49 -0
- package/src/commands/qa-run.ts +4 -3
- package/src/commands/review-pack.ts +41 -5
- package/src/commands/workflow.ts +8 -58
- package/src/core/agents/coord-client.ts +0 -20
- package/src/core/agents/index.ts +6 -0
- package/src/core/agents/live-authority-v3.ts +11 -4
- package/src/core/agents/render/session-context.ts +1 -7
- package/src/core/agents/session-events.ts +18 -3
- package/src/core/agents/state/heartbeat-reader.ts +3 -0
- package/src/core/agents/state/live-coordination-view.ts +13 -6
- package/src/core/agents/state/parent-reference-contract.ts +14 -0
- package/src/core/agents/state/parent-reference.ts +179 -0
- package/src/core/agents/state/pidmap.ts +2 -2
- package/src/core/agents/state/proc-start.ts +41 -69
- package/src/core/agents/state/service-process.ts +217 -0
- package/src/core/config.ts +85 -0
- package/src/core/context/index.ts +207 -272
- package/src/core/context/observation.ts +40 -9
- package/src/core/diagnostics/path-identity.ts +52 -6
- package/src/core/events/v3/canonical.ts +46 -13
- package/src/core/events/v3/index.ts +3 -0
- package/src/core/events/v3/producers/recorder.ts +151 -13
- package/src/core/events/v3/reader.ts +55 -11
- package/src/core/events/v3/runtime-build.ts +62 -0
- package/src/core/events/v3/validate.ts +42 -1
- package/src/core/governor/index.ts +1 -2
- package/src/core/governor/service-read.ts +15 -114
- package/src/core/governor/service.ts +36 -220
- package/src/core/hooks/adapter/native-parent.ts +109 -0
- package/src/core/hooks/cli.ts +83 -4
- package/src/core/hooks/resolve/owner.ts +2 -25
- package/src/core/hooks/shell-admission.ts +634 -0
- package/src/core/hooks/shell-commit-tree.ts +102 -0
- package/src/core/inbox/contract.ts +18 -0
- package/src/core/inbox/peer-messages.ts +501 -15
- package/src/core/inbox/service.ts +108 -3
- package/src/core/inbox/targets.ts +94 -3
- package/src/core/presence/git.ts +45 -37
- package/src/core/presence/index.ts +16 -8
- package/src/core/presence/mail.ts +620 -0
- package/src/core/resources/sampler.ts +3 -2
- package/src/core/resources/service-status.ts +6 -35
- package/src/core/resources/service.ts +23 -133
- package/src/core/resources/status.ts +3 -2
- package/src/core/semantic/service.ts +8 -2
- package/src/core/servers/index.ts +3 -23
- package/src/core/storage/modes.ts +6 -0
- package/src/core/storage/segments.ts +5 -4
- package/src/core/supervisor/service.ts +33 -155
- package/src/core/supervisor/services.ts +2 -2
- package/src/core/supervisor/status.ts +10 -85
- package/src/core/workflow/engine.ts +1 -1
- package/src/core/workflow/index.ts +2 -13
- package/src/core/workflow/proof.ts +35 -83
- package/src/core/workflow/resume-lock.ts +179 -0
- package/src/core/workflow/run-state.ts +3 -207
- package/src/core/workflow/workspaces/leases.ts +1 -1
- package/src/core/workflow/workspaces/local-git.ts +120 -239
- package/src/core/workflow/workspaces/ownership.ts +3 -158
- package/src/core/workflow/workspaces/reclaim.ts +3 -9
- package/src/core/workflow/workspaces/recovery.ts +1 -1
- package/src/core/workflow/workspaces/state.ts +1 -5
- package/src/lib/admission-history.ts +267 -0
- package/src/lib/admission.ts +217 -19
- package/src/lib/browser/client.ts +147 -35
- package/src/lib/browser/content-checks.ts +14 -3
- package/src/lib/browser/critique.ts +113 -3
- package/src/lib/browser/geometry.ts +63 -14
- package/src/lib/browser/index.ts +5 -0
- package/src/lib/browser/page-review-contracts.ts +6 -1
- package/src/lib/browser/page-review-judge.ts +58 -13
- package/src/lib/browser/page-review-pack.ts +13 -2
- package/src/lib/browser/qa-run-contracts.ts +30 -4
- package/src/lib/browser/qa-run.ts +78 -17
- package/src/lib/browser/runts.ts +85 -37
- package/src/lib/browser/windows-chrome.ts +50 -0
- package/src/lib/browser/windows-login-sync.ts +275 -0
- package/src/lib/cookies/client.ts +62 -10
- package/src/lib/cookies/index.ts +3 -0
- package/src/lib/docs-metadata-sync.ts +44 -2
- package/src/lib/durable-job.ts +15 -0
- package/src/lib/http/client.ts +63 -1
- package/src/lib/instructions/templates.ts +4 -4
- package/dist/core/agents/state/process-handle.d.ts +0 -26
- package/dist/core/agents/state/process-handle.d.ts.map +0 -1
- package/dist/core/agents/state/process-handle.js +0 -121
- package/dist/core/workflow/recovery-audit.d.ts +0 -30
- package/dist/core/workflow/recovery-audit.d.ts.map +0 -1
- package/dist/core/workflow/recovery-audit.js +0 -116
- package/src/core/agents/state/process-handle.ts +0 -165
- package/src/core/workflow/recovery-audit.ts +0 -181
|
@@ -1,24 +1,25 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
|
-
import {
|
|
3
|
-
import { closeSync, existsSync, mkdirSync, openSync, readdirSync, readFileSync, rmSync, unlinkSync, writeFileSync, } from "node:fs";
|
|
2
|
+
import { existsSync, mkdirSync, readdirSync, rmSync } from "node:fs";
|
|
4
3
|
import { hostname } from "node:os";
|
|
5
4
|
import { resolve } from "node:path";
|
|
6
5
|
import { performance } from "node:perf_hooks";
|
|
7
6
|
import { fileURLToPath } from "node:url";
|
|
8
7
|
import { collectCoordinationHealthSnapshot } from "../agents/health.js";
|
|
9
|
-
import { processStartToken
|
|
8
|
+
import { processStartToken } from "../agents/state/proc-start.js";
|
|
9
|
+
import { acquireServiceLease, requestServiceStop, serviceLeaseOwner, serviceStartRefusal, } from "../agents/state/service-process.js";
|
|
10
10
|
import { resolveBinName } from "../config.js";
|
|
11
11
|
import { pressureHistoryFromSupervisor } from "../diagnostics/advice.js";
|
|
12
12
|
import { assessPressure } from "../diagnostics/pressure.js";
|
|
13
13
|
import { readEventV3ControlState } from "../events/v3/control.js";
|
|
14
14
|
import { janitorLiveDisplayV3 } from "../events/v3/live-feed.js";
|
|
15
|
+
import { installedHarneryBuild } from "../events/v3/runtime-build.js";
|
|
15
16
|
import { sampleResources } from "../resources/sampler.js";
|
|
16
17
|
import { requestResourceServiceStop } from "../resources/service.js";
|
|
17
18
|
import { readResourceServiceStatus } from "../resources/service-status.js";
|
|
18
19
|
import { resourcePaths } from "../resources/storage.js";
|
|
19
20
|
import { writePrivateJsonAtomic } from "../storage/atomic-json.js";
|
|
20
21
|
import { closeProcessLoggers, legacyLogFields, processLogger } from "../storage/logger.js";
|
|
21
|
-
import { stateDirMode
|
|
22
|
+
import { stateDirMode } from "../storage/modes.js";
|
|
22
23
|
import { collectSupervisorActivitySnapshot } from "./activity.js";
|
|
23
24
|
import { SUPERVISOR_PRESSURE_SCHEMA_VERSION, SUPERVISOR_SNAPSHOT_SCHEMA_VERSION, SUPERVISOR_STATUS_SCHEMA_VERSION, } from "./contract.js";
|
|
24
25
|
import { explainSupervisorFinding } from "./explanations.js";
|
|
@@ -29,7 +30,7 @@ import { writeSupervisorHookHealth } from "./hook-health-storage.js";
|
|
|
29
30
|
import { collectHookHealth } from "./hooks.js";
|
|
30
31
|
import { SupervisorLogCollector } from "./log-feed.js";
|
|
31
32
|
import { collectServiceHealth } from "./services.js";
|
|
32
|
-
import {
|
|
33
|
+
import { readSupervisorStatus } from "./status.js";
|
|
33
34
|
import { readSupervisorFindings, readSupervisorHistory, readSupervisorPressure, supervisorPaths, } from "./storage.js";
|
|
34
35
|
import { buildSupervisorTimeline } from "./timeline.js";
|
|
35
36
|
export const SUPERVISOR_DEFAULT_INTERVAL_MS = 2_000;
|
|
@@ -42,13 +43,12 @@ const LIVE_DISPLAY_SWEEP_INTERVAL_MS = 5 * 60_000;
|
|
|
42
43
|
export async function spawnSupervisor(coordRootRaw, options = {}) {
|
|
43
44
|
const coordRoot = resolve(coordRootRaw);
|
|
44
45
|
const current = readSupervisorStatus(coordRoot);
|
|
45
|
-
if (current.liveness
|
|
46
|
-
throw
|
|
47
|
-
if (current.liveness === "running") {
|
|
48
|
-
throw new Error(`local supervisor is already running under pid ${current.record?.pid}`);
|
|
49
|
-
}
|
|
46
|
+
if (current.liveness !== "stopped")
|
|
47
|
+
throw startRefusal(current.record?.pid, current.liveness);
|
|
50
48
|
const paths = supervisorPaths(coordRoot);
|
|
51
|
-
|
|
49
|
+
const lease = serviceLeaseOwner(paths.lease);
|
|
50
|
+
if (lease.liveness !== "stopped")
|
|
51
|
+
throw startRefusal(lease.lease?.pid, lease.liveness);
|
|
52
52
|
await stopLegacyResourceObserver(coordRoot);
|
|
53
53
|
const intervalMs = normalizeInterval(options.intervalMs);
|
|
54
54
|
const idleExitMs = normalizeIdleExit(options.idleExitMs);
|
|
@@ -112,45 +112,29 @@ export async function ensureSupervisorRunning(coordRoot) {
|
|
|
112
112
|
};
|
|
113
113
|
}
|
|
114
114
|
}
|
|
115
|
+
/** Windows has no graceful SIGTERM, so the durable request alone stops it there. */
|
|
115
116
|
export function requestSupervisorStop(coordRootRaw, dependencies = {}) {
|
|
116
117
|
const coordRoot = resolve(coordRootRaw);
|
|
117
|
-
const paths = supervisorPaths(coordRoot);
|
|
118
|
-
const status = readSupervisorStatus(coordRoot, Date.now(), dependencies);
|
|
119
|
-
mkdirSync(paths.root, { recursive: true, mode: stateDirMode() });
|
|
120
|
-
writePrivateJsonAtomic(paths.stop, {
|
|
121
|
-
requested_at: new Date().toISOString(),
|
|
122
|
-
requested_by_pid: process.pid,
|
|
123
|
-
});
|
|
124
118
|
const legacyPaths = resourcePaths(coordRoot);
|
|
125
119
|
if (existsSync(legacyPaths.service) || existsSync(legacyPaths.lease))
|
|
126
120
|
requestResourceServiceStop(coordRoot, dependencies);
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
signal = signalIfSameGeneration(status.record.pid, status.record.start_token, "SIGTERM", dependencies);
|
|
132
|
-
}
|
|
133
|
-
return {
|
|
134
|
-
...readSupervisorStatus(coordRoot, Date.now(), dependencies),
|
|
135
|
-
signal_sent: signal.sent,
|
|
136
|
-
signal_verdict: signal.verdict,
|
|
137
|
-
};
|
|
121
|
+
const read = () => readSupervisorStatus(coordRoot, Date.now(), dependencies);
|
|
122
|
+
return requestServiceStop(read(), read, supervisorPaths(coordRoot).stop, dependencies, {
|
|
123
|
+
signal: process.platform !== "win32",
|
|
124
|
+
});
|
|
138
125
|
}
|
|
139
126
|
export async function runSupervisor(input) {
|
|
140
127
|
const coordRoot = resolve(input.coordRoot);
|
|
141
128
|
const current = readSupervisorStatus(coordRoot);
|
|
142
|
-
if (current.liveness
|
|
143
|
-
throw
|
|
144
|
-
if (current.liveness === "running") {
|
|
145
|
-
throw new Error(`local supervisor is already running under pid ${current.record?.pid}`);
|
|
146
|
-
}
|
|
129
|
+
if (current.liveness !== "stopped")
|
|
130
|
+
throw startRefusal(current.record?.pid, current.liveness);
|
|
147
131
|
const paths = supervisorPaths(coordRoot);
|
|
148
132
|
const intervalMs = normalizeInterval(input.intervalMs);
|
|
149
133
|
const idleExitMs = normalizeIdleExit(input.idleExitMs);
|
|
150
134
|
const keepAlive = input.keepAlive ?? false;
|
|
151
135
|
const now = input.now ?? (() => new Date());
|
|
152
136
|
const wait = input.wait ?? delay;
|
|
153
|
-
const lease =
|
|
137
|
+
const lease = acquireServiceLease(paths.lease, startRefusal);
|
|
154
138
|
rmSync(paths.stop, { force: true });
|
|
155
139
|
const startedAt = now().toISOString();
|
|
156
140
|
const startToken = processStartToken(process.pid);
|
|
@@ -158,7 +142,7 @@ export async function runSupervisor(input) {
|
|
|
158
142
|
schema_version: SUPERVISOR_STATUS_SCHEMA_VERSION,
|
|
159
143
|
pid: process.pid,
|
|
160
144
|
...(startToken ? { start_token: startToken } : {}),
|
|
161
|
-
running_build:
|
|
145
|
+
running_build: installedHarneryBuild(),
|
|
162
146
|
host: hostname(),
|
|
163
147
|
nonce: lease.nonce,
|
|
164
148
|
state: "starting",
|
|
@@ -400,7 +384,7 @@ export async function runSupervisor(input) {
|
|
|
400
384
|
await closeProcessLoggers();
|
|
401
385
|
}
|
|
402
386
|
finally {
|
|
403
|
-
|
|
387
|
+
lease.release();
|
|
404
388
|
}
|
|
405
389
|
}
|
|
406
390
|
return status;
|
|
@@ -440,48 +424,6 @@ function observeLedgerControlState(coordRoot, now) {
|
|
|
440
424
|
};
|
|
441
425
|
}
|
|
442
426
|
}
|
|
443
|
-
function acquireLease(coordRoot, now) {
|
|
444
|
-
const paths = supervisorPaths(coordRoot);
|
|
445
|
-
mkdirSync(paths.root, { recursive: true, mode: stateDirMode() });
|
|
446
|
-
for (let attempt = 0; attempt < 2; attempt++) {
|
|
447
|
-
const startToken = processStartToken(process.pid);
|
|
448
|
-
const lease = {
|
|
449
|
-
pid: process.pid,
|
|
450
|
-
...(startToken ? { start_token: startToken } : {}),
|
|
451
|
-
host: hostname(),
|
|
452
|
-
nonce: randomUUID(),
|
|
453
|
-
created_at: now.toISOString(),
|
|
454
|
-
};
|
|
455
|
-
try {
|
|
456
|
-
const fd = openSync(paths.lease, "wx", stateFileMode());
|
|
457
|
-
try {
|
|
458
|
-
writeFileSync(fd, `${JSON.stringify(lease)}\n`, "utf8");
|
|
459
|
-
}
|
|
460
|
-
finally {
|
|
461
|
-
closeSync(fd);
|
|
462
|
-
}
|
|
463
|
-
return lease;
|
|
464
|
-
}
|
|
465
|
-
catch (error) {
|
|
466
|
-
if (error.code !== "EEXIST")
|
|
467
|
-
throw error;
|
|
468
|
-
const existing = readLease(paths.lease);
|
|
469
|
-
const liveness = existing ? leaseIsLive(existing) : "unknown";
|
|
470
|
-
if (liveness === "unknown")
|
|
471
|
-
throw unknownOwnerError();
|
|
472
|
-
if (existing && liveness === "running") {
|
|
473
|
-
throw new Error(`local supervisor lease is held by pid ${existing.pid}`);
|
|
474
|
-
}
|
|
475
|
-
try {
|
|
476
|
-
unlinkSync(paths.lease);
|
|
477
|
-
}
|
|
478
|
-
catch {
|
|
479
|
-
// A concurrent starter may have replaced or removed the stale lease.
|
|
480
|
-
}
|
|
481
|
-
}
|
|
482
|
-
}
|
|
483
|
-
throw new Error("local supervisor could not acquire its singleton lease");
|
|
484
|
-
}
|
|
485
427
|
function pruneProjectionDirectory(directory, retainedFindingIds) {
|
|
486
428
|
for (const file of readdirSync(directory)) {
|
|
487
429
|
if (!file.endsWith(".json"))
|
|
@@ -491,49 +433,8 @@ function pruneProjectionDirectory(directory, retainedFindingIds) {
|
|
|
491
433
|
rmSync(resolve(directory, file), { force: true });
|
|
492
434
|
}
|
|
493
435
|
}
|
|
494
|
-
function
|
|
495
|
-
|
|
496
|
-
if (current?.nonce !== nonce)
|
|
497
|
-
return;
|
|
498
|
-
try {
|
|
499
|
-
unlinkSync(path);
|
|
500
|
-
}
|
|
501
|
-
catch {
|
|
502
|
-
// A missing lease is already released.
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
function readLease(path) {
|
|
506
|
-
try {
|
|
507
|
-
const value = JSON.parse(readFileSync(path, "utf8"));
|
|
508
|
-
return value &&
|
|
509
|
-
Number.isSafeInteger(value.pid) &&
|
|
510
|
-
value.pid > 0 &&
|
|
511
|
-
typeof value.host === "string" &&
|
|
512
|
-
value.host.length > 0 &&
|
|
513
|
-
typeof value.nonce === "string" &&
|
|
514
|
-
value.nonce.length > 0
|
|
515
|
-
? value
|
|
516
|
-
: undefined;
|
|
517
|
-
}
|
|
518
|
-
catch {
|
|
519
|
-
return undefined;
|
|
520
|
-
}
|
|
521
|
-
}
|
|
522
|
-
function leaseIsLive(lease) {
|
|
523
|
-
return supervisorProcessLiveness(lease).liveness;
|
|
524
|
-
}
|
|
525
|
-
function assertLeaseAvailable(path) {
|
|
526
|
-
if (!existsSync(path))
|
|
527
|
-
return;
|
|
528
|
-
const lease = readLease(path);
|
|
529
|
-
const liveness = lease ? leaseIsLive(lease) : "unknown";
|
|
530
|
-
if (liveness === "unknown")
|
|
531
|
-
throw unknownOwnerError();
|
|
532
|
-
if (liveness === "running")
|
|
533
|
-
throw new Error(`local supervisor lease is held by pid ${lease?.pid}`);
|
|
534
|
-
}
|
|
535
|
-
function unknownOwnerError() {
|
|
536
|
-
return new Error(`local supervisor process identity is unknown; run ${resolveBinName()} supervisor stop to write the durable stop request before starting again`);
|
|
436
|
+
function startRefusal(pid, liveness) {
|
|
437
|
+
return serviceStartRefusal("local supervisor", `${resolveBinName()} supervisor stop`, pid, liveness);
|
|
537
438
|
}
|
|
538
439
|
async function stopLegacyResourceObserver(coordRoot) {
|
|
539
440
|
const legacy = readResourceServiceStatus(coordRoot);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { existsSync, readdirSync, readFileSync, rmSync, statSync } from "node:fs";
|
|
2
2
|
import { hostname } from "node:os";
|
|
3
3
|
import { join } from "node:path";
|
|
4
|
-
import {
|
|
4
|
+
import { processStartToken, verifyProcessGeneration } from "../agents/state/proc-start.js";
|
|
5
5
|
import { readGovernorServiceStatus } from "../governor/service-read.js";
|
|
6
6
|
import { writePrivateJsonAtomic } from "../storage/atomic-json.js";
|
|
7
7
|
import { SUPERVISOR_CONSUMER_SCHEMA_VERSION, } from "./contract.js";
|
|
@@ -87,7 +87,7 @@ function consumerAlive(record) {
|
|
|
87
87
|
if (error.code !== "EPERM")
|
|
88
88
|
return false;
|
|
89
89
|
}
|
|
90
|
-
return
|
|
90
|
+
return verifyProcessGeneration(record.pid, record.start_token) !== "different";
|
|
91
91
|
}
|
|
92
92
|
function readDetachedService(path, id) {
|
|
93
93
|
const record = readBoundedJson(path);
|
|
@@ -1,18 +1,4 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
import { type
|
|
3
|
-
export
|
|
4
|
-
readToken?: (pid: number) => string | null;
|
|
5
|
-
probePid?: (pid: number) => unknown;
|
|
6
|
-
}
|
|
7
|
-
export declare function installedSupervisorBuild(): SupervisorBuild;
|
|
8
|
-
export declare function readSupervisorStatus(coordRoot: string, nowMs?: number, dependencies?: SupervisorProcessDependencies): SupervisorStatus;
|
|
9
|
-
/** A stale heartbeat does not prove that a process has exited. */
|
|
10
|
-
export declare function supervisorProcessLiveness(owner: {
|
|
11
|
-
pid: number;
|
|
12
|
-
host: string;
|
|
13
|
-
start_token?: string;
|
|
14
|
-
}, dependencies?: SupervisorProcessDependencies): {
|
|
15
|
-
liveness: SupervisorStatus["liveness"];
|
|
16
|
-
generation: ProcessGenerationVerdict;
|
|
17
|
-
};
|
|
1
|
+
import { type ServiceProcessDependencies } from "../agents/state/service-process.js";
|
|
2
|
+
import { type SupervisorStatus } from "./contract.js";
|
|
3
|
+
export declare function readSupervisorStatus(coordRoot: string, nowMs?: number, dependencies?: ServiceProcessDependencies): SupervisorStatus;
|
|
18
4
|
//# sourceMappingURL=status.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/core/supervisor/status.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/core/supervisor/status.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,0BAA0B,EAChC,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,eAAe,CAAC;AAKvB,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,KAAK,SAAa,EAClB,YAAY,GAAE,0BAA+B,GAC5C,gBAAgB,CA4BlB"}
|
|
@@ -1,45 +1,13 @@
|
|
|
1
|
-
import { existsSync
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { verifyProcessGeneration, } from "../agents/state/proc-start.js";
|
|
5
|
-
import { currentHarneryRuntimeBuild, harneryPackageRoot } from "../events/v3/runtime-build.js";
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { observeServiceProcess, } from "../agents/state/service-process.js";
|
|
3
|
+
import { serviceBuildStatus } from "../events/v3/runtime-build.js";
|
|
6
4
|
import { SUPERVISOR_STATUS_SCHEMA_VERSION, } from "./contract.js";
|
|
7
5
|
import { readSupervisorServiceRecord, supervisorPaths } from "./storage.js";
|
|
8
6
|
const STALE_HEARTBEAT_MS = 15_000;
|
|
9
|
-
export function installedSupervisorBuild() {
|
|
10
|
-
let version = "unknown";
|
|
11
|
-
let revision = "unknown";
|
|
12
|
-
try {
|
|
13
|
-
const pkg = JSON.parse(readFileSync(join(harneryPackageRoot(), "package.json"), "utf8"));
|
|
14
|
-
if (typeof pkg.version === "string")
|
|
15
|
-
version = pkg.version;
|
|
16
|
-
revision = currentHarneryRuntimeBuild();
|
|
17
|
-
}
|
|
18
|
-
catch {
|
|
19
|
-
// Missing build evidence must still produce an inspectable status.
|
|
20
|
-
}
|
|
21
|
-
return { version, revision };
|
|
22
|
-
}
|
|
23
7
|
export function readSupervisorStatus(coordRoot, nowMs = Date.now(), dependencies = {}) {
|
|
24
8
|
const paths = supervisorPaths(coordRoot);
|
|
25
9
|
const record = readSupervisorServiceRecord(coordRoot);
|
|
26
|
-
const
|
|
27
|
-
const runningBuild = validBuild(record?.running_build) ? record.running_build : null;
|
|
28
|
-
const restartNeeded = !runningBuild ||
|
|
29
|
-
installedBuild.version === "unknown" ||
|
|
30
|
-
installedBuild.revision === "unknown" ||
|
|
31
|
-
runningBuild.version !== installedBuild.version ||
|
|
32
|
-
runningBuild.revision !== installedBuild.revision;
|
|
33
|
-
const build = {
|
|
34
|
-
running_build: runningBuild,
|
|
35
|
-
installed_build: installedBuild,
|
|
36
|
-
restart_needed: restartNeeded,
|
|
37
|
-
build_status: !runningBuild
|
|
38
|
-
? "running build unknown; restart needed"
|
|
39
|
-
: restartNeeded
|
|
40
|
-
? "restart needed"
|
|
41
|
-
: "current",
|
|
42
|
-
};
|
|
10
|
+
const build = serviceBuildStatus(record?.running_build);
|
|
43
11
|
if (!validRecord(record)) {
|
|
44
12
|
return {
|
|
45
13
|
running: false,
|
|
@@ -53,12 +21,11 @@ export function readSupervisorStatus(coordRoot, nowMs = Date.now(), dependencies
|
|
|
53
21
|
}
|
|
54
22
|
const heartbeatAt = Date.parse(record.heartbeat_at);
|
|
55
23
|
const stale = !Number.isFinite(heartbeatAt) || nowMs - heartbeatAt > STALE_HEARTBEAT_MS;
|
|
56
|
-
const
|
|
57
|
-
const liveness = owner.generation === "same" && record.state === "stopped" ? "stopped" : owner.liveness;
|
|
24
|
+
const { generation, liveness } = observeServiceProcess(record, dependencies);
|
|
58
25
|
return {
|
|
59
|
-
running: liveness === "running" && !stale
|
|
26
|
+
running: liveness === "running" && !stale,
|
|
60
27
|
stale,
|
|
61
|
-
generation
|
|
28
|
+
generation,
|
|
62
29
|
liveness,
|
|
63
30
|
...build,
|
|
64
31
|
record,
|
|
@@ -74,33 +41,3 @@ function validRecord(value) {
|
|
|
74
41
|
typeof value.heartbeat_at === "string" &&
|
|
75
42
|
typeof value.keep_alive === "boolean");
|
|
76
43
|
}
|
|
77
|
-
/** A stale heartbeat does not prove that a process has exited. */
|
|
78
|
-
export function supervisorProcessLiveness(owner, dependencies = {}) {
|
|
79
|
-
if (owner.host !== hostname())
|
|
80
|
-
return { liveness: "unknown", generation: "unknown" };
|
|
81
|
-
try {
|
|
82
|
-
(dependencies.probePid ?? ((pid) => process.kill(pid, 0)))(owner.pid);
|
|
83
|
-
}
|
|
84
|
-
catch (error) {
|
|
85
|
-
return {
|
|
86
|
-
liveness: error.code === "ESRCH" ? "stopped" : "unknown",
|
|
87
|
-
generation: "unknown",
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
const generation = verifyProcessGeneration(owner.pid, owner.start_token, dependencies.readToken);
|
|
91
|
-
return {
|
|
92
|
-
generation,
|
|
93
|
-
liveness: generation === "same" ? "running" : generation === "different" ? "stopped" : "unknown",
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
function validBuild(value) {
|
|
97
|
-
if (!value || typeof value !== "object")
|
|
98
|
-
return false;
|
|
99
|
-
const build = value;
|
|
100
|
-
return (typeof build.version === "string" &&
|
|
101
|
-
!!build.version &&
|
|
102
|
-
build.version !== "unknown" &&
|
|
103
|
-
typeof build.revision === "string" &&
|
|
104
|
-
!!build.revision &&
|
|
105
|
-
build.revision !== "unknown");
|
|
106
|
-
}
|
|
@@ -39,7 +39,8 @@ import { stableDigest } from "./durable-record.js";
|
|
|
39
39
|
import { evidencePreflightError } from "./evidence-preflight.js";
|
|
40
40
|
import { endWorkflowChildSessionV3, startWorkflowChildSessionV3 } from "./live-session-v3.js";
|
|
41
41
|
import { buildWorkflowProof, createEvidenceRecord, digestResult, normalizeWorkflowMeta, writeWorkflowProof, } from "./proof.js";
|
|
42
|
-
import { acquireWorkflowResumeLease
|
|
42
|
+
import { acquireWorkflowResumeLease } from "./resume-lock.js";
|
|
43
|
+
import { assertWorkflowRunResumable, assertWorkflowScriptUnchanged, WORKFLOW_RUN_MANIFEST_SCHEMA_VERSION, workflowScriptDigest, writeWorkflowRunManifest, } from "./run-state.js";
|
|
43
44
|
import { assertProjectionWithinWorkspace, resolveGitGrantRoots } from "./sandbox-projection.js";
|
|
44
45
|
import { normalizeWorkflowSpecialists, resolveSpecialistAssignment } from "./specialists.js";
|
|
45
46
|
import { appendWorkflowTranscriptEvent } from "./transcript.js";
|
|
@@ -4,10 +4,9 @@ export { assertWorkflowRunId, createWorkflowApproval, listWorkflowApprovals, rea
|
|
|
4
4
|
export { freezeWorkflowAttemptContext, isCanonicalWorkflowAttemptContext, normalizeWorkflowAttemptContext, } from "./attempt-context.js";
|
|
5
5
|
export { runWorkflow, WorkflowParkedError, WorkflowRunError } from "./engine.js";
|
|
6
6
|
export { buildWorkflowProof, createEvidenceRecord, deriveRunFailureClass, digestResult, normalizeWorkflowMeta, readWorkflowProof, renderWorkflowProof, rollupAcceptance, writeWorkflowProof, } from "./proof.js";
|
|
7
|
-
export
|
|
8
|
-
export {
|
|
9
|
-
export
|
|
10
|
-
export { acquireWorkflowResumeLease, assertWorkflowRunResumable, assertWorkflowScriptUnchanged, readWorkflowRunManifest, recoverWorkflowResumeLease, WORKFLOW_RUN_MANIFEST_SCHEMA_VERSION, workflowRunManifestPath, workflowScriptDigest, writeWorkflowRunManifest, } from "./run-state.js";
|
|
7
|
+
export { acquireWorkflowResumeLease } from "./resume-lock.js";
|
|
8
|
+
export type { WorkflowRunManifest } from "./run-state.js";
|
|
9
|
+
export { assertWorkflowRunResumable, assertWorkflowScriptUnchanged, readWorkflowRunManifest, WORKFLOW_RUN_MANIFEST_SCHEMA_VERSION, workflowRunManifestPath, workflowScriptDigest, writeWorkflowRunManifest, } from "./run-state.js";
|
|
11
10
|
export { isUpstreamFailureText, vendorFailureText } from "./spawn-failure.js";
|
|
12
11
|
export type { AcceptanceCriterion, AcceptanceResult, AcceptanceStatus, AcceptanceSummary, AdapterEvidenceCapability, AdapterEvidenceCoverage, AdapterName, AgentOpts, EngineOpts, EvidenceKind, EvidenceSource, EvidenceStatus, ResultDigest, RunReport, Spawner, SpawnFailureClass, SpawnRequest, SpawnResult, StageSchema, WorkflowAgentProof, WorkflowApprovalMode, WorkflowAttemptContext, WorkflowAttemptFailureCause, WorkflowAttemptPriorContext, WorkflowAttemptUnresolvedCriterion, WorkflowContext, WorkflowDiagnosticAdmissionConfig, WorkflowDiagnosticAdmissionObservation, WorkflowDiagnosticAdmissionProof, WorkflowEvidenceInput, WorkflowEvidenceRecord, WorkflowMeta, WorkflowModule, WorkflowPolicyProof, WorkflowProof, WorkflowProofUnknown, WorkflowRepoEvidence, WorkflowRepoSnapshot, WorkflowRunStatus, WorkflowSpecialistProfile, WorkflowWorkContext, } from "./types.js";
|
|
13
12
|
export { WORKFLOW_ATTEMPT_CONTEXT_SCHEMA_VERSION, WORKFLOW_DIAGNOSTIC_ADMISSION_SCHEMA_VERSION, WORKFLOW_PROOF_SCHEMA_VERSION, WORKFLOW_WORK_CONTEXT_SCHEMA_VERSION, } from "./types.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/workflow/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,4CAA4C,EAC5C,KAAK,uCAAuC,EAC5C,kCAAkC,EAClC,KAAK,kCAAkC,GACxC,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,2BAA2B,EAC3B,4BAA4B,EAC5B,gBAAgB,EAChB,wBAAwB,EACxB,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,EACvB,gCAAgC,EAChC,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,4BAA4B,EAC5B,iCAAiC,EACjC,+BAA+B,GAChC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,YAAY,EACZ,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AACpB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/workflow/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,4CAA4C,EAC5C,KAAK,uCAAuC,EAC5C,kCAAkC,EAClC,KAAK,kCAAkC,GACxC,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,2BAA2B,EAC3B,4BAA4B,EAC5B,gBAAgB,EAChB,wBAAwB,EACxB,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,EACvB,gCAAgC,EAChC,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,4BAA4B,EAC5B,iCAAiC,EACjC,+BAA+B,GAChC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,YAAY,EACZ,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,YAAY,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EACL,0BAA0B,EAC1B,6BAA6B,EAC7B,uBAAuB,EACvB,oCAAoC,EACpC,uBAAuB,EACvB,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,YAAY,EACV,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,yBAAyB,EACzB,uBAAuB,EACvB,WAAW,EACX,SAAS,EACT,UAAU,EACV,YAAY,EACZ,cAAc,EACd,cAAc,EACd,YAAY,EACZ,SAAS,EACT,OAAO,EACP,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACtB,2BAA2B,EAC3B,2BAA2B,EAC3B,kCAAkC,EAClC,eAAe,EACf,iCAAiC,EACjC,sCAAsC,EACtC,gCAAgC,EAChC,qBAAqB,EACrB,sBAAsB,EACtB,YAAY,EACZ,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,uCAAuC,EACvC,4CAA4C,EAC5C,6BAA6B,EAC7B,oCAAoC,GACrC,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,qBAAqB,EACrB,yBAAyB,EACzB,kCAAkC,EAClC,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,eAAe,EACf,uBAAuB,EACvB,iBAAiB,EACjB,+BAA+B,EAC/B,uBAAuB,EACvB,wBAAwB,EACxB,0BAA0B,EAC1B,yBAAyB,EACzB,eAAe,EACf,yBAAyB,EACzB,iBAAiB,EACjB,uBAAuB,EACvB,2BAA2B,EAC3B,0BAA0B,EAC1B,uBAAuB,EACvB,6BAA6B,EAC7B,0BAA0B,EAC1B,oBAAoB,EACpB,gBAAgB,EAChB,+BAA+B,EAC/B,4BAA4B,EAC5B,2BAA2B,EAC3B,uBAAuB,EACvB,sBAAsB,EACtB,oBAAoB,EACpB,uBAAuB,EACvB,sBAAsB,EACtB,uCAAuC,EACvC,0BAA0B,EAC1B,yBAAyB,EACzB,kBAAkB,EAClB,4BAA4B,EAC5B,iCAAiC,EACjC,uBAAuB,EACvB,oBAAoB,EACpB,cAAc,EACd,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,6BAA6B,EAC7B,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,gBAAgB,EAChB,kCAAkC,EAClC,eAAe,EACf,gBAAgB,EAChB,8BAA8B,EAC9B,wBAAwB,EACxB,6BAA6B,EAC7B,wBAAwB,EACxB,yBAAyB,EACzB,gCAAgC,EAChC,kBAAkB,EAClB,6BAA6B,EAC7B,2BAA2B,EAC3B,6BAA6B,EAC7B,0BAA0B,EAC1B,gCAAgC,EAChC,gCAAgC,GACjC,MAAM,uBAAuB,CAAC"}
|
|
@@ -3,8 +3,8 @@ export { assertWorkflowRunId, createWorkflowApproval, listWorkflowApprovals, rea
|
|
|
3
3
|
export { freezeWorkflowAttemptContext, isCanonicalWorkflowAttemptContext, normalizeWorkflowAttemptContext, } from "./attempt-context.js";
|
|
4
4
|
export { runWorkflow, WorkflowParkedError, WorkflowRunError } from "./engine.js";
|
|
5
5
|
export { buildWorkflowProof, createEvidenceRecord, deriveRunFailureClass, digestResult, normalizeWorkflowMeta, readWorkflowProof, renderWorkflowProof, rollupAcceptance, writeWorkflowProof, } from "./proof.js";
|
|
6
|
-
export {
|
|
7
|
-
export {
|
|
6
|
+
export { acquireWorkflowResumeLease } from "./resume-lock.js";
|
|
7
|
+
export { assertWorkflowRunResumable, assertWorkflowScriptUnchanged, readWorkflowRunManifest, WORKFLOW_RUN_MANIFEST_SCHEMA_VERSION, workflowRunManifestPath, workflowScriptDigest, writeWorkflowRunManifest, } from "./run-state.js";
|
|
8
8
|
export { isUpstreamFailureText, vendorFailureText } from "./spawn-failure.js";
|
|
9
9
|
export { WORKFLOW_ATTEMPT_CONTEXT_SCHEMA_VERSION, WORKFLOW_DIAGNOSTIC_ADMISSION_SCHEMA_VERSION, WORKFLOW_PROOF_SCHEMA_VERSION, WORKFLOW_WORK_CONTEXT_SCHEMA_VERSION, } from "./types.js";
|
|
10
10
|
export { applyIntegration, assertWorkspaceLifecycleTransition, cancelWorkspace, cleanupWorkspace, createLocalGitWorktreeProvider, deriveWorkspaceLifecycle, IntegrationPrepareParkedError, inspectWorkflowWorkspace, isWorkspaceLifecycleState, listWorkflowWorkspaceInspections, prepareIntegration, probeLocalGitWorktreeProvider, readWorkflowWorkspaceStatus, renderWorkflowWorkspaceStatus, validateProviderEventChain, WORKSPACE_BINDING_SCHEMA_VERSION, WORKSPACE_RECEIPT_SCHEMA_VERSION, } from "./workspaces/index.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proof.d.ts","sourceRoot":"","sources":["../../../src/core/workflow/proof.ts"],"names":[],"mappings":"AAGA,OAAO,
|
|
1
|
+
{"version":3,"file":"proof.d.ts","sourceRoot":"","sources":["../../../src/core/workflow/proof.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { repoComparisonProblems } from "../context/observation.js";
|
|
5
5
|
import { DIAGNOSTIC_ADVICE_SCHEMA_VERSION } from "../diagnostics/contract.js";
|
|
6
6
|
import { policyDigest } from "../policy/index.js";
|
|
7
7
|
import { isCanonicalWorkflowAttemptContext } from "./attempt-context.js";
|
|
@@ -276,13 +276,8 @@ export function readWorkflowProof(coordRoot, runId) {
|
|
|
276
276
|
!isWorkspaceExecutionEvidence(proof.execution, runId, proof.run.status))) {
|
|
277
277
|
throw new Error(`workflow proof at ${path} has an unsupported or mismatched schema`);
|
|
278
278
|
}
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
proof.repository.after.dirty_paths_truncated ||
|
|
282
|
-
!proof.repository.before.branch?.trim() ||
|
|
283
|
-
!proof.repository.after.branch?.trim() ||
|
|
284
|
-
!proof.repository.before.head?.trim() ||
|
|
285
|
-
!proof.repository.after.head?.trim()) {
|
|
279
|
+
// Packets written before observation checks may carry unproven drift.
|
|
280
|
+
if (repoProblems(proof.repository).length > 0) {
|
|
286
281
|
proof.repository = buildRepoEvidence(proof.repository.before, proof.repository.after);
|
|
287
282
|
proof.unknowns = proof.unknowns.filter((item) => item.code !== "repository_drift_incomplete");
|
|
288
283
|
proof.unknowns.push({
|
|
@@ -384,26 +379,16 @@ export function renderWorkflowProof(proof) {
|
|
|
384
379
|
`${observation.advice.assessment.recommended_action}; action none`
|
|
385
380
|
: "admission: shadow not needed; no real child dispatch");
|
|
386
381
|
}
|
|
387
|
-
const
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
!proof.repository.after.dirty_paths_truncated &&
|
|
391
|
-
proof.repository.before.branch?.trim() &&
|
|
392
|
-
proof.repository.after.branch?.trim() &&
|
|
393
|
-
proof.repository.before.head?.trim() &&
|
|
394
|
-
proof.repository.after.head?.trim()
|
|
395
|
-
? proof.repository
|
|
396
|
-
: buildRepoEvidence(proof.repository.before, proof.repository.after);
|
|
397
|
-
const drift = repo.drift;
|
|
398
|
-
if (!comparable) {
|
|
399
|
-
lines.push(`repository: drift unknown. ${drift.note}`);
|
|
382
|
+
const problems = repoProblems(proof.repository);
|
|
383
|
+
if (problems.length > 0) {
|
|
384
|
+
lines.push(`repository: drift unknown. ${unverifiedDrift(problems)}`);
|
|
400
385
|
}
|
|
401
386
|
else {
|
|
402
|
-
const
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
387
|
+
const { before, after, drift } = proof.repository;
|
|
388
|
+
lines.push(`repository: branch ${before.branch} -> ${after.branch}; ` +
|
|
389
|
+
`HEAD ${short(before.head)} -> ${short(after.head)}; ` +
|
|
390
|
+
`${drift.dirty_paths_added?.length ?? "unknown"} dirty added, ` +
|
|
391
|
+
`${drift.dirty_paths_cleared?.length ?? "unknown"} cleared`);
|
|
407
392
|
}
|
|
408
393
|
if (proof.unknowns.length > 0) {
|
|
409
394
|
lines.push(`unknowns: ${proof.unknowns.length}`);
|
|
@@ -416,8 +401,8 @@ export function renderWorkflowProof(proof) {
|
|
|
416
401
|
function buildRepoEvidence(beforeRaw, afterRaw) {
|
|
417
402
|
const before = normalizeRepoSnapshot(beforeRaw);
|
|
418
403
|
const after = normalizeRepoSnapshot(afterRaw);
|
|
419
|
-
const
|
|
420
|
-
if (
|
|
404
|
+
const problems = repoProblems({ before, after });
|
|
405
|
+
if (problems.length > 0) {
|
|
421
406
|
return {
|
|
422
407
|
source: "engine",
|
|
423
408
|
before,
|
|
@@ -429,46 +414,37 @@ function buildRepoEvidence(beforeRaw, afterRaw) {
|
|
|
429
414
|
dirty_paths_cleared: null,
|
|
430
415
|
dirty_paths_retained: null,
|
|
431
416
|
incomplete: true,
|
|
432
|
-
note:
|
|
417
|
+
note: unverifiedDrift(problems),
|
|
433
418
|
},
|
|
434
419
|
};
|
|
435
420
|
}
|
|
436
|
-
const pathsComparable = !before.dirty_paths_truncated && !after.dirty_paths_truncated;
|
|
437
|
-
const branchKnown = Boolean(before.branch && after.branch);
|
|
438
|
-
const headKnown = Boolean(before.head && after.head);
|
|
439
421
|
const beforeDirty = new Set(before.dirty_paths);
|
|
440
422
|
const afterDirty = new Set(after.dirty_paths);
|
|
441
423
|
const retained = after.dirty_paths.filter((path) => beforeDirty.has(path));
|
|
442
|
-
const
|
|
443
|
-
...(!pathsComparable
|
|
444
|
-
? ["Dirty-path drift is unknown because a snapshot list was truncated."]
|
|
445
|
-
: []),
|
|
446
|
-
...(!branchKnown ? ["Branch drift is unknown because a snapshot has no branch."] : []),
|
|
447
|
-
...(!headKnown ? ["HEAD drift is unknown because a snapshot has no HEAD."] : []),
|
|
448
|
-
...(pathsComparable && retained.length > 0
|
|
449
|
-
? ["Snapshots cannot prove whether retained dirty paths changed during the run."]
|
|
450
|
-
: []),
|
|
451
|
-
];
|
|
452
|
-
const incomplete = notes.length > 0;
|
|
424
|
+
const incomplete = retained.length > 0;
|
|
453
425
|
return {
|
|
454
426
|
source: "engine",
|
|
455
427
|
before,
|
|
456
428
|
after,
|
|
457
429
|
drift: {
|
|
458
|
-
branch_changed:
|
|
459
|
-
head_changed:
|
|
460
|
-
dirty_paths_added:
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
dirty_paths_cleared: pathsComparable
|
|
464
|
-
? before.dirty_paths.filter((path) => !afterDirty.has(path))
|
|
465
|
-
: null,
|
|
466
|
-
dirty_paths_retained: pathsComparable ? retained : null,
|
|
430
|
+
branch_changed: before.branch !== after.branch,
|
|
431
|
+
head_changed: before.head !== after.head,
|
|
432
|
+
dirty_paths_added: after.dirty_paths.filter((path) => !beforeDirty.has(path)),
|
|
433
|
+
dirty_paths_cleared: before.dirty_paths.filter((path) => !afterDirty.has(path)),
|
|
434
|
+
dirty_paths_retained: retained,
|
|
467
435
|
incomplete,
|
|
468
|
-
note: incomplete
|
|
436
|
+
note: incomplete
|
|
437
|
+
? "Snapshots cannot prove whether retained dirty paths changed during the run."
|
|
438
|
+
: undefined,
|
|
469
439
|
},
|
|
470
440
|
};
|
|
471
441
|
}
|
|
442
|
+
function repoProblems(repository) {
|
|
443
|
+
return repoComparisonProblems(repository.before, repository.after, ["before", "after"]);
|
|
444
|
+
}
|
|
445
|
+
function unverifiedDrift(problems) {
|
|
446
|
+
return `Repository drift could not be verified: ${problems.join("; ")}. Re-check before editing.`;
|
|
447
|
+
}
|
|
472
448
|
function normalizeRepoSnapshot(snapshot) {
|
|
473
449
|
return {
|
|
474
450
|
cwd: snapshot.cwd,
|
|
@@ -483,26 +459,6 @@ function normalizeRepoSnapshot(snapshot) {
|
|
|
483
459
|
dirty_paths_truncated: snapshot.dirty_paths_truncated,
|
|
484
460
|
};
|
|
485
461
|
}
|
|
486
|
-
function snapshotFailure(label, snapshot) {
|
|
487
|
-
return `${label} snapshot is ${snapshot.observation}${snapshot.observation_detail ? ` (${snapshot.observation_detail})` : ""}`;
|
|
488
|
-
}
|
|
489
|
-
function repoComparisonProblem(before, after) {
|
|
490
|
-
if (!observationsComparable(before, after)) {
|
|
491
|
-
return [
|
|
492
|
-
...(before.observation !== "ok" ? [snapshotFailure("before", before)] : []),
|
|
493
|
-
...(after.observation !== "ok" ? [snapshotFailure("after", after)] : []),
|
|
494
|
-
].join("; ");
|
|
495
|
-
}
|
|
496
|
-
const unknownRoots = [
|
|
497
|
-
...(!before.root || !isAbsolute(before.root) ? ["before"] : []),
|
|
498
|
-
...(!after.root || !isAbsolute(after.root) ? ["after"] : []),
|
|
499
|
-
];
|
|
500
|
-
if (unknownRoots.length > 0)
|
|
501
|
-
return `${unknownRoots.join(" and ")} snapshot repository root is unknown`;
|
|
502
|
-
if (before.root !== after.root)
|
|
503
|
-
return "snapshots name different repository roots";
|
|
504
|
-
return undefined;
|
|
505
|
-
}
|
|
506
462
|
function buildAdapterCoverage(agents, claims, attestations) {
|
|
507
463
|
return [...new Set(agents.map((agent) => agent.adapter))].map((adapter) => {
|
|
508
464
|
const adapterAgents = agents.filter((agent) => agent.adapter === adapter);
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type WorkflowResumeOwnerState = "dead" | "live" | "unknown";
|
|
2
|
+
export interface WorkflowResumeLockOwner {
|
|
3
|
+
pid: number;
|
|
4
|
+
host: string;
|
|
5
|
+
created_at: string;
|
|
6
|
+
start_token?: string | null;
|
|
7
|
+
}
|
|
8
|
+
/** Acquire the exclusive lease shared by resume and reclaim. A lock whose
|
|
9
|
+
* same-host owner has exited, or whose PID now names a different process, is
|
|
10
|
+
* retired automatically. Every other existing lock refuses. */
|
|
11
|
+
export declare function acquireWorkflowResumeLease(coordRoot: string, runId: string): () => void;
|
|
12
|
+
export declare function workflowResumeLockPath(coordRoot: string, runId: string): string;
|
|
13
|
+
/** Only a same-host owner can be proven gone: by ESRCH, or by a recorded start
|
|
14
|
+
* token that no longer matches its PID. Foreign and unreadable owners stay live. */
|
|
15
|
+
export declare function workflowResumeOwnerState(owner: WorkflowResumeLockOwner): WorkflowResumeOwnerState;
|
|
16
|
+
export declare function readWorkflowResumeLock(coordRoot: string, runId: string): WorkflowResumeLockOwner | null;
|
|
17
|
+
//# sourceMappingURL=resume-lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume-lock.d.ts","sourceRoot":"","sources":["../../../src/core/workflow/resume-lock.ts"],"names":[],"mappings":"AAqBA,MAAM,MAAM,wBAAwB,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAEnE,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED;;+DAE+D;AAC/D,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,IAAI,CAsDvF;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAG/E;AAED;oFACoF;AACpF,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,uBAAuB,GAAG,wBAAwB,CAUjG;AAkCD,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,uBAAuB,GAAG,IAAI,CAEhC"}
|