harnery 0.38.0 → 0.40.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/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +32 -8
- package/dist/commands/artifacts.d.ts.map +1 -1
- package/dist/commands/artifacts.js +97 -6
- package/dist/commands/backup.d.ts +16 -0
- package/dist/commands/backup.d.ts.map +1 -1
- package/dist/commands/backup.js +239 -33
- package/dist/commands/browse.d.ts +8 -0
- package/dist/commands/browse.d.ts.map +1 -1
- package/dist/commands/browse.js +466 -231
- package/dist/commands/diagnostics.d.ts.map +1 -1
- package/dist/commands/diagnostics.js +6 -3
- package/dist/commands/ledger-v3.d.ts.map +1 -1
- package/dist/commands/ledger-v3.js +20 -4
- package/dist/commands/qa-run.d.ts.map +1 -1
- package/dist/commands/qa-run.js +26 -3
- package/dist/commands/qa-status.d.ts.map +1 -1
- package/dist/commands/qa-status.js +7 -2
- package/dist/commands/resources.d.ts.map +1 -1
- package/dist/commands/resources.js +23 -3
- package/dist/commands/review-pack.d.ts.map +1 -1
- package/dist/commands/review-pack.js +98 -23
- package/dist/commands/tunnel.d.ts.map +1 -1
- package/dist/commands/tunnel.js +2 -2
- package/dist/core/adapters/profiles.d.ts +1 -1
- package/dist/core/agents/canonical-emit.d.ts +3 -2
- package/dist/core/agents/canonical-emit.d.ts.map +1 -1
- package/dist/core/agents/canonical-emit.js +2 -0
- package/dist/core/agents/cli.js +13 -6
- package/dist/core/agents/live-authority-v3.d.ts.map +1 -1
- package/dist/core/agents/live-authority-v3.js +5 -3
- package/dist/core/agents/live-lifecycle-v3.d.ts +2 -2
- package/dist/core/agents/live-lifecycle-v3.d.ts.map +1 -1
- package/dist/core/agents/render/prompt-context.d.ts +7 -5
- package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
- package/dist/core/agents/render/prompt-context.js +63 -8
- package/dist/core/agents/session-finalizer-v3.d.ts +2 -2
- package/dist/core/agents/session-finalizer-v3.d.ts.map +1 -1
- package/dist/core/agents/state/live-coordination-view.d.ts +3 -3
- package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -1
- package/dist/core/agents/state/live-coordination-view.js +2 -1
- package/dist/core/agents/state/names.d.ts +35 -2
- package/dist/core/agents/state/names.d.ts.map +1 -1
- package/dist/core/agents/state/names.js +80 -5
- package/dist/core/agents/state/stale-sweep.d.ts +2 -1
- package/dist/core/agents/state/stale-sweep.d.ts.map +1 -1
- package/dist/core/agents/state/stale-sweep.js +23 -6
- package/dist/core/agents/turn-elapsed.d.ts +51 -0
- package/dist/core/agents/turn-elapsed.d.ts.map +1 -0
- package/dist/core/agents/turn-elapsed.js +91 -0
- package/dist/core/artifacts/activity.d.ts +14 -0
- package/dist/core/artifacts/activity.d.ts.map +1 -0
- package/dist/core/artifacts/activity.js +52 -0
- package/dist/core/artifacts/delivery-card.d.ts +39 -0
- package/dist/core/artifacts/delivery-card.d.ts.map +1 -0
- package/dist/core/artifacts/delivery-card.js +282 -0
- package/dist/core/artifacts/index.d.ts +42 -7
- package/dist/core/artifacts/index.d.ts.map +1 -1
- package/dist/core/artifacts/index.js +288 -76
- package/dist/core/artifacts/mutation-lock.d.ts +2 -0
- package/dist/core/artifacts/mutation-lock.d.ts.map +1 -0
- package/dist/core/artifacts/mutation-lock.js +91 -0
- package/dist/core/backup/host-snapshot.d.ts +18 -0
- package/dist/core/backup/host-snapshot.d.ts.map +1 -0
- package/dist/core/backup/host-snapshot.js +64 -0
- package/dist/core/config.d.ts +20 -5
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +44 -10
- package/dist/core/diagnostics/advice.d.ts +38 -3
- package/dist/core/diagnostics/advice.d.ts.map +1 -1
- package/dist/core/diagnostics/advice.js +103 -99
- package/dist/core/diagnostics/bundle.d.ts.map +1 -1
- package/dist/core/diagnostics/bundle.js +111 -47
- package/dist/core/diagnostics/comparison.d.ts.map +1 -1
- package/dist/core/diagnostics/comparison.js +3 -2
- package/dist/core/diagnostics/contract.d.ts +15 -31
- package/dist/core/diagnostics/contract.d.ts.map +1 -1
- package/dist/core/diagnostics/contract.js +2 -5
- package/dist/core/diagnostics/index.d.ts +2 -0
- package/dist/core/diagnostics/index.d.ts.map +1 -1
- package/dist/core/diagnostics/index.js +2 -0
- package/dist/core/diagnostics/pressure-contract.d.ts +260 -0
- package/dist/core/diagnostics/pressure-contract.d.ts.map +1 -0
- package/dist/core/diagnostics/pressure-contract.js +70 -0
- package/dist/core/diagnostics/pressure.d.ts +25 -0
- package/dist/core/diagnostics/pressure.d.ts.map +1 -0
- package/dist/core/diagnostics/pressure.js +1138 -0
- package/dist/core/diagnostics/replay.d.ts.map +1 -1
- package/dist/core/diagnostics/replay.js +90 -10
- package/dist/core/events/v3/adapter-id.d.ts +6 -0
- package/dist/core/events/v3/adapter-id.d.ts.map +1 -0
- package/dist/core/events/v3/adapter-id.js +7 -0
- package/dist/core/events/v3/archive-retention.d.ts.map +1 -1
- package/dist/core/events/v3/archive-retention.js +3 -2
- package/dist/core/events/v3/bootstrap.d.ts +41 -4
- package/dist/core/events/v3/bootstrap.d.ts.map +1 -1
- package/dist/core/events/v3/bootstrap.js +120 -17
- package/dist/core/events/v3/capabilities.d.ts +16 -9
- package/dist/core/events/v3/capabilities.d.ts.map +1 -1
- package/dist/core/events/v3/capabilities.js +37 -2
- package/dist/core/events/v3/capability-drift.d.ts +2 -2
- package/dist/core/events/v3/capability-drift.d.ts.map +1 -1
- package/dist/core/events/v3/control-witness.d.ts +48 -5
- package/dist/core/events/v3/control-witness.d.ts.map +1 -1
- package/dist/core/events/v3/control-witness.js +91 -36
- package/dist/core/events/v3/control.d.ts.map +1 -1
- package/dist/core/events/v3/control.js +22 -2
- package/dist/core/events/v3/index.d.ts +2 -1
- package/dist/core/events/v3/index.d.ts.map +1 -1
- package/dist/core/events/v3/index.js +2 -1
- package/dist/core/events/v3/live-feed.d.ts +7 -1
- package/dist/core/events/v3/live-feed.d.ts.map +1 -1
- package/dist/core/events/v3/live-feed.js +21 -3
- package/dist/core/events/v3/live-routing.d.ts.map +1 -1
- package/dist/core/events/v3/live-routing.js +10 -2
- package/dist/core/events/v3/producers/command-recorder.d.ts +2 -2
- package/dist/core/events/v3/producers/command-recorder.d.ts.map +1 -1
- package/dist/core/events/v3/producers/command-recorder.js +2 -1
- package/dist/core/events/v3/producers/coordination-recorder.d.ts +2 -2
- package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -1
- package/dist/core/events/v3/producers/coordination-recorder.js +2 -1
- package/dist/core/events/v3/producers/hook-base.d.ts +2 -2
- package/dist/core/events/v3/producers/hook-base.d.ts.map +1 -1
- package/dist/core/events/v3/producers/hook-base.js +15 -5
- package/dist/core/events/v3/producers/hook.d.ts.map +1 -1
- package/dist/core/events/v3/producers/hook.js +17 -4
- package/dist/core/events/v3/producers/intake.d.ts +4 -4
- package/dist/core/events/v3/producers/intake.d.ts.map +1 -1
- package/dist/core/events/v3/producers/intake.js +3 -2
- package/dist/core/events/v3/producers/producer-state-observer.d.ts.map +1 -1
- package/dist/core/events/v3/producers/producer-state-observer.js +2 -1
- package/dist/core/events/v3/producers/recorder.d.ts +16 -5
- package/dist/core/events/v3/producers/recorder.d.ts.map +1 -1
- package/dist/core/events/v3/producers/recorder.js +31 -9
- package/dist/core/events/v3/reader.d.ts.map +1 -1
- package/dist/core/events/v3/reader.js +10 -13
- package/dist/core/events/v3/runtime-build.d.ts.map +1 -1
- package/dist/core/events/v3/runtime-build.js +3 -2
- package/dist/core/events/v3/runtime-telemetry-capabilities.d.ts +2 -2
- package/dist/core/events/v3/runtime-telemetry-capabilities.d.ts.map +1 -1
- package/dist/core/events/v3/turn-telemetry.d.ts +2 -2
- package/dist/core/events/v3/turn-telemetry.d.ts.map +1 -1
- package/dist/core/hooks/adapter/output.d.ts +16 -14
- package/dist/core/hooks/adapter/output.d.ts.map +1 -1
- package/dist/core/hooks/adapter/output.js +36 -38
- package/dist/core/hooks/backup-schedule.d.ts +34 -0
- package/dist/core/hooks/backup-schedule.d.ts.map +1 -0
- package/dist/core/hooks/backup-schedule.js +114 -0
- package/dist/core/hooks/cli.js +61 -18
- package/dist/core/hooks/codex-wsl-bridge.d.ts +2 -0
- package/dist/core/hooks/codex-wsl-bridge.d.ts.map +1 -1
- package/dist/core/hooks/codex-wsl-bridge.js +18 -4
- package/dist/core/hooks/index.d.ts +1 -0
- package/dist/core/hooks/index.d.ts.map +1 -1
- package/dist/core/hooks/index.js +1 -0
- package/dist/core/hooks/prompt-context/contract.d.ts +61 -0
- package/dist/core/hooks/prompt-context/contract.d.ts.map +1 -0
- package/dist/core/hooks/prompt-context/contract.js +102 -0
- package/dist/core/hooks/prompt-context/index.d.ts +5 -0
- package/dist/core/hooks/prompt-context/index.d.ts.map +1 -0
- package/dist/core/hooks/prompt-context/index.js +2 -0
- package/dist/core/hooks/prompt-context/runner.d.ts +24 -0
- package/dist/core/hooks/prompt-context/runner.d.ts.map +1 -0
- package/dist/core/hooks/prompt-context/runner.js +249 -0
- package/dist/core/qa-artifacts.d.ts +3 -0
- package/dist/core/qa-artifacts.d.ts.map +1 -1
- package/dist/core/qa-artifacts.js +25 -3
- package/dist/core/resources/contract.d.ts +69 -3
- package/dist/core/resources/contract.d.ts.map +1 -1
- package/dist/core/resources/contract.js +1 -1
- package/dist/core/resources/index.d.ts +1 -0
- package/dist/core/resources/index.d.ts.map +1 -1
- package/dist/core/resources/index.js +1 -0
- package/dist/core/resources/native.d.ts +36 -0
- package/dist/core/resources/native.d.ts.map +1 -0
- package/dist/core/resources/native.js +418 -0
- package/dist/core/resources/sampler.d.ts +2 -0
- package/dist/core/resources/sampler.d.ts.map +1 -1
- package/dist/core/resources/sampler.js +31 -1
- package/dist/core/resources/status.d.ts +61 -0
- package/dist/core/resources/status.d.ts.map +1 -0
- package/dist/core/resources/status.js +536 -0
- package/dist/core/resources/system.d.ts +27 -0
- package/dist/core/resources/system.d.ts.map +1 -0
- package/dist/core/resources/system.js +439 -0
- package/dist/core/semantic/contract.d.ts +13 -13
- package/dist/core/semantic/service.d.ts +2 -0
- package/dist/core/semantic/service.d.ts.map +1 -1
- package/dist/core/semantic/service.js +27 -4
- package/dist/core/storage/builtins.js +41 -0
- package/dist/core/supervisor/contract.d.ts +41 -3
- package/dist/core/supervisor/contract.d.ts.map +1 -1
- package/dist/core/supervisor/contract.js +3 -2
- package/dist/core/supervisor/findings.d.ts +3 -0
- package/dist/core/supervisor/findings.d.ts.map +1 -1
- package/dist/core/supervisor/findings.js +88 -0
- package/dist/core/supervisor/history.d.ts.map +1 -1
- package/dist/core/supervisor/history.js +14 -0
- package/dist/core/supervisor/ledger-state.d.ts +55 -0
- package/dist/core/supervisor/ledger-state.d.ts.map +1 -0
- package/dist/core/supervisor/ledger-state.js +0 -0
- package/dist/core/supervisor/service.d.ts.map +1 -1
- package/dist/core/supervisor/service.js +120 -7
- package/dist/core/supervisor/storage.d.ts +3 -1
- package/dist/core/supervisor/storage.d.ts.map +1 -1
- package/dist/core/supervisor/storage.js +4 -0
- package/dist/core/workflow/admission.d.ts +3 -0
- package/dist/core/workflow/admission.d.ts.map +1 -1
- package/dist/core/workflow/admission.js +28 -16
- package/dist/core/workflow/engine.js +2 -2
- package/dist/core/workflow/live-session-v3.d.ts.map +1 -1
- package/dist/core/workflow/live-session-v3.js +6 -1
- package/dist/core/workflow/proof.d.ts.map +1 -1
- package/dist/core/workflow/proof.js +4 -3
- package/dist/lib/browser/capture-fidelity.d.ts +7 -0
- package/dist/lib/browser/capture-fidelity.d.ts.map +1 -1
- package/dist/lib/browser/capture-fidelity.js +17 -0
- package/dist/lib/browser/client.d.ts +9 -0
- package/dist/lib/browser/client.d.ts.map +1 -1
- package/dist/lib/browser/client.js +85 -37
- package/dist/lib/browser/index.d.ts +3 -1
- package/dist/lib/browser/index.d.ts.map +1 -1
- package/dist/lib/browser/index.js +2 -1
- package/dist/lib/browser/page-review-budget.d.ts +13 -0
- package/dist/lib/browser/page-review-budget.d.ts.map +1 -0
- package/dist/lib/browser/page-review-budget.js +251 -0
- package/dist/lib/browser/page-review-contracts.d.ts +127 -0
- package/dist/lib/browser/page-review-contracts.d.ts.map +1 -0
- package/dist/lib/browser/page-review-contracts.js +5 -0
- package/dist/lib/browser/page-review-evidence.d.ts +48 -0
- package/dist/lib/browser/page-review-evidence.d.ts.map +1 -0
- package/dist/lib/browser/page-review-evidence.js +340 -0
- package/dist/lib/browser/page-review-judge.d.ts +1 -1
- package/dist/lib/browser/page-review-judge.d.ts.map +1 -1
- package/dist/lib/browser/page-review-judge.js +46 -38
- package/dist/lib/browser/page-review-pack.d.ts +44 -22
- package/dist/lib/browser/page-review-pack.d.ts.map +1 -1
- package/dist/lib/browser/page-review-pack.js +116 -36
- package/dist/lib/browser/page-review-source.d.ts +12 -0
- package/dist/lib/browser/page-review-source.d.ts.map +1 -0
- package/dist/lib/browser/page-review-source.js +22 -0
- package/dist/lib/browser/qa-run-contracts.d.ts +35 -9
- package/dist/lib/browser/qa-run-contracts.d.ts.map +1 -1
- package/dist/lib/browser/qa-run-contracts.js +48 -14
- package/dist/lib/browser/qa-run.d.ts.map +1 -1
- package/dist/lib/browser/qa-run.js +215 -68
- package/dist/lib/browser/qa-snapshot.d.ts +6 -0
- package/dist/lib/browser/qa-snapshot.d.ts.map +1 -1
- package/dist/lib/browser/qa-snapshot.js +259 -48
- package/dist/lib/browser/review-capture-transaction.d.ts +13 -0
- package/dist/lib/browser/review-capture-transaction.d.ts.map +1 -0
- package/dist/lib/browser/review-capture-transaction.js +79 -0
- package/dist/lib/browser/standalone-html.d.ts.map +1 -1
- package/dist/lib/browser/standalone-html.js +4 -2
- package/dist/lib/browser/thumbnail-association.d.ts +34 -0
- package/dist/lib/browser/thumbnail-association.d.ts.map +1 -0
- package/dist/lib/browser/thumbnail-association.js +158 -0
- package/dist/lib/browser/tiling.d.ts +30 -0
- package/dist/lib/browser/tiling.d.ts.map +1 -1
- package/dist/lib/browser/tiling.js +38 -0
- package/dist/lib/docs-metadata-managed.d.ts.map +1 -1
- package/dist/lib/docs-metadata-managed.js +4 -1
- package/dist/lib/identities/assume.d.ts.map +1 -1
- package/dist/lib/identities/assume.js +7 -1
- package/dist/lib/instructions/templates.d.ts.map +1 -1
- package/dist/lib/instructions/templates.js +1 -0
- package/dist/lib/local-file-url.d.ts +12 -0
- package/dist/lib/local-file-url.d.ts.map +1 -1
- package/dist/lib/local-file-url.js +16 -2
- package/dist/lib/tunnel/state.d.ts +19 -4
- package/dist/lib/tunnel/state.d.ts.map +1 -1
- package/dist/lib/tunnel/state.js +53 -13
- package/package.json +7 -4
- package/schemas/config.schema.json +69 -2
- package/src/commands/agents.ts +42 -9
- package/src/commands/artifacts.ts +130 -6
- package/src/commands/backup.ts +287 -34
- package/src/commands/browse.ts +564 -267
- package/src/commands/diagnostics.ts +6 -3
- package/src/commands/ledger-v3.ts +20 -3
- package/src/commands/qa-run.ts +37 -3
- package/src/commands/qa-status.ts +11 -2
- package/src/commands/resources.ts +23 -3
- package/src/commands/review-pack.ts +165 -62
- package/src/commands/tunnel.ts +2 -1
- package/src/core/agents/canonical-emit.ts +4 -2
- package/src/core/agents/cli.ts +14 -6
- package/src/core/agents/live-authority-v3.ts +7 -3
- package/src/core/agents/live-lifecycle-v3.ts +2 -2
- package/src/core/agents/render/prompt-context.ts +68 -14
- package/src/core/agents/session-finalizer-v3.ts +2 -2
- package/src/core/agents/state/live-coordination-view.ts +4 -4
- package/src/core/agents/state/names.ts +92 -7
- package/src/core/agents/state/stale-sweep.ts +22 -8
- package/src/core/agents/turn-elapsed.ts +135 -0
- package/src/core/artifacts/activity.ts +71 -0
- package/src/core/artifacts/delivery-card.ts +375 -0
- package/src/core/artifacts/index.ts +385 -91
- package/src/core/artifacts/mutation-lock.ts +106 -0
- package/src/core/backup/host-snapshot.ts +76 -0
- package/src/core/config.ts +66 -13
- package/src/core/diagnostics/advice.ts +148 -120
- package/src/core/diagnostics/bundle.ts +138 -52
- package/src/core/diagnostics/comparison.ts +6 -2
- package/src/core/diagnostics/contract.ts +39 -42
- package/src/core/diagnostics/index.ts +2 -0
- package/src/core/diagnostics/pressure-contract.ts +294 -0
- package/src/core/diagnostics/pressure.ts +1361 -0
- package/src/core/diagnostics/replay.ts +116 -11
- package/src/core/events/v3/adapter-id.ts +12 -0
- package/src/core/events/v3/archive-retention.ts +3 -6
- package/src/core/events/v3/bootstrap.ts +163 -16
- package/src/core/events/v3/capabilities.ts +75 -25
- package/src/core/events/v3/capability-drift.ts +2 -2
- package/src/core/events/v3/control-witness.ts +172 -41
- package/src/core/events/v3/control.ts +34 -2
- package/src/core/events/v3/index.ts +3 -0
- package/src/core/events/v3/live-feed.ts +23 -5
- package/src/core/events/v3/live-routing.ts +14 -2
- package/src/core/events/v3/producers/command-recorder.ts +4 -4
- package/src/core/events/v3/producers/coordination-recorder.ts +4 -4
- package/src/core/events/v3/producers/hook-base.ts +21 -16
- package/src/core/events/v3/producers/hook.ts +21 -4
- package/src/core/events/v3/producers/intake.ts +6 -6
- package/src/core/events/v3/producers/producer-state-observer.ts +2 -1
- package/src/core/events/v3/producers/recorder.ts +50 -21
- package/src/core/events/v3/reader.ts +14 -13
- package/src/core/events/v3/runtime-build.ts +3 -2
- package/src/core/events/v3/runtime-telemetry-capabilities.ts +3 -3
- package/src/core/events/v3/turn-telemetry.ts +4 -4
- package/src/core/hooks/adapter/output.ts +50 -36
- package/src/core/hooks/backup-schedule.ts +147 -0
- package/src/core/hooks/cli.ts +65 -14
- package/src/core/hooks/codex-wsl-bridge.ts +21 -5
- package/src/core/hooks/index.ts +1 -0
- package/src/core/hooks/prompt-context/contract.ts +177 -0
- package/src/core/hooks/prompt-context/index.ts +22 -0
- package/src/core/hooks/prompt-context/runner.ts +303 -0
- package/src/core/qa-artifacts.ts +29 -3
- package/src/core/resources/contract.ts +76 -3
- package/src/core/resources/index.ts +1 -0
- package/src/core/resources/native.ts +481 -0
- package/src/core/resources/sampler.ts +46 -1
- package/src/core/resources/status.ts +717 -0
- package/src/core/resources/system.ts +530 -0
- package/src/core/semantic/service.ts +37 -3
- package/src/core/storage/builtins.ts +41 -0
- package/src/core/supervisor/contract.ts +45 -3
- package/src/core/supervisor/findings.ts +159 -0
- package/src/core/supervisor/history.ts +15 -0
- package/src/core/supervisor/ledger-state.ts +0 -0
- package/src/core/supervisor/service.ts +133 -5
- package/src/core/supervisor/storage.ts +7 -0
- package/src/core/workflow/admission.ts +33 -17
- package/src/core/workflow/engine.ts +2 -2
- package/src/core/workflow/live-session-v3.ts +6 -8
- package/src/core/workflow/proof.ts +4 -3
- package/src/lib/browser/capture-fidelity.ts +23 -0
- package/src/lib/browser/client.ts +96 -44
- package/src/lib/browser/index.ts +15 -1
- package/src/lib/browser/page-review-budget.ts +309 -0
- package/src/lib/browser/page-review-contracts.ts +129 -0
- package/src/lib/browser/page-review-evidence.ts +465 -0
- package/src/lib/browser/page-review-judge.ts +56 -40
- package/src/lib/browser/page-review-pack.ts +181 -43
- package/src/lib/browser/page-review-source.ts +30 -0
- package/src/lib/browser/qa-run-contracts.ts +62 -18
- package/src/lib/browser/qa-run.ts +259 -71
- package/src/lib/browser/qa-snapshot.ts +289 -48
- package/src/lib/browser/review-capture-transaction.ts +106 -0
- package/src/lib/browser/standalone-html.ts +4 -2
- package/src/lib/browser/thumbnail-association.ts +190 -0
- package/src/lib/browser/tiling.ts +63 -0
- package/src/lib/docs-metadata-managed.ts +4 -1
- package/src/lib/identities/assume.ts +12 -4
- package/src/lib/instructions/templates.ts +1 -0
- package/src/lib/local-file-url.ts +17 -2
- package/src/lib/tunnel/state.ts +70 -13
|
@@ -17,6 +17,11 @@ export { readSemanticServiceStatus, SEMANTIC_SERVICE_STATUS_SCHEMA_VERSION, } fr
|
|
|
17
17
|
export const SEMANTIC_SERVICE_DEFAULT_DEBOUNCE_MS = 5_000;
|
|
18
18
|
export const SEMANTIC_SERVICE_DEFAULT_WAKE_MS = 1_000;
|
|
19
19
|
export const SEMANTIC_SERVICE_DEFAULT_HEARTBEAT_MS = 5_000;
|
|
20
|
+
// Ceiling for the wake timer while sweeps find nothing. The timer is only the fallback
|
|
21
|
+
// behind fs.watch on the active ledger, so backing it off delays nothing that writes an
|
|
22
|
+
// event; it stops an idle daemon from re-reading the manifest and agent documents once a
|
|
23
|
+
// second all night. Observed 2026-09-06: 142,637 sweeps in 70 h, 10,291 of them passes.
|
|
24
|
+
export const SEMANTIC_SERVICE_DEFAULT_IDLE_WAKE_MAX_MS = 30_000;
|
|
20
25
|
const FOREIGN_STATUS_STALE_MS = 2 * 60_000;
|
|
21
26
|
const MAX_FILE_BYTES = 512 * 1024;
|
|
22
27
|
const MAX_LOG_BYTES = 512 * 1024;
|
|
@@ -151,6 +156,7 @@ export async function runSemanticServiceDaemon(input) {
|
|
|
151
156
|
const debounceMs = Math.max(0, input.debounceMs ?? SEMANTIC_SERVICE_DEFAULT_DEBOUNCE_MS);
|
|
152
157
|
const wakeIntervalMs = positiveInterval(input.wakeIntervalMs ?? SEMANTIC_SERVICE_DEFAULT_WAKE_MS, "wake interval");
|
|
153
158
|
const heartbeatIntervalMs = positiveInterval(input.heartbeatIntervalMs ?? SEMANTIC_SERVICE_DEFAULT_HEARTBEAT_MS, "heartbeat interval");
|
|
159
|
+
const idleWakeMaxMs = Math.max(wakeIntervalMs, positiveInterval(input.idleWakeMaxMs ?? SEMANTIC_SERVICE_DEFAULT_IDLE_WAKE_MAX_MS, "idle wake ceiling"));
|
|
154
160
|
const readSince = input.readSince ?? readLedgerV3Since;
|
|
155
161
|
const runOnce = input.runOnce ??
|
|
156
162
|
(async (options) => await runSemanticOnce({
|
|
@@ -177,6 +183,8 @@ export async function runSemanticServiceDaemon(input) {
|
|
|
177
183
|
};
|
|
178
184
|
let stopRequested = false;
|
|
179
185
|
let dirtySince;
|
|
186
|
+
let idleSweeps = 0;
|
|
187
|
+
let wakeEarly;
|
|
180
188
|
let lastLoggedErrorCode;
|
|
181
189
|
let lastLoggedErrorAt = Number.NEGATIVE_INFINITY;
|
|
182
190
|
const writeStatus = () => {
|
|
@@ -187,6 +195,8 @@ export async function runSemanticServiceDaemon(input) {
|
|
|
187
195
|
stopRequested = true;
|
|
188
196
|
status.state = "stopping";
|
|
189
197
|
writeStatus();
|
|
198
|
+
// A backed-off wait must not hold a stop request for up to the idle ceiling.
|
|
199
|
+
wakeEarly?.();
|
|
190
200
|
};
|
|
191
201
|
process.on("SIGINT", requestStop);
|
|
192
202
|
process.on("SIGTERM", requestStop);
|
|
@@ -205,6 +215,7 @@ export async function runSemanticServiceDaemon(input) {
|
|
|
205
215
|
while (!stopRequested && !existsSync(paths.stop)) {
|
|
206
216
|
const sweepAt = now();
|
|
207
217
|
status.sweep_count += 1;
|
|
218
|
+
let sawWork = false;
|
|
208
219
|
try {
|
|
209
220
|
const before = safeManifest(coordRoot);
|
|
210
221
|
let read = readSince(coordRoot, before?.cursor, { authority: "active" });
|
|
@@ -212,6 +223,8 @@ export async function runSemanticServiceDaemon(input) {
|
|
|
212
223
|
read = readSince(coordRoot, undefined, { authority: "active" });
|
|
213
224
|
}
|
|
214
225
|
requireCompleteLedger(read);
|
|
226
|
+
if (read.events.length > 0)
|
|
227
|
+
sawWork = true;
|
|
215
228
|
if (read.events.length > 0 || !before?.cursor) {
|
|
216
229
|
dirtySince ??= sweepAt.getTime();
|
|
217
230
|
}
|
|
@@ -236,6 +249,7 @@ export async function runSemanticServiceDaemon(input) {
|
|
|
236
249
|
shouldStop: () => stopRequested || existsSync(paths.stop),
|
|
237
250
|
});
|
|
238
251
|
status.pass_count += 1;
|
|
252
|
+
sawWork = true;
|
|
239
253
|
status.model_calls += report.model_calls;
|
|
240
254
|
status.cache_hits += report.cache_hits;
|
|
241
255
|
status.process_usage = mergeSemanticUsageAggregates(status.process_usage ?? emptySemanticUsageAggregate(), aggregateSemanticUsage(report.outcomes));
|
|
@@ -282,13 +296,21 @@ export async function runSemanticServiceDaemon(input) {
|
|
|
282
296
|
}
|
|
283
297
|
status.last_sweep_at = now().toISOString();
|
|
284
298
|
writeStatus();
|
|
299
|
+
idleSweeps = sawWork ? 0 : idleSweeps + 1;
|
|
285
300
|
if (input.maxSweeps !== undefined && status.sweep_count >= input.maxSweeps)
|
|
286
301
|
break;
|
|
287
302
|
if (!stopRequested && !existsSync(paths.stop)) {
|
|
303
|
+
// Double the fallback timer per idle sweep, up to the ceiling; any sweep that
|
|
304
|
+
// sees events or runs a pass snaps it back to the configured interval.
|
|
305
|
+
const waitMs = Math.min(idleWakeMaxMs, wakeIntervalMs * 2 ** Math.min(idleSweeps, 20));
|
|
288
306
|
if (input.waitForWake)
|
|
289
|
-
await input.waitForWake(
|
|
290
|
-
else
|
|
291
|
-
await waitForLedgerWake(eventV3ActiveWatchPath(coordRoot),
|
|
307
|
+
await input.waitForWake(waitMs);
|
|
308
|
+
else {
|
|
309
|
+
await waitForLedgerWake(eventV3ActiveWatchPath(coordRoot), waitMs, (wake) => {
|
|
310
|
+
wakeEarly = wake;
|
|
311
|
+
});
|
|
312
|
+
wakeEarly = undefined;
|
|
313
|
+
}
|
|
292
314
|
}
|
|
293
315
|
}
|
|
294
316
|
}
|
|
@@ -453,7 +475,7 @@ function pidAlive(pid) {
|
|
|
453
475
|
return error.code === "EPERM";
|
|
454
476
|
}
|
|
455
477
|
}
|
|
456
|
-
async function waitForLedgerWake(path, milliseconds) {
|
|
478
|
+
async function waitForLedgerWake(path, milliseconds, onWait) {
|
|
457
479
|
await new Promise((done) => {
|
|
458
480
|
let settled = false;
|
|
459
481
|
let watcher;
|
|
@@ -472,6 +494,7 @@ async function waitForLedgerWake(path, milliseconds) {
|
|
|
472
494
|
catch {
|
|
473
495
|
// The timer is the polling fallback when the active file does not exist yet.
|
|
474
496
|
}
|
|
497
|
+
onWait?.(finish);
|
|
475
498
|
});
|
|
476
499
|
}
|
|
477
500
|
export function appendSemanticServiceDiagnostic(coordRoot, entry) {
|
|
@@ -289,6 +289,42 @@ function durableHistoryFamilies() {
|
|
|
289
289
|
}));
|
|
290
290
|
return [
|
|
291
291
|
...histories,
|
|
292
|
+
family({
|
|
293
|
+
id: "agent-mailbox-history",
|
|
294
|
+
owner: "agent mailbox service",
|
|
295
|
+
storage_class: "durable-object-history",
|
|
296
|
+
roots: (context) => [subtree(context, ".harnery/mailbox")],
|
|
297
|
+
format: "jsonl",
|
|
298
|
+
durability: "crash-safe",
|
|
299
|
+
writer_model: "multi-process",
|
|
300
|
+
policy: ownerHistoryPolicy("agent-mailbox-history-v1"),
|
|
301
|
+
consumers: ["agent mailbox service", "prompt delivery", "storage inventory"],
|
|
302
|
+
provider: filesystemProvider("agent-mailbox-provider", "agent mailbox lifecycle"),
|
|
303
|
+
}),
|
|
304
|
+
family({
|
|
305
|
+
id: "workflow-approval-history",
|
|
306
|
+
owner: "workflow approval service",
|
|
307
|
+
storage_class: "durable-object-history",
|
|
308
|
+
roots: (context) => [subtree(context, ".harnery/approvals")],
|
|
309
|
+
format: "json",
|
|
310
|
+
durability: "crash-safe",
|
|
311
|
+
writer_model: "object-owned",
|
|
312
|
+
policy: ownerHistoryPolicy("workflow-approval-history-v1"),
|
|
313
|
+
consumers: ["workflow approval service", "governor service", "storage inventory"],
|
|
314
|
+
provider: filesystemProvider("workflow-approval-provider", "workflow approval lifecycle"),
|
|
315
|
+
}),
|
|
316
|
+
family({
|
|
317
|
+
id: "agent-name-history",
|
|
318
|
+
owner: "agent identity service",
|
|
319
|
+
storage_class: "durable-object-history",
|
|
320
|
+
roots: (context) => [exact(context, ".harnery/.name-history", "file")],
|
|
321
|
+
format: "jsonl",
|
|
322
|
+
durability: "crash-safe",
|
|
323
|
+
writer_model: "multi-process",
|
|
324
|
+
policy: ownerHistoryPolicy("agent-name-history-v1"),
|
|
325
|
+
consumers: ["agent identity service", "session rendering", "storage inventory"],
|
|
326
|
+
provider: filesystemProvider("agent-name-history-provider", "agent identity lifecycle"),
|
|
327
|
+
}),
|
|
292
328
|
family({
|
|
293
329
|
id: "project-configuration",
|
|
294
330
|
owner: "Harnery configuration service",
|
|
@@ -325,6 +361,11 @@ function durableHistoryFamilies() {
|
|
|
325
361
|
function cacheFamilies() {
|
|
326
362
|
const definitions = [
|
|
327
363
|
["active-agent-projection", ".harnery/active", "Event Ledger V3 and native heartbeats"],
|
|
364
|
+
[
|
|
365
|
+
"storage-dashboard-cache",
|
|
366
|
+
".harnery/cache/storage-footprint",
|
|
367
|
+
"canonical metadata-only storage inventory",
|
|
368
|
+
],
|
|
328
369
|
["pid-map-cache", ".harnery/pid-map", "active native process observations"],
|
|
329
370
|
["remote-presence-cache", ".harnery/presence/remote", "presence relay observations"],
|
|
330
371
|
["event-v3-live-display", ".harnery/live/v3", "Event Ledger V3 canonical events"],
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import type { PressureAssessment, PressureHysteresisState } from "../diagnostics/pressure-contract.js";
|
|
1
2
|
import type { ResourceProcessGroup } from "../resources/contract.js";
|
|
2
3
|
import type { HarneryLogRecordV1 } from "../storage/jsonl.js";
|
|
3
4
|
export declare const SUPERVISOR_STATUS_SCHEMA_VERSION: 1;
|
|
4
5
|
export declare const SUPERVISOR_SNAPSHOT_SCHEMA_VERSION: 2;
|
|
5
|
-
export declare const SUPERVISOR_HISTORY_SCHEMA_VERSION:
|
|
6
|
-
export declare const SUPERVISOR_FINDING_SCHEMA_VERSION:
|
|
6
|
+
export declare const SUPERVISOR_HISTORY_SCHEMA_VERSION: 2;
|
|
7
|
+
export declare const SUPERVISOR_FINDING_SCHEMA_VERSION: 3;
|
|
8
|
+
export declare const SUPERVISOR_PRESSURE_SCHEMA_VERSION: 1;
|
|
7
9
|
export declare const SUPERVISOR_ACTIVITY_SCHEMA_VERSION: 1;
|
|
8
10
|
export declare const SUPERVISOR_TIMELINE_SCHEMA_VERSION: 2;
|
|
9
11
|
export declare const SUPERVISOR_EXPLANATION_SCHEMA_VERSION: 1;
|
|
@@ -96,7 +98,18 @@ export interface SupervisorHistoryPoint {
|
|
|
96
98
|
memory_percent: number | null;
|
|
97
99
|
memory_used_bytes: number | null;
|
|
98
100
|
swap_used_bytes: number | null;
|
|
99
|
-
process_count: number;
|
|
101
|
+
process_count: number | null;
|
|
102
|
+
load_average_1?: number | null;
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* The contention readings the pressure trend follows. Null when the platform
|
|
106
|
+
* does not expose a dimension, never zero, so a gap cannot read as calm.
|
|
107
|
+
*/
|
|
108
|
+
pressure: {
|
|
109
|
+
memory_full_avg10: number | null;
|
|
110
|
+
io_full_avg10: number | null;
|
|
111
|
+
cpu_some_avg60: number | null;
|
|
112
|
+
swap_out_bytes_per_second: number | null;
|
|
100
113
|
};
|
|
101
114
|
groups: readonly ResourceProcessGroup[];
|
|
102
115
|
}
|
|
@@ -108,6 +121,16 @@ export interface SupervisorHistory {
|
|
|
108
121
|
}
|
|
109
122
|
export type SupervisorCapabilityState = "supported" | "partial" | "unsupported" | "error" | "expired" | "malformed" | "redacted";
|
|
110
123
|
export type SupervisorFindingSeverity = "info" | "warning" | "critical";
|
|
124
|
+
/**
|
|
125
|
+
* Why a finding exists, and therefore what it may influence.
|
|
126
|
+
*
|
|
127
|
+
* `contention` findings report that a shared resource is actually contended,
|
|
128
|
+
* and are the only class the pressure assessment may read as machine state.
|
|
129
|
+
* `attribution` findings name who holds a resource; they are always carried as
|
|
130
|
+
* contributors and never set state. `diagnostic` findings report that an
|
|
131
|
+
* observation path itself is degraded.
|
|
132
|
+
*/
|
|
133
|
+
export type SupervisorFindingClass = "contention" | "attribution" | "diagnostic";
|
|
111
134
|
export type SupervisorFindingState = "opened" | "resolved";
|
|
112
135
|
export interface SupervisorCapability {
|
|
113
136
|
source_kind: string;
|
|
@@ -152,6 +175,7 @@ export interface SupervisorFinding {
|
|
|
152
175
|
fingerprint: string;
|
|
153
176
|
source_kind: string;
|
|
154
177
|
finding_kind: string;
|
|
178
|
+
finding_class: SupervisorFindingClass;
|
|
155
179
|
severity: SupervisorFindingSeverity;
|
|
156
180
|
state: SupervisorFindingState;
|
|
157
181
|
scope_kind: string;
|
|
@@ -187,6 +211,20 @@ export interface SupervisorActivitySnapshot {
|
|
|
187
211
|
omitted_entry_count: number;
|
|
188
212
|
capability: SupervisorCapability;
|
|
189
213
|
}
|
|
214
|
+
/**
|
|
215
|
+
* The pressure assessment the observer published on its last cycle, with the
|
|
216
|
+
* hysteresis state that produced it. The observer is the only writer, because
|
|
217
|
+
* it is the only reader that sees consecutive samples; every other surface
|
|
218
|
+
* reads this record so all of them report the same assessment.
|
|
219
|
+
*/
|
|
220
|
+
export interface SupervisorPressureRecord {
|
|
221
|
+
schema_version: typeof SUPERVISOR_PRESSURE_SCHEMA_VERSION;
|
|
222
|
+
published_at: string;
|
|
223
|
+
/** Identity of the observer run, so a restart resets carried-forward streaks. */
|
|
224
|
+
observer_generation: string;
|
|
225
|
+
assessment: PressureAssessment;
|
|
226
|
+
prior_hysteresis: PressureHysteresisState | null;
|
|
227
|
+
}
|
|
190
228
|
export interface SupervisorFindings {
|
|
191
229
|
schema_version: typeof SUPERVISOR_FINDING_SCHEMA_VERSION;
|
|
192
230
|
max_findings: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../../src/core/supervisor/contract.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../../src/core/supervisor/contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
export const SUPERVISOR_STATUS_SCHEMA_VERSION = 1;
|
|
2
2
|
export const SUPERVISOR_SNAPSHOT_SCHEMA_VERSION = 2;
|
|
3
|
-
export const SUPERVISOR_HISTORY_SCHEMA_VERSION =
|
|
4
|
-
export const SUPERVISOR_FINDING_SCHEMA_VERSION =
|
|
3
|
+
export const SUPERVISOR_HISTORY_SCHEMA_VERSION = 2;
|
|
4
|
+
export const SUPERVISOR_FINDING_SCHEMA_VERSION = 3;
|
|
5
|
+
export const SUPERVISOR_PRESSURE_SCHEMA_VERSION = 1;
|
|
5
6
|
export const SUPERVISOR_ACTIVITY_SCHEMA_VERSION = 1;
|
|
6
7
|
export const SUPERVISOR_TIMELINE_SCHEMA_VERSION = 2;
|
|
7
8
|
export const SUPERVISOR_EXPLANATION_SCHEMA_VERSION = 1;
|
|
@@ -2,6 +2,7 @@ import type { CoordinationHealthSnapshot } from "../agents/health.js";
|
|
|
2
2
|
import type { ResourceSnapshot } from "../resources/contract.js";
|
|
3
3
|
import { type ObservedHookHealth, type ObservedServiceHealth, type SupervisorActivitySnapshot, type SupervisorFinding, type SupervisorFindings, type SupervisorHistory, type SupervisorLogFeed } from "./contract.js";
|
|
4
4
|
import type { SupervisorHookHealth } from "./hook-health.js";
|
|
5
|
+
import { type LedgerControlStateFindingInputV1 } from "./ledger-state.js";
|
|
5
6
|
export interface SupervisorFindingEvaluationInput {
|
|
6
7
|
previous?: SupervisorFindings;
|
|
7
8
|
resource: ResourceSnapshot;
|
|
@@ -12,6 +13,8 @@ export interface SupervisorFindingEvaluationInput {
|
|
|
12
13
|
hookHealth?: SupervisorHookHealth;
|
|
13
14
|
coordination?: CoordinationHealthSnapshot;
|
|
14
15
|
activity?: SupervisorActivitySnapshot;
|
|
16
|
+
/** Event ledger control drift, when the caller observed the control state. */
|
|
17
|
+
ledgerControlState?: LedgerControlStateFindingInputV1;
|
|
15
18
|
now?: Date;
|
|
16
19
|
}
|
|
17
20
|
/** Pure deterministic evaluator used by the live supervisor and replay. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findings.d.ts","sourceRoot":"","sources":["../../../src/core/supervisor/findings.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,KAAK,EAGV,gBAAgB,EACjB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAI1B,KAAK,0BAA0B,EAE/B,KAAK,iBAAiB,
|
|
1
|
+
{"version":3,"file":"findings.d.ts","sourceRoot":"","sources":["../../../src/core/supervisor/findings.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,KAAK,EAGV,gBAAgB,EACjB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAI1B,KAAK,0BAA0B,EAE/B,KAAK,iBAAiB,EAKtB,KAAK,kBAAkB,EAEvB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EAEvB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAE7D,OAAO,EACL,KAAK,gCAAgC,EAEtC,MAAM,mBAAmB,CAAC;AA8B3B,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,QAAQ,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAC3C,KAAK,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACrC,OAAO,EAAE,iBAAiB,CAAC;IAC3B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAClC,YAAY,CAAC,EAAE,0BAA0B,CAAC;IAC1C,QAAQ,CAAC,EAAE,0BAA0B,CAAC;IACtC,8EAA8E;IAC9E,kBAAkB,CAAC,EAAE,gCAAgC,CAAC;IACtD,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED,2EAA2E;AAC3E,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,IAAI,CAAC,gCAAgC,EAAE,UAAU,CAAC,GACxD,SAAS,iBAAiB,EAAE,CAE9B;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,gCAAgC,GACtC,kBAAkB,CAyEpB"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { SUPERVISOR_DIAGNOSTIC_LIMITS, SUPERVISOR_FINDING_POLICY, SUPERVISOR_FINDING_SCHEMA_VERSION, } from "./contract.js";
|
|
3
3
|
import { evaluateHookHealthAlerts } from "./hook-health-alerts.js";
|
|
4
|
+
import { ledgerControlStateFindingCandidateV1, } from "./ledger-state.js";
|
|
4
5
|
const GIB = 1_024 * 1_024 * 1_024;
|
|
5
6
|
const MIB = 1_024 * 1_024;
|
|
6
7
|
const MACHINE_CPU_THRESHOLD = 90;
|
|
@@ -51,6 +52,7 @@ export function updateSupervisorFindings(input) {
|
|
|
51
52
|
fingerprint,
|
|
52
53
|
source_kind: candidate.source_kind,
|
|
53
54
|
finding_kind: candidate.finding_kind,
|
|
55
|
+
finding_class: candidate.finding_class,
|
|
54
56
|
severity: candidate.severity,
|
|
55
57
|
state: "opened",
|
|
56
58
|
scope_kind: candidate.scope_kind,
|
|
@@ -114,6 +116,69 @@ function evaluateCandidates(input) {
|
|
|
114
116
|
: null;
|
|
115
117
|
if ((swapPercent ?? 0) >= MACHINE_SWAP_THRESHOLD)
|
|
116
118
|
addMachine("machine.swap-pressure", "warning", `Machine swap is ${swapPercent}% used.`, swapPercent, "percent");
|
|
119
|
+
for (const disk of input.resource.disks ?? []) {
|
|
120
|
+
if (disk.state !== "supported" || disk.available_bytes === null || disk.used_percent === null)
|
|
121
|
+
continue;
|
|
122
|
+
if (disk.used_percent < 90 && disk.available_bytes >= 5 * GIB)
|
|
123
|
+
continue;
|
|
124
|
+
out.push(candidate("machine.disk-space", disk.used_percent >= 97 || disk.available_bytes < GIB ? "critical" : "warning", "filesystem", disk.path, `Filesystem ${disk.path} has ${round1(disk.available_bytes / GIB)} GiB available (${disk.used_percent}% used).`, source, disk.used_percent, "percent", [resourceCapability]));
|
|
125
|
+
}
|
|
126
|
+
const pressure = input.resource.pressure;
|
|
127
|
+
if (pressure?.state === "supported" || pressure?.state === "partial") {
|
|
128
|
+
for (const [kind, full] of [
|
|
129
|
+
["memory", pressure.memory_full],
|
|
130
|
+
["io", pressure.io_full],
|
|
131
|
+
]) {
|
|
132
|
+
if (!full || (full.avg10 < 50 && !(full.avg10 >= 20 && full.avg10 > full.avg60)))
|
|
133
|
+
continue;
|
|
134
|
+
const direction = full.avg10 > full.avg60 ? "rising" : full.avg10 < full.avg60 ? "falling" : "steady";
|
|
135
|
+
addMachine(`machine.${kind}-full-stall`, full.avg10 >= 50 ? "critical" : "warning", `All non-idle tasks stalled on ${kind} for ${full.avg10}% of the recent 10-second window (${direction}; 60s ${full.avg60}%, 300s ${full.avg300}%).`, full.avg10, "percent");
|
|
136
|
+
}
|
|
137
|
+
for (const [kind, value, threshold] of [
|
|
138
|
+
["cpu", pressure.cpu, 20],
|
|
139
|
+
["memory", pressure.memory, 5],
|
|
140
|
+
["io", pressure.io, 10],
|
|
141
|
+
]) {
|
|
142
|
+
if (!value || value.avg60 < threshold)
|
|
143
|
+
continue;
|
|
144
|
+
addMachine(`machine.${kind}-stall`, value.avg60 >= threshold * 2 ? "critical" : "warning", `At least one task stalled on ${kind} for ${value.avg60}% of the last minute.`, value.avg60, "percent");
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
const oom = input.resource.oom;
|
|
148
|
+
if (oom?.state === "supported" &&
|
|
149
|
+
oom.last_kill_age_ms !== null &&
|
|
150
|
+
oom.last_kill_age_ms <= 60_000 &&
|
|
151
|
+
oom.total_kills !== null) {
|
|
152
|
+
addMachine("machine.oom-kill", "critical", `Kernel OOM kills increased ${Math.round(oom.last_kill_age_ms / 1000)}s ago; ${oom.total_kills} kills reported in total. Work may have been lost.`, oom.total_kills, "count");
|
|
153
|
+
}
|
|
154
|
+
const host = input.resource.host;
|
|
155
|
+
const hostAge = host
|
|
156
|
+
? Date.parse(input.resource.sampled_at) +
|
|
157
|
+
input.resource.sample_duration_ms -
|
|
158
|
+
Date.parse(host.sampled_at)
|
|
159
|
+
: NaN;
|
|
160
|
+
if (host?.machine &&
|
|
161
|
+
(host.state === "supported" || host.state === "partial") &&
|
|
162
|
+
hostAge >= 0 &&
|
|
163
|
+
hostAge <= 30_000) {
|
|
164
|
+
const hostSource = stableSource("resource.windows-host", "windows-host", host.sampled_at, host.state);
|
|
165
|
+
for (const [kind, value, threshold, severity] of [
|
|
166
|
+
["cpu", host.machine.cpu_percent, MACHINE_CPU_THRESHOLD, "warning"],
|
|
167
|
+
["memory", host.machine.memory_percent, MACHINE_MEMORY_THRESHOLD, "critical"],
|
|
168
|
+
]) {
|
|
169
|
+
if (value === null || value < threshold)
|
|
170
|
+
continue;
|
|
171
|
+
out.push(candidate(`machine.host-${kind}-pressure`, severity, "machine", "windows-host", `Windows host ${kind} is ${value}%.`, hostSource, value, "percent", [{ source_kind: "resource.windows-host", state: host.state }]));
|
|
172
|
+
}
|
|
173
|
+
for (const disk of host.disks) {
|
|
174
|
+
if (disk.state !== "supported" ||
|
|
175
|
+
disk.available_bytes === null ||
|
|
176
|
+
disk.used_percent === null ||
|
|
177
|
+
(disk.used_percent < 90 && disk.available_bytes >= 5 * GIB))
|
|
178
|
+
continue;
|
|
179
|
+
out.push(candidate("machine.host-disk-space", disk.used_percent >= 97 || disk.available_bytes < GIB ? "critical" : "warning", "filesystem", `windows-host:${disk.path}`, `Windows filesystem ${disk.path} has ${round1(disk.available_bytes / GIB)} GiB available (${disk.used_percent}% used).`, hostSource, disk.used_percent, "percent", [{ source_kind: "resource.windows-host", state: host.state }]));
|
|
180
|
+
}
|
|
181
|
+
}
|
|
117
182
|
if (input.resource.collector_cpu_ms >= COLLECTOR_CPU_THRESHOLD_MS)
|
|
118
183
|
out.push(candidate("supervisor.collector-overhead", "warning", "service", "supervisor", `Supervisor resource collection used ${input.resource.collector_cpu_ms} ms of CPU.`, source, input.resource.collector_cpu_ms, "milliseconds", [resourceCapability]));
|
|
119
184
|
for (const service of input.services.filter((entry) => entry.state === "stale").slice(0, 5)) {
|
|
@@ -180,6 +245,11 @@ function evaluateCandidates(input) {
|
|
|
180
245
|
out.push(candidate("coordination.ledger-diagnostic", "warning", "ledger", diagnostic.code, `Event ledger reported ${diagnostic.code}.`, diagnosticSource, 1, "count", [coordination.capability]));
|
|
181
246
|
}
|
|
182
247
|
}
|
|
248
|
+
if (input.ledgerControlState) {
|
|
249
|
+
const ledger = ledgerControlStateFindingCandidateV1(input.ledgerControlState);
|
|
250
|
+
if (ledger)
|
|
251
|
+
out.push(ledger);
|
|
252
|
+
}
|
|
183
253
|
return out;
|
|
184
254
|
}
|
|
185
255
|
function capabilityCandidate(capability, source) {
|
|
@@ -304,6 +374,7 @@ function candidate(findingKind, severity, scopeKind, scopeId, summary, source, o
|
|
|
304
374
|
return {
|
|
305
375
|
source_kind: source.source_kind,
|
|
306
376
|
finding_kind: findingKind,
|
|
377
|
+
finding_class: classifyFinding(findingKind),
|
|
307
378
|
severity,
|
|
308
379
|
scope_kind: scopeKind,
|
|
309
380
|
scope_id: scopeId,
|
|
@@ -315,6 +386,23 @@ function candidate(findingKind, severity, scopeKind, scopeId, summary, source, o
|
|
|
315
386
|
...(workloadContext ? { workload_context: workloadContext } : {}),
|
|
316
387
|
};
|
|
317
388
|
}
|
|
389
|
+
/**
|
|
390
|
+
* Which question a finding answers. Contention findings report a machine
|
|
391
|
+
* resource the kernel says is exhausted or stalling. Attribution findings name
|
|
392
|
+
* who is consuming a resource, which is useful for an operator but is never
|
|
393
|
+
* evidence that the machine is under contention. Diagnostic findings report
|
|
394
|
+
* that the observation path itself is degraded. Anything unrecognized is
|
|
395
|
+
* diagnostic, because only contention may ever bear machine state.
|
|
396
|
+
*/
|
|
397
|
+
function classifyFinding(findingKind) {
|
|
398
|
+
if (findingKind.startsWith("machine."))
|
|
399
|
+
return "contention";
|
|
400
|
+
if (findingKind === "resource.memory-growth" ||
|
|
401
|
+
["process.", "group.", "hook.", "service."].some((prefix) => findingKind.startsWith(prefix))) {
|
|
402
|
+
return "attribution";
|
|
403
|
+
}
|
|
404
|
+
return "diagnostic";
|
|
405
|
+
}
|
|
318
406
|
function resourceSource(resource, capability, recordId) {
|
|
319
407
|
return stableSource("resource.snapshot", `${resource.platform}:${resource.namespace}`, resource.sampled_at, capability, recordId, resource.schema_version);
|
|
320
408
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../../src/core/supervisor/history.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAEL,KAAK,iBAAiB,EAEvB,MAAM,eAAe,CAAC;AAEvB,eAAO,MAAM,8BAA8B,QAAS,CAAC;AACrD,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAEhD,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,iBAAiB,GAAG,SAAS,EACvC,QAAQ,EAAE,gBAAgB,GACzB;IAAE,OAAO,EAAE,iBAAiB,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../../src/core/supervisor/history.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAEL,KAAK,iBAAiB,EAEvB,MAAM,eAAe,CAAC;AAEvB,eAAO,MAAM,8BAA8B,QAAS,CAAC;AACrD,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAEhD,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,iBAAiB,GAAG,SAAS,EACvC,QAAQ,EAAE,gBAAgB,GACzB;IAAE,OAAO,EAAE,iBAAiB,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAyClD"}
|
|
@@ -26,7 +26,9 @@ export function updateSupervisorHistory(previous, resource) {
|
|
|
26
26
|
memory_used_bytes: resource.machine.memory_used_bytes,
|
|
27
27
|
swap_used_bytes: resource.machine.swap_used_bytes,
|
|
28
28
|
process_count: resource.machine.process_count,
|
|
29
|
+
load_average_1: resource.machine.load_average?.[0] ?? null,
|
|
29
30
|
},
|
|
31
|
+
pressure: pressurePoint(resource),
|
|
30
32
|
groups: resource.groups.map((group) => ({ ...group, root_pids: [...group.root_pids] })),
|
|
31
33
|
};
|
|
32
34
|
return {
|
|
@@ -39,6 +41,18 @@ export function updateSupervisorHistory(previous, resource) {
|
|
|
39
41
|
changed: true,
|
|
40
42
|
};
|
|
41
43
|
}
|
|
44
|
+
function pressurePoint(resource) {
|
|
45
|
+
const pressure = resource.pressure;
|
|
46
|
+
const usable = pressure?.state === "supported" || pressure?.state === "partial";
|
|
47
|
+
const vmstat = resource.vmstat;
|
|
48
|
+
const vmstatUsable = vmstat?.state === "supported" || vmstat?.state === "partial";
|
|
49
|
+
return {
|
|
50
|
+
memory_full_avg10: usable ? (pressure.memory_full?.avg10 ?? null) : null,
|
|
51
|
+
io_full_avg10: usable ? (pressure.io_full?.avg10 ?? null) : null,
|
|
52
|
+
cpu_some_avg60: usable ? (pressure.cpu?.avg60 ?? null) : null,
|
|
53
|
+
swap_out_bytes_per_second: vmstatUsable ? vmstat.swap_out_bytes_per_second : null,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
42
56
|
function validHistory(value) {
|
|
43
57
|
return (value?.schema_version === SUPERVISOR_HISTORY_SCHEMA_VERSION &&
|
|
44
58
|
Array.isArray(value.points) &&
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { EventV3ControlState } from "../events/v3/control.js";
|
|
2
|
+
import { type SupervisorCapability, type SupervisorFindingClass, type SupervisorFindingEvidence, type SupervisorFindingSeverity, type SupervisorSourceReference } from "./contract.js";
|
|
3
|
+
/**
|
|
4
|
+
* Event ledger control drift, as a supervisor finding.
|
|
5
|
+
*
|
|
6
|
+
* A root whose control state is not `active` still coordinates, so nothing
|
|
7
|
+
* fails loudly: the write gate narrows, every reader validates the whole epoch,
|
|
8
|
+
* and the only surface that said so was `init --check`. One root sat in
|
|
9
|
+
* `candidate` for twenty hours that way. This module turns that drift into a
|
|
10
|
+
* `coordination.ledger-diagnostic` finding so `agents health`, the resources
|
|
11
|
+
* page, and diagnostic bundles carry it.
|
|
12
|
+
*
|
|
13
|
+
* It is a `diagnostic` finding by construction: it reports that an observation
|
|
14
|
+
* and recording path is degraded, never that a machine resource is contended,
|
|
15
|
+
* so it can never raise machine pressure or throttle anyone's work.
|
|
16
|
+
*/
|
|
17
|
+
export type LedgerControlStateNameV1 = EventV3ControlState["state"];
|
|
18
|
+
export interface LedgerControlStateObservationV1 {
|
|
19
|
+
state: LedgerControlStateNameV1;
|
|
20
|
+
/** The control reader's reason code, when the state carries one. */
|
|
21
|
+
reason?: string;
|
|
22
|
+
observed_at: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* The finding shape `evaluateSupervisorFindings` consumes, before identity,
|
|
26
|
+
* fingerprinting, and transition bookkeeping are applied to it.
|
|
27
|
+
*/
|
|
28
|
+
export interface SupervisorFindingCandidateV1 {
|
|
29
|
+
source_kind: string;
|
|
30
|
+
finding_kind: string;
|
|
31
|
+
finding_class: SupervisorFindingClass;
|
|
32
|
+
severity: SupervisorFindingSeverity;
|
|
33
|
+
scope_kind: string;
|
|
34
|
+
scope_id: string;
|
|
35
|
+
summary: string;
|
|
36
|
+
primary_source: SupervisorSourceReference;
|
|
37
|
+
evidence: SupervisorFindingEvidence[];
|
|
38
|
+
capabilities: SupervisorCapability[];
|
|
39
|
+
}
|
|
40
|
+
export interface LedgerControlStateFindingInputV1 {
|
|
41
|
+
/** The control state observed for the current supervisor history point. */
|
|
42
|
+
current: LedgerControlStateObservationV1;
|
|
43
|
+
/** Earlier observations, most recent first. Only the leading run is read. */
|
|
44
|
+
previous?: readonly LedgerControlStateObservationV1[];
|
|
45
|
+
capability: SupervisorCapability;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Open a finding once the drift has outlived one supervisor history point.
|
|
49
|
+
*
|
|
50
|
+
* Rotation and activation legitimately pass through `candidate` between two
|
|
51
|
+
* appends, so a single non-active sample is not drift. Two consecutive ones
|
|
52
|
+
* are: no correct boundary spans a supervisor cycle.
|
|
53
|
+
*/
|
|
54
|
+
export declare function ledgerControlStateFindingCandidateV1(input: LedgerControlStateFindingInputV1): SupervisorFindingCandidateV1 | undefined;
|
|
55
|
+
//# sourceMappingURL=ledger-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ledger-state.d.ts","sourceRoot":"","sources":["../../../src/core/supervisor/ledger-state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAEL,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC/B,MAAM,eAAe,CAAC;AAEvB;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,wBAAwB,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAEpE,MAAM,WAAW,+BAA+B;IAC9C,KAAK,EAAE,wBAAwB,CAAC;IAChC,oEAAoE;IACpE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,4BAA4B;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,sBAAsB,CAAC;IACtC,QAAQ,EAAE,yBAAyB,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,yBAAyB,CAAC;IAC1C,QAAQ,EAAE,yBAAyB,EAAE,CAAC;IACtC,YAAY,EAAE,oBAAoB,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,gCAAgC;IAC/C,2EAA2E;IAC3E,OAAO,EAAE,+BAA+B,CAAC;IACzC,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,SAAS,+BAA+B,EAAE,CAAC;IACtD,UAAU,EAAE,oBAAoB,CAAC;CAClC;AAED;;;;;;GAMG;AACH,wBAAgB,oCAAoC,CAClD,KAAK,EAAE,gCAAgC,GACtC,4BAA4B,GAAG,SAAS,CAqC1C"}
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/core/supervisor/service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/core/supervisor/service.ts"],"names":[],"mappings":"AA+BA,OAAO,EAML,KAAK,6BAA6B,EAElC,KAAK,gBAAgB,EACtB,MAAM,eAAe,CAAC;AAsBvB,eAAO,MAAM,8BAA8B,OAAQ,CAAC;AACpD,eAAO,MAAM,+BAA+B,QAAa,CAAC;AAe1D,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAChD;AAED,MAAM,MAAM,sBAAsB,GAC9B;IAAE,KAAK,EAAE,SAAS,GAAG,SAAS,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,GAC1D;IAAE,KAAK,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtE,wBAAsB,eAAe,CACnC,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GAC9E,OAAO,CAAC,gBAAgB,CAAC,CAwD3B;AAED,wBAAsB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAahG;AAED,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,gBAAgB,CAiB5E;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC,6BAA6B,CAAC,CAyQxC"}
|