open-multi-agent-kit 0.97.0 → 0.98.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/CHANGELOG.md +35 -0
- package/README.md +41 -9
- package/dist/cli/args.d.ts +2 -3
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +13 -189
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/help.d.ts +3 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/help.js +194 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/initial-message.d.ts.map +1 -1
- package/dist/cli/initial-message.js +2 -1
- package/dist/cli/initial-message.js.map +1 -1
- package/dist/cli/resource-paths.d.ts +4 -0
- package/dist/cli/resource-paths.d.ts.map +1 -0
- package/dist/cli/resource-paths.js +59 -0
- package/dist/cli/resource-paths.js.map +1 -0
- package/dist/commands/adaptorch-doctor-cli.d.ts +13 -0
- package/dist/commands/adaptorch-doctor-cli.d.ts.map +1 -0
- package/dist/commands/adaptorch-doctor-cli.js +115 -0
- package/dist/commands/adaptorch-doctor-cli.js.map +1 -0
- package/dist/commands/resource-doctor-cli.d.ts +4 -0
- package/dist/commands/resource-doctor-cli.d.ts.map +1 -1
- package/dist/commands/resource-doctor-cli.js +35 -5
- package/dist/commands/resource-doctor-cli.js.map +1 -1
- package/dist/core/adaptorch-bridge.d.ts +11 -13
- package/dist/core/adaptorch-bridge.d.ts.map +1 -1
- package/dist/core/adaptorch-bridge.js +11 -13
- package/dist/core/adaptorch-bridge.js.map +1 -1
- package/dist/core/agent-session-snapshot.d.ts +16 -0
- package/dist/core/agent-session-snapshot.d.ts.map +1 -0
- package/dist/core/agent-session-snapshot.js +111 -0
- package/dist/core/agent-session-snapshot.js.map +1 -0
- package/dist/core/agent-session.d.ts +5 -9
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +27 -219
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/agent-tool-settings.d.ts +10 -0
- package/dist/core/agent-tool-settings.d.ts.map +1 -1
- package/dist/core/agent-tool-settings.js +10 -1
- package/dist/core/agent-tool-settings.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +7 -0
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +25 -61
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/compaction/index.d.ts +1 -0
- package/dist/core/compaction/index.d.ts.map +1 -1
- package/dist/core/compaction/index.js +1 -0
- package/dist/core/compaction/index.js.map +1 -1
- package/dist/core/compaction/knowledge-triage-format.d.ts +9 -0
- package/dist/core/compaction/knowledge-triage-format.d.ts.map +1 -0
- package/dist/core/compaction/knowledge-triage-format.js +71 -0
- package/dist/core/compaction/knowledge-triage-format.js.map +1 -0
- package/dist/core/compaction/knowledge-triage-types.d.ts +7 -0
- package/dist/core/compaction/knowledge-triage-types.d.ts.map +1 -0
- package/dist/core/compaction/knowledge-triage-types.js +2 -0
- package/dist/core/compaction/knowledge-triage-types.js.map +1 -0
- package/dist/core/compaction/knowledge-triage.d.ts +29 -0
- package/dist/core/compaction/knowledge-triage.d.ts.map +1 -0
- package/dist/core/compaction/knowledge-triage.js +189 -0
- package/dist/core/compaction/knowledge-triage.js.map +1 -0
- package/dist/core/compaction/transaction.d.ts.map +1 -1
- package/dist/core/compaction/transaction.js +1 -1
- package/dist/core/compaction/transaction.js.map +1 -1
- package/dist/core/compaction/utils.d.ts +4 -0
- package/dist/core/compaction/utils.d.ts.map +1 -1
- package/dist/core/compaction/utils.js +37 -0
- package/dist/core/compaction/utils.js.map +1 -1
- package/dist/core/completion-sound-io.d.ts +14 -0
- package/dist/core/completion-sound-io.d.ts.map +1 -0
- package/dist/core/completion-sound-io.js +64 -0
- package/dist/core/completion-sound-io.js.map +1 -0
- package/dist/core/completion-sound.d.ts +4 -10
- package/dist/core/completion-sound.d.ts.map +1 -1
- package/dist/core/completion-sound.js +28 -58
- package/dist/core/completion-sound.js.map +1 -1
- package/dist/core/context-budget-relevance.d.ts +15 -2
- package/dist/core/context-budget-relevance.d.ts.map +1 -1
- package/dist/core/context-budget-relevance.js +21 -9
- package/dist/core/context-budget-relevance.js.map +1 -1
- package/dist/core/context-budget-system-prompt-items.d.ts +1 -1
- package/dist/core/context-budget-system-prompt-items.d.ts.map +1 -1
- package/dist/core/context-budget-system-prompt-items.js.map +1 -1
- package/dist/core/context-budget-system-prompt.d.ts +1 -1
- package/dist/core/context-budget-system-prompt.d.ts.map +1 -1
- package/dist/core/context-budget-system-prompt.js.map +1 -1
- package/dist/core/context-file.d.ts +23 -0
- package/dist/core/context-file.d.ts.map +1 -0
- package/dist/core/context-file.js +17 -0
- package/dist/core/context-file.js.map +1 -0
- package/dist/core/keybindings.d.ts +1 -1
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +6 -1
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/model-prompt-policy.d.ts +1 -1
- package/dist/core/model-prompt-policy.d.ts.map +1 -1
- package/dist/core/model-prompt-policy.js.map +1 -1
- package/dist/core/prompt-settlement.d.ts +6 -3
- package/dist/core/prompt-settlement.d.ts.map +1 -1
- package/dist/core/prompt-settlement.js +10 -14
- package/dist/core/prompt-settlement.js.map +1 -1
- package/dist/core/reasoning-router-promotion.d.ts +41 -1
- package/dist/core/reasoning-router-promotion.d.ts.map +1 -1
- package/dist/core/reasoning-router-promotion.js +31 -2
- package/dist/core/reasoning-router-promotion.js.map +1 -1
- package/dist/core/reasoning-router-replay-stability.d.ts +65 -0
- package/dist/core/reasoning-router-replay-stability.d.ts.map +1 -0
- package/dist/core/reasoning-router-replay-stability.js +67 -0
- package/dist/core/reasoning-router-replay-stability.js.map +1 -0
- package/dist/core/reasoning-router-v4-weights.d.ts +6 -6
- package/dist/core/reasoning-router-v4-weights.d.ts.map +1 -1
- package/dist/core/reasoning-router-v4-weights.js +3 -3
- package/dist/core/reasoning-router-v4-weights.js.map +1 -1
- package/dist/core/reasoning-router-v4.d.ts.map +1 -1
- package/dist/core/reasoning-router-v4.js +6 -6
- package/dist/core/reasoning-router-v4.js.map +1 -1
- package/dist/core/redaction.d.ts.map +1 -1
- package/dist/core/redaction.js +1 -1
- package/dist/core/redaction.js.map +1 -1
- package/dist/core/resource-admission.d.ts +2 -1
- package/dist/core/resource-admission.d.ts.map +1 -1
- package/dist/core/resource-admission.js +11 -0
- package/dist/core/resource-admission.js.map +1 -1
- package/dist/core/resource-governor-format.d.ts +1 -1
- package/dist/core/resource-governor-format.d.ts.map +1 -1
- package/dist/core/resource-governor-format.js.map +1 -1
- package/dist/core/resource-governor-settings.d.ts +6 -12
- package/dist/core/resource-governor-settings.d.ts.map +1 -1
- package/dist/core/resource-governor-settings.js.map +1 -1
- package/dist/core/resource-governor-types.d.ts +24 -0
- package/dist/core/resource-governor-types.d.ts.map +1 -0
- package/dist/core/resource-governor-types.js +15 -0
- package/dist/core/resource-governor-types.js.map +1 -0
- package/dist/core/resource-loader.d.ts +1 -7
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/resource-observation-journal.d.ts +2 -1
- package/dist/core/resource-observation-journal.d.ts.map +1 -1
- package/dist/core/resource-observation-journal.js +4 -3
- package/dist/core/resource-observation-journal.js.map +1 -1
- package/dist/core/resource-observation-report-reader.d.ts +7 -0
- package/dist/core/resource-observation-report-reader.d.ts.map +1 -0
- package/dist/core/resource-observation-report-reader.js +157 -0
- package/dist/core/resource-observation-report-reader.js.map +1 -0
- package/dist/core/resource-observation-report.d.ts +24 -0
- package/dist/core/resource-observation-report.d.ts.map +1 -0
- package/dist/core/resource-observation-report.js +101 -0
- package/dist/core/resource-observation-report.js.map +1 -0
- package/dist/core/router-feedback-collector.d.ts +1 -1
- package/dist/core/router-feedback-collector.d.ts.map +1 -1
- package/dist/core/router-feedback-collector.js.map +1 -1
- package/dist/core/session-failure-cause.d.ts +33 -0
- package/dist/core/session-failure-cause.d.ts.map +1 -0
- package/dist/core/session-failure-cause.js +141 -0
- package/dist/core/session-failure-cause.js.map +1 -0
- package/dist/core/session-system-prompt.d.ts +1 -1
- package/dist/core/session-system-prompt.d.ts.map +1 -1
- package/dist/core/session-system-prompt.js.map +1 -1
- package/dist/core/settings-manager.d.ts +1 -1
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/system-prompt.d.ts +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +7 -7
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/workload-classifier.d.ts +2 -10
- package/dist/core/workload-classifier.d.ts.map +1 -1
- package/dist/core/workload-classifier.js +17 -0
- package/dist/core/workload-classifier.js.map +1 -1
- package/dist/core/workload-family-matcher.d.ts +1 -1
- package/dist/core/workload-family-matcher.d.ts.map +1 -1
- package/dist/core/workload-family-matcher.js.map +1 -1
- package/dist/core/workload-shard-execution-types.d.ts +40 -0
- package/dist/core/workload-shard-execution-types.d.ts.map +1 -0
- package/dist/core/workload-shard-execution-types.js +14 -0
- package/dist/core/workload-shard-execution-types.js.map +1 -0
- package/dist/core/workload-shard-executor.d.ts +3 -27
- package/dist/core/workload-shard-executor.d.ts.map +1 -1
- package/dist/core/workload-shard-executor.js.map +1 -1
- package/dist/core/workload-shard-runner.d.ts +1 -1
- package/dist/core/workload-shard-runner.d.ts.map +1 -1
- package/dist/core/workload-shard-runner.js.map +1 -1
- package/dist/core/workload-types.d.ts +24 -0
- package/dist/core/workload-types.d.ts.map +1 -0
- package/dist/core/workload-types.js +15 -0
- package/dist/core/workload-types.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +27 -47
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/theme/omk-control-panel.json +1 -1
- package/dist/utils/clipboard-image.d.ts.map +1 -1
- package/dist/utils/clipboard-image.js +42 -33
- package/dist/utils/clipboard-image.js.map +1 -1
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js +14 -2
- package/dist/utils/clipboard.js.map +1 -1
- package/docs/adaptorch-preview-spec.md +20 -18
- package/docs/adaptorch-preview.md +9 -9
- package/docs/compaction.md +24 -3
- package/docs/correctness-wall.md +10 -10
- package/docs/docs.json +12 -0
- package/docs/environment-variables.md +9 -2
- package/docs/index.md +3 -0
- package/docs/runtime-algorithms.md +359 -0
- package/docs/sdk.md +2 -2
- package/docs/settings.md +11 -10
- package/docs/usage.md +18 -2
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/npm-shrinkwrap.json +18 -18
- package/package.json +6 -6
- package/dist/core/context-budget-governor.d.ts +0 -67
- package/dist/core/context-budget-governor.d.ts.map +0 -1
- package/dist/core/context-budget-governor.js +0 -224
- package/dist/core/context-budget-governor.js.map +0 -1
- package/dist/core/lean-ctx.d.ts +0 -99
- package/dist/core/lean-ctx.d.ts.map +0 -1
- package/dist/core/lean-ctx.js +0 -225
- package/dist/core/lean-ctx.js.map +0 -1
- package/dist/core/read-anchors.d.ts +0 -110
- package/dist/core/read-anchors.d.ts.map +0 -1
- package/dist/core/read-anchors.js +0 -193
- package/dist/core/read-anchors.js.map +0 -1
- package/dist/core/recovery-checkpoint.d.ts +0 -196
- package/dist/core/recovery-checkpoint.d.ts.map +0 -1
- package/dist/core/recovery-checkpoint.js +0 -382
- package/dist/core/recovery-checkpoint.js.map +0 -1
- package/dist/core/sandbox-policy-v2.d.ts +0 -49
- package/dist/core/sandbox-policy-v2.d.ts.map +0 -1
- package/dist/core/sandbox-policy-v2.js +0 -368
- package/dist/core/sandbox-policy-v2.js.map +0 -1
- package/dist/guardrails/audit-logger.d.ts +0 -4
- package/dist/guardrails/audit-logger.d.ts.map +0 -1
- package/dist/guardrails/audit-logger.js +0 -28
- package/dist/guardrails/audit-logger.js.map +0 -1
- package/dist/guardrails/freedomd-adapter.d.ts +0 -16
- package/dist/guardrails/freedomd-adapter.d.ts.map +0 -1
- package/dist/guardrails/freedomd-adapter.js +0 -87
- package/dist/guardrails/freedomd-adapter.js.map +0 -1
- package/dist/orchestration/lane-grant-auditor.d.ts +0 -4
- package/dist/orchestration/lane-grant-auditor.d.ts.map +0 -1
- package/dist/orchestration/lane-grant-auditor.js +0 -87
- package/dist/orchestration/lane-grant-auditor.js.map +0 -1
- package/dist/types/guardrails.d.ts +0 -61
- package/dist/types/guardrails.d.ts.map +0 -1
- package/dist/types/guardrails.js +0 -9
- package/dist/types/guardrails.js.map +0 -1
- package/dist/types/lane-grant.d.ts +0 -58
- package/dist/types/lane-grant.d.ts.map +0 -1
- package/dist/types/lane-grant.js +0 -9
- package/dist/types/lane-grant.js.map +0 -1
|
@@ -22,6 +22,17 @@ export { DEFAULT_RESOURCE_ADMISSION_CAP_TABLE, DEFAULT_RESOURCE_ADMISSION_CONFIG
|
|
|
22
22
|
* and `0 = unlimited` settings are limited to the admission cap.
|
|
23
23
|
*/
|
|
24
24
|
export const RESOURCE_ADMISSION_VERSION = 1;
|
|
25
|
+
export const RESOURCE_REASON_CODES = [
|
|
26
|
+
"resource.memory.low",
|
|
27
|
+
"resource.memory.critical",
|
|
28
|
+
"resource.disk.low",
|
|
29
|
+
"resource.disk.critical",
|
|
30
|
+
"resource.cpu.busy",
|
|
31
|
+
"resource.heap.high",
|
|
32
|
+
"resource.heap.critical",
|
|
33
|
+
"resource.probe.partial",
|
|
34
|
+
"resource.probe.timeout",
|
|
35
|
+
];
|
|
25
36
|
const MIB = 1024 * 1024;
|
|
26
37
|
const MIN_CAP = 1;
|
|
27
38
|
const PRESSURE_RANK = { normal: 0, constrained: 1, critical: 2 };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-admission.js","sourceRoot":"","sources":["../../src/core/resource-admission.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport {\n\tcomputeHostResourceSnapshotDigest,\n\teffectiveAvailableMemoryBytes,\n\ttype HostResourceSnapshot,\n} from \"./host-resource-snapshot.ts\";\nimport {\n\tDEFAULT_RESOURCE_ADMISSION_CONFIG,\n\tDEFAULT_RESOURCE_ADMISSION_THRESHOLDS,\n\ttype ResourceAdmissionConfig,\n\ttype ResourceAdmissionThresholds,\n} from \"./resource-admission-config.ts\";\n\nexport type {\n\tResolvedResourceAdmissionConfig,\n\tResourceAdmissionCapTable,\n\tResourceAdmissionConfig,\n\tResourceAdmissionConfigOverrides,\n\tResourceAdmissionThresholds,\n\tResourceGovernorMode,\n\tResourcePressureCaps,\n} from \"./resource-admission-config.ts\";\nexport {\n\tDEFAULT_RESOURCE_ADMISSION_CAP_TABLE,\n\tDEFAULT_RESOURCE_ADMISSION_CONFIG,\n\tDEFAULT_RESOURCE_ADMISSION_THRESHOLDS,\n\tresolveResourceAdmissionConfig,\n\tvalidateResourceAdmissionConfig,\n} from \"./resource-admission-config.ts\";\n\n/**\n * Pure resource admission policy (OMK v0.97.x roadmap §6.6-§7, M1/PR1).\n *\n * This module maps an immutable {@link HostResourceSnapshot} to an immutable\n * {@link ResourceAdmissionDecision}. It is deterministic (clock and id are\n * injectable), side-effect free, and performs no scheduler wiring — the\n * decision only becomes scheduler authority in later milestones (M2+).\n *\n * Policy invariants (verified by property tests, roadmap §23.2):\n * - Monotonic degradation (§4.4): worse memory/disk/CPU never improves\n * pressure and never raises a cap.\n * - Conservative unknown handling (§4.3): a known critical fact wins; a\n * missing key probe (memory, disk, heap) degrades to `constrained`; only a\n * fully healthy snapshot is `normal`.\n * - CPU alone never produces `critical` (§6.7): CPU pressure throttles,\n * while memory/disk/heap may block heavy admission.\n * - User cap precedence (§7.3): effective caps never exceed configured caps,\n * and `0 = unlimited` settings are limited to the admission cap.\n */\n\nexport const RESOURCE_ADMISSION_VERSION = 1 as const;\n\nexport type ResourcePressure = \"normal\" | \"constrained\" | \"critical\";\n\nexport type ResourceAdmissionAction = \"allow\" | \"throttle\" | \"defer-heavy\";\n\nexport type ResourceReasonCode =\n\t| \"resource.memory.low\"\n\t| \"resource.memory.critical\"\n\t| \"resource.disk.low\"\n\t| \"resource.disk.critical\"\n\t| \"resource.cpu.busy\"\n\t| \"resource.heap.high\"\n\t| \"resource.heap.critical\"\n\t| \"resource.probe.partial\"\n\t| \"resource.probe.timeout\";\n\nexport interface ResourceAdmissionDecision {\n\treadonly schemaVersion: typeof RESOURCE_ADMISSION_VERSION;\n\treadonly decisionId: string;\n\treadonly snapshotDigest: string;\n\treadonly pressure: ResourcePressure;\n\treadonly action: ResourceAdmissionAction;\n\n\treadonly maxToolConcurrency: number;\n\treadonly maxParallelLanes: number;\n\treadonly maxHeavyProcesses: number;\n\n\treadonly reasons: readonly ResourceReasonCode[];\n\treadonly decidedAt: string;\n}\n\n/** Bounded model-facing hint (§6.2). Never expose the raw snapshot to the model. */\nexport interface ModelResourceBudgetHint {\n\treadonly pressure: ResourcePressure;\n\treadonly maxToolConcurrency: number;\n\treadonly maxParallelLanes: number;\n\treadonly maxHeavyProcesses: number;\n\treadonly reasons: readonly ResourceReasonCode[];\n}\n\nconst MIB = 1024 * 1024;\nconst MIN_CAP = 1;\nconst PRESSURE_RANK: Record<ResourcePressure, number> = { normal: 0, constrained: 1, critical: 2 };\nconst RANK_TO_PRESSURE: readonly ResourcePressure[] = [\"normal\", \"constrained\", \"critical\"];\n/** §7 action mapping: allow at normal, throttle at constrained, defer heavy work at critical. */\nconst ACTION_BY_PRESSURE: Record<ResourcePressure, ResourceAdmissionAction> = {\n\tnormal: \"allow\",\n\tconstrained: \"throttle\",\n\tcritical: \"defer-heavy\",\n};\n\n/** Total order for pressure levels: `normal` (0) < `constrained` (1) < `critical` (2). */\nexport function resourcePressureRank(pressure: ResourcePressure): number {\n\treturn PRESSURE_RANK[pressure];\n}\n\nexport interface ResourcePressureEvaluation {\n\treadonly pressure: ResourcePressure;\n\treadonly reasons: readonly ResourceReasonCode[];\n}\n\n/**\n * Derive pressure and reason codes from a snapshot (§4.3, §6.6, §6.7).\n * Pure and monotonic: strictly worse inputs never yield a better pressure.\n */\nexport function evaluateResourcePressure(\n\tsnapshot: HostResourceSnapshot,\n\tthresholds: ResourceAdmissionThresholds = DEFAULT_RESOURCE_ADMISSION_THRESHOLDS,\n): ResourcePressureEvaluation {\n\tconst reasons: ResourceReasonCode[] = [];\n\tlet rank = PRESSURE_RANK.normal;\n\tconst escalate = (target: ResourcePressure, reason: ResourceReasonCode): void => {\n\t\treasons.push(reason);\n\t\trank = Math.max(rank, PRESSURE_RANK[target]);\n\t};\n\n\tconst memory = effectiveAvailableMemoryBytes(snapshot);\n\tif (memory !== null) {\n\t\tif (memory < thresholds.criticalAvailableMemoryMiB * MIB) {\n\t\t\tescalate(\"critical\", \"resource.memory.critical\");\n\t\t} else if (memory < thresholds.constrainedAvailableMemoryMiB * MIB) {\n\t\t\tescalate(\"constrained\", \"resource.memory.low\");\n\t\t}\n\t}\n\n\tconst disk = snapshot.workspaceAvailableBytes;\n\tif (disk !== null) {\n\t\tif (disk < thresholds.criticalDiskFreeMiB * MIB) {\n\t\t\tescalate(\"critical\", \"resource.disk.critical\");\n\t\t} else if (disk < thresholds.constrainedDiskFreeMiB * MIB) {\n\t\t\tescalate(\"constrained\", \"resource.disk.low\");\n\t\t}\n\t}\n\n\tconst heapRatio = snapshot.heapLimitBytes > 0 ? snapshot.heapUsedBytes / snapshot.heapLimitBytes : null;\n\tif (heapRatio !== null) {\n\t\tif (heapRatio >= thresholds.criticalHeapRatio) {\n\t\t\tescalate(\"critical\", \"resource.heap.critical\");\n\t\t} else if (heapRatio >= thresholds.constrainedHeapRatio) {\n\t\t\tescalate(\"constrained\", \"resource.heap.high\");\n\t\t}\n\t}\n\n\t// §6.7: CPU pressure only throttles; it can never be critical on its own.\n\tif (snapshot.systemCpuPercent !== null && snapshot.systemCpuPercent >= thresholds.busyCpuPercent) {\n\t\tescalate(\"constrained\", \"resource.cpu.busy\");\n\t}\n\n\t// §4.3 conservative unknown handling. Key probes are the heavy-admission\n\t// authorities (memory, disk, heap); a missing one degrades to constrained.\n\tif (memory === null || disk === null || heapRatio === null) {\n\t\tescalate(\"constrained\", \"resource.probe.partial\");\n\t}\n\t// §21: any probe timeout keeps the prompt going but never reports normal.\n\tif (snapshot.diagnostics.some((code) => code.endsWith(\".timeout\"))) {\n\t\tescalate(\"constrained\", \"resource.probe.timeout\");\n\t}\n\n\treturn { pressure: RANK_TO_PRESSURE[rank] ?? \"critical\", reasons };\n}\n\n/**\n * Existing user settings that admission must never exceed (§7.3).\n * `0` or `undefined` means \"unlimited\" and is limited to the admission cap.\n */\nexport interface ConfiguredResourceCaps {\n\treadonly maxToolConcurrency?: number;\n\treadonly maxParallelLanes?: number;\n\treadonly maxHeavyProcesses?: number;\n}\n\nexport interface ResourceAdmissionInput {\n\treadonly snapshot: HostResourceSnapshot;\n\treadonly config?: ResourceAdmissionConfig;\n\treadonly configuredCaps?: ConfiguredResourceCaps;\n\t/** Injectable for deterministic tests; defaults to a UUID-based id. */\n\treadonly decisionId?: string;\n\t/** Injectable ISO timestamp; defaults to the current time. */\n\treadonly decidedAt?: string;\n}\n\n/** Map a snapshot to an immutable admission decision (§7.1-§7.3). */\nexport function decideResourceAdmission(input: ResourceAdmissionInput): ResourceAdmissionDecision {\n\tconst config = input.config ?? DEFAULT_RESOURCE_ADMISSION_CONFIG;\n\tconst { pressure, reasons } = evaluateResourcePressure(input.snapshot, config.thresholds);\n\tconst tier = config.caps[pressure];\n\treturn {\n\t\tschemaVersion: RESOURCE_ADMISSION_VERSION,\n\t\tdecisionId: input.decisionId ?? `res-adm-${randomUUID()}`,\n\t\tsnapshotDigest: computeHostResourceSnapshotDigest(input.snapshot),\n\t\tpressure,\n\t\taction: ACTION_BY_PRESSURE[pressure],\n\t\tmaxToolConcurrency: effectiveCap(input.configuredCaps?.maxToolConcurrency, tier.maxToolConcurrency),\n\t\tmaxParallelLanes: effectiveCap(input.configuredCaps?.maxParallelLanes, tier.maxParallelLanes),\n\t\tmaxHeavyProcesses: effectiveCap(input.configuredCaps?.maxHeavyProcesses, tier.maxHeavyProcesses),\n\t\treasons,\n\t\tdecidedAt: input.decidedAt ?? new Date().toISOString(),\n\t};\n}\n\n/** Bounded hint for the model (§6.2). Carries no raw host values. */\nexport function toModelResourceBudgetHint(decision: ResourceAdmissionDecision): ModelResourceBudgetHint {\n\treturn {\n\t\tpressure: decision.pressure,\n\t\tmaxToolConcurrency: decision.maxToolConcurrency,\n\t\tmaxParallelLanes: decision.maxParallelLanes,\n\t\tmaxHeavyProcesses: decision.maxHeavyProcesses,\n\t\treasons: decision.reasons,\n\t};\n}\n\n/** §7.3: `min(configured, admission)`, where configured `0`/absent means unlimited. */\nfunction effectiveCap(configured: number | undefined, admission: number): number {\n\tconst admitted = Math.max(MIN_CAP, Math.floor(admission));\n\tif (typeof configured !== \"number\" || !Number.isFinite(configured) || configured <= 0) {\n\t\treturn admitted;\n\t}\n\treturn Math.max(MIN_CAP, Math.min(Math.floor(configured), admitted));\n}\n"]}
|
|
1
|
+
{"version":3,"file":"resource-admission.js","sourceRoot":"","sources":["../../src/core/resource-admission.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport {\n\tcomputeHostResourceSnapshotDigest,\n\teffectiveAvailableMemoryBytes,\n\ttype HostResourceSnapshot,\n} from \"./host-resource-snapshot.ts\";\nimport {\n\tDEFAULT_RESOURCE_ADMISSION_CONFIG,\n\tDEFAULT_RESOURCE_ADMISSION_THRESHOLDS,\n\ttype ResourceAdmissionConfig,\n\ttype ResourceAdmissionThresholds,\n} from \"./resource-admission-config.ts\";\n\nexport type {\n\tResolvedResourceAdmissionConfig,\n\tResourceAdmissionCapTable,\n\tResourceAdmissionConfig,\n\tResourceAdmissionConfigOverrides,\n\tResourceAdmissionThresholds,\n\tResourceGovernorMode,\n\tResourcePressureCaps,\n} from \"./resource-admission-config.ts\";\nexport {\n\tDEFAULT_RESOURCE_ADMISSION_CAP_TABLE,\n\tDEFAULT_RESOURCE_ADMISSION_CONFIG,\n\tDEFAULT_RESOURCE_ADMISSION_THRESHOLDS,\n\tresolveResourceAdmissionConfig,\n\tvalidateResourceAdmissionConfig,\n} from \"./resource-admission-config.ts\";\n\n/**\n * Pure resource admission policy (OMK v0.97.x roadmap §6.6-§7, M1/PR1).\n *\n * This module maps an immutable {@link HostResourceSnapshot} to an immutable\n * {@link ResourceAdmissionDecision}. It is deterministic (clock and id are\n * injectable), side-effect free, and performs no scheduler wiring — the\n * decision only becomes scheduler authority in later milestones (M2+).\n *\n * Policy invariants (verified by property tests, roadmap §23.2):\n * - Monotonic degradation (§4.4): worse memory/disk/CPU never improves\n * pressure and never raises a cap.\n * - Conservative unknown handling (§4.3): a known critical fact wins; a\n * missing key probe (memory, disk, heap) degrades to `constrained`; only a\n * fully healthy snapshot is `normal`.\n * - CPU alone never produces `critical` (§6.7): CPU pressure throttles,\n * while memory/disk/heap may block heavy admission.\n * - User cap precedence (§7.3): effective caps never exceed configured caps,\n * and `0 = unlimited` settings are limited to the admission cap.\n */\n\nexport const RESOURCE_ADMISSION_VERSION = 1 as const;\n\nexport type ResourcePressure = \"normal\" | \"constrained\" | \"critical\";\n\nexport type ResourceAdmissionAction = \"allow\" | \"throttle\" | \"defer-heavy\";\n\nexport const RESOURCE_REASON_CODES = [\n\t\"resource.memory.low\",\n\t\"resource.memory.critical\",\n\t\"resource.disk.low\",\n\t\"resource.disk.critical\",\n\t\"resource.cpu.busy\",\n\t\"resource.heap.high\",\n\t\"resource.heap.critical\",\n\t\"resource.probe.partial\",\n\t\"resource.probe.timeout\",\n] as const;\n\nexport type ResourceReasonCode = (typeof RESOURCE_REASON_CODES)[number];\n\nexport interface ResourceAdmissionDecision {\n\treadonly schemaVersion: typeof RESOURCE_ADMISSION_VERSION;\n\treadonly decisionId: string;\n\treadonly snapshotDigest: string;\n\treadonly pressure: ResourcePressure;\n\treadonly action: ResourceAdmissionAction;\n\n\treadonly maxToolConcurrency: number;\n\treadonly maxParallelLanes: number;\n\treadonly maxHeavyProcesses: number;\n\n\treadonly reasons: readonly ResourceReasonCode[];\n\treadonly decidedAt: string;\n}\n\n/** Bounded model-facing hint (§6.2). Never expose the raw snapshot to the model. */\nexport interface ModelResourceBudgetHint {\n\treadonly pressure: ResourcePressure;\n\treadonly maxToolConcurrency: number;\n\treadonly maxParallelLanes: number;\n\treadonly maxHeavyProcesses: number;\n\treadonly reasons: readonly ResourceReasonCode[];\n}\n\nconst MIB = 1024 * 1024;\nconst MIN_CAP = 1;\nconst PRESSURE_RANK: Record<ResourcePressure, number> = { normal: 0, constrained: 1, critical: 2 };\nconst RANK_TO_PRESSURE: readonly ResourcePressure[] = [\"normal\", \"constrained\", \"critical\"];\n/** §7 action mapping: allow at normal, throttle at constrained, defer heavy work at critical. */\nconst ACTION_BY_PRESSURE: Record<ResourcePressure, ResourceAdmissionAction> = {\n\tnormal: \"allow\",\n\tconstrained: \"throttle\",\n\tcritical: \"defer-heavy\",\n};\n\n/** Total order for pressure levels: `normal` (0) < `constrained` (1) < `critical` (2). */\nexport function resourcePressureRank(pressure: ResourcePressure): number {\n\treturn PRESSURE_RANK[pressure];\n}\n\nexport interface ResourcePressureEvaluation {\n\treadonly pressure: ResourcePressure;\n\treadonly reasons: readonly ResourceReasonCode[];\n}\n\n/**\n * Derive pressure and reason codes from a snapshot (§4.3, §6.6, §6.7).\n * Pure and monotonic: strictly worse inputs never yield a better pressure.\n */\nexport function evaluateResourcePressure(\n\tsnapshot: HostResourceSnapshot,\n\tthresholds: ResourceAdmissionThresholds = DEFAULT_RESOURCE_ADMISSION_THRESHOLDS,\n): ResourcePressureEvaluation {\n\tconst reasons: ResourceReasonCode[] = [];\n\tlet rank = PRESSURE_RANK.normal;\n\tconst escalate = (target: ResourcePressure, reason: ResourceReasonCode): void => {\n\t\treasons.push(reason);\n\t\trank = Math.max(rank, PRESSURE_RANK[target]);\n\t};\n\n\tconst memory = effectiveAvailableMemoryBytes(snapshot);\n\tif (memory !== null) {\n\t\tif (memory < thresholds.criticalAvailableMemoryMiB * MIB) {\n\t\t\tescalate(\"critical\", \"resource.memory.critical\");\n\t\t} else if (memory < thresholds.constrainedAvailableMemoryMiB * MIB) {\n\t\t\tescalate(\"constrained\", \"resource.memory.low\");\n\t\t}\n\t}\n\n\tconst disk = snapshot.workspaceAvailableBytes;\n\tif (disk !== null) {\n\t\tif (disk < thresholds.criticalDiskFreeMiB * MIB) {\n\t\t\tescalate(\"critical\", \"resource.disk.critical\");\n\t\t} else if (disk < thresholds.constrainedDiskFreeMiB * MIB) {\n\t\t\tescalate(\"constrained\", \"resource.disk.low\");\n\t\t}\n\t}\n\n\tconst heapRatio = snapshot.heapLimitBytes > 0 ? snapshot.heapUsedBytes / snapshot.heapLimitBytes : null;\n\tif (heapRatio !== null) {\n\t\tif (heapRatio >= thresholds.criticalHeapRatio) {\n\t\t\tescalate(\"critical\", \"resource.heap.critical\");\n\t\t} else if (heapRatio >= thresholds.constrainedHeapRatio) {\n\t\t\tescalate(\"constrained\", \"resource.heap.high\");\n\t\t}\n\t}\n\n\t// §6.7: CPU pressure only throttles; it can never be critical on its own.\n\tif (snapshot.systemCpuPercent !== null && snapshot.systemCpuPercent >= thresholds.busyCpuPercent) {\n\t\tescalate(\"constrained\", \"resource.cpu.busy\");\n\t}\n\n\t// §4.3 conservative unknown handling. Key probes are the heavy-admission\n\t// authorities (memory, disk, heap); a missing one degrades to constrained.\n\tif (memory === null || disk === null || heapRatio === null) {\n\t\tescalate(\"constrained\", \"resource.probe.partial\");\n\t}\n\t// §21: any probe timeout keeps the prompt going but never reports normal.\n\tif (snapshot.diagnostics.some((code) => code.endsWith(\".timeout\"))) {\n\t\tescalate(\"constrained\", \"resource.probe.timeout\");\n\t}\n\n\treturn { pressure: RANK_TO_PRESSURE[rank] ?? \"critical\", reasons };\n}\n\n/**\n * Existing user settings that admission must never exceed (§7.3).\n * `0` or `undefined` means \"unlimited\" and is limited to the admission cap.\n */\nexport interface ConfiguredResourceCaps {\n\treadonly maxToolConcurrency?: number;\n\treadonly maxParallelLanes?: number;\n\treadonly maxHeavyProcesses?: number;\n}\n\nexport interface ResourceAdmissionInput {\n\treadonly snapshot: HostResourceSnapshot;\n\treadonly config?: ResourceAdmissionConfig;\n\treadonly configuredCaps?: ConfiguredResourceCaps;\n\t/** Injectable for deterministic tests; defaults to a UUID-based id. */\n\treadonly decisionId?: string;\n\t/** Injectable ISO timestamp; defaults to the current time. */\n\treadonly decidedAt?: string;\n}\n\n/** Map a snapshot to an immutable admission decision (§7.1-§7.3). */\nexport function decideResourceAdmission(input: ResourceAdmissionInput): ResourceAdmissionDecision {\n\tconst config = input.config ?? DEFAULT_RESOURCE_ADMISSION_CONFIG;\n\tconst { pressure, reasons } = evaluateResourcePressure(input.snapshot, config.thresholds);\n\tconst tier = config.caps[pressure];\n\treturn {\n\t\tschemaVersion: RESOURCE_ADMISSION_VERSION,\n\t\tdecisionId: input.decisionId ?? `res-adm-${randomUUID()}`,\n\t\tsnapshotDigest: computeHostResourceSnapshotDigest(input.snapshot),\n\t\tpressure,\n\t\taction: ACTION_BY_PRESSURE[pressure],\n\t\tmaxToolConcurrency: effectiveCap(input.configuredCaps?.maxToolConcurrency, tier.maxToolConcurrency),\n\t\tmaxParallelLanes: effectiveCap(input.configuredCaps?.maxParallelLanes, tier.maxParallelLanes),\n\t\tmaxHeavyProcesses: effectiveCap(input.configuredCaps?.maxHeavyProcesses, tier.maxHeavyProcesses),\n\t\treasons,\n\t\tdecidedAt: input.decidedAt ?? new Date().toISOString(),\n\t};\n}\n\n/** Bounded hint for the model (§6.2). Carries no raw host values. */\nexport function toModelResourceBudgetHint(decision: ResourceAdmissionDecision): ModelResourceBudgetHint {\n\treturn {\n\t\tpressure: decision.pressure,\n\t\tmaxToolConcurrency: decision.maxToolConcurrency,\n\t\tmaxParallelLanes: decision.maxParallelLanes,\n\t\tmaxHeavyProcesses: decision.maxHeavyProcesses,\n\t\treasons: decision.reasons,\n\t};\n}\n\n/** §7.3: `min(configured, admission)`, where configured `0`/absent means unlimited. */\nfunction effectiveCap(configured: number | undefined, admission: number): number {\n\tconst admitted = Math.max(MIN_CAP, Math.floor(admission));\n\tif (typeof configured !== \"number\" || !Number.isFinite(configured) || configured <= 0) {\n\t\treturn admitted;\n\t}\n\treturn Math.max(MIN_CAP, Math.min(Math.floor(configured), admitted));\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { HostResourceSnapshot } from "./host-resource-snapshot.ts";
|
|
2
2
|
import type { ResourceAdmissionDecision, ResourceGovernorMode, ResourceReasonCode } from "./resource-admission.ts";
|
|
3
|
-
import type { ResolvedResourceGovernorSettings } from "./resource-governor-
|
|
3
|
+
import type { ResolvedResourceGovernorSettings } from "./resource-governor-types.ts";
|
|
4
4
|
/** Humanize reason codes for the §19.1 summary line ("memory low, CPU busy"). */
|
|
5
5
|
export declare function describeResourceReasons(reasons: readonly ResourceReasonCode[]): string;
|
|
6
6
|
/** §19.1 summary block shared by `/resource` and the doctor's human output. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-governor-format.d.ts","sourceRoot":"","sources":["../../src/core/resource-governor-format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAExE,OAAO,KAAK,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AACnH,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"resource-governor-format.d.ts","sourceRoot":"","sources":["../../src/core/resource-governor-format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAExE,OAAO,KAAK,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AACnH,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,8BAA8B,CAAC;AAcrF,kFAAiF;AACjF,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,SAAS,kBAAkB,EAAE,GAAG,MAAM,CAKtF;AAED,gFAA+E;AAC/E,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,oBAAoB,EAAE,QAAQ,EAAE,yBAAyB,GAAG,MAAM,EAAE,CAUpH;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,MAAM,EAAE,CAiBjF;AAED,qFAAkF;AAClF,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,gCAAgC,GAAG,MAAM,EAAE,CAiB9F;AAED,sEAAqE;AACrE,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,yBAAyB,CAAC,UAAU,CAAC,CAAC;IACzD,QAAQ,CAAC,MAAM,EAAE,yBAAyB,CAAC,QAAQ,CAAC,CAAC;IACrD,QAAQ,CAAC,IAAI,EAAE;QACd,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;QACpC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;QAClC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;KACnC,CAAC;IACF,QAAQ,CAAC,OAAO,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAChD,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE;QAClB,QAAQ,CAAC,WAAW,EAAE,oBAAoB,CAAC,aAAa,CAAC,CAAC;QAC1D,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;QACjC,QAAQ,CAAC,2BAA2B,EAAE,MAAM,GAAG,IAAI,CAAC;QACpD,QAAQ,CAAC,yBAAyB,EAAE,MAAM,GAAG,IAAI,CAAC;QAClD,QAAQ,CAAC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7C,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1C,QAAQ,CAAC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3C,QAAQ,CAAC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9C,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;QACtC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;QACzC,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;KACxC,CAAC;IACF,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3C;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE;IAChD,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,yBAAyB,CAAC;IAC7C,QAAQ,CAAC,QAAQ,EAAE,gCAAgC,CAAC;IACpD,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CACjC,GAAG,oBAAoB,CA+BvB","sourcesContent":["import type { HostResourceSnapshot } from \"./host-resource-snapshot.ts\";\nimport { effectiveAvailableMemoryBytes } from \"./host-resource-snapshot.ts\";\nimport type { ResourceAdmissionDecision, ResourceGovernorMode, ResourceReasonCode } from \"./resource-admission.ts\";\nimport type { ResolvedResourceGovernorSettings } from \"./resource-governor-types.ts\";\n\nconst REASON_LABELS: Record<ResourceReasonCode, string> = {\n\t\"resource.memory.low\": \"memory low\",\n\t\"resource.memory.critical\": \"memory critical\",\n\t\"resource.disk.low\": \"disk low\",\n\t\"resource.disk.critical\": \"disk critical\",\n\t\"resource.cpu.busy\": \"CPU busy\",\n\t\"resource.heap.high\": \"heap high\",\n\t\"resource.heap.critical\": \"heap critical\",\n\t\"resource.probe.partial\": \"partial probe\",\n\t\"resource.probe.timeout\": \"probe timeout\",\n};\n\n/** Humanize reason codes for the §19.1 summary line (\"memory low, CPU busy\"). */\nexport function describeResourceReasons(reasons: readonly ResourceReasonCode[]): string {\n\tif (reasons.length === 0) {\n\t\treturn \"none\";\n\t}\n\treturn reasons.map((reason) => REASON_LABELS[reason] ?? reason).join(\", \");\n}\n\n/** §19.1 summary block shared by `/resource` and the doctor's human output. */\nexport function formatResourceSummaryLines(mode: ResourceGovernorMode, decision: ResourceAdmissionDecision): string[] {\n\treturn [\n\t\t`mode: ${mode}`,\n\t\t`pressure: ${decision.pressure}`,\n\t\t`action: ${decision.action}`,\n\t\t`tool concurrency: ${decision.maxToolConcurrency}`,\n\t\t`subagent lanes: ${decision.maxParallelLanes}`,\n\t\t`heavy processes: ${decision.maxHeavyProcesses}`,\n\t\t`reasons: ${describeResourceReasons(decision.reasons)}`,\n\t];\n}\n\n/**\n * Verbose probe details for explicit local diagnostics only (§19.1 verbose,\n * §11.3: raw values never enter tool results or model prompts).\n */\nexport function formatResourceProbeLines(snapshot: HostResourceSnapshot): string[] {\n\tconst heapRatio = snapshot.heapLimitBytes > 0 ? snapshot.heapUsedBytes / snapshot.heapLimitBytes : null;\n\tconst lines = [\n\t\t`observed at: ${snapshot.observedAt}`,\n\t\t`environment: ${snapshot.environment} (${snapshot.platform}/${snapshot.arch}, ${snapshot.logicalCpuCount} CPUs)`,\n\t\t`effective available memory: ${formatMiB(effectiveAvailableMemoryBytes(snapshot))}`,\n\t\t` process available: ${formatMiB(snapshot.processAvailableMemoryBytes)}`,\n\t\t` constrained limit: ${formatMiB(snapshot.constrainedMemoryBytes)}`,\n\t\t` host free: ${formatMiB(snapshot.hostFreeMemoryBytes)} of ${formatMiB(snapshot.hostTotalMemoryBytes)}`,\n\t\t`workspace disk available: ${formatMiB(snapshot.workspaceAvailableBytes)}`,\n\t\t`heap: ${formatMiB(snapshot.heapUsedBytes)} of ${formatMiB(snapshot.heapLimitBytes)}${heapRatio === null ? \"\" : ` (${(heapRatio * 100).toFixed(1)}%)`}`,\n\t\t`system CPU: ${snapshot.systemCpuPercent === null ? \"unknown\" : `${snapshot.systemCpuPercent.toFixed(1)}%`}`,\n\t];\n\tif (snapshot.diagnostics.length > 0) {\n\t\tlines.push(`diagnostics: ${snapshot.diagnostics.join(\", \")}`);\n\t}\n\treturn lines;\n}\n\n/** Policy view: mode, §6.7 thresholds, §7.2 caps, and §18.1 validation errors. */\nexport function formatResourcePolicyLines(resolved: ResolvedResourceGovernorSettings): string[] {\n\tconst { thresholds, caps } = resolved.admission;\n\tconst lines = [\n\t\t`mode: ${resolved.mode}`,\n\t\t`probe deadline: ${resolved.maxProbeMs ?? 300} ms, CPU sample: ${resolved.cpuSampleMs ?? 180} ms`,\n\t\t`memory MiB (constrained/critical): ${thresholds.constrainedAvailableMemoryMiB}/${thresholds.criticalAvailableMemoryMiB}`,\n\t\t`disk MiB (constrained/critical): ${thresholds.constrainedDiskFreeMiB}/${thresholds.criticalDiskFreeMiB}`,\n\t\t`heap ratio (constrained/critical): ${thresholds.constrainedHeapRatio}/${thresholds.criticalHeapRatio}`,\n\t\t`busy CPU percent: ${thresholds.busyCpuPercent}`,\n\t\t`caps normal: tools ${caps.normal.maxToolConcurrency}, lanes ${caps.normal.maxParallelLanes}, heavy ${caps.normal.maxHeavyProcesses}`,\n\t\t`caps constrained: tools ${caps.constrained.maxToolConcurrency}, lanes ${caps.constrained.maxParallelLanes}, heavy ${caps.constrained.maxHeavyProcesses}`,\n\t\t`caps critical: tools ${caps.critical.maxToolConcurrency}, lanes ${caps.critical.maxParallelLanes}, heavy ${caps.critical.maxHeavyProcesses}`,\n\t];\n\tfor (const error of resolved.errors) {\n\t\tlines.push(`error: ${error}`);\n\t}\n\treturn lines;\n}\n\n/** Bounded JSON schema for `omk doctor resources --json` (§19.2). */\nexport interface ResourceDoctorReport {\n\treadonly schemaVersion: 1;\n\treadonly command: \"resource_doctor\";\n\treadonly mode: ResourceGovernorMode;\n\treadonly pressure: ResourceAdmissionDecision[\"pressure\"];\n\treadonly action: ResourceAdmissionDecision[\"action\"];\n\treadonly caps: {\n\t\treadonly maxToolConcurrency: number;\n\t\treadonly maxParallelLanes: number;\n\t\treadonly maxHeavyProcesses: number;\n\t};\n\treadonly reasons: readonly ResourceReasonCode[];\n\treadonly probeDurationMs: number;\n\treadonly snapshot: {\n\t\treadonly environment: HostResourceSnapshot[\"environment\"];\n\t\treadonly logicalCpuCount: number;\n\t\treadonly effectiveAvailableMemoryMiB: number | null;\n\t\treadonly processAvailableMemoryMiB: number | null;\n\t\treadonly constrainedMemoryMiB: number | null;\n\t\treadonly hostFreeMemoryMiB: number | null;\n\t\treadonly hostTotalMemoryMiB: number | null;\n\t\treadonly workspaceAvailableMiB: number | null;\n\t\treadonly heapUsedRatio: number | null;\n\t\treadonly systemCpuPercent: number | null;\n\t\treadonly diagnostics: readonly string[];\n\t};\n\treadonly settingsErrors: readonly string[];\n}\n\nexport function buildResourceDoctorReport(input: {\n\treadonly snapshot: HostResourceSnapshot;\n\treadonly decision: ResourceAdmissionDecision;\n\treadonly resolved: ResolvedResourceGovernorSettings;\n\treadonly probeDurationMs: number;\n}): ResourceDoctorReport {\n\tconst { snapshot, decision, resolved } = input;\n\tconst heapRatio = snapshot.heapLimitBytes > 0 ? snapshot.heapUsedBytes / snapshot.heapLimitBytes : null;\n\treturn {\n\t\tschemaVersion: 1,\n\t\tcommand: \"resource_doctor\",\n\t\tmode: resolved.mode,\n\t\tpressure: decision.pressure,\n\t\taction: decision.action,\n\t\tcaps: {\n\t\t\tmaxToolConcurrency: decision.maxToolConcurrency,\n\t\t\tmaxParallelLanes: decision.maxParallelLanes,\n\t\t\tmaxHeavyProcesses: decision.maxHeavyProcesses,\n\t\t},\n\t\treasons: decision.reasons,\n\t\tprobeDurationMs: Math.round(input.probeDurationMs),\n\t\tsnapshot: {\n\t\t\tenvironment: snapshot.environment,\n\t\t\tlogicalCpuCount: snapshot.logicalCpuCount,\n\t\t\teffectiveAvailableMemoryMiB: toMiB(effectiveAvailableMemoryBytes(snapshot)),\n\t\t\tprocessAvailableMemoryMiB: toMiB(snapshot.processAvailableMemoryBytes),\n\t\t\tconstrainedMemoryMiB: toMiB(snapshot.constrainedMemoryBytes),\n\t\t\thostFreeMemoryMiB: toMiB(snapshot.hostFreeMemoryBytes),\n\t\t\thostTotalMemoryMiB: toMiB(snapshot.hostTotalMemoryBytes),\n\t\t\tworkspaceAvailableMiB: toMiB(snapshot.workspaceAvailableBytes),\n\t\t\theapUsedRatio: heapRatio === null ? null : Number(heapRatio.toFixed(4)),\n\t\t\tsystemCpuPercent: snapshot.systemCpuPercent,\n\t\t\tdiagnostics: snapshot.diagnostics,\n\t\t},\n\t\tsettingsErrors: resolved.errors,\n\t};\n}\n\nconst MIB = 1024 * 1024;\n\nfunction toMiB(bytes: number | null): number | null {\n\treturn bytes === null ? null : Math.round(bytes / MIB);\n}\n\nfunction formatMiB(bytes: number | null): string {\n\tconst mib = toMiB(bytes);\n\treturn mib === null ? \"unknown\" : `${mib.toLocaleString()} MiB`;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-governor-format.js","sourceRoot":"","sources":["../../src/core/resource-governor-format.ts"],"names":[],"mappings":"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","sourcesContent":["import type { HostResourceSnapshot } from \"./host-resource-snapshot.ts\";\nimport { effectiveAvailableMemoryBytes } from \"./host-resource-snapshot.ts\";\nimport type { ResourceAdmissionDecision, ResourceGovernorMode, ResourceReasonCode } from \"./resource-admission.ts\";\nimport type { ResolvedResourceGovernorSettings } from \"./resource-governor-settings.ts\";\n\nconst REASON_LABELS: Record<ResourceReasonCode, string> = {\n\t\"resource.memory.low\": \"memory low\",\n\t\"resource.memory.critical\": \"memory critical\",\n\t\"resource.disk.low\": \"disk low\",\n\t\"resource.disk.critical\": \"disk critical\",\n\t\"resource.cpu.busy\": \"CPU busy\",\n\t\"resource.heap.high\": \"heap high\",\n\t\"resource.heap.critical\": \"heap critical\",\n\t\"resource.probe.partial\": \"partial probe\",\n\t\"resource.probe.timeout\": \"probe timeout\",\n};\n\n/** Humanize reason codes for the §19.1 summary line (\"memory low, CPU busy\"). */\nexport function describeResourceReasons(reasons: readonly ResourceReasonCode[]): string {\n\tif (reasons.length === 0) {\n\t\treturn \"none\";\n\t}\n\treturn reasons.map((reason) => REASON_LABELS[reason] ?? reason).join(\", \");\n}\n\n/** §19.1 summary block shared by `/resource` and the doctor's human output. */\nexport function formatResourceSummaryLines(mode: ResourceGovernorMode, decision: ResourceAdmissionDecision): string[] {\n\treturn [\n\t\t`mode: ${mode}`,\n\t\t`pressure: ${decision.pressure}`,\n\t\t`action: ${decision.action}`,\n\t\t`tool concurrency: ${decision.maxToolConcurrency}`,\n\t\t`subagent lanes: ${decision.maxParallelLanes}`,\n\t\t`heavy processes: ${decision.maxHeavyProcesses}`,\n\t\t`reasons: ${describeResourceReasons(decision.reasons)}`,\n\t];\n}\n\n/**\n * Verbose probe details for explicit local diagnostics only (§19.1 verbose,\n * §11.3: raw values never enter tool results or model prompts).\n */\nexport function formatResourceProbeLines(snapshot: HostResourceSnapshot): string[] {\n\tconst heapRatio = snapshot.heapLimitBytes > 0 ? snapshot.heapUsedBytes / snapshot.heapLimitBytes : null;\n\tconst lines = [\n\t\t`observed at: ${snapshot.observedAt}`,\n\t\t`environment: ${snapshot.environment} (${snapshot.platform}/${snapshot.arch}, ${snapshot.logicalCpuCount} CPUs)`,\n\t\t`effective available memory: ${formatMiB(effectiveAvailableMemoryBytes(snapshot))}`,\n\t\t` process available: ${formatMiB(snapshot.processAvailableMemoryBytes)}`,\n\t\t` constrained limit: ${formatMiB(snapshot.constrainedMemoryBytes)}`,\n\t\t` host free: ${formatMiB(snapshot.hostFreeMemoryBytes)} of ${formatMiB(snapshot.hostTotalMemoryBytes)}`,\n\t\t`workspace disk available: ${formatMiB(snapshot.workspaceAvailableBytes)}`,\n\t\t`heap: ${formatMiB(snapshot.heapUsedBytes)} of ${formatMiB(snapshot.heapLimitBytes)}${heapRatio === null ? \"\" : ` (${(heapRatio * 100).toFixed(1)}%)`}`,\n\t\t`system CPU: ${snapshot.systemCpuPercent === null ? \"unknown\" : `${snapshot.systemCpuPercent.toFixed(1)}%`}`,\n\t];\n\tif (snapshot.diagnostics.length > 0) {\n\t\tlines.push(`diagnostics: ${snapshot.diagnostics.join(\", \")}`);\n\t}\n\treturn lines;\n}\n\n/** Policy view: mode, §6.7 thresholds, §7.2 caps, and §18.1 validation errors. */\nexport function formatResourcePolicyLines(resolved: ResolvedResourceGovernorSettings): string[] {\n\tconst { thresholds, caps } = resolved.admission;\n\tconst lines = [\n\t\t`mode: ${resolved.mode}`,\n\t\t`probe deadline: ${resolved.maxProbeMs ?? 300} ms, CPU sample: ${resolved.cpuSampleMs ?? 180} ms`,\n\t\t`memory MiB (constrained/critical): ${thresholds.constrainedAvailableMemoryMiB}/${thresholds.criticalAvailableMemoryMiB}`,\n\t\t`disk MiB (constrained/critical): ${thresholds.constrainedDiskFreeMiB}/${thresholds.criticalDiskFreeMiB}`,\n\t\t`heap ratio (constrained/critical): ${thresholds.constrainedHeapRatio}/${thresholds.criticalHeapRatio}`,\n\t\t`busy CPU percent: ${thresholds.busyCpuPercent}`,\n\t\t`caps normal: tools ${caps.normal.maxToolConcurrency}, lanes ${caps.normal.maxParallelLanes}, heavy ${caps.normal.maxHeavyProcesses}`,\n\t\t`caps constrained: tools ${caps.constrained.maxToolConcurrency}, lanes ${caps.constrained.maxParallelLanes}, heavy ${caps.constrained.maxHeavyProcesses}`,\n\t\t`caps critical: tools ${caps.critical.maxToolConcurrency}, lanes ${caps.critical.maxParallelLanes}, heavy ${caps.critical.maxHeavyProcesses}`,\n\t];\n\tfor (const error of resolved.errors) {\n\t\tlines.push(`error: ${error}`);\n\t}\n\treturn lines;\n}\n\n/** Bounded JSON schema for `omk doctor resources --json` (§19.2). */\nexport interface ResourceDoctorReport {\n\treadonly schemaVersion: 1;\n\treadonly command: \"resource_doctor\";\n\treadonly mode: ResourceGovernorMode;\n\treadonly pressure: ResourceAdmissionDecision[\"pressure\"];\n\treadonly action: ResourceAdmissionDecision[\"action\"];\n\treadonly caps: {\n\t\treadonly maxToolConcurrency: number;\n\t\treadonly maxParallelLanes: number;\n\t\treadonly maxHeavyProcesses: number;\n\t};\n\treadonly reasons: readonly ResourceReasonCode[];\n\treadonly probeDurationMs: number;\n\treadonly snapshot: {\n\t\treadonly environment: HostResourceSnapshot[\"environment\"];\n\t\treadonly logicalCpuCount: number;\n\t\treadonly effectiveAvailableMemoryMiB: number | null;\n\t\treadonly processAvailableMemoryMiB: number | null;\n\t\treadonly constrainedMemoryMiB: number | null;\n\t\treadonly hostFreeMemoryMiB: number | null;\n\t\treadonly hostTotalMemoryMiB: number | null;\n\t\treadonly workspaceAvailableMiB: number | null;\n\t\treadonly heapUsedRatio: number | null;\n\t\treadonly systemCpuPercent: number | null;\n\t\treadonly diagnostics: readonly string[];\n\t};\n\treadonly settingsErrors: readonly string[];\n}\n\nexport function buildResourceDoctorReport(input: {\n\treadonly snapshot: HostResourceSnapshot;\n\treadonly decision: ResourceAdmissionDecision;\n\treadonly resolved: ResolvedResourceGovernorSettings;\n\treadonly probeDurationMs: number;\n}): ResourceDoctorReport {\n\tconst { snapshot, decision, resolved } = input;\n\tconst heapRatio = snapshot.heapLimitBytes > 0 ? snapshot.heapUsedBytes / snapshot.heapLimitBytes : null;\n\treturn {\n\t\tschemaVersion: 1,\n\t\tcommand: \"resource_doctor\",\n\t\tmode: resolved.mode,\n\t\tpressure: decision.pressure,\n\t\taction: decision.action,\n\t\tcaps: {\n\t\t\tmaxToolConcurrency: decision.maxToolConcurrency,\n\t\t\tmaxParallelLanes: decision.maxParallelLanes,\n\t\t\tmaxHeavyProcesses: decision.maxHeavyProcesses,\n\t\t},\n\t\treasons: decision.reasons,\n\t\tprobeDurationMs: Math.round(input.probeDurationMs),\n\t\tsnapshot: {\n\t\t\tenvironment: snapshot.environment,\n\t\t\tlogicalCpuCount: snapshot.logicalCpuCount,\n\t\t\teffectiveAvailableMemoryMiB: toMiB(effectiveAvailableMemoryBytes(snapshot)),\n\t\t\tprocessAvailableMemoryMiB: toMiB(snapshot.processAvailableMemoryBytes),\n\t\t\tconstrainedMemoryMiB: toMiB(snapshot.constrainedMemoryBytes),\n\t\t\thostFreeMemoryMiB: toMiB(snapshot.hostFreeMemoryBytes),\n\t\t\thostTotalMemoryMiB: toMiB(snapshot.hostTotalMemoryBytes),\n\t\t\tworkspaceAvailableMiB: toMiB(snapshot.workspaceAvailableBytes),\n\t\t\theapUsedRatio: heapRatio === null ? null : Number(heapRatio.toFixed(4)),\n\t\t\tsystemCpuPercent: snapshot.systemCpuPercent,\n\t\t\tdiagnostics: snapshot.diagnostics,\n\t\t},\n\t\tsettingsErrors: resolved.errors,\n\t};\n}\n\nconst MIB = 1024 * 1024;\n\nfunction toMiB(bytes: number | null): number | null {\n\treturn bytes === null ? null : Math.round(bytes / MIB);\n}\n\nfunction formatMiB(bytes: number | null): string {\n\tconst mib = toMiB(bytes);\n\treturn mib === null ? \"unknown\" : `${mib.toLocaleString()} MiB`;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"resource-governor-format.js","sourceRoot":"","sources":["../../src/core/resource-governor-format.ts"],"names":[],"mappings":"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","sourcesContent":["import type { HostResourceSnapshot } from \"./host-resource-snapshot.ts\";\nimport { effectiveAvailableMemoryBytes } from \"./host-resource-snapshot.ts\";\nimport type { ResourceAdmissionDecision, ResourceGovernorMode, ResourceReasonCode } from \"./resource-admission.ts\";\nimport type { ResolvedResourceGovernorSettings } from \"./resource-governor-types.ts\";\n\nconst REASON_LABELS: Record<ResourceReasonCode, string> = {\n\t\"resource.memory.low\": \"memory low\",\n\t\"resource.memory.critical\": \"memory critical\",\n\t\"resource.disk.low\": \"disk low\",\n\t\"resource.disk.critical\": \"disk critical\",\n\t\"resource.cpu.busy\": \"CPU busy\",\n\t\"resource.heap.high\": \"heap high\",\n\t\"resource.heap.critical\": \"heap critical\",\n\t\"resource.probe.partial\": \"partial probe\",\n\t\"resource.probe.timeout\": \"probe timeout\",\n};\n\n/** Humanize reason codes for the §19.1 summary line (\"memory low, CPU busy\"). */\nexport function describeResourceReasons(reasons: readonly ResourceReasonCode[]): string {\n\tif (reasons.length === 0) {\n\t\treturn \"none\";\n\t}\n\treturn reasons.map((reason) => REASON_LABELS[reason] ?? reason).join(\", \");\n}\n\n/** §19.1 summary block shared by `/resource` and the doctor's human output. */\nexport function formatResourceSummaryLines(mode: ResourceGovernorMode, decision: ResourceAdmissionDecision): string[] {\n\treturn [\n\t\t`mode: ${mode}`,\n\t\t`pressure: ${decision.pressure}`,\n\t\t`action: ${decision.action}`,\n\t\t`tool concurrency: ${decision.maxToolConcurrency}`,\n\t\t`subagent lanes: ${decision.maxParallelLanes}`,\n\t\t`heavy processes: ${decision.maxHeavyProcesses}`,\n\t\t`reasons: ${describeResourceReasons(decision.reasons)}`,\n\t];\n}\n\n/**\n * Verbose probe details for explicit local diagnostics only (§19.1 verbose,\n * §11.3: raw values never enter tool results or model prompts).\n */\nexport function formatResourceProbeLines(snapshot: HostResourceSnapshot): string[] {\n\tconst heapRatio = snapshot.heapLimitBytes > 0 ? snapshot.heapUsedBytes / snapshot.heapLimitBytes : null;\n\tconst lines = [\n\t\t`observed at: ${snapshot.observedAt}`,\n\t\t`environment: ${snapshot.environment} (${snapshot.platform}/${snapshot.arch}, ${snapshot.logicalCpuCount} CPUs)`,\n\t\t`effective available memory: ${formatMiB(effectiveAvailableMemoryBytes(snapshot))}`,\n\t\t` process available: ${formatMiB(snapshot.processAvailableMemoryBytes)}`,\n\t\t` constrained limit: ${formatMiB(snapshot.constrainedMemoryBytes)}`,\n\t\t` host free: ${formatMiB(snapshot.hostFreeMemoryBytes)} of ${formatMiB(snapshot.hostTotalMemoryBytes)}`,\n\t\t`workspace disk available: ${formatMiB(snapshot.workspaceAvailableBytes)}`,\n\t\t`heap: ${formatMiB(snapshot.heapUsedBytes)} of ${formatMiB(snapshot.heapLimitBytes)}${heapRatio === null ? \"\" : ` (${(heapRatio * 100).toFixed(1)}%)`}`,\n\t\t`system CPU: ${snapshot.systemCpuPercent === null ? \"unknown\" : `${snapshot.systemCpuPercent.toFixed(1)}%`}`,\n\t];\n\tif (snapshot.diagnostics.length > 0) {\n\t\tlines.push(`diagnostics: ${snapshot.diagnostics.join(\", \")}`);\n\t}\n\treturn lines;\n}\n\n/** Policy view: mode, §6.7 thresholds, §7.2 caps, and §18.1 validation errors. */\nexport function formatResourcePolicyLines(resolved: ResolvedResourceGovernorSettings): string[] {\n\tconst { thresholds, caps } = resolved.admission;\n\tconst lines = [\n\t\t`mode: ${resolved.mode}`,\n\t\t`probe deadline: ${resolved.maxProbeMs ?? 300} ms, CPU sample: ${resolved.cpuSampleMs ?? 180} ms`,\n\t\t`memory MiB (constrained/critical): ${thresholds.constrainedAvailableMemoryMiB}/${thresholds.criticalAvailableMemoryMiB}`,\n\t\t`disk MiB (constrained/critical): ${thresholds.constrainedDiskFreeMiB}/${thresholds.criticalDiskFreeMiB}`,\n\t\t`heap ratio (constrained/critical): ${thresholds.constrainedHeapRatio}/${thresholds.criticalHeapRatio}`,\n\t\t`busy CPU percent: ${thresholds.busyCpuPercent}`,\n\t\t`caps normal: tools ${caps.normal.maxToolConcurrency}, lanes ${caps.normal.maxParallelLanes}, heavy ${caps.normal.maxHeavyProcesses}`,\n\t\t`caps constrained: tools ${caps.constrained.maxToolConcurrency}, lanes ${caps.constrained.maxParallelLanes}, heavy ${caps.constrained.maxHeavyProcesses}`,\n\t\t`caps critical: tools ${caps.critical.maxToolConcurrency}, lanes ${caps.critical.maxParallelLanes}, heavy ${caps.critical.maxHeavyProcesses}`,\n\t];\n\tfor (const error of resolved.errors) {\n\t\tlines.push(`error: ${error}`);\n\t}\n\treturn lines;\n}\n\n/** Bounded JSON schema for `omk doctor resources --json` (§19.2). */\nexport interface ResourceDoctorReport {\n\treadonly schemaVersion: 1;\n\treadonly command: \"resource_doctor\";\n\treadonly mode: ResourceGovernorMode;\n\treadonly pressure: ResourceAdmissionDecision[\"pressure\"];\n\treadonly action: ResourceAdmissionDecision[\"action\"];\n\treadonly caps: {\n\t\treadonly maxToolConcurrency: number;\n\t\treadonly maxParallelLanes: number;\n\t\treadonly maxHeavyProcesses: number;\n\t};\n\treadonly reasons: readonly ResourceReasonCode[];\n\treadonly probeDurationMs: number;\n\treadonly snapshot: {\n\t\treadonly environment: HostResourceSnapshot[\"environment\"];\n\t\treadonly logicalCpuCount: number;\n\t\treadonly effectiveAvailableMemoryMiB: number | null;\n\t\treadonly processAvailableMemoryMiB: number | null;\n\t\treadonly constrainedMemoryMiB: number | null;\n\t\treadonly hostFreeMemoryMiB: number | null;\n\t\treadonly hostTotalMemoryMiB: number | null;\n\t\treadonly workspaceAvailableMiB: number | null;\n\t\treadonly heapUsedRatio: number | null;\n\t\treadonly systemCpuPercent: number | null;\n\t\treadonly diagnostics: readonly string[];\n\t};\n\treadonly settingsErrors: readonly string[];\n}\n\nexport function buildResourceDoctorReport(input: {\n\treadonly snapshot: HostResourceSnapshot;\n\treadonly decision: ResourceAdmissionDecision;\n\treadonly resolved: ResolvedResourceGovernorSettings;\n\treadonly probeDurationMs: number;\n}): ResourceDoctorReport {\n\tconst { snapshot, decision, resolved } = input;\n\tconst heapRatio = snapshot.heapLimitBytes > 0 ? snapshot.heapUsedBytes / snapshot.heapLimitBytes : null;\n\treturn {\n\t\tschemaVersion: 1,\n\t\tcommand: \"resource_doctor\",\n\t\tmode: resolved.mode,\n\t\tpressure: decision.pressure,\n\t\taction: decision.action,\n\t\tcaps: {\n\t\t\tmaxToolConcurrency: decision.maxToolConcurrency,\n\t\t\tmaxParallelLanes: decision.maxParallelLanes,\n\t\t\tmaxHeavyProcesses: decision.maxHeavyProcesses,\n\t\t},\n\t\treasons: decision.reasons,\n\t\tprobeDurationMs: Math.round(input.probeDurationMs),\n\t\tsnapshot: {\n\t\t\tenvironment: snapshot.environment,\n\t\t\tlogicalCpuCount: snapshot.logicalCpuCount,\n\t\t\teffectiveAvailableMemoryMiB: toMiB(effectiveAvailableMemoryBytes(snapshot)),\n\t\t\tprocessAvailableMemoryMiB: toMiB(snapshot.processAvailableMemoryBytes),\n\t\t\tconstrainedMemoryMiB: toMiB(snapshot.constrainedMemoryBytes),\n\t\t\thostFreeMemoryMiB: toMiB(snapshot.hostFreeMemoryBytes),\n\t\t\thostTotalMemoryMiB: toMiB(snapshot.hostTotalMemoryBytes),\n\t\t\tworkspaceAvailableMiB: toMiB(snapshot.workspaceAvailableBytes),\n\t\t\theapUsedRatio: heapRatio === null ? null : Number(heapRatio.toFixed(4)),\n\t\t\tsystemCpuPercent: snapshot.systemCpuPercent,\n\t\t\tdiagnostics: snapshot.diagnostics,\n\t\t},\n\t\tsettingsErrors: resolved.errors,\n\t};\n}\n\nconst MIB = 1024 * 1024;\n\nfunction toMiB(bytes: number | null): number | null {\n\treturn bytes === null ? null : Math.round(bytes / MIB);\n}\n\nfunction formatMiB(bytes: number | null): string {\n\tconst mib = toMiB(bytes);\n\treturn mib === null ? \"unknown\" : `${mib.toLocaleString()} MiB`;\n}\n"]}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ResourceGovernorMode } from "./resource-admission.ts";
|
|
2
|
+
import type { ResolvedResourceGovernorSettings } from "./resource-governor-types.ts";
|
|
3
|
+
export type { ResolvedResourceGovernorSettings };
|
|
2
4
|
export { buildResourceDoctorReport, describeResourceReasons, formatResourcePolicyLines, formatResourceProbeLines, formatResourceSummaryLines, type ResourceDoctorReport, } from "./resource-governor-format.ts";
|
|
3
5
|
/**
|
|
4
6
|
* Resource governor settings surface (OMK v0.97.x roadmap §18, M1/PR2).
|
|
@@ -10,8 +12,9 @@ export { buildResourceDoctorReport, describeResourceReasons, formatResourcePolic
|
|
|
10
12
|
*
|
|
11
13
|
* Resolved values feed the `/resource` command, `omk doctor resources`, and
|
|
12
14
|
* the M2 prompt preflight: `observe` records decisions only, while
|
|
13
|
-
* `adaptive`/`strict`
|
|
14
|
-
*
|
|
15
|
+
* `adaptive`/`strict` throttle per-run tool concurrency and governed bash
|
|
16
|
+
* heavy-process permits. Subagent lane caps remain internal until the live
|
|
17
|
+
* child-dispatch path uses `launchSubagentLanes()`.
|
|
15
18
|
*/
|
|
16
19
|
/** Additive settings block (§18, §29.1: absent block keeps v0.96.1 behavior). */
|
|
17
20
|
export interface ResourceGovernorSettings {
|
|
@@ -38,15 +41,6 @@ export interface ResourceGovernorSettings {
|
|
|
38
41
|
}
|
|
39
42
|
export declare const RESOURCE_GOVERNOR_MODE_ENV = "OMK_RESOURCE_GOVERNOR";
|
|
40
43
|
export declare const DEFAULT_RESOURCE_GOVERNOR_MODE: ResourceGovernorMode;
|
|
41
|
-
export interface ResolvedResourceGovernorSettings {
|
|
42
|
-
readonly mode: ResourceGovernorMode;
|
|
43
|
-
/** Only present when the setting is valid; the probe applies its own defaults otherwise. */
|
|
44
|
-
readonly maxProbeMs?: number;
|
|
45
|
-
readonly cpuSampleMs?: number;
|
|
46
|
-
readonly admission: ResourceAdmissionConfig;
|
|
47
|
-
/** §18.1 explicit validation errors; non-empty means defaults were applied for the failed area. */
|
|
48
|
-
readonly errors: readonly string[];
|
|
49
|
-
}
|
|
50
44
|
/**
|
|
51
45
|
* Resolve settings + environment into governor mode, probe options, and the
|
|
52
46
|
* admission config. Never throws; every invalid field produces an explicit
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-governor-settings.d.ts","sourceRoot":"","sources":["../../src/core/resource-governor-settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"resource-governor-settings.d.ts","sourceRoot":"","sources":["../../src/core/resource-governor-settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoC,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAEtG,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,8BAA8B,CAAC;AAMrF,YAAY,EAAE,gCAAgC,EAAE,CAAC;AAEjD,OAAO,EACN,yBAAyB,EACzB,uBAAuB,EACvB,yBAAyB,EACzB,wBAAwB,EACxB,0BAA0B,EAC1B,KAAK,oBAAoB,GACzB,MAAM,+BAA+B,CAAC;AAEvC;;;;;;;;;;;;;GAaG;AAEH,mFAAiF;AACjF,MAAM,WAAW,wBAAwB;IACxC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,oBAAoB,CAAC;IAE5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,6BAA6B,CAAC,EAAE,MAAM,CAAC;IACvC,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,6BAA6B,CAAC,EAAE,MAAM,CAAC;IACvC,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,4BAA4B,CAAC,EAAE,MAAM,CAAC;IACtC,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,eAAO,MAAM,0BAA0B,0BAA0B,CAAC;AAClE,eAAO,MAAM,8BAA8B,EAAE,oBAAgC,CAAC;AAG9E;;;;GAIG;AACH,wBAAgB,+BAA+B,CAC9C,QAAQ,CAAC,EAAE,wBAAwB,EACnC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAClC,gCAAgC,CA6ClC","sourcesContent":["import type { ResourceAdmissionConfigOverrides, ResourceGovernorMode } from \"./resource-admission.ts\";\nimport { resolveResourceAdmissionConfig } from \"./resource-admission.ts\";\nimport type { ResolvedResourceGovernorSettings } from \"./resource-governor-types.ts\";\nimport { MAX_CPU_SAMPLE_MS, MIN_CPU_SAMPLE_MS } from \"./system-cpu-sampler.ts\";\n\n// The shape lives in `resource-governor-types.ts` so the formatter can describe\n// it without importing this module back. Re-exported because this module is the\n// governor's entry point and callers already import the name from here.\nexport type { ResolvedResourceGovernorSettings };\n\nexport {\n\tbuildResourceDoctorReport,\n\tdescribeResourceReasons,\n\tformatResourcePolicyLines,\n\tformatResourceProbeLines,\n\tformatResourceSummaryLines,\n\ttype ResourceDoctorReport,\n} from \"./resource-governor-format.ts\";\n\n/**\n * Resource governor settings surface (OMK v0.97.x roadmap §18, M1/PR2).\n *\n * Pure translation from the additive `resourceGovernor` settings block (and\n * the §18.2 `OMK_RESOURCE_GOVERNOR` env override) to the layer-1 admission\n * config plus probe options. Validation follows §18.1: explicit errors over\n * silent clamps, and invalid input fails closed to the defaults.\n *\n * Resolved values feed the `/resource` command, `omk doctor resources`, and\n * the M2 prompt preflight: `observe` records decisions only, while\n * `adaptive`/`strict` throttle per-run tool concurrency and governed bash\n * heavy-process permits. Subagent lane caps remain internal until the live\n * child-dispatch path uses `launchSubagentLanes()`.\n */\n\n/** Additive settings block (§18, §29.1: absent block keeps v0.96.1 behavior). */\nexport interface ResourceGovernorSettings {\n\tenabled?: boolean; // default: true; false forces mode \"off\"\n\tmode?: ResourceGovernorMode; // default: \"observe\" (v0.97.0-alpha rollout stage, §7.4)\n\n\tmaxProbeMs?: number; // default: 300; async probe deadline, valid 50..5000 (§18.1)\n\tcpuSampleMs?: number; // default: 180; CPU two-sample interval, valid 150..250 (§6.3)\n\n\tconstrainedAvailableMemoryMiB?: number; // default: 1536 (§6.7)\n\tcriticalAvailableMemoryMiB?: number; // default: 512\n\tconstrainedDiskFreeMiB?: number; // default: 4096\n\tcriticalDiskFreeMiB?: number; // default: 1024\n\tconstrainedHeapRatio?: number; // default: 0.75\n\tcriticalHeapRatio?: number; // default: 0.85\n\tbusyCpuPercent?: number; // default: 85\n\n\tnormalMaxToolConcurrency?: number; // default: 4 (§7.2)\n\tconstrainedMaxToolConcurrency?: number; // default: 2\n\tcriticalMaxToolConcurrency?: number; // default: 1\n\tnormalMaxParallelLanes?: number; // default: 4\n\tconstrainedMaxParallelLanes?: number; // default: 2\n\tcriticalMaxParallelLanes?: number; // default: 1\n\tnormalMaxHeavyProcesses?: number; // default: 2\n\tconstrainedMaxHeavyProcesses?: number; // default: 1\n\tcriticalMaxHeavyProcesses?: number; // default: 1\n}\n\nexport const RESOURCE_GOVERNOR_MODE_ENV = \"OMK_RESOURCE_GOVERNOR\";\nexport const DEFAULT_RESOURCE_GOVERNOR_MODE: ResourceGovernorMode = \"observe\";\nconst RESOURCE_GOVERNOR_MODES: ReadonlySet<string> = new Set([\"off\", \"observe\", \"adaptive\", \"strict\"]);\n\n/**\n * Resolve settings + environment into governor mode, probe options, and the\n * admission config. Never throws; every invalid field produces an explicit\n * error and falls back to the corresponding default (§18.1 fail-closed).\n */\nexport function resolveResourceGovernorSettings(\n\tsettings?: ResourceGovernorSettings,\n\tenv: NodeJS.ProcessEnv = process.env,\n): ResolvedResourceGovernorSettings {\n\tconst errors: string[] = [];\n\tconst mode = resolveMode(settings, env, errors);\n\n\tconst maxProbeMs = validateRange(settings?.maxProbeMs, \"maxProbeMs\", 50, 5000, errors);\n\tconst cpuSampleMs = validateRange(\n\t\tsettings?.cpuSampleMs,\n\t\t\"cpuSampleMs\",\n\t\tMIN_CPU_SAMPLE_MS,\n\t\tMAX_CPU_SAMPLE_MS,\n\t\terrors,\n\t);\n\n\tconst overrides: ResourceAdmissionConfigOverrides = {\n\t\tthresholds: pruneUndefined({\n\t\t\tconstrainedAvailableMemoryMiB: settings?.constrainedAvailableMemoryMiB,\n\t\t\tcriticalAvailableMemoryMiB: settings?.criticalAvailableMemoryMiB,\n\t\t\tconstrainedDiskFreeMiB: settings?.constrainedDiskFreeMiB,\n\t\t\tcriticalDiskFreeMiB: settings?.criticalDiskFreeMiB,\n\t\t\tconstrainedHeapRatio: settings?.constrainedHeapRatio,\n\t\t\tcriticalHeapRatio: settings?.criticalHeapRatio,\n\t\t\tbusyCpuPercent: settings?.busyCpuPercent,\n\t\t}),\n\t\tcaps: {\n\t\t\tnormal: pruneUndefined({\n\t\t\t\tmaxToolConcurrency: settings?.normalMaxToolConcurrency,\n\t\t\t\tmaxParallelLanes: settings?.normalMaxParallelLanes,\n\t\t\t\tmaxHeavyProcesses: settings?.normalMaxHeavyProcesses,\n\t\t\t}),\n\t\t\tconstrained: pruneUndefined({\n\t\t\t\tmaxToolConcurrency: settings?.constrainedMaxToolConcurrency,\n\t\t\t\tmaxParallelLanes: settings?.constrainedMaxParallelLanes,\n\t\t\t\tmaxHeavyProcesses: settings?.constrainedMaxHeavyProcesses,\n\t\t\t}),\n\t\t\tcritical: pruneUndefined({\n\t\t\t\tmaxToolConcurrency: settings?.criticalMaxToolConcurrency,\n\t\t\t\tmaxParallelLanes: settings?.criticalMaxParallelLanes,\n\t\t\t\tmaxHeavyProcesses: settings?.criticalMaxHeavyProcesses,\n\t\t\t}),\n\t\t},\n\t};\n\tconst admission = resolveResourceAdmissionConfig(overrides);\n\terrors.push(...admission.errors);\n\n\treturn { mode, maxProbeMs, cpuSampleMs, admission: admission.config, errors };\n}\n\nfunction resolveMode(\n\tsettings: ResourceGovernorSettings | undefined,\n\tenv: NodeJS.ProcessEnv,\n\terrors: string[],\n): ResourceGovernorMode {\n\t// §18.2/§30.1: the env override is the operator kill switch and wins.\n\tconst envMode = env[RESOURCE_GOVERNOR_MODE_ENV]?.trim();\n\tif (envMode !== undefined && envMode !== \"\") {\n\t\tif (RESOURCE_GOVERNOR_MODES.has(envMode)) {\n\t\t\treturn envMode as ResourceGovernorMode;\n\t\t}\n\t\terrors.push(`resourceGovernor.mode: invalid ${RESOURCE_GOVERNOR_MODE_ENV} value ${JSON.stringify(envMode)}`);\n\t}\n\tif (settings?.enabled === false) {\n\t\treturn \"off\";\n\t}\n\tconst configured = settings?.mode;\n\tif (configured !== undefined) {\n\t\tif (RESOURCE_GOVERNOR_MODES.has(configured)) {\n\t\t\treturn configured;\n\t\t}\n\t\terrors.push(`resourceGovernor.mode: invalid value ${JSON.stringify(configured)}`);\n\t}\n\treturn DEFAULT_RESOURCE_GOVERNOR_MODE;\n}\n\nfunction validateRange(\n\tvalue: number | undefined,\n\tfield: string,\n\tmin: number,\n\tmax: number,\n\terrors: string[],\n): number | undefined {\n\tif (value === undefined) {\n\t\treturn undefined;\n\t}\n\tif (!Number.isSafeInteger(value) || value < min || value > max) {\n\t\terrors.push(`resourceGovernor.${field}: must be an integer within [${min}, ${max}], got ${String(value)}`);\n\t\treturn undefined;\n\t}\n\treturn value;\n}\n\nfunction pruneUndefined<T extends Record<string, number | undefined>>(record: T): Partial<T> {\n\tconst pruned: Record<string, number> = {};\n\tfor (const [key, value] of Object.entries(record)) {\n\t\tif (value !== undefined) {\n\t\t\tpruned[key] = value;\n\t\t}\n\t}\n\treturn pruned as Partial<T>;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-governor-settings.js","sourceRoot":"","sources":["../../src/core/resource-governor-settings.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tResourceAdmissionConfig,\n\tResourceAdmissionConfigOverrides,\n\tResourceGovernorMode,\n} from \"./resource-admission.ts\";\nimport { resolveResourceAdmissionConfig } from \"./resource-admission.ts\";\nimport { MAX_CPU_SAMPLE_MS, MIN_CPU_SAMPLE_MS } from \"./system-cpu-sampler.ts\";\n\nexport {\n\tbuildResourceDoctorReport,\n\tdescribeResourceReasons,\n\tformatResourcePolicyLines,\n\tformatResourceProbeLines,\n\tformatResourceSummaryLines,\n\ttype ResourceDoctorReport,\n} from \"./resource-governor-format.ts\";\n\n/**\n * Resource governor settings surface (OMK v0.97.x roadmap §18, M1/PR2).\n *\n * Pure translation from the additive `resourceGovernor` settings block (and\n * the §18.2 `OMK_RESOURCE_GOVERNOR` env override) to the layer-1 admission\n * config plus probe options. Validation follows §18.1: explicit errors over\n * silent clamps, and invalid input fails closed to the defaults.\n *\n * Resolved values feed the `/resource` command, `omk doctor resources`, and\n * the M2 prompt preflight: `observe` records decisions only, while\n * `adaptive`/`strict` let the run lease throttle per-run tool concurrency.\n * Lane and heavy-process caps become authoritative in later milestones.\n */\n\n/** Additive settings block (§18, §29.1: absent block keeps v0.96.1 behavior). */\nexport interface ResourceGovernorSettings {\n\tenabled?: boolean; // default: true; false forces mode \"off\"\n\tmode?: ResourceGovernorMode; // default: \"observe\" (v0.97.0-alpha rollout stage, §7.4)\n\n\tmaxProbeMs?: number; // default: 300; async probe deadline, valid 50..5000 (§18.1)\n\tcpuSampleMs?: number; // default: 180; CPU two-sample interval, valid 150..250 (§6.3)\n\n\tconstrainedAvailableMemoryMiB?: number; // default: 1536 (§6.7)\n\tcriticalAvailableMemoryMiB?: number; // default: 512\n\tconstrainedDiskFreeMiB?: number; // default: 4096\n\tcriticalDiskFreeMiB?: number; // default: 1024\n\tconstrainedHeapRatio?: number; // default: 0.75\n\tcriticalHeapRatio?: number; // default: 0.85\n\tbusyCpuPercent?: number; // default: 85\n\n\tnormalMaxToolConcurrency?: number; // default: 4 (§7.2)\n\tconstrainedMaxToolConcurrency?: number; // default: 2\n\tcriticalMaxToolConcurrency?: number; // default: 1\n\tnormalMaxParallelLanes?: number; // default: 4\n\tconstrainedMaxParallelLanes?: number; // default: 2\n\tcriticalMaxParallelLanes?: number; // default: 1\n\tnormalMaxHeavyProcesses?: number; // default: 2\n\tconstrainedMaxHeavyProcesses?: number; // default: 1\n\tcriticalMaxHeavyProcesses?: number; // default: 1\n}\n\nexport const RESOURCE_GOVERNOR_MODE_ENV = \"OMK_RESOURCE_GOVERNOR\";\nexport const DEFAULT_RESOURCE_GOVERNOR_MODE: ResourceGovernorMode = \"observe\";\nconst RESOURCE_GOVERNOR_MODES: ReadonlySet<string> = new Set([\"off\", \"observe\", \"adaptive\", \"strict\"]);\n\nexport interface ResolvedResourceGovernorSettings {\n\treadonly mode: ResourceGovernorMode;\n\t/** Only present when the setting is valid; the probe applies its own defaults otherwise. */\n\treadonly maxProbeMs?: number;\n\treadonly cpuSampleMs?: number;\n\treadonly admission: ResourceAdmissionConfig;\n\t/** §18.1 explicit validation errors; non-empty means defaults were applied for the failed area. */\n\treadonly errors: readonly string[];\n}\n\n/**\n * Resolve settings + environment into governor mode, probe options, and the\n * admission config. Never throws; every invalid field produces an explicit\n * error and falls back to the corresponding default (§18.1 fail-closed).\n */\nexport function resolveResourceGovernorSettings(\n\tsettings?: ResourceGovernorSettings,\n\tenv: NodeJS.ProcessEnv = process.env,\n): ResolvedResourceGovernorSettings {\n\tconst errors: string[] = [];\n\tconst mode = resolveMode(settings, env, errors);\n\n\tconst maxProbeMs = validateRange(settings?.maxProbeMs, \"maxProbeMs\", 50, 5000, errors);\n\tconst cpuSampleMs = validateRange(\n\t\tsettings?.cpuSampleMs,\n\t\t\"cpuSampleMs\",\n\t\tMIN_CPU_SAMPLE_MS,\n\t\tMAX_CPU_SAMPLE_MS,\n\t\terrors,\n\t);\n\n\tconst overrides: ResourceAdmissionConfigOverrides = {\n\t\tthresholds: pruneUndefined({\n\t\t\tconstrainedAvailableMemoryMiB: settings?.constrainedAvailableMemoryMiB,\n\t\t\tcriticalAvailableMemoryMiB: settings?.criticalAvailableMemoryMiB,\n\t\t\tconstrainedDiskFreeMiB: settings?.constrainedDiskFreeMiB,\n\t\t\tcriticalDiskFreeMiB: settings?.criticalDiskFreeMiB,\n\t\t\tconstrainedHeapRatio: settings?.constrainedHeapRatio,\n\t\t\tcriticalHeapRatio: settings?.criticalHeapRatio,\n\t\t\tbusyCpuPercent: settings?.busyCpuPercent,\n\t\t}),\n\t\tcaps: {\n\t\t\tnormal: pruneUndefined({\n\t\t\t\tmaxToolConcurrency: settings?.normalMaxToolConcurrency,\n\t\t\t\tmaxParallelLanes: settings?.normalMaxParallelLanes,\n\t\t\t\tmaxHeavyProcesses: settings?.normalMaxHeavyProcesses,\n\t\t\t}),\n\t\t\tconstrained: pruneUndefined({\n\t\t\t\tmaxToolConcurrency: settings?.constrainedMaxToolConcurrency,\n\t\t\t\tmaxParallelLanes: settings?.constrainedMaxParallelLanes,\n\t\t\t\tmaxHeavyProcesses: settings?.constrainedMaxHeavyProcesses,\n\t\t\t}),\n\t\t\tcritical: pruneUndefined({\n\t\t\t\tmaxToolConcurrency: settings?.criticalMaxToolConcurrency,\n\t\t\t\tmaxParallelLanes: settings?.criticalMaxParallelLanes,\n\t\t\t\tmaxHeavyProcesses: settings?.criticalMaxHeavyProcesses,\n\t\t\t}),\n\t\t},\n\t};\n\tconst admission = resolveResourceAdmissionConfig(overrides);\n\terrors.push(...admission.errors);\n\n\treturn { mode, maxProbeMs, cpuSampleMs, admission: admission.config, errors };\n}\n\nfunction resolveMode(\n\tsettings: ResourceGovernorSettings | undefined,\n\tenv: NodeJS.ProcessEnv,\n\terrors: string[],\n): ResourceGovernorMode {\n\t// §18.2/§30.1: the env override is the operator kill switch and wins.\n\tconst envMode = env[RESOURCE_GOVERNOR_MODE_ENV]?.trim();\n\tif (envMode !== undefined && envMode !== \"\") {\n\t\tif (RESOURCE_GOVERNOR_MODES.has(envMode)) {\n\t\t\treturn envMode as ResourceGovernorMode;\n\t\t}\n\t\terrors.push(`resourceGovernor.mode: invalid ${RESOURCE_GOVERNOR_MODE_ENV} value ${JSON.stringify(envMode)}`);\n\t}\n\tif (settings?.enabled === false) {\n\t\treturn \"off\";\n\t}\n\tconst configured = settings?.mode;\n\tif (configured !== undefined) {\n\t\tif (RESOURCE_GOVERNOR_MODES.has(configured)) {\n\t\t\treturn configured;\n\t\t}\n\t\terrors.push(`resourceGovernor.mode: invalid value ${JSON.stringify(configured)}`);\n\t}\n\treturn DEFAULT_RESOURCE_GOVERNOR_MODE;\n}\n\nfunction validateRange(\n\tvalue: number | undefined,\n\tfield: string,\n\tmin: number,\n\tmax: number,\n\terrors: string[],\n): number | undefined {\n\tif (value === undefined) {\n\t\treturn undefined;\n\t}\n\tif (!Number.isSafeInteger(value) || value < min || value > max) {\n\t\terrors.push(`resourceGovernor.${field}: must be an integer within [${min}, ${max}], got ${String(value)}`);\n\t\treturn undefined;\n\t}\n\treturn value;\n}\n\nfunction pruneUndefined<T extends Record<string, number | undefined>>(record: T): Partial<T> {\n\tconst pruned: Record<string, number> = {};\n\tfor (const [key, value] of Object.entries(record)) {\n\t\tif (value !== undefined) {\n\t\t\tpruned[key] = value;\n\t\t}\n\t}\n\treturn pruned as Partial<T>;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"resource-governor-settings.js","sourceRoot":"","sources":["../../src/core/resource-governor-settings.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ResourceAdmissionConfigOverrides, ResourceGovernorMode } from \"./resource-admission.ts\";\nimport { resolveResourceAdmissionConfig } from \"./resource-admission.ts\";\nimport type { ResolvedResourceGovernorSettings } from \"./resource-governor-types.ts\";\nimport { MAX_CPU_SAMPLE_MS, MIN_CPU_SAMPLE_MS } from \"./system-cpu-sampler.ts\";\n\n// The shape lives in `resource-governor-types.ts` so the formatter can describe\n// it without importing this module back. Re-exported because this module is the\n// governor's entry point and callers already import the name from here.\nexport type { ResolvedResourceGovernorSettings };\n\nexport {\n\tbuildResourceDoctorReport,\n\tdescribeResourceReasons,\n\tformatResourcePolicyLines,\n\tformatResourceProbeLines,\n\tformatResourceSummaryLines,\n\ttype ResourceDoctorReport,\n} from \"./resource-governor-format.ts\";\n\n/**\n * Resource governor settings surface (OMK v0.97.x roadmap §18, M1/PR2).\n *\n * Pure translation from the additive `resourceGovernor` settings block (and\n * the §18.2 `OMK_RESOURCE_GOVERNOR` env override) to the layer-1 admission\n * config plus probe options. Validation follows §18.1: explicit errors over\n * silent clamps, and invalid input fails closed to the defaults.\n *\n * Resolved values feed the `/resource` command, `omk doctor resources`, and\n * the M2 prompt preflight: `observe` records decisions only, while\n * `adaptive`/`strict` throttle per-run tool concurrency and governed bash\n * heavy-process permits. Subagent lane caps remain internal until the live\n * child-dispatch path uses `launchSubagentLanes()`.\n */\n\n/** Additive settings block (§18, §29.1: absent block keeps v0.96.1 behavior). */\nexport interface ResourceGovernorSettings {\n\tenabled?: boolean; // default: true; false forces mode \"off\"\n\tmode?: ResourceGovernorMode; // default: \"observe\" (v0.97.0-alpha rollout stage, §7.4)\n\n\tmaxProbeMs?: number; // default: 300; async probe deadline, valid 50..5000 (§18.1)\n\tcpuSampleMs?: number; // default: 180; CPU two-sample interval, valid 150..250 (§6.3)\n\n\tconstrainedAvailableMemoryMiB?: number; // default: 1536 (§6.7)\n\tcriticalAvailableMemoryMiB?: number; // default: 512\n\tconstrainedDiskFreeMiB?: number; // default: 4096\n\tcriticalDiskFreeMiB?: number; // default: 1024\n\tconstrainedHeapRatio?: number; // default: 0.75\n\tcriticalHeapRatio?: number; // default: 0.85\n\tbusyCpuPercent?: number; // default: 85\n\n\tnormalMaxToolConcurrency?: number; // default: 4 (§7.2)\n\tconstrainedMaxToolConcurrency?: number; // default: 2\n\tcriticalMaxToolConcurrency?: number; // default: 1\n\tnormalMaxParallelLanes?: number; // default: 4\n\tconstrainedMaxParallelLanes?: number; // default: 2\n\tcriticalMaxParallelLanes?: number; // default: 1\n\tnormalMaxHeavyProcesses?: number; // default: 2\n\tconstrainedMaxHeavyProcesses?: number; // default: 1\n\tcriticalMaxHeavyProcesses?: number; // default: 1\n}\n\nexport const RESOURCE_GOVERNOR_MODE_ENV = \"OMK_RESOURCE_GOVERNOR\";\nexport const DEFAULT_RESOURCE_GOVERNOR_MODE: ResourceGovernorMode = \"observe\";\nconst RESOURCE_GOVERNOR_MODES: ReadonlySet<string> = new Set([\"off\", \"observe\", \"adaptive\", \"strict\"]);\n\n/**\n * Resolve settings + environment into governor mode, probe options, and the\n * admission config. Never throws; every invalid field produces an explicit\n * error and falls back to the corresponding default (§18.1 fail-closed).\n */\nexport function resolveResourceGovernorSettings(\n\tsettings?: ResourceGovernorSettings,\n\tenv: NodeJS.ProcessEnv = process.env,\n): ResolvedResourceGovernorSettings {\n\tconst errors: string[] = [];\n\tconst mode = resolveMode(settings, env, errors);\n\n\tconst maxProbeMs = validateRange(settings?.maxProbeMs, \"maxProbeMs\", 50, 5000, errors);\n\tconst cpuSampleMs = validateRange(\n\t\tsettings?.cpuSampleMs,\n\t\t\"cpuSampleMs\",\n\t\tMIN_CPU_SAMPLE_MS,\n\t\tMAX_CPU_SAMPLE_MS,\n\t\terrors,\n\t);\n\n\tconst overrides: ResourceAdmissionConfigOverrides = {\n\t\tthresholds: pruneUndefined({\n\t\t\tconstrainedAvailableMemoryMiB: settings?.constrainedAvailableMemoryMiB,\n\t\t\tcriticalAvailableMemoryMiB: settings?.criticalAvailableMemoryMiB,\n\t\t\tconstrainedDiskFreeMiB: settings?.constrainedDiskFreeMiB,\n\t\t\tcriticalDiskFreeMiB: settings?.criticalDiskFreeMiB,\n\t\t\tconstrainedHeapRatio: settings?.constrainedHeapRatio,\n\t\t\tcriticalHeapRatio: settings?.criticalHeapRatio,\n\t\t\tbusyCpuPercent: settings?.busyCpuPercent,\n\t\t}),\n\t\tcaps: {\n\t\t\tnormal: pruneUndefined({\n\t\t\t\tmaxToolConcurrency: settings?.normalMaxToolConcurrency,\n\t\t\t\tmaxParallelLanes: settings?.normalMaxParallelLanes,\n\t\t\t\tmaxHeavyProcesses: settings?.normalMaxHeavyProcesses,\n\t\t\t}),\n\t\t\tconstrained: pruneUndefined({\n\t\t\t\tmaxToolConcurrency: settings?.constrainedMaxToolConcurrency,\n\t\t\t\tmaxParallelLanes: settings?.constrainedMaxParallelLanes,\n\t\t\t\tmaxHeavyProcesses: settings?.constrainedMaxHeavyProcesses,\n\t\t\t}),\n\t\t\tcritical: pruneUndefined({\n\t\t\t\tmaxToolConcurrency: settings?.criticalMaxToolConcurrency,\n\t\t\t\tmaxParallelLanes: settings?.criticalMaxParallelLanes,\n\t\t\t\tmaxHeavyProcesses: settings?.criticalMaxHeavyProcesses,\n\t\t\t}),\n\t\t},\n\t};\n\tconst admission = resolveResourceAdmissionConfig(overrides);\n\terrors.push(...admission.errors);\n\n\treturn { mode, maxProbeMs, cpuSampleMs, admission: admission.config, errors };\n}\n\nfunction resolveMode(\n\tsettings: ResourceGovernorSettings | undefined,\n\tenv: NodeJS.ProcessEnv,\n\terrors: string[],\n): ResourceGovernorMode {\n\t// §18.2/§30.1: the env override is the operator kill switch and wins.\n\tconst envMode = env[RESOURCE_GOVERNOR_MODE_ENV]?.trim();\n\tif (envMode !== undefined && envMode !== \"\") {\n\t\tif (RESOURCE_GOVERNOR_MODES.has(envMode)) {\n\t\t\treturn envMode as ResourceGovernorMode;\n\t\t}\n\t\terrors.push(`resourceGovernor.mode: invalid ${RESOURCE_GOVERNOR_MODE_ENV} value ${JSON.stringify(envMode)}`);\n\t}\n\tif (settings?.enabled === false) {\n\t\treturn \"off\";\n\t}\n\tconst configured = settings?.mode;\n\tif (configured !== undefined) {\n\t\tif (RESOURCE_GOVERNOR_MODES.has(configured)) {\n\t\t\treturn configured;\n\t\t}\n\t\terrors.push(`resourceGovernor.mode: invalid value ${JSON.stringify(configured)}`);\n\t}\n\treturn DEFAULT_RESOURCE_GOVERNOR_MODE;\n}\n\nfunction validateRange(\n\tvalue: number | undefined,\n\tfield: string,\n\tmin: number,\n\tmax: number,\n\terrors: string[],\n): number | undefined {\n\tif (value === undefined) {\n\t\treturn undefined;\n\t}\n\tif (!Number.isSafeInteger(value) || value < min || value > max) {\n\t\terrors.push(`resourceGovernor.${field}: must be an integer within [${min}, ${max}], got ${String(value)}`);\n\t\treturn undefined;\n\t}\n\treturn value;\n}\n\nfunction pruneUndefined<T extends Record<string, number | undefined>>(record: T): Partial<T> {\n\tconst pruned: Record<string, number> = {};\n\tfor (const [key, value] of Object.entries(record)) {\n\t\tif (value !== undefined) {\n\t\t\tpruned[key] = value;\n\t\t}\n\t}\n\treturn pruned as Partial<T>;\n}\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolved resource-governor settings shape.
|
|
3
|
+
*
|
|
4
|
+
* This interface lived in `resource-governor-settings.ts`, which re-exports the
|
|
5
|
+
* formatter as the governor's single entry point, while the formatter imported
|
|
6
|
+
* the interface back to describe what it renders — a two-module import cycle.
|
|
7
|
+
* The facade is deliberate, so the shape moves down instead: both the settings
|
|
8
|
+
* surface and the formatter now depend on this module, and neither depends on
|
|
9
|
+
* the other.
|
|
10
|
+
*
|
|
11
|
+
* Types only. Imports stay limited to the admission layer, which sits below
|
|
12
|
+
* both modules and imports neither.
|
|
13
|
+
*/
|
|
14
|
+
import type { ResourceAdmissionConfig, ResourceGovernorMode } from "./resource-admission.ts";
|
|
15
|
+
export interface ResolvedResourceGovernorSettings {
|
|
16
|
+
readonly mode: ResourceGovernorMode;
|
|
17
|
+
/** Only present when the setting is valid; the probe applies its own defaults otherwise. */
|
|
18
|
+
readonly maxProbeMs?: number;
|
|
19
|
+
readonly cpuSampleMs?: number;
|
|
20
|
+
readonly admission: ResourceAdmissionConfig;
|
|
21
|
+
/** §18.1 explicit validation errors; non-empty means defaults were applied for the failed area. */
|
|
22
|
+
readonly errors: readonly string[];
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=resource-governor-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-governor-types.d.ts","sourceRoot":"","sources":["../../src/core/resource-governor-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAE7F,MAAM,WAAW,gCAAgC;IAChD,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACpC,4FAA4F;IAC5F,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,uBAAuB,CAAC;IAC5C,oGAAmG;IACnG,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC","sourcesContent":["/**\n * Resolved resource-governor settings shape.\n *\n * This interface lived in `resource-governor-settings.ts`, which re-exports the\n * formatter as the governor's single entry point, while the formatter imported\n * the interface back to describe what it renders — a two-module import cycle.\n * The facade is deliberate, so the shape moves down instead: both the settings\n * surface and the formatter now depend on this module, and neither depends on\n * the other.\n *\n * Types only. Imports stay limited to the admission layer, which sits below\n * both modules and imports neither.\n */\n\nimport type { ResourceAdmissionConfig, ResourceGovernorMode } from \"./resource-admission.ts\";\n\nexport interface ResolvedResourceGovernorSettings {\n\treadonly mode: ResourceGovernorMode;\n\t/** Only present when the setting is valid; the probe applies its own defaults otherwise. */\n\treadonly maxProbeMs?: number;\n\treadonly cpuSampleMs?: number;\n\treadonly admission: ResourceAdmissionConfig;\n\t/** §18.1 explicit validation errors; non-empty means defaults were applied for the failed area. */\n\treadonly errors: readonly string[];\n}\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolved resource-governor settings shape.
|
|
3
|
+
*
|
|
4
|
+
* This interface lived in `resource-governor-settings.ts`, which re-exports the
|
|
5
|
+
* formatter as the governor's single entry point, while the formatter imported
|
|
6
|
+
* the interface back to describe what it renders — a two-module import cycle.
|
|
7
|
+
* The facade is deliberate, so the shape moves down instead: both the settings
|
|
8
|
+
* surface and the formatter now depend on this module, and neither depends on
|
|
9
|
+
* the other.
|
|
10
|
+
*
|
|
11
|
+
* Types only. Imports stay limited to the admission layer, which sits below
|
|
12
|
+
* both modules and imports neither.
|
|
13
|
+
*/
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=resource-governor-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-governor-types.js","sourceRoot":"","sources":["../../src/core/resource-governor-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG","sourcesContent":["/**\n * Resolved resource-governor settings shape.\n *\n * This interface lived in `resource-governor-settings.ts`, which re-exports the\n * formatter as the governor's single entry point, while the formatter imported\n * the interface back to describe what it renders — a two-module import cycle.\n * The facade is deliberate, so the shape moves down instead: both the settings\n * surface and the formatter now depend on this module, and neither depends on\n * the other.\n *\n * Types only. Imports stay limited to the admission layer, which sits below\n * both modules and imports neither.\n */\n\nimport type { ResourceAdmissionConfig, ResourceGovernorMode } from \"./resource-admission.ts\";\n\nexport interface ResolvedResourceGovernorSettings {\n\treadonly mode: ResourceGovernorMode;\n\t/** Only present when the setting is valid; the probe applies its own defaults otherwise. */\n\treadonly maxProbeMs?: number;\n\treadonly cpuSampleMs?: number;\n\treadonly admission: ResourceAdmissionConfig;\n\t/** §18.1 explicit validation errors; non-empty means defaults were applied for the failed area. */\n\treadonly errors: readonly string[];\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type Theme } from "../modes/interactive/theme/theme.ts";
|
|
2
|
+
import type { ContextFile } from "./context-file.ts";
|
|
2
3
|
import type { ResourceDiagnostic } from "./diagnostics.ts";
|
|
3
4
|
export type { ResourceCollision, ResourceDiagnostic } from "./diagnostics.ts";
|
|
4
5
|
import { type EventBus } from "./event-bus.ts";
|
|
@@ -7,13 +8,6 @@ import { type PathMetadata } from "./package-manager.ts";
|
|
|
7
8
|
import type { PromptTemplate } from "./prompt-templates.ts";
|
|
8
9
|
import { SettingsManager } from "./settings-manager.ts";
|
|
9
10
|
import type { Skill } from "./skills.ts";
|
|
10
|
-
export interface ContextFile {
|
|
11
|
-
path: string;
|
|
12
|
-
content: string;
|
|
13
|
-
isGlobal?: boolean;
|
|
14
|
-
containsJailbreak?: boolean;
|
|
15
|
-
sanitized?: boolean;
|
|
16
|
-
}
|
|
17
11
|
export interface ResourceExtensionPaths {
|
|
18
12
|
skillPaths?: Array<{
|
|
19
13
|
path: string;
|