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
|
@@ -8,4 +8,18 @@ export { liveEventV3BuildId, livePlatformV3 } from "./runtime-identity.js";
|
|
|
8
8
|
*/
|
|
9
9
|
export declare function currentHarneryRuntimeBuild(): string;
|
|
10
10
|
export declare function harneryPackageRoot(): string;
|
|
11
|
+
export interface HarneryBuild {
|
|
12
|
+
version: string;
|
|
13
|
+
revision: string;
|
|
14
|
+
}
|
|
15
|
+
/** The installed package version and runtime revision; "unknown" when unreadable. */
|
|
16
|
+
export declare function installedHarneryBuild(): HarneryBuild;
|
|
17
|
+
export interface ServiceBuildStatus {
|
|
18
|
+
running_build: HarneryBuild | null;
|
|
19
|
+
installed_build: HarneryBuild;
|
|
20
|
+
restart_needed: boolean;
|
|
21
|
+
build_status: string;
|
|
22
|
+
}
|
|
23
|
+
/** A missing or unknown running build, or any difference, means restart. */
|
|
24
|
+
export declare function serviceBuildStatus(recorded: unknown): ServiceBuildStatus;
|
|
11
25
|
//# sourceMappingURL=runtime-build.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-build.d.ts","sourceRoot":"","sources":["../../../../src/core/events/v3/runtime-build.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE3E;;;;;;GAMG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,CAuBnD;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C"}
|
|
1
|
+
{"version":3,"file":"runtime-build.d.ts","sourceRoot":"","sources":["../../../../src/core/events/v3/runtime-build.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE3E;;;;;;GAMG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,CAuBnD;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qFAAqF;AACrF,wBAAgB,qBAAqB,IAAI,YAAY,CAkBpD;AAED,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,YAAY,GAAG,IAAI,CAAC;IACnC,eAAe,EAAE,YAAY,CAAC;IAC9B,cAAc,EAAE,OAAO,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,4EAA4E;AAC5E,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,OAAO,GAAG,kBAAkB,CA0BxE"}
|
|
@@ -38,3 +38,47 @@ export function currentHarneryRuntimeBuild() {
|
|
|
38
38
|
export function harneryPackageRoot() {
|
|
39
39
|
return resolve(dirname(fileURLToPath(import.meta.url)), "../../../..");
|
|
40
40
|
}
|
|
41
|
+
/** The installed package version and runtime revision; "unknown" when unreadable. */
|
|
42
|
+
export function installedHarneryBuild() {
|
|
43
|
+
let version = "unknown";
|
|
44
|
+
let revision = "unknown";
|
|
45
|
+
try {
|
|
46
|
+
const manifest = JSON.parse(readFileSync(resolve(harneryPackageRoot(), "package.json"), "utf8"));
|
|
47
|
+
if (typeof manifest.version === "string" && manifest.version.length <= 100)
|
|
48
|
+
version = manifest.version;
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// Missing package metadata cannot establish that a running build is current.
|
|
52
|
+
}
|
|
53
|
+
try {
|
|
54
|
+
revision = currentHarneryRuntimeBuild();
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
// Status still reports the unavailable build instead of guessing a match.
|
|
58
|
+
}
|
|
59
|
+
return { version, revision };
|
|
60
|
+
}
|
|
61
|
+
/** A missing or unknown running build, or any difference, means restart. */
|
|
62
|
+
export function serviceBuildStatus(recorded) {
|
|
63
|
+
const installed_build = installedHarneryBuild();
|
|
64
|
+
const candidate = recorded;
|
|
65
|
+
const known = (value) => typeof value === "string" && value.length > 0 && value.length <= 100 && value !== "unknown";
|
|
66
|
+
const running_build = candidate && known(candidate.version) && known(candidate.revision)
|
|
67
|
+
? { version: candidate.version, revision: candidate.revision }
|
|
68
|
+
: null;
|
|
69
|
+
const restart_needed = running_build === null ||
|
|
70
|
+
installed_build.version === "unknown" ||
|
|
71
|
+
installed_build.revision === "unknown" ||
|
|
72
|
+
running_build.version !== installed_build.version ||
|
|
73
|
+
running_build.revision !== installed_build.revision;
|
|
74
|
+
return {
|
|
75
|
+
running_build,
|
|
76
|
+
installed_build,
|
|
77
|
+
restart_needed,
|
|
78
|
+
build_status: running_build === null
|
|
79
|
+
? "running build unknown; restart needed"
|
|
80
|
+
: restart_needed
|
|
81
|
+
? "restart needed"
|
|
82
|
+
: "current",
|
|
83
|
+
};
|
|
84
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../../src/core/events/v3/validate.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,OAAO,EAAiB,MAAM,eAAe,CAAC;AAE5D,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../../src/core/events/v3/validate.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,OAAO,EAAiB,MAAM,eAAe,CAAC;AAE5D,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAgFD,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,uBAAuB,CAkBvE;AAkSD,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAKtE"}
|
|
@@ -1,8 +1,43 @@
|
|
|
1
1
|
import { Value } from "@sinclair/typebox/value";
|
|
2
2
|
import { canonicalJsonV3 } from "./canonical.js";
|
|
3
3
|
import { EventV3Schema } from "./contract.js";
|
|
4
|
+
/**
|
|
5
|
+
* Every union member requires its own literal `event_type`, so only the member
|
|
6
|
+
* named by a value's `event_type` can accept it. Checking that one member gives
|
|
7
|
+
* the union's verdict without trying the other variants, which more than halves
|
|
8
|
+
* a full-ledger read. Returns null, falling back to the whole union, if a member
|
|
9
|
+
* ever stops carrying a required unique literal.
|
|
10
|
+
*/
|
|
11
|
+
let eventVariantsByType;
|
|
12
|
+
function eventVariantsByTypeV3() {
|
|
13
|
+
if (eventVariantsByType !== undefined)
|
|
14
|
+
return eventVariantsByType;
|
|
15
|
+
const variants = new Map();
|
|
16
|
+
for (const variant of EventV3Schema.anyOf) {
|
|
17
|
+
const literal = variant.properties.event_type?.const;
|
|
18
|
+
if (typeof literal !== "string" ||
|
|
19
|
+
!variant.required?.includes("event_type") ||
|
|
20
|
+
variants.has(literal)) {
|
|
21
|
+
eventVariantsByType = null;
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
variants.set(literal, variant);
|
|
25
|
+
}
|
|
26
|
+
eventVariantsByType = variants;
|
|
27
|
+
return variants;
|
|
28
|
+
}
|
|
29
|
+
function checkEventSchemaV3(value) {
|
|
30
|
+
const variants = eventVariantsByTypeV3();
|
|
31
|
+
if (!variants)
|
|
32
|
+
return Value.Check(EventV3Schema, value);
|
|
33
|
+
const eventType = typeof value === "object" && value !== null
|
|
34
|
+
? value.event_type
|
|
35
|
+
: undefined;
|
|
36
|
+
const variant = typeof eventType === "string" ? variants.get(eventType) : undefined;
|
|
37
|
+
return variant !== undefined && Value.Check(variant, value);
|
|
38
|
+
}
|
|
4
39
|
export function validateEventV3(value) {
|
|
5
|
-
if (!
|
|
40
|
+
if (!checkEventSchemaV3(value)) {
|
|
6
41
|
return {
|
|
7
42
|
ok: false,
|
|
8
43
|
issues: [...Value.Errors(EventV3Schema, value)]
|
|
@@ -2,6 +2,7 @@ export { approveGovernorPlan, findCompletedMissionGoverning, rejectGovernorPlan,
|
|
|
2
2
|
export { readGovernorPlan, readGovernorPlanReviewReceipt, readGovernorPlans, } from "./plan-read.js";
|
|
3
3
|
export { type CreateGovernorPlanTemplateInput, type CreateGovernorReplanningInput, GOVERNOR_PLAN_SCHEMA_VERSION, type GovernorPlanEvent, type GovernorPlanEventType, type GovernorPlanHistory, type GovernorPlanMilestone, type GovernorPlanOutcome, type GovernorPlanProposal, type GovernorPlanRecord, type GovernorPlanRequest, type GovernorPlanReviewFinding, type GovernorPlanReviewReceipt, type GovernorPlanReviewReviewer, type GovernorPlanReviewRound, type GovernorPlanReviewStatus, type GovernorPlanReviewSummary, type GovernorPlanReviewVerdict, type GovernorPlanStatus, type GovernorPlanTemplate, type GovernorPlanWorkSpec, type GovernorReplanningPolicy, MAX_GOVERNOR_PLAN_REVIEWERS, MAX_GOVERNOR_PLAN_REVISION_ROUNDS, } from "./plan-types.js";
|
|
4
4
|
export { type GovernorDispatchOutcome, type GovernorRunReport, type GovernorStopReason, type RunGovernorInput, runGovernor, } from "./runner.js";
|
|
5
|
-
export { type ConfigureGovernorServiceInput, configureGovernorService, GOVERNOR_SERVICE_CONFIG_SCHEMA_VERSION, GOVERNOR_SERVICE_RUNTIME_SCHEMA_VERSION, GOVERNOR_SERVICE_STATUS_SCHEMA_VERSION, type GovernorServiceConfig, type GovernorServiceEngineConfig, type GovernorServiceGoalRuntime, type GovernorServiceGoalState, type GovernorServiceProcessState, type GovernorServiceRuntime, type GovernorServiceStatus, type GovernorServiceStatusRecord, type GovernorServiceSweepOutcome, type GovernorServiceSweepReport, governorServiceLogPath, type RunGovernorServiceDaemonInput, type RunGovernorServiceSweepInput, readGovernorServiceConfig,
|
|
5
|
+
export { type ConfigureGovernorServiceInput, configureGovernorService, GOVERNOR_SERVICE_CONFIG_SCHEMA_VERSION, GOVERNOR_SERVICE_RUNTIME_SCHEMA_VERSION, GOVERNOR_SERVICE_STATUS_SCHEMA_VERSION, type GovernorServiceConfig, type GovernorServiceEngineConfig, type GovernorServiceGoalRuntime, type GovernorServiceGoalState, type GovernorServiceProcessState, type GovernorServiceRuntime, type GovernorServiceStatus, type GovernorServiceStatusRecord, type GovernorServiceSweepOutcome, type GovernorServiceSweepReport, governorServiceLogPath, type RunGovernorServiceDaemonInput, type RunGovernorServiceSweepInput, readGovernorServiceConfig, requestGovernorServiceStop, runGovernorServiceDaemon, runGovernorServiceSweep, spawnGovernorService, } from "./service.js";
|
|
6
|
+
export { readGovernorServiceRuntime, readGovernorServiceStatus } from "./service-read.js";
|
|
6
7
|
export { assertGovernorId, type CreateGovernorInput, type CreateGovernorMissionInput, collectGovernorWork, createGovernor, GOVERNOR_INTENT_SCHEMA_VERSION, type GovernorAutomationPolicy, type GovernorIntent, type GovernorLimits, type GovernorListResult, type GovernorListWarning, type GovernorMission, type GovernorNextAction, type GovernorProjection, type GovernorRecord, type GovernorState, listGovernors, listGovernorsWithWarnings, newGovernorId, readGovernor, } from "./state.js";
|
|
7
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/governor/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,6BAA6B,EAC7B,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,gBAAgB,EAChB,6BAA6B,EAC7B,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,KAAK,+BAA+B,EACpC,KAAK,6BAA6B,EAClC,4BAA4B,EAC5B,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC9B,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC7B,2BAA2B,EAC3B,iCAAiC,GAClC,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,WAAW,GACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,KAAK,6BAA6B,EAClC,wBAAwB,EACxB,sCAAsC,EACtC,uCAAuC,EACvC,sCAAsC,EACtC,KAAK,qBAAqB,EAC1B,KAAK,2BAA2B,EAChC,KAAK,0BAA0B,EAC/B,KAAK,wBAAwB,EAC7B,KAAK,2BAA2B,EAChC,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,2BAA2B,EAChC,KAAK,2BAA2B,EAChC,KAAK,0BAA0B,EAC/B,sBAAsB,EACtB,KAAK,6BAA6B,EAClC,KAAK,4BAA4B,EACjC,yBAAyB,EACzB,0BAA0B,EAC1B,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/governor/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,6BAA6B,EAC7B,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,gBAAgB,EAChB,6BAA6B,EAC7B,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,KAAK,+BAA+B,EACpC,KAAK,6BAA6B,EAClC,4BAA4B,EAC5B,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC9B,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC7B,2BAA2B,EAC3B,iCAAiC,GAClC,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,WAAW,GACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,KAAK,6BAA6B,EAClC,wBAAwB,EACxB,sCAAsC,EACtC,uCAAuC,EACvC,sCAAsC,EACtC,KAAK,qBAAqB,EAC1B,KAAK,2BAA2B,EAChC,KAAK,0BAA0B,EAC/B,KAAK,wBAAwB,EAC7B,KAAK,2BAA2B,EAChC,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,2BAA2B,EAChC,KAAK,2BAA2B,EAChC,KAAK,0BAA0B,EAC/B,sBAAsB,EACtB,KAAK,6BAA6B,EAClC,KAAK,4BAA4B,EACjC,yBAAyB,EACzB,0BAA0B,EAC1B,wBAAwB,EACxB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,0BAA0B,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC1F,OAAO,EACL,gBAAgB,EAChB,KAAK,mBAAmB,EACxB,KAAK,0BAA0B,EAC/B,mBAAmB,EACnB,cAAc,EACd,8BAA8B,EAC9B,KAAK,wBAAwB,EAC7B,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,aAAa,EACb,yBAAyB,EACzB,aAAa,EACb,YAAY,GACb,MAAM,YAAY,CAAC"}
|
|
@@ -2,5 +2,6 @@ export { approveGovernorPlan, findCompletedMissionGoverning, rejectGovernorPlan,
|
|
|
2
2
|
export { readGovernorPlan, readGovernorPlanReviewReceipt, readGovernorPlans, } from "./plan-read.js";
|
|
3
3
|
export { GOVERNOR_PLAN_SCHEMA_VERSION, MAX_GOVERNOR_PLAN_REVIEWERS, MAX_GOVERNOR_PLAN_REVISION_ROUNDS, } from "./plan-types.js";
|
|
4
4
|
export { runGovernor, } from "./runner.js";
|
|
5
|
-
export { configureGovernorService, GOVERNOR_SERVICE_CONFIG_SCHEMA_VERSION, GOVERNOR_SERVICE_RUNTIME_SCHEMA_VERSION, GOVERNOR_SERVICE_STATUS_SCHEMA_VERSION, governorServiceLogPath, readGovernorServiceConfig,
|
|
5
|
+
export { configureGovernorService, GOVERNOR_SERVICE_CONFIG_SCHEMA_VERSION, GOVERNOR_SERVICE_RUNTIME_SCHEMA_VERSION, GOVERNOR_SERVICE_STATUS_SCHEMA_VERSION, governorServiceLogPath, readGovernorServiceConfig, requestGovernorServiceStop, runGovernorServiceDaemon, runGovernorServiceSweep, spawnGovernorService, } from "./service.js";
|
|
6
|
+
export { readGovernorServiceRuntime, readGovernorServiceStatus } from "./service-read.js";
|
|
6
7
|
export { assertGovernorId, collectGovernorWork, createGovernor, GOVERNOR_INTENT_SCHEMA_VERSION, listGovernors, listGovernorsWithWarnings, newGovernorId, readGovernor, } from "./state.js";
|
|
@@ -1,15 +1,8 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
import type {
|
|
3
|
-
export declare function currentGovernorServiceBuild(): GovernorServiceBuild;
|
|
4
|
-
export declare function governorServiceBuildStatus(record: GovernorServiceStatusRecord | undefined): Pick<GovernorServiceStatus, "running_build" | "installed_build" | "restart_needed" | "build_status">;
|
|
5
|
-
/** An unknown token or process probe cannot establish a running or stopped owner. */
|
|
6
|
-
export declare function observeGovernorServiceProcess(record: Pick<GovernorServiceStatusRecord, "pid" | "host" | "state" | "start_token"> | undefined, dependencies?: GovernorServiceProcessDependencies): {
|
|
7
|
-
generation: ProcessGenerationVerdict;
|
|
8
|
-
liveness: GovernorServiceStatus["liveness"];
|
|
9
|
-
};
|
|
1
|
+
import { type ServiceProcessDependencies } from "../agents/state/service-process.js";
|
|
2
|
+
import type { GovernorServiceConfig, GovernorServiceRuntime, GovernorServiceStatus } from "./service.js";
|
|
10
3
|
export declare function readGovernorServiceConfig(coordRootRaw: string): GovernorServiceConfig;
|
|
11
4
|
export declare function readGovernorServiceRuntime(coordRootRaw: string): GovernorServiceRuntime | undefined;
|
|
12
|
-
export declare function readGovernorServiceStatus(coordRootRaw: string, dependencies?:
|
|
5
|
+
export declare function readGovernorServiceStatus(coordRootRaw: string, dependencies?: ServiceProcessDependencies): GovernorServiceStatus;
|
|
13
6
|
export declare function governorServiceLogPath(coordRoot: string): string;
|
|
14
7
|
export interface GovernorServiceLogReadOptions {
|
|
15
8
|
max_bytes?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-read.d.ts","sourceRoot":"","sources":["../../../src/core/governor/service-read.ts"],"names":[],"mappings":"AAKA,OAAO,
|
|
1
|
+
{"version":3,"file":"service-read.d.ts","sourceRoot":"","sources":["../../../src/core/governor/service-read.ts"],"names":[],"mappings":"AAKA,OAAO,EAGL,KAAK,0BAA0B,EAChC,MAAM,oCAAoC,CAAC;AAM5C,OAAO,KAAK,EACV,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EAEtB,MAAM,cAAc,CAAC;AAMtB,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,qBAAqB,CA0BrF;AAED,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,MAAM,GACnB,sBAAsB,GAAG,SAAS,CAgBpC;AAED,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,MAAM,EACpB,YAAY,GAAE,0BAA+B,GAC5C,qBAAqB,CA8BvB;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAahE;AAED,MAAM,WAAW,6BAA6B;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,4BAA4B;IAC3C,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;CACpB;AAeD,wFAAwF;AACxF,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,6BAAkC,GAC1C,4BAA4B,CA6D9B"}
|
|
@@ -1,101 +1,15 @@
|
|
|
1
1
|
import { closeSync, existsSync, openSync, readFileSync, readSync, statSync } from "node:fs";
|
|
2
|
-
import { hostname } from "node:os";
|
|
3
2
|
import { join, resolve } from "node:path";
|
|
4
3
|
import { gunzipSync } from "node:zlib";
|
|
5
4
|
import { coordEnv } from "../../lib/env.js";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
5
|
+
import { observeServiceProcess, } from "../agents/state/service-process.js";
|
|
6
|
+
import { serviceBuildStatus } from "../events/v3/runtime-build.js";
|
|
8
7
|
import { createStorageCatalog } from "../storage/catalog.js";
|
|
9
8
|
import { parseLogRecord } from "../storage/jsonl.js";
|
|
10
9
|
import { familyLogDirectory, readSegmentManifest } from "../storage/segments.js";
|
|
11
10
|
const MAX_FILE_BYTES = 512 * 1024;
|
|
12
11
|
const MAX_LOG_RECORDS = 10_000;
|
|
13
12
|
const MAX_GOALS = 100;
|
|
14
|
-
export function currentGovernorServiceBuild() {
|
|
15
|
-
let version = "unknown";
|
|
16
|
-
let revision = "unknown";
|
|
17
|
-
try {
|
|
18
|
-
const manifest = JSON.parse(readFileSync(new URL("../../../package.json", import.meta.url), "utf8"));
|
|
19
|
-
if (typeof manifest.version === "string" && manifest.version.length <= 100) {
|
|
20
|
-
version = manifest.version;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
catch {
|
|
24
|
-
// Missing package metadata cannot establish that the running build is current.
|
|
25
|
-
}
|
|
26
|
-
try {
|
|
27
|
-
revision = currentHarneryRuntimeBuild();
|
|
28
|
-
}
|
|
29
|
-
catch {
|
|
30
|
-
// Status still reports the unavailable build instead of guessing a match.
|
|
31
|
-
}
|
|
32
|
-
return { version, revision };
|
|
33
|
-
}
|
|
34
|
-
export function governorServiceBuildStatus(record) {
|
|
35
|
-
const installed_build = currentGovernorServiceBuild();
|
|
36
|
-
const candidate = record?.running_build;
|
|
37
|
-
const running_build = candidate &&
|
|
38
|
-
typeof candidate.version === "string" &&
|
|
39
|
-
candidate.version.length > 0 &&
|
|
40
|
-
candidate.version.length <= 100 &&
|
|
41
|
-
typeof candidate.revision === "string" &&
|
|
42
|
-
candidate.revision.length > 0 &&
|
|
43
|
-
candidate.revision.length <= 100 &&
|
|
44
|
-
candidate.version !== "unknown" &&
|
|
45
|
-
candidate.revision !== "unknown"
|
|
46
|
-
? candidate
|
|
47
|
-
: null;
|
|
48
|
-
const restart_needed = running_build === null ||
|
|
49
|
-
installed_build.version === "unknown" ||
|
|
50
|
-
installed_build.revision === "unknown" ||
|
|
51
|
-
running_build.version !== installed_build.version ||
|
|
52
|
-
running_build.revision !== installed_build.revision;
|
|
53
|
-
return {
|
|
54
|
-
running_build,
|
|
55
|
-
installed_build,
|
|
56
|
-
restart_needed,
|
|
57
|
-
build_status: running_build === null
|
|
58
|
-
? "running build unknown; restart needed"
|
|
59
|
-
: restart_needed
|
|
60
|
-
? "restart needed"
|
|
61
|
-
: "current",
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
/** An unknown token or process probe cannot establish a running or stopped owner. */
|
|
65
|
-
export function observeGovernorServiceProcess(record, dependencies = {}) {
|
|
66
|
-
if (!record)
|
|
67
|
-
return { generation: "unknown", liveness: "stopped" };
|
|
68
|
-
const generation = record.host === hostname()
|
|
69
|
-
? verifyProcessGeneration(record.pid, record.start_token, dependencies.readToken)
|
|
70
|
-
: "unknown";
|
|
71
|
-
if (record.host !== hostname())
|
|
72
|
-
return { generation, liveness: "unknown" };
|
|
73
|
-
try {
|
|
74
|
-
const present = (dependencies.probePid ?? probePid)(record.pid);
|
|
75
|
-
if (!present)
|
|
76
|
-
return { generation, liveness: "stopped" };
|
|
77
|
-
}
|
|
78
|
-
catch (error) {
|
|
79
|
-
return {
|
|
80
|
-
generation,
|
|
81
|
-
liveness: error.code === "ESRCH" ? "stopped" : "unknown",
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
return {
|
|
85
|
-
generation,
|
|
86
|
-
liveness: generation === "same"
|
|
87
|
-
? record.state === "stopped"
|
|
88
|
-
? "stopped"
|
|
89
|
-
: "running"
|
|
90
|
-
: generation === "different"
|
|
91
|
-
? "stopped"
|
|
92
|
-
: "unknown",
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
function probePid(pid) {
|
|
96
|
-
process.kill(pid, 0);
|
|
97
|
-
return true;
|
|
98
|
-
}
|
|
99
13
|
export function readGovernorServiceConfig(coordRootRaw) {
|
|
100
14
|
const coordRoot = resolve(coordRootRaw);
|
|
101
15
|
const config = readBoundedJson(join(serviceDir(coordRoot), "config.json"), "governor service configuration");
|
|
@@ -151,15 +65,17 @@ export function readGovernorServiceStatus(coordRootRaw, dependencies = {}) {
|
|
|
151
65
|
catch {
|
|
152
66
|
// Runtime is recoverable and must not make the dashboard unreadable.
|
|
153
67
|
}
|
|
154
|
-
const observation =
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
68
|
+
const observation = record
|
|
69
|
+
? observeServiceProcess(record, dependencies)
|
|
70
|
+
: {
|
|
71
|
+
generation: "unknown",
|
|
72
|
+
liveness: existsSync(join(serviceDir(coordRoot), "status.json")) ? "unknown" : "stopped",
|
|
73
|
+
};
|
|
158
74
|
return {
|
|
159
|
-
running: observation.liveness === "running"
|
|
75
|
+
running: observation.liveness === "running",
|
|
160
76
|
stale: observation.liveness === "stopped" && record !== undefined && record.state !== "stopped",
|
|
161
77
|
...observation,
|
|
162
|
-
...
|
|
78
|
+
...serviceBuildStatus(record?.running_build),
|
|
163
79
|
record,
|
|
164
80
|
config,
|
|
165
81
|
runtime,
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type ProcessGenerationVerdict } from "../agents/state/proc-start.js";
|
|
2
|
+
import { type ServiceProcessDependencies } from "../agents/state/service-process.js";
|
|
2
3
|
import { type NormalizedPolicy, type PolicyIsolation } from "../policy/index.js";
|
|
3
4
|
import type { RunWorkItemInput } from "../work/index.js";
|
|
4
5
|
import { type GovernorRunReport, type GovernorStopReason } from "./runner.js";
|
|
@@ -55,9 +56,6 @@ export interface GovernorServiceBuild {
|
|
|
55
56
|
version: string;
|
|
56
57
|
revision: string;
|
|
57
58
|
}
|
|
58
|
-
export interface GovernorServiceProcessDependencies extends ProcessGenerationSignalDependencies {
|
|
59
|
-
probePid?: (pid: number) => boolean;
|
|
60
|
-
}
|
|
61
59
|
export interface GovernorServiceStatusRecord {
|
|
62
60
|
schema_version: typeof GOVERNOR_SERVICE_STATUS_SCHEMA_VERSION;
|
|
63
61
|
pid: number;
|
|
@@ -122,10 +120,8 @@ export interface RunGovernorServiceDaemonInput {
|
|
|
122
120
|
}
|
|
123
121
|
export declare function configureGovernorService(input: ConfigureGovernorServiceInput): GovernorServiceConfig;
|
|
124
122
|
export declare function readGovernorServiceConfig(coordRootRaw: string): GovernorServiceConfig;
|
|
125
|
-
export declare function readGovernorServiceRuntime(coordRootRaw: string): GovernorServiceRuntime | undefined;
|
|
126
|
-
export declare function readGovernorServiceStatus(coordRootRaw: string, dependencies?: GovernorServiceProcessDependencies): GovernorServiceStatus;
|
|
127
123
|
export declare function spawnGovernorService(coordRootRaw: string): Promise<GovernorServiceStatus>;
|
|
128
|
-
export declare function requestGovernorServiceStop(coordRootRaw: string, dependencies?:
|
|
124
|
+
export declare function requestGovernorServiceStop(coordRootRaw: string, dependencies?: ServiceProcessDependencies): GovernorServiceStatus;
|
|
129
125
|
export declare function runGovernorServiceSweep(input: RunGovernorServiceSweepInput): Promise<GovernorServiceSweepReport>;
|
|
130
126
|
export declare function runGovernorServiceDaemon(input: RunGovernorServiceDaemonInput): Promise<GovernorServiceStatusRecord>;
|
|
131
127
|
export declare function governorServiceLogPath(coordRoot: string): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/core/governor/service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/core/governor/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
2
|
import { randomBytes, randomUUID } from "node:crypto";
|
|
3
|
-
import { chmodSync, closeSync, existsSync, mkdirSync, openSync, readFileSync, renameSync, rmSync, statSync,
|
|
3
|
+
import { chmodSync, closeSync, existsSync, mkdirSync, openSync, readFileSync, renameSync, rmSync, statSync, writeFileSync, } from "node:fs";
|
|
4
4
|
import { hostname } from "node:os";
|
|
5
5
|
import { dirname, join, resolve } from "node:path";
|
|
6
6
|
import { coordEnv } from "../../lib/env.js";
|
|
7
|
-
import { processStartToken
|
|
7
|
+
import { processStartToken } from "../agents/state/proc-start.js";
|
|
8
|
+
import { acquireServiceLease, requestServiceStop, serviceStartRefusal, } from "../agents/state/service-process.js";
|
|
8
9
|
import { resolveBinName } from "../config.js";
|
|
10
|
+
import { installedHarneryBuild } from "../events/v3/runtime-build.js";
|
|
9
11
|
import { normalizePolicy } from "../policy/index.js";
|
|
10
12
|
import { closeProcessLoggers, legacyLogFields, processLogger } from "../storage/logger.js";
|
|
11
13
|
import { stateDirMode, stateFileMode } from "../storage/modes.js";
|
|
12
14
|
import { RotatingTextSink } from "../storage/process-log.js";
|
|
13
15
|
import { runGovernor } from "./runner.js";
|
|
14
|
-
import {
|
|
16
|
+
import { readGovernorServiceRuntime, readGovernorServiceStatus } from "./service-read.js";
|
|
15
17
|
import { readGovernor } from "./state.js";
|
|
16
18
|
export const GOVERNOR_SERVICE_CONFIG_SCHEMA_VERSION = 1;
|
|
17
19
|
export const GOVERNOR_SERVICE_RUNTIME_SCHEMA_VERSION = 1;
|
|
@@ -21,15 +23,9 @@ const MAX_GOALS = 100;
|
|
|
21
23
|
const MAX_ERROR = 2_000;
|
|
22
24
|
export function configureGovernorService(input) {
|
|
23
25
|
const coordRoot = resolve(input.coordRoot);
|
|
24
|
-
const
|
|
25
|
-
if (
|
|
26
|
-
throw
|
|
27
|
-
}
|
|
28
|
-
if (active) {
|
|
29
|
-
const liveness = statusOwnerIsLive(active);
|
|
30
|
-
if (liveness !== "stopped")
|
|
31
|
-
throw serviceStartRefusal(coordRoot, active.pid, liveness);
|
|
32
|
-
}
|
|
26
|
+
const current = readGovernorServiceStatus(coordRoot);
|
|
27
|
+
if (current.liveness !== "stopped")
|
|
28
|
+
throw startRefusal(coordRoot, current.record?.pid, current.liveness);
|
|
33
29
|
const goalIds = unique(input.goalIds.map((value) => value.trim()).filter(Boolean));
|
|
34
30
|
if (goalIds.length < 1 || goalIds.length > MAX_GOALS) {
|
|
35
31
|
throw new Error(`governor service requires from 1 to ${MAX_GOALS} unique goal ids`);
|
|
@@ -65,57 +61,12 @@ export function readGovernorServiceConfig(coordRootRaw) {
|
|
|
65
61
|
validateConfig(coordRoot, config);
|
|
66
62
|
return config;
|
|
67
63
|
}
|
|
68
|
-
export function readGovernorServiceRuntime(coordRootRaw) {
|
|
69
|
-
const coordRoot = resolve(coordRootRaw);
|
|
70
|
-
if (!existsSync(serviceRuntimePath(coordRoot)))
|
|
71
|
-
return undefined;
|
|
72
|
-
const runtime = readBoundedJson(serviceRuntimePath(coordRoot), "governor service runtime");
|
|
73
|
-
if (runtime.schema_version !== GOVERNOR_SERVICE_RUNTIME_SCHEMA_VERSION ||
|
|
74
|
-
!validTimestamp(runtime.config_created_at) ||
|
|
75
|
-
!validTimestamp(runtime.updated_at) ||
|
|
76
|
-
!runtime.goals ||
|
|
77
|
-
typeof runtime.goals !== "object" ||
|
|
78
|
-
Array.isArray(runtime.goals)) {
|
|
79
|
-
throw new Error("governor service runtime has an unsupported schema");
|
|
80
|
-
}
|
|
81
|
-
return runtime;
|
|
82
|
-
}
|
|
83
|
-
export function readGovernorServiceStatus(coordRootRaw, dependencies = {}) {
|
|
84
|
-
const coordRoot = resolve(coordRootRaw);
|
|
85
|
-
const record = readStatusRecord(coordRoot);
|
|
86
|
-
let config;
|
|
87
|
-
let runtime;
|
|
88
|
-
try {
|
|
89
|
-
config = readGovernorServiceConfig(coordRoot);
|
|
90
|
-
}
|
|
91
|
-
catch {
|
|
92
|
-
// A service has no usable configuration until explicitly configured.
|
|
93
|
-
}
|
|
94
|
-
try {
|
|
95
|
-
runtime = readGovernorServiceRuntime(coordRoot);
|
|
96
|
-
}
|
|
97
|
-
catch {
|
|
98
|
-
// Status remains readable when recoverable runtime state is corrupt.
|
|
99
|
-
}
|
|
100
|
-
const observation = observeGovernorServiceProcess(record, dependencies);
|
|
101
|
-
if (!record && existsSync(serviceStatusPath(coordRoot)))
|
|
102
|
-
observation.liveness = "unknown";
|
|
103
|
-
return {
|
|
104
|
-
running: observation.liveness === "running" && record?.state !== "stopped",
|
|
105
|
-
stale: observation.liveness === "stopped" && record !== undefined && record.state !== "stopped",
|
|
106
|
-
...observation,
|
|
107
|
-
...governorServiceBuildStatus(record),
|
|
108
|
-
record,
|
|
109
|
-
config,
|
|
110
|
-
runtime,
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
64
|
export async function spawnGovernorService(coordRootRaw) {
|
|
114
65
|
const coordRoot = resolve(coordRootRaw);
|
|
115
66
|
readGovernorServiceConfig(coordRoot);
|
|
116
67
|
const current = readGovernorServiceStatus(coordRoot);
|
|
117
68
|
if (current.liveness !== "stopped") {
|
|
118
|
-
throw
|
|
69
|
+
throw startRefusal(coordRoot, current.record?.pid, current.liveness);
|
|
119
70
|
}
|
|
120
71
|
mkdirSync(serviceDir(coordRoot), { recursive: true, mode: stateDirMode() });
|
|
121
72
|
const sharedLogs = coordEnv("SHARED_LOGS") !== "0";
|
|
@@ -164,18 +115,7 @@ export function requestGovernorServiceStop(coordRootRaw, dependencies = {}) {
|
|
|
164
115
|
if ((status.record?.state === "stopped" || !status.record) && status.liveness === "stopped") {
|
|
165
116
|
return { ...status, signal_sent: false, signal_verdict: status.generation };
|
|
166
117
|
}
|
|
167
|
-
|
|
168
|
-
requested_at: new Date().toISOString(),
|
|
169
|
-
requested_by_pid: process.pid,
|
|
170
|
-
});
|
|
171
|
-
const signal = status.record?.host === hostname() && status.record.state !== "stopped"
|
|
172
|
-
? signalIfSameGeneration(status.record.pid, status.record.start_token, "SIGTERM", dependencies)
|
|
173
|
-
: { sent: false, verdict: status.generation };
|
|
174
|
-
return {
|
|
175
|
-
...readGovernorServiceStatus(coordRoot, dependencies),
|
|
176
|
-
signal_sent: signal.sent,
|
|
177
|
-
signal_verdict: signal.verdict,
|
|
178
|
-
};
|
|
118
|
+
return requestServiceStop(status, () => readGovernorServiceStatus(coordRoot, dependencies), serviceStopPath(coordRoot), dependencies);
|
|
179
119
|
}
|
|
180
120
|
export async function runGovernorServiceSweep(input) {
|
|
181
121
|
const coordRoot = resolve(input.coordRoot);
|
|
@@ -313,23 +253,17 @@ export async function runGovernorServiceSweep(input) {
|
|
|
313
253
|
export async function runGovernorServiceDaemon(input) {
|
|
314
254
|
const coordRoot = resolve(input.coordRoot);
|
|
315
255
|
const config = readGovernorServiceConfig(coordRoot);
|
|
316
|
-
const
|
|
317
|
-
if (
|
|
318
|
-
throw
|
|
319
|
-
}
|
|
320
|
-
if (existing) {
|
|
321
|
-
const liveness = statusOwnerIsLive(existing);
|
|
322
|
-
if (liveness !== "stopped")
|
|
323
|
-
throw serviceStartRefusal(coordRoot, existing.pid, liveness);
|
|
324
|
-
}
|
|
325
|
-
const release = acquireServiceLease(coordRoot);
|
|
256
|
+
const current = readGovernorServiceStatus(coordRoot);
|
|
257
|
+
if (current.liveness !== "stopped")
|
|
258
|
+
throw startRefusal(coordRoot, current.record?.pid, current.liveness);
|
|
259
|
+
const { release } = acquireServiceLease(serviceLeasePath(coordRoot), (pid, liveness) => startRefusal(coordRoot, pid, liveness), { running_build: installedHarneryBuild() });
|
|
326
260
|
rmSync(serviceStopPath(coordRoot), { force: true });
|
|
327
261
|
const now = new Date().toISOString();
|
|
328
262
|
const status = {
|
|
329
263
|
schema_version: GOVERNOR_SERVICE_STATUS_SCHEMA_VERSION,
|
|
330
264
|
pid: process.pid,
|
|
331
265
|
start_token: processStartToken(process.pid) ?? undefined,
|
|
332
|
-
running_build:
|
|
266
|
+
running_build: installedHarneryBuild(),
|
|
333
267
|
host: hostname(),
|
|
334
268
|
nonce: randomUUID(),
|
|
335
269
|
state: "starting",
|
|
@@ -537,107 +471,8 @@ function normalizeIsolation(value) {
|
|
|
537
471
|
}
|
|
538
472
|
throw new Error("service isolation must be shared, worktree, sandbox, or remote");
|
|
539
473
|
}
|
|
540
|
-
function
|
|
541
|
-
|
|
542
|
-
mkdirSync(dirname(path), { recursive: true, mode: stateDirMode() });
|
|
543
|
-
const owner = {
|
|
544
|
-
pid: process.pid,
|
|
545
|
-
start_token: processStartToken(process.pid) ?? undefined,
|
|
546
|
-
running_build: currentGovernorServiceBuild(),
|
|
547
|
-
host: hostname(),
|
|
548
|
-
nonce: randomUUID(),
|
|
549
|
-
created_at: new Date().toISOString(),
|
|
550
|
-
};
|
|
551
|
-
const acquire = () => {
|
|
552
|
-
try {
|
|
553
|
-
const fd = openSync(path, "wx", stateFileMode());
|
|
554
|
-
try {
|
|
555
|
-
writeFileSync(fd, `${JSON.stringify(owner)}\n`, "utf8");
|
|
556
|
-
}
|
|
557
|
-
finally {
|
|
558
|
-
closeSync(fd);
|
|
559
|
-
}
|
|
560
|
-
return true;
|
|
561
|
-
}
|
|
562
|
-
catch (error) {
|
|
563
|
-
if (error.code !== "EEXIST")
|
|
564
|
-
throw error;
|
|
565
|
-
return false;
|
|
566
|
-
}
|
|
567
|
-
};
|
|
568
|
-
if (!acquire()) {
|
|
569
|
-
const existing = readLease(path);
|
|
570
|
-
const liveness = existing ? leaseOwnerIsLive(existing) : "unknown";
|
|
571
|
-
if (liveness !== "stopped") {
|
|
572
|
-
throw serviceStartRefusal(coordRoot, existing?.pid, liveness);
|
|
573
|
-
}
|
|
574
|
-
unlinkSync(path);
|
|
575
|
-
if (!acquire())
|
|
576
|
-
throw new Error("governor service lease raced with another process");
|
|
577
|
-
}
|
|
578
|
-
return () => {
|
|
579
|
-
try {
|
|
580
|
-
const existing = readLease(path);
|
|
581
|
-
if (existing?.nonce === owner.nonce)
|
|
582
|
-
unlinkSync(path);
|
|
583
|
-
}
|
|
584
|
-
catch {
|
|
585
|
-
// A stale lease is recoverable by the next explicit service start.
|
|
586
|
-
}
|
|
587
|
-
};
|
|
588
|
-
}
|
|
589
|
-
function readLease(path) {
|
|
590
|
-
try {
|
|
591
|
-
const value = JSON.parse(readFileSync(path, "utf8"));
|
|
592
|
-
return Number.isSafeInteger(value.pid) &&
|
|
593
|
-
(value.pid ?? 0) > 0 &&
|
|
594
|
-
typeof value.host === "string" &&
|
|
595
|
-
typeof value.nonce === "string" &&
|
|
596
|
-
typeof value.created_at === "string"
|
|
597
|
-
? {
|
|
598
|
-
...value,
|
|
599
|
-
start_token: typeof value.start_token === "string" ? value.start_token : undefined,
|
|
600
|
-
}
|
|
601
|
-
: null;
|
|
602
|
-
}
|
|
603
|
-
catch {
|
|
604
|
-
return null;
|
|
605
|
-
}
|
|
606
|
-
}
|
|
607
|
-
function leaseOwnerIsLive(lease) {
|
|
608
|
-
return observeGovernorServiceProcess({ ...lease, state: "running" }).liveness;
|
|
609
|
-
}
|
|
610
|
-
function readStatusRecord(coordRoot) {
|
|
611
|
-
if (!existsSync(serviceStatusPath(coordRoot)))
|
|
612
|
-
return undefined;
|
|
613
|
-
try {
|
|
614
|
-
const value = readBoundedJson(serviceStatusPath(coordRoot), "governor service status");
|
|
615
|
-
if (value.schema_version !== GOVERNOR_SERVICE_STATUS_SCHEMA_VERSION ||
|
|
616
|
-
!Number.isSafeInteger(value.pid) ||
|
|
617
|
-
value.pid < 1 ||
|
|
618
|
-
typeof value.host !== "string" ||
|
|
619
|
-
typeof value.nonce !== "string" ||
|
|
620
|
-
!validTimestamp(value.started_at) ||
|
|
621
|
-
!validTimestamp(value.heartbeat_at)) {
|
|
622
|
-
return undefined;
|
|
623
|
-
}
|
|
624
|
-
return {
|
|
625
|
-
...value,
|
|
626
|
-
start_token: typeof value.start_token === "string" ? value.start_token : undefined,
|
|
627
|
-
};
|
|
628
|
-
}
|
|
629
|
-
catch {
|
|
630
|
-
return undefined;
|
|
631
|
-
}
|
|
632
|
-
}
|
|
633
|
-
function statusOwnerIsLive(record) {
|
|
634
|
-
return observeGovernorServiceProcess(record).liveness;
|
|
635
|
-
}
|
|
636
|
-
function serviceStartRefusal(coordRoot, pid, liveness) {
|
|
637
|
-
const reason = liveness === "unknown"
|
|
638
|
-
? `governor service process generation is unknown${pid ? ` for pid ${pid}` : ""}`
|
|
639
|
-
: `governor service process is still running under pid ${pid}`;
|
|
640
|
-
return new Error(`${reason}; run \`${resolveBinName(coordRoot)} governor service stop\` to write a durable stop request before starting or reconfiguring it`);
|
|
474
|
+
function startRefusal(coordRoot, pid, liveness) {
|
|
475
|
+
return serviceStartRefusal("governor service", `${resolveBinName(coordRoot)} governor service stop`, pid, liveness);
|
|
641
476
|
}
|
|
642
477
|
export function appendGovernorServiceDiagnostic(coordRoot, data) {
|
|
643
478
|
if (coordEnv("SHARED_LOGS") !== "0") {
|