open-multi-agent-kit 0.80.7 → 0.90.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 +5 -27
- package/README.md +81 -38
- package/dist/agents/jailbreak/index.d.ts +7 -0
- package/dist/agents/jailbreak/index.d.ts.map +1 -0
- package/dist/agents/jailbreak/index.js +7 -0
- package/dist/agents/jailbreak/index.js.map +1 -0
- package/dist/agents/jailbreak/subagent-f.d.ts +44 -0
- package/dist/agents/jailbreak/subagent-f.d.ts.map +1 -0
- package/dist/agents/jailbreak/subagent-f.js +60 -0
- package/dist/agents/jailbreak/subagent-f.js.map +1 -0
- package/dist/bun/register-bedrock.d.ts.map +1 -1
- package/dist/bun/register-bedrock.js +2 -2
- package/dist/bun/register-bedrock.js.map +1 -1
- package/dist/ci/verify-reporter.d.ts +22 -0
- package/dist/ci/verify-reporter.d.ts.map +1 -0
- package/dist/ci/verify-reporter.js +50 -0
- package/dist/ci/verify-reporter.js.map +1 -0
- package/dist/cli/args.d.ts +4 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +8 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/config-selector.d.ts.map +1 -1
- package/dist/cli/config-selector.js +1 -1
- package/dist/cli/config-selector.js.map +1 -1
- package/dist/cli/file-processor.d.ts +1 -1
- package/dist/cli/file-processor.d.ts.map +1 -1
- package/dist/cli/file-processor.js.map +1 -1
- package/dist/cli/initial-message.d.ts +1 -1
- package/dist/cli/initial-message.d.ts.map +1 -1
- package/dist/cli/initial-message.js.map +1 -1
- package/dist/cli/jailbreak-args.d.ts +26 -0
- package/dist/cli/jailbreak-args.d.ts.map +1 -0
- package/dist/cli/jailbreak-args.js +86 -0
- package/dist/cli/jailbreak-args.js.map +1 -0
- package/dist/cli/list-models.d.ts.map +1 -1
- package/dist/cli/list-models.js +1 -1
- package/dist/cli/list-models.js.map +1 -1
- package/dist/cli/session-picker.d.ts.map +1 -1
- package/dist/cli/session-picker.js +1 -1
- package/dist/cli/session-picker.js.map +1 -1
- package/dist/commands/doctor-provider.d.ts +19 -0
- package/dist/commands/doctor-provider.d.ts.map +1 -0
- package/dist/commands/doctor-provider.js +123 -0
- package/dist/commands/doctor-provider.js.map +1 -0
- package/dist/commands/jailbreak.d.ts +49 -0
- package/dist/commands/jailbreak.d.ts.map +1 -0
- package/dist/commands/jailbreak.js +201 -0
- package/dist/commands/jailbreak.js.map +1 -0
- package/dist/config.d.ts +9 -5
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +33 -52
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-services.d.ts +2 -2
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +16 -27
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +185 -89
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage.d.ts +3 -6
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +7 -7
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/automation/index.d.ts +359 -0
- package/dist/core/automation/index.d.ts.map +1 -0
- package/dist/core/automation/index.js +665 -0
- package/dist/core/automation/index.js.map +1 -0
- package/dist/core/bash-executor.d.ts +1 -0
- package/dist/core/bash-executor.d.ts.map +1 -1
- package/dist/core/bash-executor.js +1 -0
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/browser-use.d.ts +53 -0
- package/dist/core/browser-use.d.ts.map +1 -0
- package/dist/core/browser-use.js +108 -0
- package/dist/core/browser-use.js.map +1 -0
- package/dist/core/command-safety-parser.d.ts +77 -0
- package/dist/core/command-safety-parser.d.ts.map +1 -0
- package/dist/core/command-safety-parser.js +763 -0
- package/dist/core/command-safety-parser.js.map +1 -0
- package/dist/core/command-safety.d.ts.map +1 -1
- package/dist/core/command-safety.js +106 -3
- package/dist/core/command-safety.js.map +1 -1
- package/dist/core/compaction/branch-summarization.d.ts +2 -2
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/core/compaction/branch-summarization.js +5 -21
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +3 -101
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +21 -656
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/compaction/utils.d.ts +2 -2
- package/dist/core/compaction/utils.d.ts.map +1 -1
- package/dist/core/compaction/utils.js.map +1 -1
- package/dist/core/compactor.d.ts +42 -0
- package/dist/core/compactor.d.ts.map +1 -0
- package/dist/core/compactor.js +131 -0
- package/dist/core/compactor.js.map +1 -0
- package/dist/core/context-budget-compressors.d.ts +50 -0
- package/dist/core/context-budget-compressors.d.ts.map +1 -0
- package/dist/core/context-budget-compressors.js +166 -0
- package/dist/core/context-budget-compressors.js.map +1 -0
- package/dist/core/context-budget-governor-v2.d.ts +7 -0
- package/dist/core/context-budget-governor-v2.d.ts.map +1 -0
- package/dist/core/context-budget-governor-v2.js +7 -0
- package/dist/core/context-budget-governor-v2.js.map +1 -0
- package/dist/core/context-budget-governor.d.ts +67 -0
- package/dist/core/context-budget-governor.d.ts.map +1 -0
- package/dist/core/context-budget-governor.js +224 -0
- package/dist/core/context-budget-governor.js.map +1 -0
- package/dist/core/context-budget-headroom-candidates.d.ts +3 -0
- package/dist/core/context-budget-headroom-candidates.d.ts.map +1 -0
- package/dist/core/context-budget-headroom-candidates.js +85 -0
- package/dist/core/context-budget-headroom-candidates.js.map +1 -0
- package/dist/core/context-budget-headroom-types.d.ts +67 -0
- package/dist/core/context-budget-headroom-types.d.ts.map +1 -0
- package/dist/core/context-budget-headroom-types.js +46 -0
- package/dist/core/context-budget-headroom-types.js.map +1 -0
- package/dist/core/context-budget-headroom.d.ts +5 -0
- package/dist/core/context-budget-headroom.d.ts.map +1 -0
- package/dist/core/context-budget-headroom.js +123 -0
- package/dist/core/context-budget-headroom.js.map +1 -0
- package/dist/core/context-budget-relevance.d.ts +46 -0
- package/dist/core/context-budget-relevance.d.ts.map +1 -0
- package/dist/core/context-budget-relevance.js +329 -0
- package/dist/core/context-budget-relevance.js.map +1 -0
- package/dist/core/context-budget-system-prompt-items.d.ts +19 -0
- package/dist/core/context-budget-system-prompt-items.d.ts.map +1 -0
- package/dist/core/context-budget-system-prompt-items.js +143 -0
- package/dist/core/context-budget-system-prompt-items.js.map +1 -0
- package/dist/core/context-budget-system-prompt.d.ts +31 -0
- package/dist/core/context-budget-system-prompt.d.ts.map +1 -0
- package/dist/core/context-budget-system-prompt.js +87 -0
- package/dist/core/context-budget-system-prompt.js.map +1 -0
- package/dist/core/context-budget-token-counter.d.ts +34 -0
- package/dist/core/context-budget-token-counter.d.ts.map +1 -0
- package/dist/core/context-budget-token-counter.js +315 -0
- package/dist/core/context-budget-token-counter.js.map +1 -0
- package/dist/core/context-budget-v2-coverage.d.ts +5 -0
- package/dist/core/context-budget-v2-coverage.d.ts.map +1 -0
- package/dist/core/context-budget-v2-coverage.js +58 -0
- package/dist/core/context-budget-v2-coverage.js.map +1 -0
- package/dist/core/context-budget-v2-plan-hash.d.ts +12 -0
- package/dist/core/context-budget-v2-plan-hash.d.ts.map +1 -0
- package/dist/core/context-budget-v2-plan-hash.js +38 -0
- package/dist/core/context-budget-v2-plan-hash.js.map +1 -0
- package/dist/core/context-budget-v2-planner.d.ts +3 -0
- package/dist/core/context-budget-v2-planner.d.ts.map +1 -0
- package/dist/core/context-budget-v2-planner.js +143 -0
- package/dist/core/context-budget-v2-planner.js.map +1 -0
- package/dist/core/context-budget-v2-scoring.d.ts +14 -0
- package/dist/core/context-budget-v2-scoring.d.ts.map +1 -0
- package/dist/core/context-budget-v2-scoring.js +114 -0
- package/dist/core/context-budget-v2-scoring.js.map +1 -0
- package/dist/core/context-budget-v2-selection.d.ts +32 -0
- package/dist/core/context-budget-v2-selection.d.ts.map +1 -0
- package/dist/core/context-budget-v2-selection.js +158 -0
- package/dist/core/context-budget-v2-selection.js.map +1 -0
- package/dist/core/context-budget-v2-tiers.d.ts +15 -0
- package/dist/core/context-budget-v2-tiers.d.ts.map +1 -0
- package/dist/core/context-budget-v2-tiers.js +68 -0
- package/dist/core/context-budget-v2-tiers.js.map +1 -0
- package/dist/core/context-budget-v2-types.d.ts +92 -0
- package/dist/core/context-budget-v2-types.d.ts.map +1 -0
- package/dist/core/context-budget-v2-types.js +24 -0
- package/dist/core/context-budget-v2-types.js.map +1 -0
- package/dist/core/defaults.d.ts +1 -1
- package/dist/core/defaults.d.ts.map +1 -1
- package/dist/core/defaults.js.map +1 -1
- package/dist/core/diagnostics.d.ts +6 -0
- package/dist/core/diagnostics.d.ts.map +1 -1
- package/dist/core/diagnostics.js.map +1 -1
- package/dist/core/domain-confidence.d.ts +9 -0
- package/dist/core/domain-confidence.d.ts.map +1 -0
- package/dist/core/domain-confidence.js +39 -0
- package/dist/core/domain-confidence.js.map +1 -0
- package/dist/core/domain-dispatch.d.ts +44 -0
- package/dist/core/domain-dispatch.d.ts.map +1 -0
- package/dist/core/domain-dispatch.js +118 -0
- package/dist/core/domain-dispatch.js.map +1 -0
- package/dist/core/domain-loadouts.d.ts +76 -0
- package/dist/core/domain-loadouts.d.ts.map +1 -0
- package/dist/core/domain-loadouts.js +981 -0
- package/dist/core/domain-loadouts.js.map +1 -0
- package/dist/core/domain-registry.d.ts +7 -0
- package/dist/core/domain-registry.d.ts.map +1 -0
- package/dist/core/domain-registry.js +11 -0
- package/dist/core/domain-registry.js.map +1 -0
- package/dist/core/domain-router.d.ts +16 -0
- package/dist/core/domain-router.d.ts.map +1 -0
- package/dist/core/domain-router.js +24 -0
- package/dist/core/domain-router.js.map +1 -0
- package/dist/core/domain-score.d.ts +13 -0
- package/dist/core/domain-score.d.ts.map +1 -0
- package/dist/core/domain-score.js +48 -0
- package/dist/core/domain-score.js.map +1 -0
- package/dist/core/domain-trigger-match.d.ts +14 -0
- package/dist/core/domain-trigger-match.d.ts.map +1 -0
- package/dist/core/domain-trigger-match.js +51 -0
- package/dist/core/domain-trigger-match.js.map +1 -0
- package/dist/core/domain-types.d.ts +30 -0
- package/dist/core/domain-types.d.ts.map +1 -0
- package/dist/core/domain-types.js +2 -0
- package/dist/core/domain-types.js.map +1 -0
- package/dist/core/exact-cache-policy.d.ts +8 -0
- package/dist/core/exact-cache-policy.d.ts.map +1 -1
- package/dist/core/exact-cache-policy.js +9 -0
- package/dist/core/exact-cache-policy.js.map +1 -1
- package/dist/core/exec.d.ts +0 -2
- package/dist/core/exec.d.ts.map +1 -1
- package/dist/core/exec.js +0 -1
- package/dist/core/exec.js.map +1 -1
- package/dist/core/export-html/index.d.ts +1 -1
- package/dist/core/export-html/index.d.ts.map +1 -1
- package/dist/core/export-html/index.js.map +1 -1
- package/dist/core/export-html/template.js +1 -3
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
- package/dist/core/export-html/tool-renderer.js.map +1 -1
- package/dist/core/extensions/builtin/command-safety-gate.d.ts +3 -0
- package/dist/core/extensions/builtin/command-safety-gate.d.ts.map +1 -1
- package/dist/core/extensions/builtin/command-safety-gate.js +15 -3
- package/dist/core/extensions/builtin/command-safety-gate.js.map +1 -1
- package/dist/core/extensions/builtin/todo-checklist.d.ts +20 -0
- package/dist/core/extensions/builtin/todo-checklist.d.ts.map +1 -0
- package/dist/core/extensions/builtin/todo-checklist.js +73 -0
- package/dist/core/extensions/builtin/todo-checklist.js.map +1 -0
- package/dist/core/extensions/loader.d.ts +4 -4
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +57 -92
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +3 -3
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +1 -1
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +7 -35
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/extensions/wrapper.d.ts +1 -1
- package/dist/core/extensions/wrapper.d.ts.map +1 -1
- package/dist/core/extensions/wrapper.js.map +1 -1
- package/dist/core/footer-data-provider.d.ts +3 -1
- package/dist/core/footer-data-provider.d.ts.map +1 -1
- package/dist/core/footer-data-provider.js +4 -0
- package/dist/core/footer-data-provider.js.map +1 -1
- package/dist/core/headroom.d.ts +45 -0
- package/dist/core/headroom.d.ts.map +1 -0
- package/dist/core/headroom.js +171 -0
- package/dist/core/headroom.js.map +1 -0
- package/dist/core/hook-inventory.d.ts +4 -2
- package/dist/core/hook-inventory.d.ts.map +1 -1
- package/dist/core/hook-inventory.js +80 -11
- package/dist/core/hook-inventory.js.map +1 -1
- package/dist/core/hooks/fail-closed.d.ts +4 -1
- package/dist/core/hooks/fail-closed.d.ts.map +1 -1
- package/dist/core/hooks/fail-closed.js +79 -5
- package/dist/core/hooks/fail-closed.js.map +1 -1
- package/dist/core/hooks/index.d.ts +2 -2
- package/dist/core/hooks/index.d.ts.map +1 -1
- package/dist/core/hooks/index.js +1 -1
- package/dist/core/hooks/index.js.map +1 -1
- package/dist/core/hooks/types.d.ts +9 -0
- package/dist/core/hooks/types.d.ts.map +1 -1
- package/dist/core/hooks/types.js.map +1 -1
- package/dist/core/keybindings.d.ts +2 -14
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +1 -31
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/lean-ctx.d.ts +99 -0
- package/dist/core/lean-ctx.d.ts.map +1 -0
- package/dist/core/lean-ctx.js +225 -0
- package/dist/core/lean-ctx.js.map +1 -0
- package/dist/core/loadout-compose.d.ts +53 -0
- package/dist/core/loadout-compose.d.ts.map +1 -0
- package/dist/core/loadout-compose.js +172 -0
- package/dist/core/loadout-compose.js.map +1 -0
- package/dist/core/loadout-policy-bridge.d.ts +22 -0
- package/dist/core/loadout-policy-bridge.d.ts.map +1 -0
- package/dist/core/loadout-policy-bridge.js +52 -0
- package/dist/core/loadout-policy-bridge.js.map +1 -0
- package/dist/core/loadout-runtime.d.ts +22 -0
- package/dist/core/loadout-runtime.d.ts.map +1 -1
- package/dist/core/loadout-runtime.js +41 -5
- package/dist/core/loadout-runtime.js.map +1 -1
- package/dist/core/loadout-safety.d.ts +55 -0
- package/dist/core/loadout-safety.d.ts.map +1 -0
- package/dist/core/loadout-safety.js +213 -0
- package/dist/core/loadout-safety.js.map +1 -0
- package/dist/core/loadouts.d.ts +4 -2
- package/dist/core/loadouts.d.ts.map +1 -1
- package/dist/core/loadouts.js +116 -5
- package/dist/core/loadouts.js.map +1 -1
- package/dist/core/loop-gates.d.ts +48 -0
- package/dist/core/loop-gates.d.ts.map +1 -0
- package/dist/core/loop-gates.js +352 -0
- package/dist/core/loop-gates.js.map +1 -0
- package/dist/core/loop-registry.d.ts +77 -0
- package/dist/core/loop-registry.d.ts.map +1 -0
- package/dist/core/loop-registry.js +831 -0
- package/dist/core/loop-registry.js.map +1 -0
- package/dist/core/loop-types.d.ts +194 -0
- package/dist/core/loop-types.d.ts.map +1 -0
- package/dist/core/loop-types.js +2 -0
- package/dist/core/loop-types.js.map +1 -0
- package/dist/core/mcp-inventory.d.ts +7 -0
- package/dist/core/mcp-inventory.d.ts.map +1 -1
- package/dist/core/mcp-inventory.js +5 -1
- package/dist/core/mcp-inventory.js.map +1 -1
- package/dist/core/mcp-presets.d.ts +43 -2
- package/dist/core/mcp-presets.d.ts.map +1 -1
- package/dist/core/mcp-presets.js +298 -2
- package/dist/core/mcp-presets.js.map +1 -1
- package/dist/core/messages.d.ts +3 -3
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js.map +1 -1
- package/dist/core/metrics-sampler.d.ts +11 -0
- package/dist/core/metrics-sampler.d.ts.map +1 -1
- package/dist/core/metrics-sampler.js +52 -13
- package/dist/core/metrics-sampler.js.map +1 -1
- package/dist/core/model-registry.d.ts +1 -2
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +18 -41
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts +2 -2
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +2 -2
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/package-gallery-identity.d.ts +7 -0
- package/dist/core/package-gallery-identity.d.ts.map +1 -0
- package/dist/core/package-gallery-identity.js +31 -0
- package/dist/core/package-gallery-identity.js.map +1 -0
- package/dist/core/package-gallery-install.d.ts +6 -0
- package/dist/core/package-gallery-install.d.ts.map +1 -0
- package/dist/core/package-gallery-install.js +59 -0
- package/dist/core/package-gallery-install.js.map +1 -0
- package/dist/core/package-gallery-manifest.d.ts +13 -0
- package/dist/core/package-gallery-manifest.d.ts.map +1 -0
- package/dist/core/package-gallery-manifest.js +183 -0
- package/dist/core/package-gallery-manifest.js.map +1 -0
- package/dist/core/package-gallery-trial.d.ts +4 -0
- package/dist/core/package-gallery-trial.d.ts.map +1 -0
- package/dist/core/package-gallery-trial.js +55 -0
- package/dist/core/package-gallery-trial.js.map +1 -0
- package/dist/core/package-gallery-types.d.ts +71 -0
- package/dist/core/package-gallery-types.d.ts.map +1 -0
- package/dist/core/package-gallery-types.js +2 -0
- package/dist/core/package-gallery-types.js.map +1 -0
- package/dist/core/package-gallery.d.ts +5 -123
- package/dist/core/package-gallery.d.ts.map +1 -1
- package/dist/core/package-gallery.js +5 -391
- package/dist/core/package-gallery.js.map +1 -1
- package/dist/core/package-manager.d.ts +0 -69
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +69 -367
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/package-procurement.d.ts +4 -4
- package/dist/core/package-procurement.d.ts.map +1 -1
- package/dist/core/package-procurement.js +29 -17
- package/dist/core/package-procurement.js.map +1 -1
- package/dist/core/pi-package-intake-candidates.d.ts +21 -0
- package/dist/core/pi-package-intake-candidates.d.ts.map +1 -0
- package/dist/core/pi-package-intake-candidates.js +109 -0
- package/dist/core/pi-package-intake-candidates.js.map +1 -0
- package/dist/core/pi-package-intake.d.ts +43 -0
- package/dist/core/pi-package-intake.d.ts.map +1 -0
- package/dist/core/pi-package-intake.js +122 -0
- package/dist/core/pi-package-intake.js.map +1 -0
- package/dist/core/provider-attribution.d.ts +1 -1
- package/dist/core/provider-attribution.d.ts.map +1 -1
- package/dist/core/provider-attribution.js.map +1 -1
- package/dist/core/provider-display-names.d.ts.map +1 -1
- package/dist/core/provider-display-names.js +1 -0
- package/dist/core/provider-display-names.js.map +1 -1
- package/dist/core/read-anchors.d.ts +1 -1
- package/dist/core/read-anchors.d.ts.map +1 -1
- package/dist/core/read-anchors.js +1 -1
- package/dist/core/read-anchors.js.map +1 -1
- package/dist/core/recovery-checkpoint.d.ts +2 -2
- package/dist/core/recovery-checkpoint.d.ts.map +1 -1
- package/dist/core/recovery-checkpoint.js +2 -2
- package/dist/core/recovery-checkpoint.js.map +1 -1
- package/dist/core/resolve-config-value.d.ts +1 -1
- package/dist/core/resolve-config-value.d.ts.map +1 -1
- package/dist/core/resolve-config-value.js +2 -30
- package/dist/core/resolve-config-value.js.map +1 -1
- package/dist/core/resource-loader.d.ts +12 -20
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +67 -90
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/sandbox-policy-v2.d.ts +49 -0
- package/dist/core/sandbox-policy-v2.d.ts.map +1 -0
- package/dist/core/sandbox-policy-v2.js +368 -0
- package/dist/core/sandbox-policy-v2.js.map +1 -0
- package/dist/core/sdk.d.ts +10 -78
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +97 -139
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/semantic-cache-policy.d.ts +7 -1
- package/dist/core/semantic-cache-policy.d.ts.map +1 -1
- package/dist/core/semantic-cache-policy.js +8 -0
- package/dist/core/semantic-cache-policy.js.map +1 -1
- package/dist/core/session-manager.d.ts +2 -4
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +5 -6
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +1 -18
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +2 -48
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/skills.d.ts +5 -0
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +149 -36
- package/dist/core/skills.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +0 -2
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/subagent-orchestration.d.ts +73 -0
- package/dist/core/subagent-orchestration.d.ts.map +1 -0
- package/dist/core/subagent-orchestration.js +408 -0
- package/dist/core/subagent-orchestration.js.map +1 -0
- package/dist/core/system-prompt.d.ts +5 -4
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +57 -36
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/timings.d.ts +0 -4
- package/dist/core/timings.d.ts.map +1 -1
- package/dist/core/timings.js +0 -4
- package/dist/core/timings.js.map +1 -1
- package/dist/core/todo-runtime-state.d.ts +5 -0
- package/dist/core/todo-runtime-state.d.ts.map +1 -0
- package/dist/core/todo-runtime-state.js +12 -0
- package/dist/core/todo-runtime-state.js.map +1 -0
- package/dist/core/todo-state.d.ts +53 -0
- package/dist/core/todo-state.d.ts.map +1 -0
- package/dist/core/todo-state.js +87 -0
- package/dist/core/todo-state.js.map +1 -0
- package/dist/core/token-optimizer.d.ts +58 -0
- package/dist/core/token-optimizer.d.ts.map +1 -0
- package/dist/core/token-optimizer.js +179 -0
- package/dist/core/token-optimizer.js.map +1 -0
- package/dist/core/tools/bash.d.ts +8 -9
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +9 -8
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit.d.ts +3 -14
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +4 -25
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/find.d.ts +1 -4
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +1 -4
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts +1 -4
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +2 -5
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/index.d.ts +2 -2
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/ls.d.ts +1 -4
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +1 -4
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/read.d.ts +2 -14
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +4 -28
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/render-utils.d.ts +1 -1
- package/dist/core/tools/render-utils.d.ts.map +1 -1
- package/dist/core/tools/render-utils.js +1 -1
- package/dist/core/tools/render-utils.js.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts +1 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
- package/dist/core/tools/write.d.ts +2 -4
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +4 -4
- package/dist/core/tools/write.js.map +1 -1
- package/dist/encoding/index.d.ts +6 -0
- package/dist/encoding/index.d.ts.map +1 -0
- package/dist/encoding/index.js +6 -0
- package/dist/encoding/index.js.map +1 -0
- package/dist/encoding/l4-encoder.d.ts +96 -0
- package/dist/encoding/l4-encoder.d.ts.map +1 -0
- package/dist/encoding/l4-encoder.js +474 -0
- package/dist/encoding/l4-encoder.js.map +1 -0
- package/dist/fuzzing/index.d.ts +6 -0
- package/dist/fuzzing/index.d.ts.map +1 -0
- package/dist/fuzzing/index.js +6 -0
- package/dist/fuzzing/index.js.map +1 -0
- package/dist/fuzzing/mutation-engine.d.ts +93 -0
- package/dist/fuzzing/mutation-engine.d.ts.map +1 -0
- package/dist/fuzzing/mutation-engine.js +244 -0
- package/dist/fuzzing/mutation-engine.js.map +1 -0
- package/dist/guardrails/audit-logger.d.ts +4 -0
- package/dist/guardrails/audit-logger.d.ts.map +1 -0
- package/dist/guardrails/audit-logger.js +28 -0
- package/dist/guardrails/audit-logger.js.map +1 -0
- package/dist/guardrails/evidence-system.d.ts +61 -0
- package/dist/guardrails/evidence-system.d.ts.map +1 -0
- package/dist/guardrails/evidence-system.js +302 -0
- package/dist/guardrails/evidence-system.js.map +1 -0
- package/dist/guardrails/freedomd-adapter.d.ts +16 -0
- package/dist/guardrails/freedomd-adapter.d.ts.map +1 -0
- package/dist/guardrails/freedomd-adapter.js +87 -0
- package/dist/guardrails/freedomd-adapter.js.map +1 -0
- package/dist/index.d.ts +5 -19
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -17
- package/dist/index.js.map +1 -1
- package/dist/jailbreak-extension.d.ts +48 -0
- package/dist/jailbreak-extension.d.ts.map +1 -0
- package/dist/jailbreak-extension.js +47 -0
- package/dist/jailbreak-extension.js.map +1 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +2 -2
- package/dist/main.js.map +1 -1
- package/dist/migrations.d.ts +0 -37
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +6 -414
- package/dist/migrations.js.map +1 -1
- package/dist/modes/interactive/components/armin.d.ts +1 -1
- package/dist/modes/interactive/components/armin.d.ts.map +1 -1
- package/dist/modes/interactive/components/armin.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts +2 -2
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +1 -1
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/bash-execution.js +1 -1
- package/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.d.ts +1 -1
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.js +1 -1
- package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.js +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/config-selector.d.ts +1 -1
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector.js +1 -1
- package/dist/modes/interactive/components/config-selector.js.map +1 -1
- package/dist/modes/interactive/components/control-panel-box.d.ts +15 -0
- package/dist/modes/interactive/components/control-panel-box.d.ts.map +1 -0
- package/dist/modes/interactive/components/control-panel-box.js +55 -0
- package/dist/modes/interactive/components/control-panel-box.js.map +1 -0
- package/dist/modes/interactive/components/control-panel-gradient-motion.d.ts.map +1 -1
- package/dist/modes/interactive/components/control-panel-gradient-motion.js +2 -36
- package/dist/modes/interactive/components/control-panel-gradient-motion.js.map +1 -1
- package/dist/modes/interactive/components/control-panel-gradient.d.ts +1 -0
- package/dist/modes/interactive/components/control-panel-gradient.d.ts.map +1 -1
- package/dist/modes/interactive/components/control-panel-gradient.js +6 -5
- package/dist/modes/interactive/components/control-panel-gradient.js.map +1 -1
- package/dist/modes/interactive/components/control-panel-layout.d.ts +30 -0
- package/dist/modes/interactive/components/control-panel-layout.d.ts.map +1 -0
- package/dist/modes/interactive/components/control-panel-layout.js +197 -0
- package/dist/modes/interactive/components/control-panel-layout.js.map +1 -0
- package/dist/modes/interactive/components/control-panel-runtime-status.d.ts +6 -0
- package/dist/modes/interactive/components/control-panel-runtime-status.d.ts.map +1 -0
- package/dist/modes/interactive/components/control-panel-runtime-status.js +29 -0
- package/dist/modes/interactive/components/control-panel-runtime-status.js.map +1 -0
- package/dist/modes/interactive/components/control-panel.d.ts +9 -31
- package/dist/modes/interactive/components/control-panel.d.ts.map +1 -1
- package/dist/modes/interactive/components/control-panel.js +49 -168
- package/dist/modes/interactive/components/control-panel.js.map +1 -1
- package/dist/modes/interactive/components/countdown-timer.d.ts +1 -1
- package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
- package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-editor.js +14 -22
- package/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js +1 -1
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/components/daxnuts.d.ts +1 -1
- package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
- package/dist/modes/interactive/components/daxnuts.js.map +1 -1
- package/dist/modes/interactive/components/dynamic-border.d.ts +1 -1
- package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
- package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
- package/dist/modes/interactive/components/earendil-announcement.d.ts +1 -1
- package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
- package/dist/modes/interactive/components/earendil-announcement.js +1 -1
- package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
- package/dist/modes/interactive/components/extension-editor.d.ts +1 -1
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-editor.js +1 -1
- package/dist/modes/interactive/components/extension-editor.js.map +1 -1
- package/dist/modes/interactive/components/extension-input.d.ts +1 -1
- package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-input.js +1 -1
- package/dist/modes/interactive/components/extension-input.js.map +1 -1
- package/dist/modes/interactive/components/extension-selector.d.ts +1 -1
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-selector.js +1 -1
- package/dist/modes/interactive/components/extension-selector.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts +1 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +7 -9
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/index.d.ts +0 -2
- package/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/dist/modes/interactive/components/index.js +0 -2
- package/dist/modes/interactive/components/index.js.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.d.ts +1 -1
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.js +1 -1
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts +2 -2
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +2 -2
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts +13 -47
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +118 -193
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.js +1 -1
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.d.ts +2 -2
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
- package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector-search.js +1 -1
- package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector.js +1 -1
- package/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +3 -3
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +1 -1
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.d.ts +1 -1
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.js +1 -1
- package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/dist/modes/interactive/components/theme-selector.d.ts +1 -2
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/theme-selector.js +2 -11
- package/dist/modes/interactive/components/theme-selector.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts +8 -7
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +48 -7
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/components/todo-checklist.d.ts +31 -0
- package/dist/modes/interactive/components/todo-checklist.d.ts.map +1 -0
- package/dist/modes/interactive/components/todo-checklist.js +121 -0
- package/dist/modes/interactive/components/todo-checklist.js.map +1 -0
- package/dist/modes/interactive/components/tool-execution.d.ts +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +1 -1
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +1 -1
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.d.ts +1 -1
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.js +1 -1
- package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message.d.ts +1 -1
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message.js +1 -1
- package/dist/modes/interactive/components/user-message.js.map +1 -1
- package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
- package/dist/modes/interactive/components/visual-truncate.js +1 -1
- package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +3 -8
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +80 -232
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/omk-control-grid-dark.json +65 -77
- package/dist/modes/interactive/theme/omk-neon-control.json +90 -0
- package/dist/modes/interactive/theme/rust-forge.json +14 -24
- package/dist/modes/interactive/theme/theme.d.ts +1 -1
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +25 -45
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/print-mode.d.ts +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +2 -2
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +0 -4
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +2 -2
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/modules/index.d.ts +8 -0
- package/dist/modules/index.d.ts.map +1 -0
- package/dist/modules/index.js +7 -0
- package/dist/modules/index.js.map +1 -0
- package/dist/modules/lrl-bypass.d.ts +40 -0
- package/dist/modules/lrl-bypass.d.ts.map +1 -0
- package/dist/modules/lrl-bypass.js +84 -0
- package/dist/modules/lrl-bypass.js.map +1 -0
- package/dist/modules/lrl-deps.d.ts +38 -0
- package/dist/modules/lrl-deps.d.ts.map +1 -0
- package/dist/modules/lrl-deps.js +128 -0
- package/dist/modules/lrl-deps.js.map +1 -0
- package/dist/multiturn/easl-chain.d.ts +113 -0
- package/dist/multiturn/easl-chain.d.ts.map +1 -0
- package/dist/multiturn/easl-chain.js +351 -0
- package/dist/multiturn/easl-chain.js.map +1 -0
- package/dist/multiturn/index.d.ts +6 -0
- package/dist/multiturn/index.d.ts.map +1 -0
- package/dist/multiturn/index.js +6 -0
- package/dist/multiturn/index.js.map +1 -0
- package/dist/orchestration/lane-grant-auditor.d.ts +4 -0
- package/dist/orchestration/lane-grant-auditor.d.ts.map +1 -0
- package/dist/orchestration/lane-grant-auditor.js +87 -0
- package/dist/orchestration/lane-grant-auditor.js.map +1 -0
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +48 -113
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/routing/fallback-router.d.ts +123 -0
- package/dist/routing/fallback-router.d.ts.map +1 -0
- package/dist/routing/fallback-router.js +355 -0
- package/dist/routing/fallback-router.js.map +1 -0
- package/dist/routing/index.d.ts +6 -0
- package/dist/routing/index.d.ts.map +1 -0
- package/dist/routing/index.js +6 -0
- package/dist/routing/index.js.map +1 -0
- package/dist/types/evidence.d.ts +117 -0
- package/dist/types/evidence.d.ts.map +1 -0
- package/dist/types/evidence.js +8 -0
- package/dist/types/evidence.js.map +1 -0
- package/dist/types/guardrails.d.ts +61 -0
- package/dist/types/guardrails.d.ts.map +1 -0
- package/dist/types/guardrails.js +9 -0
- package/dist/types/guardrails.js.map +1 -0
- package/dist/types/jailbreak.d.ts +246 -0
- package/dist/types/jailbreak.d.ts.map +1 -0
- package/dist/types/jailbreak.js +8 -0
- package/dist/types/jailbreak.js.map +1 -0
- package/dist/types/lane-grant.d.ts +58 -0
- package/dist/types/lane-grant.d.ts.map +1 -0
- package/dist/types/lane-grant.js +9 -0
- package/dist/types/lane-grant.js.map +1 -0
- package/dist/utils/jailbreak/common.d.ts +63 -0
- package/dist/utils/jailbreak/common.d.ts.map +1 -0
- package/dist/utils/jailbreak/common.js +130 -0
- package/dist/utils/jailbreak/common.js.map +1 -0
- package/dist/utils/jailbreak/index.d.ts +7 -0
- package/dist/utils/jailbreak/index.d.ts.map +1 -0
- package/dist/utils/jailbreak/index.js +7 -0
- package/dist/utils/jailbreak/index.js.map +1 -0
- package/dist/utils/windows-self-update.d.ts.map +1 -1
- package/dist/utils/windows-self-update.js +1 -1
- package/dist/utils/windows-self-update.js.map +1 -1
- package/docs/compaction.md +8 -21
- package/docs/custom-provider.md +2 -2
- package/docs/development.md +1 -1
- package/docs/extensions.md +11 -11
- package/docs/loadout-domains/README.md +70 -0
- package/docs/loadout-domains/ai-agent-ops.md +94 -0
- package/docs/loadout-domains/backend-api.md +116 -0
- package/docs/loadout-domains/data-science.md +100 -0
- package/docs/loadout-domains/devops-infra.md +85 -0
- package/docs/loadout-domains/docs-writing.md +92 -0
- package/docs/loadout-domains/frontend-ui.md +128 -0
- package/docs/loadout-domains/general.md +62 -0
- package/docs/loadout-domains/mobile.md +84 -0
- package/docs/loadout-domains/qa-testing.md +87 -0
- package/docs/loadout-domains/research.md +80 -0
- package/docs/loadout-domains/security-audit.md +97 -0
- package/docs/packages.md +7 -48
- package/docs/prompt-templates.md +0 -2
- package/docs/providers.md +12 -0
- package/docs/sdk.md +3 -3
- package/docs/security.md +145 -0
- package/docs/session-format.md +1 -1
- package/docs/themes.md +8 -7
- package/docs/tui.md +14 -14
- package/docs/usage.md +6 -16
- package/examples/extensions/README.md +2 -2
- package/examples/extensions/aside-computer-use/README.md +114 -0
- package/examples/extensions/aside-computer-use/action-scoring.ts +122 -0
- package/examples/extensions/aside-computer-use/assertions.ts +380 -0
- package/examples/extensions/aside-computer-use/controller.ts +491 -0
- package/examples/extensions/aside-computer-use/evidence.ts +229 -0
- package/examples/extensions/aside-computer-use/golden-trace.ts +141 -0
- package/examples/extensions/aside-computer-use/index.ts +76 -0
- package/examples/extensions/aside-computer-use/mcp-client.ts +381 -0
- package/examples/extensions/aside-computer-use/observation-snapshot.ts +121 -0
- package/examples/extensions/aside-computer-use/package.json +16 -0
- package/examples/extensions/aside-computer-use/policy.ts +257 -0
- package/examples/extensions/aside-computer-use/risk-authorize.ts +200 -0
- package/examples/extensions/aside-computer-use/risk-classifier.ts +205 -0
- package/examples/extensions/aside-computer-use/schema-fingerprint.ts +80 -0
- package/examples/extensions/aside-computer-use/session-binding.ts +161 -0
- package/examples/extensions/aside-computer-use/tools.ts +449 -0
- package/examples/extensions/aside-computer-use/types.ts +217 -0
- package/examples/extensions/aside-computer-use/url-origin.ts +132 -0
- package/examples/extensions/bash-spawn-hook.ts +1 -1
- package/examples/extensions/border-status-editor.ts +2 -2
- package/examples/extensions/built-in-tool-renderer.ts +1 -1
- package/examples/extensions/custom-compaction.ts +1 -1
- package/examples/extensions/custom-footer.ts +2 -2
- package/examples/extensions/custom-header.ts +8 -8
- package/examples/extensions/custom-provider-anthropic/index.ts +1 -1
- 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/index.ts +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/test.ts +1 -1
- package/examples/extensions/doom-overlay/README.md +1 -2
- package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
- package/examples/extensions/doom-overlay/doom/build.sh +4 -4
- package/examples/extensions/doom-overlay/doom/doomgeneric_omk.c +72 -0
- package/examples/extensions/doom-overlay/doom-component.ts +2 -2
- package/examples/extensions/doom-overlay/doom-keys.ts +1 -1
- package/examples/extensions/git-merge-and-resolve.ts +1 -1
- package/examples/extensions/github-issue-autocomplete.ts +1 -6
- package/examples/extensions/gondolin/index.ts +1 -1
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/handoff.ts +2 -2
- package/examples/extensions/hello.ts +1 -1
- package/examples/extensions/inline-bash.ts +1 -1
- package/examples/extensions/input-transform-streaming.ts +1 -1
- package/examples/extensions/input-transform.ts +2 -2
- package/examples/extensions/mac-system-theme.ts +1 -1
- package/examples/extensions/message-renderer.ts +1 -1
- package/examples/extensions/minimal-mode.ts +1 -1
- package/examples/extensions/modal-editor.ts +1 -1
- package/examples/extensions/overlay-qa-tests.ts +7 -7
- package/examples/extensions/overlay-test.ts +1 -1
- package/examples/extensions/plan-mode/index.ts +3 -3
- package/examples/extensions/preset.ts +4 -4
- package/examples/extensions/provider-payload.ts +6 -3
- package/examples/extensions/qna.ts +1 -1
- package/examples/extensions/question.ts +1 -1
- package/examples/extensions/questionnaire.ts +1 -1
- package/examples/extensions/rpc-demo.ts +1 -1
- package/examples/extensions/sandbox/index.ts +2 -2
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/shutdown-command.ts +5 -5
- package/examples/extensions/snake.ts +1 -1
- package/examples/extensions/space-invaders.ts +1 -1
- package/examples/extensions/structured-output.ts +1 -1
- package/examples/extensions/subagent/agents.ts +2 -2
- package/examples/extensions/subagent/index.ts +19 -51
- package/examples/extensions/summarize.ts +2 -2
- package/examples/extensions/tic-tac-toe.ts +2 -2
- package/examples/extensions/todo.ts +2 -2
- package/examples/extensions/tool-override.ts +1 -1
- package/examples/extensions/tools.ts +1 -1
- package/examples/extensions/truncated-tool.ts +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/examples/extensions/working-indicator.ts +3 -3
- package/examples/rpc-extension-ui.ts +1 -9
- package/examples/sdk/02-custom-model.ts +1 -1
- package/examples/sdk/07-context-files.ts +0 -2
- package/examples/sdk/12-full-control.ts +1 -1
- package/examples/sdk/README.md +1 -1
- package/npm-shrinkwrap.json +1805 -0
- package/package.json +10 -32
- package/dist/core/compaction/pruner-policy.d.ts +0 -84
- package/dist/core/compaction/pruner-policy.d.ts.map +0 -1
- package/dist/core/compaction/pruner-policy.js +0 -273
- package/dist/core/compaction/pruner-policy.js.map +0 -1
- package/dist/core/context-graph-identity-resolution.d.ts +0 -114
- package/dist/core/context-graph-identity-resolution.d.ts.map +0 -1
- package/dist/core/context-graph-identity-resolution.js +0 -127
- package/dist/core/context-graph-identity-resolution.js.map +0 -1
- package/dist/core/context-graph-memory-store.d.ts +0 -153
- package/dist/core/context-graph-memory-store.d.ts.map +0 -1
- package/dist/core/context-graph-memory-store.js +0 -377
- package/dist/core/context-graph-memory-store.js.map +0 -1
- package/dist/core/context-graph-ontology-generation.d.ts +0 -104
- package/dist/core/context-graph-ontology-generation.d.ts.map +0 -1
- package/dist/core/context-graph-ontology-generation.js +0 -135
- package/dist/core/context-graph-ontology-generation.js.map +0 -1
- package/dist/core/context-graph-ontology-registry.d.ts +0 -766
- package/dist/core/context-graph-ontology-registry.d.ts.map +0 -1
- package/dist/core/context-graph-ontology-registry.js +0 -1133
- package/dist/core/context-graph-ontology-registry.js.map +0 -1
- package/dist/core/context-graph-policy.d.ts +0 -68
- package/dist/core/context-graph-policy.d.ts.map +0 -1
- package/dist/core/context-graph-policy.js +0 -221
- package/dist/core/context-graph-policy.js.map +0 -1
- package/dist/core/context-graph-reasoning.d.ts +0 -130
- package/dist/core/context-graph-reasoning.d.ts.map +0 -1
- package/dist/core/context-graph-reasoning.js +0 -442
- package/dist/core/context-graph-reasoning.js.map +0 -1
- package/dist/core/context-graph-retrieval.d.ts +0 -120
- package/dist/core/context-graph-retrieval.d.ts.map +0 -1
- package/dist/core/context-graph-retrieval.js +0 -288
- package/dist/core/context-graph-retrieval.js.map +0 -1
- package/dist/core/contract-verification.d.ts +0 -78
- package/dist/core/contract-verification.d.ts.map +0 -1
- package/dist/core/contract-verification.js +0 -110
- package/dist/core/contract-verification.js.map +0 -1
- package/dist/core/freedom/banner.d.ts +0 -14
- package/dist/core/freedom/banner.d.ts.map +0 -1
- package/dist/core/freedom/banner.js +0 -22
- package/dist/core/freedom/banner.js.map +0 -1
- package/dist/core/freedom/config.d.ts +0 -27
- package/dist/core/freedom/config.d.ts.map +0 -1
- package/dist/core/freedom/config.js +0 -216
- package/dist/core/freedom/config.js.map +0 -1
- package/dist/core/freedom/index.d.ts +0 -23
- package/dist/core/freedom/index.d.ts.map +0 -1
- package/dist/core/freedom/index.js +0 -19
- package/dist/core/freedom/index.js.map +0 -1
- package/dist/core/freedom/policy.d.ts +0 -42
- package/dist/core/freedom/policy.d.ts.map +0 -1
- package/dist/core/freedom/policy.js +0 -47
- package/dist/core/freedom/policy.js.map +0 -1
- package/dist/core/freedom/safety-floor.d.ts +0 -73
- package/dist/core/freedom/safety-floor.d.ts.map +0 -1
- package/dist/core/freedom/safety-floor.js +0 -275
- package/dist/core/freedom/safety-floor.js.map +0 -1
- package/dist/core/harness-control-events.d.ts +0 -91
- package/dist/core/harness-control-events.d.ts.map +0 -1
- package/dist/core/harness-control-events.js +0 -514
- package/dist/core/harness-control-events.js.map +0 -1
- package/dist/core/harness-control-replay.d.ts +0 -31
- package/dist/core/harness-control-replay.d.ts.map +0 -1
- package/dist/core/harness-control-replay.js +0 -187
- package/dist/core/harness-control-replay.js.map +0 -1
- package/dist/core/headroom-middleware.d.ts +0 -35
- package/dist/core/headroom-middleware.d.ts.map +0 -1
- package/dist/core/headroom-middleware.js +0 -166
- package/dist/core/headroom-middleware.js.map +0 -1
- package/dist/core/lean-context-middleware.d.ts +0 -12
- package/dist/core/lean-context-middleware.d.ts.map +0 -1
- package/dist/core/lean-context-middleware.js +0 -87
- package/dist/core/lean-context-middleware.js.map +0 -1
- package/dist/core/lean-context-policy.d.ts +0 -45
- package/dist/core/lean-context-policy.d.ts.map +0 -1
- package/dist/core/lean-context-policy.js +0 -108
- package/dist/core/lean-context-policy.js.map +0 -1
- package/dist/core/native-adoption-benchmark.d.ts +0 -166
- package/dist/core/native-adoption-benchmark.d.ts.map +0 -1
- package/dist/core/native-adoption-benchmark.js +0 -624
- package/dist/core/native-adoption-benchmark.js.map +0 -1
- package/dist/core/observability-trace.d.ts +0 -80
- package/dist/core/observability-trace.d.ts.map +0 -1
- package/dist/core/observability-trace.js +0 -140
- package/dist/core/observability-trace.js.map +0 -1
- package/dist/core/orchestration/checkpoint.d.ts +0 -83
- package/dist/core/orchestration/checkpoint.d.ts.map +0 -1
- package/dist/core/orchestration/checkpoint.js +0 -152
- package/dist/core/orchestration/checkpoint.js.map +0 -1
- package/dist/core/orchestration/errors.d.ts +0 -74
- package/dist/core/orchestration/errors.d.ts.map +0 -1
- package/dist/core/orchestration/errors.js +0 -52
- package/dist/core/orchestration/errors.js.map +0 -1
- package/dist/core/orchestration/merge-queue.d.ts +0 -121
- package/dist/core/orchestration/merge-queue.d.ts.map +0 -1
- package/dist/core/orchestration/merge-queue.js +0 -149
- package/dist/core/orchestration/merge-queue.js.map +0 -1
- package/dist/core/orchestration/recovery.d.ts +0 -106
- package/dist/core/orchestration/recovery.d.ts.map +0 -1
- package/dist/core/orchestration/recovery.js +0 -110
- package/dist/core/orchestration/recovery.js.map +0 -1
- package/dist/core/orchestration/replay-ledger.d.ts +0 -76
- package/dist/core/orchestration/replay-ledger.d.ts.map +0 -1
- package/dist/core/orchestration/replay-ledger.js +0 -395
- package/dist/core/orchestration/replay-ledger.js.map +0 -1
- package/dist/core/orchestration/scheduler-state.d.ts +0 -78
- package/dist/core/orchestration/scheduler-state.d.ts.map +0 -1
- package/dist/core/orchestration/scheduler-state.js +0 -185
- package/dist/core/orchestration/scheduler-state.js.map +0 -1
- package/dist/core/orchestration/scheduler-store.d.ts +0 -309
- package/dist/core/orchestration/scheduler-store.d.ts.map +0 -1
- package/dist/core/orchestration/scheduler-store.js +0 -368
- package/dist/core/orchestration/scheduler-store.js.map +0 -1
- package/dist/core/orchestration/sqlite-scheduler-store.d.ts +0 -57
- package/dist/core/orchestration/sqlite-scheduler-store.d.ts.map +0 -1
- package/dist/core/orchestration/sqlite-scheduler-store.js +0 -528
- package/dist/core/orchestration/sqlite-scheduler-store.js.map +0 -1
- package/dist/core/orchestration/transaction-coordinator.d.ts +0 -217
- package/dist/core/orchestration/transaction-coordinator.d.ts.map +0 -1
- package/dist/core/orchestration/transaction-coordinator.js +0 -281
- package/dist/core/orchestration/transaction-coordinator.js.map +0 -1
- package/dist/core/orchestration/verification-contract.d.ts +0 -197
- package/dist/core/orchestration/verification-contract.d.ts.map +0 -1
- package/dist/core/orchestration/verification-contract.js +0 -145
- package/dist/core/orchestration/verification-contract.js.map +0 -1
- package/dist/core/package-composition.d.ts +0 -68
- package/dist/core/package-composition.d.ts.map +0 -1
- package/dist/core/package-composition.js +0 -304
- package/dist/core/package-composition.js.map +0 -1
- package/dist/core/package-trial-runtime.d.ts +0 -75
- package/dist/core/package-trial-runtime.d.ts.map +0 -1
- package/dist/core/package-trial-runtime.js +0 -73
- package/dist/core/package-trial-runtime.js.map +0 -1
- package/dist/core/package-trial-sandbox.d.ts +0 -27
- package/dist/core/package-trial-sandbox.d.ts.map +0 -1
- package/dist/core/package-trial-sandbox.js +0 -102
- package/dist/core/package-trial-sandbox.js.map +0 -1
- package/dist/core/policy-overlays-runtime.d.ts +0 -141
- package/dist/core/policy-overlays-runtime.d.ts.map +0 -1
- package/dist/core/policy-overlays-runtime.js +0 -720
- package/dist/core/policy-overlays-runtime.js.map +0 -1
- package/dist/core/read-anchor-registry.d.ts +0 -27
- package/dist/core/read-anchor-registry.d.ts.map +0 -1
- package/dist/core/read-anchor-registry.js +0 -103
- package/dist/core/read-anchor-registry.js.map +0 -1
- package/dist/core/read-content-cache.d.ts +0 -22
- package/dist/core/read-content-cache.d.ts.map +0 -1
- package/dist/core/read-content-cache.js +0 -79
- package/dist/core/read-content-cache.js.map +0 -1
- package/dist/core/session-digest.d.ts +0 -57
- package/dist/core/session-digest.d.ts.map +0 -1
- package/dist/core/session-digest.js +0 -193
- package/dist/core/session-digest.js.map +0 -1
- package/dist/core/spec-kit/compiler.d.ts +0 -67
- package/dist/core/spec-kit/compiler.d.ts.map +0 -1
- package/dist/core/spec-kit/compiler.js +0 -268
- package/dist/core/spec-kit/compiler.js.map +0 -1
- package/dist/core/transaction-coordinator.d.ts +0 -30
- package/dist/core/transaction-coordinator.d.ts.map +0 -1
- package/dist/core/transaction-coordinator.js +0 -173
- package/dist/core/transaction-coordinator.js.map +0 -1
- package/dist/modes/interactive/components/mcp-selector.d.ts +0 -30
- package/dist/modes/interactive/components/mcp-selector.d.ts.map +0 -1
- package/dist/modes/interactive/components/mcp-selector.js +0 -155
- package/dist/modes/interactive/components/mcp-selector.js.map +0 -1
- package/dist/modes/interactive/components/model-selector-state.d.ts +0 -101
- package/dist/modes/interactive/components/model-selector-state.d.ts.map +0 -1
- package/dist/modes/interactive/components/model-selector-state.js +0 -261
- package/dist/modes/interactive/components/model-selector-state.js.map +0 -1
- package/dist/modes/interactive/components/skills-selector.d.ts +0 -32
- package/dist/modes/interactive/components/skills-selector.d.ts.map +0 -1
- package/dist/modes/interactive/components/skills-selector.js +0 -130
- package/dist/modes/interactive/components/skills-selector.js.map +0 -1
- package/dist/modes/interactive/theme/omk-blackboard.json +0 -91
- package/dist/modes/interactive/theme/omk-freedom-grid.json +0 -91
- package/dist/modes/interactive/theme/omk-neon-ops.json +0 -90
- package/dist/modes/interactive/theme/omk-slate-light.json +0 -91
- package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +0 -72
- package/node_modules/@earendil-works/omk-agent-core/README.md +0 -488
- package/node_modules/@earendil-works/omk-agent-core/dist/agent-loop.d.ts +0 -24
- package/node_modules/@earendil-works/omk-agent-core/dist/agent-loop.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/agent-loop.js +0 -553
- package/node_modules/@earendil-works/omk-agent-core/dist/agent-loop.js.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/agent.d.ts +0 -118
- package/node_modules/@earendil-works/omk-agent-core/dist/agent.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/agent.js +0 -402
- package/node_modules/@earendil-works/omk-agent-core/dist/agent.js.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/agent-harness.d.ts +0 -95
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/agent-harness.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/agent-harness.js +0 -996
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/agent-harness.js.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/branch-summarization.d.ts +0 -53
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/branch-summarization.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/branch-summarization.js +0 -175
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/branch-summarization.js.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/compaction.d.ts +0 -117
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/compaction.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/compaction.js +0 -568
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/compaction.js.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/utils.d.ts +0 -25
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/utils.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/utils.js +0 -131
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/utils.js.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/env/nodejs.d.ts +0 -51
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/env/nodejs.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/env/nodejs.js +0 -510
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/env/nodejs.js.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/messages.d.ts +0 -51
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/messages.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/messages.js +0 -102
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/messages.js.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/prompt-templates.d.ts +0 -48
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/prompt-templates.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/prompt-templates.js +0 -230
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/prompt-templates.js.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-repo.d.ts +0 -26
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-repo.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-repo.js +0 -101
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-repo.js.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-storage.d.ts +0 -36
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-storage.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-storage.js +0 -273
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-storage.js.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-repo.d.ts +0 -18
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-repo.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-repo.js +0 -42
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-repo.js.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-storage.d.ts +0 -25
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-storage.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-storage.js +0 -114
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-storage.js.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/repo-utils.d.ts +0 -11
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/repo-utils.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/repo-utils.js +0 -39
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/repo-utils.js.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/session.d.ts +0 -33
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/session.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/session.js +0 -210
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/session.js.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/uuid.d.ts +0 -2
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/uuid.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/uuid.js +0 -50
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/uuid.js.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/skills.d.ts +0 -44
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/skills.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/skills.js +0 -311
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/skills.js.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/system-prompt.d.ts +0 -3
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/system-prompt.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/system-prompt.js +0 -30
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/system-prompt.js.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/types.d.ts +0 -616
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/types.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/types.js +0 -94
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/types.js.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/shell-output.d.ts +0 -14
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/shell-output.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/shell-output.js +0 -126
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/shell-output.js.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/truncate.d.ts +0 -70
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/truncate.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/truncate.js +0 -297
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/truncate.js.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/index.d.ts +0 -20
- package/node_modules/@earendil-works/omk-agent-core/dist/index.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/index.js +0 -25
- package/node_modules/@earendil-works/omk-agent-core/dist/index.js.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/node.d.ts +0 -3
- package/node_modules/@earendil-works/omk-agent-core/dist/node.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/node.js +0 -3
- package/node_modules/@earendil-works/omk-agent-core/dist/node.js.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/proxy.d.ts +0 -69
- package/node_modules/@earendil-works/omk-agent-core/dist/proxy.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/proxy.js +0 -278
- package/node_modules/@earendil-works/omk-agent-core/dist/proxy.js.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/types.d.ts +0 -393
- package/node_modules/@earendil-works/omk-agent-core/dist/types.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/dist/types.js +0 -2
- package/node_modules/@earendil-works/omk-agent-core/dist/types.js.map +0 -1
- package/node_modules/@earendil-works/omk-agent-core/package.json +0 -60
- package/node_modules/@earendil-works/omk-ai/README.md +0 -1389
- package/node_modules/@earendil-works/omk-ai/dist/api-registry.d.ts +0 -20
- package/node_modules/@earendil-works/omk-ai/dist/api-registry.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/api-registry.js +0 -44
- package/node_modules/@earendil-works/omk-ai/dist/api-registry.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/bedrock-provider.d.ts +0 -5
- package/node_modules/@earendil-works/omk-ai/dist/bedrock-provider.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/bedrock-provider.js +0 -6
- package/node_modules/@earendil-works/omk-ai/dist/bedrock-provider.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/cli.d.ts +0 -3
- package/node_modules/@earendil-works/omk-ai/dist/cli.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/cli.js +0 -130
- package/node_modules/@earendil-works/omk-ai/dist/cli.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/env-api-keys.d.ts +0 -20
- package/node_modules/@earendil-works/omk-ai/dist/env-api-keys.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/env-api-keys.js +0 -199
- package/node_modules/@earendil-works/omk-ai/dist/env-api-keys.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/image-models.d.ts +0 -10
- package/node_modules/@earendil-works/omk-ai/dist/image-models.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/image-models.generated.d.ts +0 -515
- package/node_modules/@earendil-works/omk-ai/dist/image-models.generated.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/image-models.generated.js +0 -517
- package/node_modules/@earendil-works/omk-ai/dist/image-models.generated.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/image-models.js +0 -23
- package/node_modules/@earendil-works/omk-ai/dist/image-models.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/images-api-registry.d.ts +0 -14
- package/node_modules/@earendil-works/omk-ai/dist/images-api-registry.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/images-api-registry.js +0 -22
- package/node_modules/@earendil-works/omk-ai/dist/images-api-registry.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/images.d.ts +0 -4
- package/node_modules/@earendil-works/omk-ai/dist/images.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/images.js +0 -16
- package/node_modules/@earendil-works/omk-ai/dist/images.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/index.d.ts +0 -33
- package/node_modules/@earendil-works/omk-ai/dist/index.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/index.js +0 -21
- package/node_modules/@earendil-works/omk-ai/dist/index.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/models.d.ts +0 -18
- package/node_modules/@earendil-works/omk-ai/dist/models.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/models.generated.d.ts +0 -18762
- package/node_modules/@earendil-works/omk-ai/dist/models.generated.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/models.generated.js +0 -17197
- package/node_modules/@earendil-works/omk-ai/dist/models.generated.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/models.js +0 -78
- package/node_modules/@earendil-works/omk-ai/dist/models.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/oauth.d.ts +0 -2
- package/node_modules/@earendil-works/omk-ai/dist/oauth.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/oauth.js +0 -2
- package/node_modules/@earendil-works/omk-ai/dist/oauth.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/provider-network.d.ts +0 -39
- package/node_modules/@earendil-works/omk-ai/dist/provider-network.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/provider-network.js +0 -170
- package/node_modules/@earendil-works/omk-ai/dist/provider-network.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/amazon-bedrock.d.ts +0 -38
- package/node_modules/@earendil-works/omk-ai/dist/providers/amazon-bedrock.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/amazon-bedrock.js +0 -826
- package/node_modules/@earendil-works/omk-ai/dist/providers/amazon-bedrock.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/anthropic.d.ts +0 -77
- package/node_modules/@earendil-works/omk-ai/dist/providers/anthropic.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/anthropic.js +0 -1123
- package/node_modules/@earendil-works/omk-ai/dist/providers/anthropic.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/azure-openai-responses.d.ts +0 -15
- package/node_modules/@earendil-works/omk-ai/dist/providers/azure-openai-responses.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/azure-openai-responses.js +0 -221
- package/node_modules/@earendil-works/omk-ai/dist/providers/azure-openai-responses.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/cloudflare.d.ts +0 -13
- package/node_modules/@earendil-works/omk-ai/dist/providers/cloudflare.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/cloudflare.js +0 -26
- package/node_modules/@earendil-works/omk-ai/dist/providers/cloudflare.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/faux.d.ts +0 -56
- package/node_modules/@earendil-works/omk-ai/dist/providers/faux.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/faux.js +0 -368
- package/node_modules/@earendil-works/omk-ai/dist/providers/faux.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/github-copilot-headers.d.ts +0 -8
- package/node_modules/@earendil-works/omk-ai/dist/providers/github-copilot-headers.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/github-copilot-headers.js +0 -29
- package/node_modules/@earendil-works/omk-ai/dist/providers/github-copilot-headers.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/google-shared.d.ts +0 -70
- package/node_modules/@earendil-works/omk-ai/dist/providers/google-shared.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/google-shared.js +0 -331
- package/node_modules/@earendil-works/omk-ai/dist/providers/google-shared.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/google-vertex.d.ts +0 -15
- package/node_modules/@earendil-works/omk-ai/dist/providers/google-vertex.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/google-vertex.js +0 -442
- package/node_modules/@earendil-works/omk-ai/dist/providers/google-vertex.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/google.d.ts +0 -13
- package/node_modules/@earendil-works/omk-ai/dist/providers/google.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/google.js +0 -402
- package/node_modules/@earendil-works/omk-ai/dist/providers/google.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/images/openrouter.d.ts +0 -3
- package/node_modules/@earendil-works/omk-ai/dist/providers/images/openrouter.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/images/openrouter.js +0 -128
- package/node_modules/@earendil-works/omk-ai/dist/providers/images/openrouter.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/images/register-builtins.d.ts +0 -4
- package/node_modules/@earendil-works/omk-ai/dist/providers/images/register-builtins.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/images/register-builtins.js +0 -34
- package/node_modules/@earendil-works/omk-ai/dist/providers/images/register-builtins.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/mistral.d.ts +0 -25
- package/node_modules/@earendil-works/omk-ai/dist/providers/mistral.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/mistral.js +0 -534
- package/node_modules/@earendil-works/omk-ai/dist/providers/mistral.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-codex-responses.d.ts +0 -30
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-codex-responses.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-codex-responses.js +0 -1171
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-codex-responses.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-completions.d.ts +0 -19
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-completions.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-completions.js +0 -977
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-completions.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-prompt-cache.d.ts +0 -11
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-prompt-cache.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-prompt-cache.js +0 -22
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-prompt-cache.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses-shared.d.ts +0 -18
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses-shared.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses-shared.js +0 -496
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses-shared.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses.d.ts +0 -13
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses.js +0 -233
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/register-builtins.d.ts +0 -35
- package/node_modules/@earendil-works/omk-ai/dist/providers/register-builtins.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/register-builtins.js +0 -254
- package/node_modules/@earendil-works/omk-ai/dist/providers/register-builtins.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/simple-options.d.ts +0 -8
- package/node_modules/@earendil-works/omk-ai/dist/providers/simple-options.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/simple-options.js +0 -42
- package/node_modules/@earendil-works/omk-ai/dist/providers/simple-options.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/tool-schema.d.ts +0 -13
- package/node_modules/@earendil-works/omk-ai/dist/providers/tool-schema.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/tool-schema.js +0 -82
- package/node_modules/@earendil-works/omk-ai/dist/providers/tool-schema.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/transform-messages.d.ts +0 -8
- package/node_modules/@earendil-works/omk-ai/dist/providers/transform-messages.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/providers/transform-messages.js +0 -184
- package/node_modules/@earendil-works/omk-ai/dist/providers/transform-messages.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/session-resources.d.ts +0 -4
- package/node_modules/@earendil-works/omk-ai/dist/session-resources.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/session-resources.js +0 -22
- package/node_modules/@earendil-works/omk-ai/dist/session-resources.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/stream.d.ts +0 -8
- package/node_modules/@earendil-works/omk-ai/dist/stream.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/stream.js +0 -77
- package/node_modules/@earendil-works/omk-ai/dist/stream.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/types.d.ts +0 -570
- package/node_modules/@earendil-works/omk-ai/dist/types.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/types.js +0 -2
- package/node_modules/@earendil-works/omk-ai/dist/types.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/utils/abort-signals.d.ts +0 -6
- package/node_modules/@earendil-works/omk-ai/dist/utils/abort-signals.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/utils/abort-signals.js +0 -34
- package/node_modules/@earendil-works/omk-ai/dist/utils/abort-signals.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/utils/diagnostics.d.ts +0 -19
- package/node_modules/@earendil-works/omk-ai/dist/utils/diagnostics.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/utils/diagnostics.js +0 -25
- package/node_modules/@earendil-works/omk-ai/dist/utils/diagnostics.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/utils/event-stream.d.ts +0 -21
- package/node_modules/@earendil-works/omk-ai/dist/utils/event-stream.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/utils/event-stream.js +0 -81
- package/node_modules/@earendil-works/omk-ai/dist/utils/event-stream.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/utils/hash.d.ts +0 -3
- package/node_modules/@earendil-works/omk-ai/dist/utils/hash.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/utils/hash.js +0 -14
- package/node_modules/@earendil-works/omk-ai/dist/utils/hash.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/utils/headers.d.ts +0 -2
- package/node_modules/@earendil-works/omk-ai/dist/utils/headers.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/utils/headers.js +0 -8
- package/node_modules/@earendil-works/omk-ai/dist/utils/headers.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/utils/json-parse.d.ts +0 -16
- package/node_modules/@earendil-works/omk-ai/dist/utils/json-parse.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/utils/json-parse.js +0 -113
- package/node_modules/@earendil-works/omk-ai/dist/utils/json-parse.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/utils/node-http-proxy.d.ts +0 -10
- package/node_modules/@earendil-works/omk-ai/dist/utils/node-http-proxy.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/utils/node-http-proxy.js +0 -97
- package/node_modules/@earendil-works/omk-ai/dist/utils/node-http-proxy.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/anthropic.d.ts +0 -25
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/anthropic.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/anthropic.js +0 -335
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/anthropic.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/device-code.d.ts +0 -21
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/device-code.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/device-code.js +0 -56
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/device-code.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/github-copilot.d.ts +0 -30
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/github-copilot.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/github-copilot.js +0 -280
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/github-copilot.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/index.d.ts +0 -58
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/index.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/index.js +0 -122
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/index.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/oauth-page.d.ts +0 -3
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/oauth-page.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/oauth-page.js +0 -105
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/oauth-page.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/openai-codex.d.ts +0 -43
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/openai-codex.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/openai-codex.js +0 -487
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/openai-codex.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/pkce.d.ts +0 -13
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/pkce.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/pkce.js +0 -31
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/pkce.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/types.d.ts +0 -64
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/types.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/types.js +0 -2
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/types.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/utils/overflow.d.ts +0 -57
- package/node_modules/@earendil-works/omk-ai/dist/utils/overflow.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/utils/overflow.js +0 -154
- package/node_modules/@earendil-works/omk-ai/dist/utils/overflow.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/utils/sanitize-unicode.d.ts +0 -22
- package/node_modules/@earendil-works/omk-ai/dist/utils/sanitize-unicode.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/utils/sanitize-unicode.js +0 -26
- package/node_modules/@earendil-works/omk-ai/dist/utils/sanitize-unicode.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/utils/typebox-helpers.d.ts +0 -17
- package/node_modules/@earendil-works/omk-ai/dist/utils/typebox-helpers.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/utils/typebox-helpers.js +0 -21
- package/node_modules/@earendil-works/omk-ai/dist/utils/typebox-helpers.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/utils/validation.d.ts +0 -18
- package/node_modules/@earendil-works/omk-ai/dist/utils/validation.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-ai/dist/utils/validation.js +0 -281
- package/node_modules/@earendil-works/omk-ai/dist/utils/validation.js.map +0 -1
- package/node_modules/@earendil-works/omk-ai/package.json +0 -106
- package/node_modules/@earendil-works/omk-tui/README.md +0 -791
- package/node_modules/@earendil-works/omk-tui/dist/autocomplete.d.ts +0 -54
- package/node_modules/@earendil-works/omk-tui/dist/autocomplete.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/autocomplete.js +0 -632
- package/node_modules/@earendil-works/omk-tui/dist/autocomplete.js.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/components/box.d.ts +0 -22
- package/node_modules/@earendil-works/omk-tui/dist/components/box.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/components/box.js +0 -104
- package/node_modules/@earendil-works/omk-tui/dist/components/box.js.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/components/cancellable-loader.d.ts +0 -22
- package/node_modules/@earendil-works/omk-tui/dist/components/cancellable-loader.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/components/cancellable-loader.js +0 -35
- package/node_modules/@earendil-works/omk-tui/dist/components/cancellable-loader.js.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/components/editor.d.ts +0 -249
- package/node_modules/@earendil-works/omk-tui/dist/components/editor.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/components/editor.js +0 -1857
- package/node_modules/@earendil-works/omk-tui/dist/components/editor.js.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/components/image.d.ts +0 -28
- package/node_modules/@earendil-works/omk-tui/dist/components/image.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/components/image.js +0 -89
- package/node_modules/@earendil-works/omk-tui/dist/components/image.js.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/components/input.d.ts +0 -37
- package/node_modules/@earendil-works/omk-tui/dist/components/input.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/components/input.js +0 -378
- package/node_modules/@earendil-works/omk-tui/dist/components/input.js.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/components/loader.d.ts +0 -31
- package/node_modules/@earendil-works/omk-tui/dist/components/loader.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/components/loader.js +0 -69
- package/node_modules/@earendil-works/omk-tui/dist/components/loader.js.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/components/markdown.d.ts +0 -96
- package/node_modules/@earendil-works/omk-tui/dist/components/markdown.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/components/markdown.js +0 -644
- package/node_modules/@earendil-works/omk-tui/dist/components/markdown.js.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/components/select-list.d.ts +0 -50
- package/node_modules/@earendil-works/omk-tui/dist/components/select-list.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/components/select-list.js +0 -159
- package/node_modules/@earendil-works/omk-tui/dist/components/select-list.js.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/components/settings-list.d.ts +0 -50
- package/node_modules/@earendil-works/omk-tui/dist/components/settings-list.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/components/settings-list.js +0 -185
- package/node_modules/@earendil-works/omk-tui/dist/components/settings-list.js.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/components/spacer.d.ts +0 -12
- package/node_modules/@earendil-works/omk-tui/dist/components/spacer.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/components/spacer.js +0 -23
- package/node_modules/@earendil-works/omk-tui/dist/components/spacer.js.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/components/text.d.ts +0 -19
- package/node_modules/@earendil-works/omk-tui/dist/components/text.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/components/text.js +0 -89
- package/node_modules/@earendil-works/omk-tui/dist/components/text.js.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/components/truncated-text.d.ts +0 -13
- package/node_modules/@earendil-works/omk-tui/dist/components/truncated-text.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/components/truncated-text.js +0 -51
- package/node_modules/@earendil-works/omk-tui/dist/components/truncated-text.js.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/editor-component.d.ts +0 -39
- package/node_modules/@earendil-works/omk-tui/dist/editor-component.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/editor-component.js +0 -2
- package/node_modules/@earendil-works/omk-tui/dist/editor-component.js.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/fuzzy.d.ts +0 -16
- package/node_modules/@earendil-works/omk-tui/dist/fuzzy.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/fuzzy.js +0 -110
- package/node_modules/@earendil-works/omk-tui/dist/fuzzy.js.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/index.d.ts +0 -23
- package/node_modules/@earendil-works/omk-tui/dist/index.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/index.js +0 -32
- package/node_modules/@earendil-works/omk-tui/dist/index.js.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/keybindings.d.ts +0 -212
- package/node_modules/@earendil-works/omk-tui/dist/keybindings.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/keybindings.js +0 -252
- package/node_modules/@earendil-works/omk-tui/dist/keybindings.js.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/keys.d.ts +0 -184
- package/node_modules/@earendil-works/omk-tui/dist/keys.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/keys.js +0 -1173
- package/node_modules/@earendil-works/omk-tui/dist/keys.js.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/kill-ring.d.ts +0 -28
- package/node_modules/@earendil-works/omk-tui/dist/kill-ring.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/kill-ring.js +0 -44
- package/node_modules/@earendil-works/omk-tui/dist/kill-ring.js.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/native-modifiers.d.ts +0 -3
- package/node_modules/@earendil-works/omk-tui/dist/native-modifiers.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/native-modifiers.js +0 -53
- package/node_modules/@earendil-works/omk-tui/dist/native-modifiers.js.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/stdin-buffer.d.ts +0 -50
- package/node_modules/@earendil-works/omk-tui/dist/stdin-buffer.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/stdin-buffer.js +0 -361
- package/node_modules/@earendil-works/omk-tui/dist/stdin-buffer.js.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/terminal-image.d.ts +0 -90
- package/node_modules/@earendil-works/omk-tui/dist/terminal-image.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/terminal-image.js +0 -366
- package/node_modules/@earendil-works/omk-tui/dist/terminal-image.js.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/terminal.d.ts +0 -113
- package/node_modules/@earendil-works/omk-tui/dist/terminal.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/terminal.js +0 -472
- package/node_modules/@earendil-works/omk-tui/dist/terminal.js.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/tui.d.ts +0 -242
- package/node_modules/@earendil-works/omk-tui/dist/tui.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/tui.js +0 -1221
- package/node_modules/@earendil-works/omk-tui/dist/tui.js.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/undo-stack.d.ts +0 -17
- package/node_modules/@earendil-works/omk-tui/dist/undo-stack.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/undo-stack.js +0 -25
- package/node_modules/@earendil-works/omk-tui/dist/undo-stack.js.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/utils.d.ts +0 -84
- package/node_modules/@earendil-works/omk-tui/dist/utils.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/utils.js +0 -1032
- package/node_modules/@earendil-works/omk-tui/dist/utils.js.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/word-navigation.d.ts +0 -25
- package/node_modules/@earendil-works/omk-tui/dist/word-navigation.d.ts.map +0 -1
- package/node_modules/@earendil-works/omk-tui/dist/word-navigation.js +0 -96
- package/node_modules/@earendil-works/omk-tui/dist/word-navigation.js.map +0 -1
- package/node_modules/@earendil-works/omk-tui/native/darwin/prebuilds/darwin-arm64/darwin-modifiers.node +0 -0
- package/node_modules/@earendil-works/omk-tui/native/darwin/prebuilds/darwin-x64/darwin-modifiers.node +0 -0
- package/node_modules/@earendil-works/omk-tui/native/win32/prebuilds/win32-arm64/win32-console-mode.node +0 -0
- package/node_modules/@earendil-works/omk-tui/native/win32/prebuilds/win32-x64/win32-console-mode.node +0 -0
- package/node_modules/@earendil-works/omk-tui/package.json +0 -47
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/automation/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { readFile, stat } from \"node:fs/promises\";\n\nexport type RiskLevel = \"R0\" | \"R1\" | \"R2\" | \"R3\";\n\nexport type Capability =\n\t| \"fs.read\"\n\t| \"fs.write\"\n\t| \"process.exec\"\n\t| \"network.read\"\n\t| \"network.write\"\n\t| \"browser.observe\"\n\t| \"browser.mutate\"\n\t| \"browser.credentialed\"\n\t| \"mcp.call\"\n\t| \"extension.run\"\n\t| \"api.call\"\n\t| \"secrets.resolve\"\n\t| \"subagent.spawn\";\n\nexport type EnvMode = \"secret-ref-only\" | \"passthrough-audited\" | \"passthrough-full\";\nexport type Sensitivity = \"public\" | \"internal\" | \"credential\" | \"payment\" | \"session\" | \"admin\";\nexport type ApiMethod = \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n\nexport interface AutonomyProfile {\n\tid: \"autopilot-max\" | \"trusted-dev\" | \"ci-agent\" | \"public-safe\";\n\thumanPromptBudget: { maxPromptsPerTask: number; maxPromptRate: number };\n\tcapabilities: Capability[];\n\tenv: {\n\t\tmode: EnvMode;\n\t\tallowPatterns: string[];\n\t\tdenyPatterns: string[];\n\t\tredactPatterns: string[];\n\t\texposeToModel: false;\n\t};\n\tapi: {\n\t\tallowOrigins: string[];\n\t\tallowMethods: ApiMethod[];\n\t\tmutationDefault: \"auto\";\n\t\trequireIdempotencyForMethods: ApiMethod[];\n\t};\n\tbrowser: {\n\t\tpersistentProfile: boolean;\n\t\tcredentialedSessions: boolean;\n\t\tautoSubmit: boolean;\n\t\tautoDownload: boolean;\n\t\tmaxUnknownOutcomeReconciliations: number;\n\t};\n\tverification: {\n\t\tminVerifiabilityByRisk: Record<RiskLevel, number>;\n\t\trequireEvidenceByRisk: Record<RiskLevel, boolean>;\n\t\trequirePostconditionsByRisk: Record<RiskLevel, boolean>;\n\t};\n\trecovery: {\n\t\tautoRetry: boolean;\n\t\tautoRollback: boolean;\n\t\tautoCompensate: boolean;\n\t\tduplicateMutationSuppression: boolean;\n\t};\n\tbudgets: {\n\t\tmaxWallClockMs: number;\n\t\tmaxToolCalls: number;\n\t\tmaxBrowserActions: number;\n\t\tmaxNetworkCalls: number;\n\t\tmaxCostUsd: number;\n\t\triskBudget: Record<RiskLevel, number>;\n\t};\n}\n\nexport const AUTOPILOT_MAX: AutonomyProfile = {\n\tid: \"autopilot-max\",\n\thumanPromptBudget: { maxPromptsPerTask: 0, maxPromptRate: 0 },\n\tcapabilities: [\n\t\t\"fs.read\",\n\t\t\"fs.write\",\n\t\t\"process.exec\",\n\t\t\"network.read\",\n\t\t\"network.write\",\n\t\t\"browser.observe\",\n\t\t\"browser.mutate\",\n\t\t\"browser.credentialed\",\n\t\t\"mcp.call\",\n\t\t\"extension.run\",\n\t\t\"api.call\",\n\t\t\"secrets.resolve\",\n\t\t\"subagent.spawn\",\n\t],\n\tenv: {\n\t\tmode: \"passthrough-audited\",\n\t\tallowPatterns: [\"*\"],\n\t\tdenyPatterns: [],\n\t\tredactPatterns: [\n\t\t\t\"*KEY*\",\n\t\t\t\"*TOKEN*\",\n\t\t\t\"*SECRET*\",\n\t\t\t\"*PASSWORD*\",\n\t\t\t\"AWS_*\",\n\t\t\t\"GCP_*\",\n\t\t\t\"AZURE_*\",\n\t\t\t\"OPENAI_*\",\n\t\t\t\"ANTHROPIC_*\",\n\t\t\t\"GITHUB_*\",\n\t\t\t\"NPM_*\",\n\t\t],\n\t\texposeToModel: false,\n\t},\n\tapi: {\n\t\tallowOrigins: [\"*\"],\n\t\tallowMethods: [\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\"],\n\t\tmutationDefault: \"auto\",\n\t\trequireIdempotencyForMethods: [\"POST\", \"PUT\", \"PATCH\", \"DELETE\"],\n\t},\n\tbrowser: {\n\t\tpersistentProfile: true,\n\t\tcredentialedSessions: true,\n\t\tautoSubmit: true,\n\t\tautoDownload: true,\n\t\tmaxUnknownOutcomeReconciliations: 5,\n\t},\n\tverification: {\n\t\tminVerifiabilityByRisk: { R0: 0.1, R1: 0.25, R2: 0.45, R3: 0.65 },\n\t\trequireEvidenceByRisk: { R0: false, R1: true, R2: true, R3: true },\n\t\trequirePostconditionsByRisk: { R0: false, R1: true, R2: true, R3: true },\n\t},\n\trecovery: {\n\t\tautoRetry: true,\n\t\tautoRollback: true,\n\t\tautoCompensate: true,\n\t\tduplicateMutationSuppression: true,\n\t},\n\tbudgets: {\n\t\tmaxWallClockMs: 30 * 60 * 1000,\n\t\tmaxToolCalls: 500,\n\t\tmaxBrowserActions: 250,\n\t\tmaxNetworkCalls: 1000,\n\t\tmaxCostUsd: 10,\n\t\triskBudget: { R0: 10000, R1: 2000, R2: 500, R3: 100 },\n\t},\n};\n\nexport interface EnvRecord {\n\tkey: string;\n\tvalue: string;\n\tsensitivity: Sensitivity;\n\tsource: \"process\" | \"profile\" | \"workspace\" | \"task\" | \"tool\";\n\tfingerprint: string;\n}\n\nexport interface EnvUseEvent {\n\tactionId: string;\n\ttoolId: string;\n\tkey: string;\n\tsensitivity: Sensitivity;\n\tfingerprint: string;\n\tpurpose: string;\n\tpassedToProcess: boolean;\n\texposedToModel: false;\n\ttimestamp: string;\n}\n\nexport interface EnvResolutionRequest {\n\tactionId: string;\n\ttoolId: string;\n\tpurpose: string;\n\tprofile: AutonomyProfile;\n\trequestedKeys?: string[];\n\trequestedPatterns?: string[];\n\textraEnv?: Record<string, string>;\n}\n\nexport interface EnvBrokerLedger {\n\tappend(event: EnvUseEvent): Promise<unknown>;\n}\n\nexport class EnvBroker {\n\tprivate readonly processEnv: Record<string, string | undefined>;\n\tprivate readonly ledger: EnvBrokerLedger;\n\n\tconstructor(args: { processEnv: Record<string, string | undefined>; ledger: EnvBrokerLedger }) {\n\t\tthis.processEnv = args.processEnv;\n\t\tthis.ledger = args.ledger;\n\t}\n\n\tasync createChildEnv(req: EnvResolutionRequest): Promise<Record<string, string>> {\n\t\tconst selected = this.collect(req).filter((record) => this.isAllowed(record, req));\n\t\tconst childEnv: Record<string, string> = {};\n\t\tfor (const record of selected) {\n\t\t\tchildEnv[record.key] = record.value;\n\t\t\tawait this.ledger.append({\n\t\t\t\tactionId: req.actionId,\n\t\t\t\ttoolId: req.toolId,\n\t\t\t\tkey: record.key,\n\t\t\t\tsensitivity: record.sensitivity,\n\t\t\t\tfingerprint: record.fingerprint,\n\t\t\t\tpurpose: req.purpose,\n\t\t\t\tpassedToProcess: true,\n\t\t\t\texposedToModel: false,\n\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t});\n\t\t}\n\t\treturn childEnv;\n\t}\n\n\tredactEnvForModel(env: Record<string, string>): Record<string, string> {\n\t\tconst out: Record<string, string> = {};\n\t\tfor (const [key, value] of Object.entries(env)) {\n\t\t\tconst sensitivity = classifyEnvKey(key, value);\n\t\t\tout[key] = sensitivity === \"public\" ? value : `[REDACTED:${sha256(value).slice(0, 12)}]`;\n\t\t}\n\t\treturn out;\n\t}\n\n\tprivate collect(req: EnvResolutionRequest): EnvRecord[] {\n\t\tconst records: EnvRecord[] = [];\n\t\tfor (const [key, value] of Object.entries(this.processEnv)) {\n\t\t\tif (typeof value !== \"string\") continue;\n\t\t\trecords.push({\n\t\t\t\tkey,\n\t\t\t\tvalue,\n\t\t\t\tsensitivity: classifyEnvKey(key, value),\n\t\t\t\tsource: \"process\",\n\t\t\t\tfingerprint: sha256(value),\n\t\t\t});\n\t\t}\n\t\tfor (const [key, value] of Object.entries(req.extraEnv ?? {})) {\n\t\t\trecords.push({\n\t\t\t\tkey,\n\t\t\t\tvalue,\n\t\t\t\tsensitivity: classifyEnvKey(key, value),\n\t\t\t\tsource: \"tool\",\n\t\t\t\tfingerprint: sha256(value),\n\t\t\t});\n\t\t}\n\t\treturn records;\n\t}\n\n\tprivate isAllowed(record: EnvRecord, req: EnvResolutionRequest): boolean {\n\t\tif (req.profile.env.mode === \"passthrough-full\") return true;\n\t\tif (req.profile.env.mode === \"secret-ref-only\" && record.sensitivity !== \"public\") return false;\n\t\tconst allowedByPattern = matchesAny(record.key, req.profile.env.allowPatterns);\n\t\tconst deniedByPattern = matchesAny(record.key, req.profile.env.denyPatterns);\n\t\tif (deniedByPattern || !allowedByPattern) return false;\n\t\tif (req.requestedKeys?.includes(record.key)) return true;\n\t\tif (req.requestedPatterns?.some((pattern) => globMatch(record.key, pattern))) return true;\n\t\treturn req.profile.env.allowPatterns.includes(\"*\");\n\t}\n}\n\nexport type EvidenceActor = \"agent\" | \"tool\" | \"browser\" | \"extension-host\" | \"mcp\" | \"api\" | \"verifier\" | \"recovery\";\nexport type EvidenceOutcome =\n\t| \"planned\"\n\t| \"executed\"\n\t| \"verified\"\n\t| \"failed_before_commit\"\n\t| \"unknown_after_dispatch\"\n\t| \"reconciled\"\n\t| \"compensated\";\n\nexport interface EvidenceEvent {\n\tsequence: number;\n\tpreviousHash: string;\n\teventHash: string;\n\ttimestamp: string;\n\tsessionId: string;\n\ttaskId: string;\n\tactionId?: string;\n\tactor: EvidenceActor;\n\tkind: string;\n\tinputHash?: string;\n\toutputHash?: string;\n\tredactedOutputHash?: string;\n\tenvUseHash?: string;\n\tpolicyHash?: string;\n\tprofileHash?: string;\n\tschemaHash?: string;\n\toutcome?: EvidenceOutcome;\n}\n\nexport type EvidenceEventInput = Omit<\n\tEvidenceEvent,\n\t\"sequence\" | \"previousHash\" | \"eventHash\" | \"timestamp\" | \"sessionId\" | \"taskId\"\n>;\n\nexport class EvidenceLedger {\n\tprivate readonly sessionId: string;\n\tprivate readonly taskId: string;\n\tprivate readonly events: EvidenceEvent[] = [];\n\tprivate previousHash = \"genesis\";\n\n\tconstructor(args: { sessionId: string; taskId: string }) {\n\t\tthis.sessionId = args.sessionId;\n\t\tthis.taskId = args.taskId;\n\t}\n\n\tasync append(event: EvidenceEventInput): Promise<EvidenceEvent> {\n\t\tconst fullWithoutHash = {\n\t\t\t...event,\n\t\t\tsequence: this.events.length + 1,\n\t\t\tpreviousHash: this.previousHash,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tsessionId: this.sessionId,\n\t\t\ttaskId: this.taskId,\n\t\t};\n\t\tconst eventHash = canonicalHash(fullWithoutHash);\n\t\tconst full: EvidenceEvent = { ...fullWithoutHash, eventHash };\n\t\tthis.events.push(full);\n\t\tthis.previousHash = eventHash;\n\t\treturn full;\n\t}\n\n\tsnapshot(): EvidenceEvent[] {\n\t\treturn this.events.map((event) => ({ ...event }));\n\t}\n}\n\nexport type Postcondition =\n\t| { kind: \"url\"; origin?: string; path?: string; pattern?: string }\n\t| { kind: \"text\"; exact?: string; pattern?: string }\n\t| { kind: \"element-visible\"; ref?: string; role?: string; name?: string }\n\t| { kind: \"element-value\"; ref: string; expected: string }\n\t| { kind: \"api-status\"; status: number }\n\t| { kind: \"api-json\"; jsonPath: string; expected: unknown }\n\t| { kind: \"file-exists\"; path: string; sha256?: string }\n\t| { kind: \"download\"; path: string; sha256?: string; mimeType?: string }\n\t| { kind: \"receipt\"; idPattern: string }\n\t| { kind: \"database\"; queryId: string; expectedHash: string };\n\nexport interface VerificationContext {\n\tcurrentUrl?: string;\n\ttext?: string;\n\telements?: Array<{ ref?: string; role?: string; name?: string; value?: string; visible?: boolean }>;\n\tapiStatus?: number;\n\tapiBody?: unknown;\n\treceiptId?: string;\n\tdatabaseHashes?: Record<string, string>;\n}\n\nexport interface EvidencePointer {\n\tkind: string;\n\tdescription: string;\n\tsha256?: string;\n}\n\nexport interface VerificationResult {\n\tpass: boolean;\n\tconfidence: number;\n\tevidencePointers: EvidencePointer[];\n\tfailures: string[];\n\treceiptId?: string;\n}\n\nexport class PostconditionVerifier {\n\tasync verify(conditions: Postcondition[], ctx: VerificationContext): Promise<VerificationResult> {\n\t\tif (conditions.length === 0) {\n\t\t\treturn { pass: false, confidence: 0, evidencePointers: [], failures: [\"no postconditions\"] };\n\t\t}\n\t\tconst results: VerificationResult[] = [];\n\t\tfor (const condition of conditions) {\n\t\t\tresults.push(await this.verifyOne(condition, ctx));\n\t\t}\n\t\treturn {\n\t\t\tpass: results.every((result) => result.pass),\n\t\t\tconfidence: Math.min(...results.map((result) => result.confidence)),\n\t\t\tevidencePointers: results.flatMap((result) => result.evidencePointers),\n\t\t\tfailures: results.flatMap((result) => result.failures),\n\t\t\treceiptId: results.find((result) => result.receiptId)?.receiptId,\n\t\t};\n\t}\n\n\tprivate async verifyOne(condition: Postcondition, ctx: VerificationContext): Promise<VerificationResult> {\n\t\tswitch (condition.kind) {\n\t\t\tcase \"api-status\":\n\t\t\t\treturn booleanResult(ctx.apiStatus === condition.status, \"api-status\", `status ${condition.status}`);\n\t\t\tcase \"api-json\": {\n\t\t\t\tconst actual = readJsonPath(ctx.apiBody, condition.jsonPath);\n\t\t\t\treturn booleanResult(deepEqual(actual, condition.expected), \"api-json\", condition.jsonPath);\n\t\t\t}\n\t\t\tcase \"text\": {\n\t\t\t\tconst text = ctx.text ?? \"\";\n\t\t\t\tconst pass =\n\t\t\t\t\tcondition.exact !== undefined\n\t\t\t\t\t\t? text.includes(condition.exact)\n\t\t\t\t\t\t: condition.pattern !== undefined && new RegExp(condition.pattern).test(text);\n\t\t\t\treturn booleanResult(pass, \"text\", condition.exact ?? condition.pattern ?? \"<missing>\");\n\t\t\t}\n\t\t\tcase \"url\": {\n\t\t\t\tconst currentUrl = ctx.currentUrl;\n\t\t\t\tif (typeof currentUrl !== \"string\") {\n\t\t\t\t\treturn booleanResult(false, \"url\", \"<missing>\");\n\t\t\t\t}\n\t\t\t\tconst parsedUrl = new URL(currentUrl);\n\t\t\t\tlet pass = true;\n\t\t\t\tif (condition.origin) pass = parsedUrl.origin === condition.origin;\n\t\t\t\tif (pass && condition.path) pass = parsedUrl.pathname === condition.path;\n\t\t\t\tif (pass && condition.pattern) pass = new RegExp(condition.pattern).test(currentUrl);\n\t\t\t\treturn booleanResult(pass, \"url\", currentUrl ?? \"<missing>\");\n\t\t\t}\n\t\t\tcase \"file-exists\":\n\t\t\t\treturn verifyFile(condition.path, condition.sha256, \"file-exists\");\n\t\t\tcase \"download\":\n\t\t\t\treturn verifyFile(condition.path, condition.sha256, \"download\");\n\t\t\tcase \"receipt\": {\n\t\t\t\tconst receiptId = ctx.receiptId;\n\t\t\t\tconst pass = typeof receiptId === \"string\" && new RegExp(condition.idPattern).test(receiptId);\n\t\t\t\treturn { ...booleanResult(pass, \"receipt\", receiptId ?? \"<missing>\"), receiptId };\n\t\t\t}\n\t\t\tcase \"database\": {\n\t\t\t\tconst actualHash = ctx.databaseHashes?.[condition.queryId];\n\t\t\t\treturn booleanResult(actualHash === condition.expectedHash, \"database\", condition.queryId);\n\t\t\t}\n\t\t\tcase \"element-visible\": {\n\t\t\t\tconst pass = (ctx.elements ?? []).some(\n\t\t\t\t\t(element) =>\n\t\t\t\t\t\telement.visible === true &&\n\t\t\t\t\t\t(condition.ref === undefined || element.ref === condition.ref) &&\n\t\t\t\t\t\t(condition.role === undefined || element.role === condition.role) &&\n\t\t\t\t\t\t(condition.name === undefined || element.name === condition.name),\n\t\t\t\t);\n\t\t\t\treturn booleanResult(pass, \"element-visible\", condition.ref ?? condition.role ?? condition.name ?? \"<any>\");\n\t\t\t}\n\t\t\tcase \"element-value\": {\n\t\t\t\tconst pass = (ctx.elements ?? []).some(\n\t\t\t\t\t(element) => element.ref === condition.ref && element.value === condition.expected,\n\t\t\t\t);\n\t\t\t\treturn booleanResult(pass, \"element-value\", condition.ref);\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport interface ApiAction {\n\tactionId: string;\n\tmethod: ApiMethod;\n\turl: string;\n\theaders: Record<string, string>;\n\tbody?: unknown;\n\tcredentialRefs: string[];\n\texpectedPostconditions: Postcondition[];\n\tidempotencyKey?: string;\n}\n\nexport interface ApiOutcome {\n\tkind: \"succeeded\" | \"failed_before_commit\" | \"succeeded_unverified\" | \"unknown_after_dispatch\";\n\tstatus?: number;\n\tbodyHash?: string;\n\treceiptId?: string;\n\tredactedBody?: unknown;\n}\n\nexport interface BrokerFetchRequest {\n\tmethod: ApiMethod;\n\theaders: Record<string, string>;\n\tbody?: string;\n\tsignal?: AbortSignal;\n}\n\nexport interface BrokerFetchResponse {\n\tstatus: number;\n\tjson(): Promise<unknown>;\n\ttext(): Promise<string>;\n}\n\nexport type BrokerFetcher = (url: string, init: BrokerFetchRequest) => Promise<BrokerFetchResponse>;\n\nexport class ApiBroker {\n\tprivate readonly ledger: EvidenceLedger;\n\tprivate readonly verifier: PostconditionVerifier;\n\tprivate readonly fetcher: BrokerFetcher;\n\n\tconstructor(args: { ledger: EvidenceLedger; verifier: PostconditionVerifier; fetcher?: BrokerFetcher }) {\n\t\tthis.ledger = args.ledger;\n\t\tthis.verifier = args.verifier;\n\t\tthis.fetcher = args.fetcher ?? defaultFetcher;\n\t}\n\n\tasync execute(\n\t\taction: ApiAction,\n\t\tctx: { signal?: AbortSignal; profile?: AutonomyProfile } = {},\n\t): Promise<ApiOutcome> {\n\t\tconst idempotencyKey = action.idempotencyKey ?? deriveIdempotencyKey(action);\n\t\tconst headers = { ...action.headers, \"Idempotency-Key\": idempotencyKey, \"X-OMK-Action-Id\": action.actionId };\n\t\tawait this.ledger.append({\n\t\t\tactor: \"api\",\n\t\t\tkind: \"api.dispatch.planned\",\n\t\t\tactionId: action.actionId,\n\t\t\tinputHash: canonicalHash({ method: action.method, url: action.url, headers, body: action.body }),\n\t\t\toutcome: \"planned\",\n\t\t});\n\n\t\tlet response: BrokerFetchResponse;\n\t\ttry {\n\t\t\tresponse = await this.fetcher(action.url, {\n\t\t\t\tmethod: action.method,\n\t\t\t\theaders,\n\t\t\t\tbody: action.body === undefined ? undefined : JSON.stringify(action.body),\n\t\t\t\tsignal: ctx.signal,\n\t\t\t});\n\t\t} catch {\n\t\t\treturn this.reconcileUnknown(action, idempotencyKey, ctx.profile ?? AUTOPILOT_MAX);\n\t\t}\n\n\t\tconst rawBody = await safeReadJsonOrText(response);\n\t\tconst redactedBody = redactForModel(rawBody);\n\t\tawait this.ledger.append({\n\t\t\tactor: \"api\",\n\t\t\tkind: \"api.response\",\n\t\t\tactionId: action.actionId,\n\t\t\toutputHash: canonicalHash(rawBody),\n\t\t\tredactedOutputHash: canonicalHash(redactedBody),\n\t\t\toutcome: \"executed\",\n\t\t});\n\t\tconst verification = await this.verifier.verify(action.expectedPostconditions, {\n\t\t\tapiStatus: response.status,\n\t\t\tapiBody: rawBody,\n\t\t\treceiptId: readReceiptId(rawBody),\n\t\t});\n\t\tif (!verification.pass) {\n\t\t\treturn {\n\t\t\t\tkind: \"succeeded_unverified\",\n\t\t\t\tstatus: response.status,\n\t\t\t\tbodyHash: canonicalHash(rawBody),\n\t\t\t\tredactedBody,\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tkind: \"succeeded\",\n\t\t\tstatus: response.status,\n\t\t\tbodyHash: canonicalHash(rawBody),\n\t\t\treceiptId: verification.receiptId,\n\t\t\tredactedBody,\n\t\t};\n\t}\n\n\tprivate async reconcileUnknown(\n\t\taction: ApiAction,\n\t\tidempotencyKey: string,\n\t\tprofile: AutonomyProfile,\n\t): Promise<ApiOutcome> {\n\t\tfor (let attempt = 0; attempt < profile.browser.maxUnknownOutcomeReconciliations; attempt++) {\n\t\t\tconst verification = await this.verifier.verify(action.expectedPostconditions, { receiptId: idempotencyKey });\n\t\t\tif (verification.pass) {\n\t\t\t\tawait this.ledger.append({\n\t\t\t\t\tactor: \"recovery\",\n\t\t\t\t\tkind: \"api.unknown.reconciled\",\n\t\t\t\t\tactionId: action.actionId,\n\t\t\t\t\toutcome: \"reconciled\",\n\t\t\t\t});\n\t\t\t\treturn { kind: \"succeeded\", receiptId: verification.receiptId };\n\t\t\t}\n\t\t}\n\t\tawait this.ledger.append({\n\t\t\tactor: \"recovery\",\n\t\t\tkind: \"api.unknown.unresolved\",\n\t\t\tactionId: action.actionId,\n\t\t\toutcome: \"unknown_after_dispatch\",\n\t\t});\n\t\treturn { kind: \"unknown_after_dispatch\" };\n\t}\n}\n\nexport interface ExecutionStrategy {\n\texecute: boolean;\n\trequirePostcondition: boolean;\n\trequireIdempotency: boolean;\n\trecovery: \"retry\" | \"repair\" | \"reconcile-and-compensate\";\n\tevidenceDepth: \"minimal\" | \"normal\" | \"deep\" | \"forensic\";\n}\n\nexport function strategyForRisk(risk: RiskLevel): ExecutionStrategy {\n\tif (risk === \"R0\") {\n\t\treturn {\n\t\t\texecute: true,\n\t\t\trequirePostcondition: false,\n\t\t\trequireIdempotency: false,\n\t\t\trecovery: \"retry\",\n\t\t\tevidenceDepth: \"minimal\",\n\t\t};\n\t}\n\tif (risk === \"R1\") {\n\t\treturn {\n\t\t\texecute: true,\n\t\t\trequirePostcondition: true,\n\t\t\trequireIdempotency: false,\n\t\t\trecovery: \"retry\",\n\t\t\tevidenceDepth: \"normal\",\n\t\t};\n\t}\n\tif (risk === \"R2\") {\n\t\treturn {\n\t\t\texecute: true,\n\t\t\trequirePostcondition: true,\n\t\t\trequireIdempotency: true,\n\t\t\trecovery: \"repair\",\n\t\t\tevidenceDepth: \"deep\",\n\t\t};\n\t}\n\treturn {\n\t\texecute: true,\n\t\trequirePostcondition: true,\n\t\trequireIdempotency: true,\n\t\trecovery: \"reconcile-and-compensate\",\n\t\tevidenceDepth: \"forensic\",\n\t};\n}\n\nexport interface ToolExecutionNeed {\n\tactionId: string;\n\trequiredCapability: Capability;\n\trisk: RiskLevel;\n\trequiredPostconditions: Postcondition[];\n\tcontextFingerprint?: string;\n}\n\nexport interface ToolExecutionCandidate {\n\ttoolId: string;\n\tcapability: Capability;\n\tschemaHash: string;\n\treliability: number;\n\tverificationStrength: number;\n\tavgLatencyMs: number;\n\tcostUsd: number;\n\tsupportsIdempotency: boolean;\n\tenabled: boolean;\n\tcontextFingerprint?: string;\n}\n\nexport interface ToolExecutionChoice {\n\tcandidate: ToolExecutionCandidate;\n\tscore: number;\n\tstrategy: ExecutionStrategy;\n\treasons: string[];\n}\n\nexport class DynamicToolPortfolioOptimizer {\n\trank(candidates: ToolExecutionCandidate[], need: ToolExecutionNeed): ToolExecutionChoice[] {\n\t\treturn candidates\n\t\t\t.filter((candidate) => candidate.enabled && candidate.capability === need.requiredCapability)\n\t\t\t.map((candidate) => this.scoreCandidate(candidate, need))\n\t\t\t.sort((left, right) => right.score - left.score);\n\t}\n\n\tscoreCandidate(candidate: ToolExecutionCandidate, need: ToolExecutionNeed): ToolExecutionChoice {\n\t\tconst strategy = strategyForRisk(need.risk);\n\t\tconst contextMatch =\n\t\t\tneed.contextFingerprint === undefined || candidate.contextFingerprint === need.contextFingerprint ? 1 : 0;\n\t\tconst idempotency = !strategy.requireIdempotency || candidate.supportsIdempotency ? 1 : 0;\n\t\tconst latency = Math.max(0, 1 - candidate.avgLatencyMs / 30000);\n\t\tconst cost = Math.max(0, 1 - candidate.costUsd / Math.max(1, AUTOPILOT_MAX.budgets.maxCostUsd));\n\t\tconst postconditionCoverage = need.requiredPostconditions.length > 0 ? candidate.verificationStrength : 1;\n\t\tconst score =\n\t\t\t0.32 * candidate.reliability +\n\t\t\t0.26 * postconditionCoverage +\n\t\t\t0.16 * idempotency +\n\t\t\t0.12 * contextMatch +\n\t\t\t0.08 * latency +\n\t\t\t0.06 * cost;\n\t\treturn {\n\t\t\tcandidate,\n\t\t\tscore: Number(score.toFixed(4)),\n\t\t\tstrategy,\n\t\t\treasons: [\n\t\t\t\t`reliability=${candidate.reliability}`,\n\t\t\t\t`verification=${postconditionCoverage}`,\n\t\t\t\t`idempotency=${idempotency}`,\n\t\t\t\t`context=${contextMatch}`,\n\t\t\t],\n\t\t};\n\t}\n}\n\nexport class ToolExecutionBroker {\n\tprivate readonly ledger: EvidenceLedger;\n\tprivate readonly profile: AutonomyProfile;\n\tprivate readonly optimizer: DynamicToolPortfolioOptimizer;\n\n\tconstructor(args: {\n\t\tledger: EvidenceLedger;\n\t\tprofile?: AutonomyProfile;\n\t\toptimizer?: DynamicToolPortfolioOptimizer;\n\t}) {\n\t\tthis.ledger = args.ledger;\n\t\tthis.profile = args.profile ?? AUTOPILOT_MAX;\n\t\tthis.optimizer = args.optimizer ?? new DynamicToolPortfolioOptimizer();\n\t}\n\n\tasync select(need: ToolExecutionNeed, candidates: ToolExecutionCandidate[]): Promise<ToolExecutionChoice> {\n\t\tconst choices = this.optimizer.rank(candidates, need);\n\t\tconst choice = choices[0];\n\t\tif (choice === undefined) {\n\t\t\tthrow new Error(`No enabled tool candidate for ${need.requiredCapability}`);\n\t\t}\n\t\tawait this.ledger.append({\n\t\t\tactor: \"tool\",\n\t\t\tkind: \"tool.execution.planned\",\n\t\t\tactionId: need.actionId,\n\t\t\tinputHash: canonicalHash(need),\n\t\t\tpolicyHash: canonicalHash(this.profile),\n\t\t\tschemaHash: choice.candidate.schemaHash,\n\t\t\toutcome: \"planned\",\n\t\t});\n\t\treturn choice;\n\t}\n\n\tasync recordResult(choice: ToolExecutionChoice, result: VerificationResult): Promise<EvidenceEvent> {\n\t\treturn this.ledger.append({\n\t\t\tactor: \"tool\",\n\t\t\tkind: \"tool.execution.result\",\n\t\t\tactionId: choice.candidate.toolId,\n\t\t\toutputHash: canonicalHash(result),\n\t\t\tschemaHash: choice.candidate.schemaHash,\n\t\t\toutcome: result.pass ? \"verified\" : \"unknown_after_dispatch\",\n\t\t});\n\t}\n}\n\nexport interface AutomationTraceAction {\n\tkind: \"tool\" | \"browser\" | \"api\" | \"mcp\" | \"extension\";\n\tverificationPass: boolean;\n\tschemaHashMatched?: boolean;\n\tenvUseLedgered?: boolean;\n\ttargetFingerprintMatched?: boolean;\n\toutcome?: \"unknown_after_dispatch\" | \"succeeded\" | \"failed\";\n\treconciled?: boolean;\n}\n\nexport interface AutomationTraceEnvApiUse {\n\tledgered: boolean;\n\texposedToModel: boolean;\n\texposedToLogs: boolean;\n}\n\nexport interface AutomationTraceContextPlan {\n\trenderedTokens: number;\n\tresourceBudget: number;\n\tplanHash: string;\n\trenderedHashLinkedPlanHash: string;\n\toutputReserveCountedOnce: boolean;\n}\n\nexport interface AutomationTrace {\n\tactions: AutomationTraceAction[];\n\tverifications: Array<{ conditionHash: string; pass: boolean }>;\n\thumanPrompts: number;\n\tenvApiUses: AutomationTraceEnvApiUse[];\n\tfailures: number;\n\tunknownOutcomes: number;\n\trecoveredFailures: number;\n\treconciledUnknowns: number;\n\tsecretLeaks: number;\n\tduplicateIrreversibleMutations: number;\n\tunledgeredEnvUses: number;\n\treplayMatches: boolean;\n\tcontextPlans: AutomationTraceContextPlan[];\n}\n\nexport interface AutomationHarnessScoreInput {\n\trequiredPostconditions: Postcondition[];\n\ttrace: AutomationTrace;\n}\n\nexport interface AutomationScoreBreakdown {\n\tscore: number;\n\tverifiedSuccess: boolean;\n\tenvApiUseCorrectness: number;\n\tduplicateMutations: number;\n\tsecretLeaks: number;\n\tcritical: boolean;\n}\n\nexport class AutomationHarnessScorer {\n\tscore(input: AutomationHarnessScoreInput): AutomationScoreBreakdown {\n\t\tconst verifiedSuccess = this.verifiedSuccess(input);\n\t\tconst autonomy = 1 - input.trace.humanPrompts / Math.max(1, input.trace.actions.length);\n\t\tconst toolUse = this.toolUseScore(input.trace);\n\t\tconst browserUse = this.browserUseScore(input.trace);\n\t\tconst envApi = this.envApiScore(input.trace);\n\t\tconst recovery = this.recoveryScore(input.trace);\n\t\tconst determinism = input.trace.replayMatches ? 1 : 0;\n\t\tconst context = this.contextScore(input.trace);\n\t\tconst critical =\n\t\t\tinput.trace.secretLeaks > 0 ||\n\t\t\tinput.trace.duplicateIrreversibleMutations > 0 ||\n\t\t\t(input.requiredPostconditions.length > 0 && verifiedSuccess < 1) ||\n\t\t\t!input.trace.replayMatches ||\n\t\t\tinput.trace.unledgeredEnvUses > 0 ||\n\t\t\tinput.trace.envApiUses.some((use) => !use.ledgered) ||\n\t\t\tinput.trace.actions.some(\n\t\t\t\t(action) =>\n\t\t\t\t\taction.schemaHashMatched === false ||\n\t\t\t\t\t(action.kind === \"browser\" && action.targetFingerprintMatched === false),\n\t\t\t);\n\t\tconst raw =\n\t\t\t20 * verifiedSuccess +\n\t\t\t15 * autonomy +\n\t\t\t15 * toolUse +\n\t\t\t15 * browserUse +\n\t\t\t10 * envApi +\n\t\t\t10 * recovery +\n\t\t\t10 * determinism +\n\t\t\t5 * context;\n\t\treturn {\n\t\t\tscore: critical ? Math.min(79, raw) : raw,\n\t\t\tverifiedSuccess: verifiedSuccess >= 0.93,\n\t\t\tenvApiUseCorrectness: envApi,\n\t\t\tduplicateMutations: input.trace.duplicateIrreversibleMutations,\n\t\t\tsecretLeaks: input.trace.secretLeaks,\n\t\t\tcritical,\n\t\t};\n\t}\n\n\tprivate verifiedSuccess(input: AutomationHarnessScoreInput): number {\n\t\tconst passed = input.requiredPostconditions.filter((condition) =>\n\t\t\tinput.trace.verifications.some(\n\t\t\t\t(verification) => verification.conditionHash === canonicalHash(condition) && verification.pass,\n\t\t\t),\n\t\t);\n\t\treturn passed.length / Math.max(1, input.requiredPostconditions.length);\n\t}\n\n\tprivate toolUseScore(trace: AutomationTrace): number {\n\t\tconst calls = trace.actions.filter((action) => action.kind === \"tool\");\n\t\tif (calls.length === 0) return 1;\n\t\tconst verified = calls.filter((action) => action.verificationPass).length;\n\t\tconst schemaStable = calls.filter((action) => action.schemaHashMatched === true).length;\n\t\tconst envLedgered = calls.filter((action) => action.envUseLedgered === true).length;\n\t\treturn (verified + schemaStable + envLedgered) / (3 * calls.length);\n\t}\n\n\tprivate browserUseScore(trace: AutomationTrace): number {\n\t\tconst actions = trace.actions.filter((action) => action.kind === \"browser\");\n\t\tif (actions.length === 0) return 1;\n\t\tconst verified = actions.filter((action) => action.verificationPass).length;\n\t\tconst targetStable = actions.filter((action) => action.targetFingerprintMatched === true).length;\n\t\tconst unknownResolved = actions.filter(\n\t\t\t(action) => action.outcome !== \"unknown_after_dispatch\" || action.reconciled === true,\n\t\t).length;\n\t\treturn (verified + targetStable + unknownResolved) / (3 * actions.length);\n\t}\n\n\tprivate envApiScore(trace: AutomationTrace): number {\n\t\tif (trace.envApiUses.length === 0) return 1;\n\t\tconst ledgered = trace.envApiUses.filter((use) => use.ledgered).length;\n\t\tconst notLeaked = trace.envApiUses.filter((use) => !use.exposedToModel && !use.exposedToLogs).length;\n\t\treturn (ledgered + notLeaked) / (2 * trace.envApiUses.length);\n\t}\n\n\tprivate recoveryScore(trace: AutomationTrace): number {\n\t\tconst failures = trace.failures + trace.unknownOutcomes;\n\t\tif (failures === 0) return 1;\n\t\treturn (trace.recoveredFailures + trace.reconciledUnknowns) / failures;\n\t}\n\n\tprivate contextScore(trace: AutomationTrace): number {\n\t\tif (trace.contextPlans.length === 0) return 1;\n\t\tconst valid = trace.contextPlans.filter(\n\t\t\t(plan) =>\n\t\t\t\tplan.renderedTokens <= plan.resourceBudget &&\n\t\t\t\tplan.planHash === plan.renderedHashLinkedPlanHash &&\n\t\t\t\tplan.outputReserveCountedOnce,\n\t\t).length;\n\t\treturn valid / trace.contextPlans.length;\n\t}\n}\n\nexport function classifyEnvKey(key: string, value: string): Sensitivity {\n\tconst normalizedKey = key.toUpperCase();\n\tif (\n\t\tnormalizedKey.includes(\"TOKEN\") ||\n\t\tnormalizedKey.includes(\"SECRET\") ||\n\t\tnormalizedKey.includes(\"PASSWORD\") ||\n\t\tnormalizedKey.includes(\"API_KEY\") ||\n\t\tnormalizedKey.endsWith(\"_KEY\") ||\n\t\tnormalizedKey.startsWith(\"AWS_\") ||\n\t\tnormalizedKey.startsWith(\"GCP_\") ||\n\t\tnormalizedKey.startsWith(\"AZURE_\") ||\n\t\tnormalizedKey.startsWith(\"OPENAI_\") ||\n\t\tnormalizedKey.startsWith(\"ANTHROPIC_\") ||\n\t\tnormalizedKey.startsWith(\"GITHUB_\") ||\n\t\tnormalizedKey.startsWith(\"NPM_\")\n\t) {\n\t\treturn \"credential\";\n\t}\n\tif (looksLikePaymentCredential(value)) return \"payment\";\n\tif (looksLikeSessionCookie(value)) return \"session\";\n\treturn \"public\";\n}\n\nexport function canonicalHash(value: unknown): string {\n\treturn sha256(stableStringify(value));\n}\n\nexport function redactForModel(value: unknown): unknown {\n\tif (typeof value === \"string\") return redactString(value);\n\tif (Array.isArray(value)) return value.map((item) => redactForModel(item));\n\tif (isRecord(value)) {\n\t\tconst out: Record<string, unknown> = {};\n\t\tfor (const [key, child] of Object.entries(value)) {\n\t\t\tout[key] =\n\t\t\t\tclassifyEnvKey(key, typeof child === \"string\" ? child : \"\") === \"public\"\n\t\t\t\t\t? redactForModel(child)\n\t\t\t\t\t: \"[REDACTED]\";\n\t\t}\n\t\treturn out;\n\t}\n\treturn value;\n}\n\nfunction booleanResult(pass: boolean, kind: string, description: string): VerificationResult {\n\treturn {\n\t\tpass,\n\t\tconfidence: pass ? 1 : 0,\n\t\tevidencePointers: pass ? [{ kind, description }] : [],\n\t\tfailures: pass ? [] : [`${kind} postcondition failed: ${description}`],\n\t};\n}\n\nasync function verifyFile(path: string, expectedHash: string | undefined, kind: string): Promise<VerificationResult> {\n\ttry {\n\t\tawait stat(path);\n\t\tconst content = await readFile(path);\n\t\tconst actualHash = createHash(\"sha256\").update(content).digest(\"hex\");\n\t\tconst pass = expectedHash === undefined || expectedHash === actualHash;\n\t\treturn {\n\t\t\tpass,\n\t\t\tconfidence: pass ? 1 : 0,\n\t\t\tevidencePointers: pass ? [{ kind, description: path, sha256: actualHash }] : [],\n\t\t\tfailures: pass ? [] : [`${kind} hash mismatch for ${path}`],\n\t\t};\n\t} catch {\n\t\treturn { pass: false, confidence: 0, evidencePointers: [], failures: [`${kind} missing: ${path}`] };\n\t}\n}\n\nfunction readJsonPath(value: unknown, path: string): unknown {\n\tif (path === \"$\") return value;\n\tif (!path.startsWith(\"$.\")) return undefined;\n\tlet current = value;\n\tfor (const segment of path.slice(2).split(\".\")) {\n\t\tif (!isRecord(current)) return undefined;\n\t\tcurrent = current[segment];\n\t}\n\treturn current;\n}\n\nfunction readReceiptId(value: unknown): string | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst receipt = value.receiptId ?? value.id;\n\treturn typeof receipt === \"string\" ? receipt : undefined;\n}\n\nasync function safeReadJsonOrText(response: BrokerFetchResponse): Promise<unknown> {\n\ttry {\n\t\treturn await response.json();\n\t} catch {\n\t\treturn response.text();\n\t}\n}\n\nfunction deriveIdempotencyKey(action: ApiAction): string {\n\treturn `omk-${canonicalHash({ method: action.method, url: action.url, body: action.body, actionId: action.actionId }).slice(0, 24)}`;\n}\n\nasync function defaultFetcher(url: string, init: BrokerFetchRequest): Promise<BrokerFetchResponse> {\n\tconst response = await fetch(url, init);\n\treturn {\n\t\tstatus: response.status,\n\t\tjson: () => response.json() as Promise<unknown>,\n\t\ttext: () => response.text(),\n\t};\n}\n\nfunction redactString(value: string): string {\n\treturn value\n\t\t.replace(/Bearer\\s+[A-Za-z0-9._~+/=-]{8,}/g, \"Bearer [REDACTED]\")\n\t\t.replace(/([?&]?(?:access_)?token=)[^&\\s]+/gi, \"$1[REDACTED]\")\n\t\t.replace(/((?:api[_-]?key|password|secret)=)[^&\\s]+/gi, \"$1[REDACTED]\");\n}\n\nfunction deepEqual(left: unknown, right: unknown): boolean {\n\treturn stableStringify(left) === stableStringify(right);\n}\n\nfunction stableStringify(value: unknown): string {\n\tif (value === null || typeof value !== \"object\") return JSON.stringify(value);\n\tif (Array.isArray(value)) return `[${value.map((item) => stableStringify(item)).join(\",\")}]`;\n\tconst record = value as Record<string, unknown>;\n\treturn `{${Object.keys(record)\n\t\t.sort()\n\t\t.map((key) => `${JSON.stringify(key)}:${stableStringify(record[key])}`)\n\t\t.join(\",\")}}`;\n}\n\nfunction matchesAny(value: string, patterns: string[]): boolean {\n\treturn patterns.some((pattern) => pattern === \"*\" || globMatch(value, pattern));\n}\n\nfunction globMatch(value: string, pattern: string): boolean {\n\tconst escaped = pattern\n\t\t.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\")\n\t\t.replace(/\\*/g, \".*\")\n\t\t.replace(/\\?/g, \".\");\n\treturn new RegExp(`^${escaped}$`, \"i\").test(value);\n}\n\nfunction sha256(value: string): string {\n\treturn createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nfunction looksLikePaymentCredential(value: string): boolean {\n\treturn /\\b(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13})\\b/.test(value);\n}\n\nfunction looksLikeSessionCookie(value: string): boolean {\n\treturn value.length >= 32 && /[A-Za-z0-9+/=_-]{32,}/.test(value);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n"]}
|
|
@@ -11,6 +11,7 @@ export interface BashExecutorOptions {
|
|
|
11
11
|
onChunk?: (chunk: string) => void;
|
|
12
12
|
/** AbortSignal for cancellation */
|
|
13
13
|
signal?: AbortSignal;
|
|
14
|
+
env?: NodeJS.ProcessEnv;
|
|
14
15
|
}
|
|
15
16
|
export interface BashResult {
|
|
16
17
|
/** Combined stdout + stderr output (sanitized, possibly truncated) */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bash-executor.d.ts","sourceRoot":"","sources":["../../src/core/bash-executor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAOtD,MAAM,WAAW,mBAAmB;IACnC,+DAA+D;IAC/D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,mCAAmC;IACnC,MAAM,CAAC,EAAE,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"bash-executor.d.ts","sourceRoot":"","sources":["../../src/core/bash-executor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAOtD,MAAM,WAAW,mBAAmB;IACnC,+DAA+D;IAC/D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,mCAAmC;IACnC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IAC1B,sEAAsE;IACtE,MAAM,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,mDAAmD;IACnD,SAAS,EAAE,OAAO,CAAC;IACnB,uCAAuC;IACvC,SAAS,EAAE,OAAO,CAAC;IACnB,yFAAyF;IACzF,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAMD;;;GAGG;AACH,wBAAsB,yBAAyB,CAC9C,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,cAAc,EAC1B,OAAO,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,UAAU,CAAC,CAiIrB","sourcesContent":["/**\n * Bash command execution with streaming support and cancellation.\n *\n * This module provides a unified bash execution implementation used by:\n * - AgentSession.executeBash() for interactive and RPC modes\n * - Direct calls from modes that need bash execution\n */\n\nimport { randomBytes } from \"node:crypto\";\nimport { createWriteStream, type WriteStream } from \"node:fs\";\nimport { rm } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { stripAnsi } from \"../utils/ansi.ts\";\nimport { sanitizeBinaryOutput } from \"../utils/shell.ts\";\nimport type { BashOperations } from \"./tools/bash.ts\";\nimport { DEFAULT_MAX_BYTES, truncateTail } from \"./tools/truncate.ts\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface BashExecutorOptions {\n\t/** Callback for streaming output chunks (already sanitized) */\n\tonChunk?: (chunk: string) => void;\n\t/** AbortSignal for cancellation */\n\tsignal?: AbortSignal;\n\tenv?: NodeJS.ProcessEnv;\n}\n\nexport interface BashResult {\n\t/** Combined stdout + stderr output (sanitized, possibly truncated) */\n\toutput: string;\n\t/** Process exit code (undefined if killed/cancelled) */\n\texitCode: number | undefined;\n\t/** Whether the command was cancelled via signal */\n\tcancelled: boolean;\n\t/** Whether the output was truncated */\n\ttruncated: boolean;\n\t/** Path to temp file containing full output (if output exceeded truncation threshold) */\n\tfullOutputPath?: string;\n}\n\n// ============================================================================\n// Implementation\n// ============================================================================\n\n/**\n * Execute a bash command using custom BashOperations.\n * Used for remote execution (SSH, containers, etc.).\n */\nexport async function executeBashWithOperations(\n\tcommand: string,\n\tcwd: string,\n\toperations: BashOperations,\n\toptions?: BashExecutorOptions,\n): Promise<BashResult> {\n\tconst outputChunks: string[] = [];\n\tlet outputBytes = 0;\n\tconst maxOutputBytes = DEFAULT_MAX_BYTES * 2;\n\n\tlet tempFilePath: string | undefined;\n\tlet tempFileStream: WriteStream | undefined;\n\tlet totalBytes = 0;\n\n\tconst ensureTempFile = () => {\n\t\tif (tempFilePath) {\n\t\t\treturn;\n\t\t}\n\t\tconst id = randomBytes(8).toString(\"hex\");\n\t\ttempFilePath = join(tmpdir(), `omk-bash-${id}.log`);\n\t\t// Owner-only permissions: full output can contain secrets (env vars, tokens, etc.).\n\t\ttempFileStream = createWriteStream(tempFilePath, { mode: 0o600 });\n\t\tfor (const chunk of outputChunks) {\n\t\t\ttempFileStream.write(chunk);\n\t\t}\n\t};\n\n\t/** Close and delete the temp file when its path is never surfaced to the caller. */\n\tconst discardTempFile = async () => {\n\t\tif (!tempFilePath) {\n\t\t\treturn;\n\t\t}\n\t\tconst path = tempFilePath;\n\t\tconst stream = tempFileStream;\n\t\ttempFilePath = undefined;\n\t\ttempFileStream = undefined;\n\t\tif (stream) {\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tstream.end(() => resolve());\n\t\t\t});\n\t\t}\n\t\ttry {\n\t\t\tawait rm(path, { force: true });\n\t\t} catch {\n\t\t\t// Best effort: a stale temp file must not fail the command.\n\t\t}\n\t};\n\n\tconst decoder = new TextDecoder();\n\n\tconst onData = (data: Buffer) => {\n\t\ttotalBytes += data.length;\n\n\t\t// Sanitize: strip ANSI, replace binary garbage, normalize newlines\n\t\tconst text = sanitizeBinaryOutput(stripAnsi(decoder.decode(data, { stream: true }))).replace(/\\r/g, \"\");\n\n\t\t// Start writing to temp file if exceeds threshold\n\t\tif (totalBytes > DEFAULT_MAX_BYTES) {\n\t\t\tensureTempFile();\n\t\t}\n\n\t\tif (tempFileStream) {\n\t\t\ttempFileStream.write(text);\n\t\t}\n\n\t\t// Keep rolling buffer\n\t\toutputChunks.push(text);\n\t\toutputBytes += text.length;\n\t\twhile (outputBytes > maxOutputBytes && outputChunks.length > 1) {\n\t\t\tconst removed = outputChunks.shift()!;\n\t\t\toutputBytes -= removed.length;\n\t\t}\n\n\t\t// Stream to callback\n\t\tif (options?.onChunk) {\n\t\t\toptions.onChunk(text);\n\t\t}\n\t};\n\n\ttry {\n\t\tconst result = await operations.exec(command, cwd, {\n\t\t\tonData,\n\t\t\tsignal: options?.signal,\n\t\t\tenv: options?.env,\n\t\t});\n\n\t\tconst fullOutput = outputChunks.join(\"\");\n\t\tconst truncationResult = truncateTail(fullOutput);\n\t\tif (truncationResult.truncated) {\n\t\t\tensureTempFile();\n\t\t} else {\n\t\t\t// fullOutputPath is only surfaced when output is truncated; don't leave the spill file behind.\n\t\t\tawait discardTempFile();\n\t\t}\n\t\tif (tempFileStream) {\n\t\t\ttempFileStream.end();\n\t\t}\n\t\tconst cancelled = options?.signal?.aborted ?? false;\n\n\t\treturn {\n\t\t\toutput: truncationResult.truncated ? truncationResult.content : fullOutput,\n\t\t\texitCode: cancelled ? undefined : (result.exitCode ?? undefined),\n\t\t\tcancelled,\n\t\t\ttruncated: truncationResult.truncated,\n\t\t\tfullOutputPath: tempFilePath,\n\t\t};\n\t} catch (err) {\n\t\t// Check if it was an abort\n\t\tif (options?.signal?.aborted) {\n\t\t\tconst fullOutput = outputChunks.join(\"\");\n\t\t\tconst truncationResult = truncateTail(fullOutput);\n\t\t\tif (truncationResult.truncated) {\n\t\t\t\tensureTempFile();\n\t\t\t} else {\n\t\t\t\t// fullOutputPath is only surfaced when output is truncated; don't leave the spill file behind.\n\t\t\t\tawait discardTempFile();\n\t\t\t}\n\t\t\tif (tempFileStream) {\n\t\t\t\ttempFileStream.end();\n\t\t\t}\n\t\t\treturn {\n\t\t\t\toutput: truncationResult.truncated ? truncationResult.content : fullOutput,\n\t\t\t\texitCode: undefined,\n\t\t\t\tcancelled: true,\n\t\t\t\ttruncated: truncationResult.truncated,\n\t\t\t\tfullOutputPath: tempFilePath,\n\t\t\t};\n\t\t}\n\n\t\t// The path is never reported when the command throws; clean up the spill file.\n\t\tawait discardTempFile();\n\n\t\tthrow err;\n\t}\n}\n"]}
|
|
@@ -88,6 +88,7 @@ export async function executeBashWithOperations(command, cwd, operations, option
|
|
|
88
88
|
const result = await operations.exec(command, cwd, {
|
|
89
89
|
onData,
|
|
90
90
|
signal: options?.signal,
|
|
91
|
+
env: options?.env,
|
|
91
92
|
});
|
|
92
93
|
const fullOutput = outputChunks.join("");
|
|
93
94
|
const truncationResult = truncateTail(fullOutput);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bash-executor.js","sourceRoot":"","sources":["../../src/core/bash-executor.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Bash command execution with streaming support and cancellation.\n *\n * This module provides a unified bash execution implementation used by:\n * - AgentSession.executeBash() for interactive and RPC modes\n * - Direct calls from modes that need bash execution\n */\n\nimport { randomBytes } from \"node:crypto\";\nimport { createWriteStream, type WriteStream } from \"node:fs\";\nimport { rm } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { stripAnsi } from \"../utils/ansi.ts\";\nimport { sanitizeBinaryOutput } from \"../utils/shell.ts\";\nimport type { BashOperations } from \"./tools/bash.ts\";\nimport { DEFAULT_MAX_BYTES, truncateTail } from \"./tools/truncate.ts\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface BashExecutorOptions {\n\t/** Callback for streaming output chunks (already sanitized) */\n\tonChunk?: (chunk: string) => void;\n\t/** AbortSignal for cancellation */\n\tsignal?: AbortSignal;\n}\n\nexport interface BashResult {\n\t/** Combined stdout + stderr output (sanitized, possibly truncated) */\n\toutput: string;\n\t/** Process exit code (undefined if killed/cancelled) */\n\texitCode: number | undefined;\n\t/** Whether the command was cancelled via signal */\n\tcancelled: boolean;\n\t/** Whether the output was truncated */\n\ttruncated: boolean;\n\t/** Path to temp file containing full output (if output exceeded truncation threshold) */\n\tfullOutputPath?: string;\n}\n\n// ============================================================================\n// Implementation\n// ============================================================================\n\n/**\n * Execute a bash command using custom BashOperations.\n * Used for remote execution (SSH, containers, etc.).\n */\nexport async function executeBashWithOperations(\n\tcommand: string,\n\tcwd: string,\n\toperations: BashOperations,\n\toptions?: BashExecutorOptions,\n): Promise<BashResult> {\n\tconst outputChunks: string[] = [];\n\tlet outputBytes = 0;\n\tconst maxOutputBytes = DEFAULT_MAX_BYTES * 2;\n\n\tlet tempFilePath: string | undefined;\n\tlet tempFileStream: WriteStream | undefined;\n\tlet totalBytes = 0;\n\n\tconst ensureTempFile = () => {\n\t\tif (tempFilePath) {\n\t\t\treturn;\n\t\t}\n\t\tconst id = randomBytes(8).toString(\"hex\");\n\t\ttempFilePath = join(tmpdir(), `omk-bash-${id}.log`);\n\t\t// Owner-only permissions: full output can contain secrets (env vars, tokens, etc.).\n\t\ttempFileStream = createWriteStream(tempFilePath, { mode: 0o600 });\n\t\tfor (const chunk of outputChunks) {\n\t\t\ttempFileStream.write(chunk);\n\t\t}\n\t};\n\n\t/** Close and delete the temp file when its path is never surfaced to the caller. */\n\tconst discardTempFile = async () => {\n\t\tif (!tempFilePath) {\n\t\t\treturn;\n\t\t}\n\t\tconst path = tempFilePath;\n\t\tconst stream = tempFileStream;\n\t\ttempFilePath = undefined;\n\t\ttempFileStream = undefined;\n\t\tif (stream) {\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tstream.end(() => resolve());\n\t\t\t});\n\t\t}\n\t\ttry {\n\t\t\tawait rm(path, { force: true });\n\t\t} catch {\n\t\t\t// Best effort: a stale temp file must not fail the command.\n\t\t}\n\t};\n\n\tconst decoder = new TextDecoder();\n\n\tconst onData = (data: Buffer) => {\n\t\ttotalBytes += data.length;\n\n\t\t// Sanitize: strip ANSI, replace binary garbage, normalize newlines\n\t\tconst text = sanitizeBinaryOutput(stripAnsi(decoder.decode(data, { stream: true }))).replace(/\\r/g, \"\");\n\n\t\t// Start writing to temp file if exceeds threshold\n\t\tif (totalBytes > DEFAULT_MAX_BYTES) {\n\t\t\tensureTempFile();\n\t\t}\n\n\t\tif (tempFileStream) {\n\t\t\ttempFileStream.write(text);\n\t\t}\n\n\t\t// Keep rolling buffer\n\t\toutputChunks.push(text);\n\t\toutputBytes += text.length;\n\t\twhile (outputBytes > maxOutputBytes && outputChunks.length > 1) {\n\t\t\tconst removed = outputChunks.shift()!;\n\t\t\toutputBytes -= removed.length;\n\t\t}\n\n\t\t// Stream to callback\n\t\tif (options?.onChunk) {\n\t\t\toptions.onChunk(text);\n\t\t}\n\t};\n\n\ttry {\n\t\tconst result = await operations.exec(command, cwd, {\n\t\t\tonData,\n\t\t\tsignal: options?.signal,\n\t\t});\n\n\t\tconst fullOutput = outputChunks.join(\"\");\n\t\tconst truncationResult = truncateTail(fullOutput);\n\t\tif (truncationResult.truncated) {\n\t\t\tensureTempFile();\n\t\t} else {\n\t\t\t// fullOutputPath is only surfaced when output is truncated; don't leave the spill file behind.\n\t\t\tawait discardTempFile();\n\t\t}\n\t\tif (tempFileStream) {\n\t\t\ttempFileStream.end();\n\t\t}\n\t\tconst cancelled = options?.signal?.aborted ?? false;\n\n\t\treturn {\n\t\t\toutput: truncationResult.truncated ? truncationResult.content : fullOutput,\n\t\t\texitCode: cancelled ? undefined : (result.exitCode ?? undefined),\n\t\t\tcancelled,\n\t\t\ttruncated: truncationResult.truncated,\n\t\t\tfullOutputPath: tempFilePath,\n\t\t};\n\t} catch (err) {\n\t\t// Check if it was an abort\n\t\tif (options?.signal?.aborted) {\n\t\t\tconst fullOutput = outputChunks.join(\"\");\n\t\t\tconst truncationResult = truncateTail(fullOutput);\n\t\t\tif (truncationResult.truncated) {\n\t\t\t\tensureTempFile();\n\t\t\t} else {\n\t\t\t\t// fullOutputPath is only surfaced when output is truncated; don't leave the spill file behind.\n\t\t\t\tawait discardTempFile();\n\t\t\t}\n\t\t\tif (tempFileStream) {\n\t\t\t\ttempFileStream.end();\n\t\t\t}\n\t\t\treturn {\n\t\t\t\toutput: truncationResult.truncated ? truncationResult.content : fullOutput,\n\t\t\t\texitCode: undefined,\n\t\t\t\tcancelled: true,\n\t\t\t\ttruncated: truncationResult.truncated,\n\t\t\t\tfullOutputPath: tempFilePath,\n\t\t\t};\n\t\t}\n\n\t\t// The path is never reported when the command throws; clean up the spill file.\n\t\tawait discardTempFile();\n\n\t\tthrow err;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"bash-executor.js","sourceRoot":"","sources":["../../src/core/bash-executor.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Bash command execution with streaming support and cancellation.\n *\n * This module provides a unified bash execution implementation used by:\n * - AgentSession.executeBash() for interactive and RPC modes\n * - Direct calls from modes that need bash execution\n */\n\nimport { randomBytes } from \"node:crypto\";\nimport { createWriteStream, type WriteStream } from \"node:fs\";\nimport { rm } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { stripAnsi } from \"../utils/ansi.ts\";\nimport { sanitizeBinaryOutput } from \"../utils/shell.ts\";\nimport type { BashOperations } from \"./tools/bash.ts\";\nimport { DEFAULT_MAX_BYTES, truncateTail } from \"./tools/truncate.ts\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface BashExecutorOptions {\n\t/** Callback for streaming output chunks (already sanitized) */\n\tonChunk?: (chunk: string) => void;\n\t/** AbortSignal for cancellation */\n\tsignal?: AbortSignal;\n\tenv?: NodeJS.ProcessEnv;\n}\n\nexport interface BashResult {\n\t/** Combined stdout + stderr output (sanitized, possibly truncated) */\n\toutput: string;\n\t/** Process exit code (undefined if killed/cancelled) */\n\texitCode: number | undefined;\n\t/** Whether the command was cancelled via signal */\n\tcancelled: boolean;\n\t/** Whether the output was truncated */\n\ttruncated: boolean;\n\t/** Path to temp file containing full output (if output exceeded truncation threshold) */\n\tfullOutputPath?: string;\n}\n\n// ============================================================================\n// Implementation\n// ============================================================================\n\n/**\n * Execute a bash command using custom BashOperations.\n * Used for remote execution (SSH, containers, etc.).\n */\nexport async function executeBashWithOperations(\n\tcommand: string,\n\tcwd: string,\n\toperations: BashOperations,\n\toptions?: BashExecutorOptions,\n): Promise<BashResult> {\n\tconst outputChunks: string[] = [];\n\tlet outputBytes = 0;\n\tconst maxOutputBytes = DEFAULT_MAX_BYTES * 2;\n\n\tlet tempFilePath: string | undefined;\n\tlet tempFileStream: WriteStream | undefined;\n\tlet totalBytes = 0;\n\n\tconst ensureTempFile = () => {\n\t\tif (tempFilePath) {\n\t\t\treturn;\n\t\t}\n\t\tconst id = randomBytes(8).toString(\"hex\");\n\t\ttempFilePath = join(tmpdir(), `omk-bash-${id}.log`);\n\t\t// Owner-only permissions: full output can contain secrets (env vars, tokens, etc.).\n\t\ttempFileStream = createWriteStream(tempFilePath, { mode: 0o600 });\n\t\tfor (const chunk of outputChunks) {\n\t\t\ttempFileStream.write(chunk);\n\t\t}\n\t};\n\n\t/** Close and delete the temp file when its path is never surfaced to the caller. */\n\tconst discardTempFile = async () => {\n\t\tif (!tempFilePath) {\n\t\t\treturn;\n\t\t}\n\t\tconst path = tempFilePath;\n\t\tconst stream = tempFileStream;\n\t\ttempFilePath = undefined;\n\t\ttempFileStream = undefined;\n\t\tif (stream) {\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tstream.end(() => resolve());\n\t\t\t});\n\t\t}\n\t\ttry {\n\t\t\tawait rm(path, { force: true });\n\t\t} catch {\n\t\t\t// Best effort: a stale temp file must not fail the command.\n\t\t}\n\t};\n\n\tconst decoder = new TextDecoder();\n\n\tconst onData = (data: Buffer) => {\n\t\ttotalBytes += data.length;\n\n\t\t// Sanitize: strip ANSI, replace binary garbage, normalize newlines\n\t\tconst text = sanitizeBinaryOutput(stripAnsi(decoder.decode(data, { stream: true }))).replace(/\\r/g, \"\");\n\n\t\t// Start writing to temp file if exceeds threshold\n\t\tif (totalBytes > DEFAULT_MAX_BYTES) {\n\t\t\tensureTempFile();\n\t\t}\n\n\t\tif (tempFileStream) {\n\t\t\ttempFileStream.write(text);\n\t\t}\n\n\t\t// Keep rolling buffer\n\t\toutputChunks.push(text);\n\t\toutputBytes += text.length;\n\t\twhile (outputBytes > maxOutputBytes && outputChunks.length > 1) {\n\t\t\tconst removed = outputChunks.shift()!;\n\t\t\toutputBytes -= removed.length;\n\t\t}\n\n\t\t// Stream to callback\n\t\tif (options?.onChunk) {\n\t\t\toptions.onChunk(text);\n\t\t}\n\t};\n\n\ttry {\n\t\tconst result = await operations.exec(command, cwd, {\n\t\t\tonData,\n\t\t\tsignal: options?.signal,\n\t\t\tenv: options?.env,\n\t\t});\n\n\t\tconst fullOutput = outputChunks.join(\"\");\n\t\tconst truncationResult = truncateTail(fullOutput);\n\t\tif (truncationResult.truncated) {\n\t\t\tensureTempFile();\n\t\t} else {\n\t\t\t// fullOutputPath is only surfaced when output is truncated; don't leave the spill file behind.\n\t\t\tawait discardTempFile();\n\t\t}\n\t\tif (tempFileStream) {\n\t\t\ttempFileStream.end();\n\t\t}\n\t\tconst cancelled = options?.signal?.aborted ?? false;\n\n\t\treturn {\n\t\t\toutput: truncationResult.truncated ? truncationResult.content : fullOutput,\n\t\t\texitCode: cancelled ? undefined : (result.exitCode ?? undefined),\n\t\t\tcancelled,\n\t\t\ttruncated: truncationResult.truncated,\n\t\t\tfullOutputPath: tempFilePath,\n\t\t};\n\t} catch (err) {\n\t\t// Check if it was an abort\n\t\tif (options?.signal?.aborted) {\n\t\t\tconst fullOutput = outputChunks.join(\"\");\n\t\t\tconst truncationResult = truncateTail(fullOutput);\n\t\t\tif (truncationResult.truncated) {\n\t\t\t\tensureTempFile();\n\t\t\t} else {\n\t\t\t\t// fullOutputPath is only surfaced when output is truncated; don't leave the spill file behind.\n\t\t\t\tawait discardTempFile();\n\t\t\t}\n\t\t\tif (tempFileStream) {\n\t\t\t\ttempFileStream.end();\n\t\t\t}\n\t\t\treturn {\n\t\t\t\toutput: truncationResult.truncated ? truncationResult.content : fullOutput,\n\t\t\t\texitCode: undefined,\n\t\t\t\tcancelled: true,\n\t\t\t\ttruncated: truncationResult.truncated,\n\t\t\t\tfullOutputPath: tempFilePath,\n\t\t\t};\n\t\t}\n\n\t\t// The path is never reported when the command throws; clean up the spill file.\n\t\tawait discardTempFile();\n\n\t\tthrow err;\n\t}\n}\n"]}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { EventEmitter } from "events";
|
|
2
|
+
import { type Postcondition, type VerificationResult } from "./automation/index.ts";
|
|
3
|
+
export interface BrowserTask {
|
|
4
|
+
url: string;
|
|
5
|
+
task: string;
|
|
6
|
+
sessionId?: string;
|
|
7
|
+
postconditions?: Postcondition[];
|
|
8
|
+
}
|
|
9
|
+
export interface PageState {
|
|
10
|
+
url: string;
|
|
11
|
+
title: string;
|
|
12
|
+
links: string[];
|
|
13
|
+
forms: {
|
|
14
|
+
action: string;
|
|
15
|
+
fields: string[];
|
|
16
|
+
}[];
|
|
17
|
+
text?: string;
|
|
18
|
+
status?: number;
|
|
19
|
+
error?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface BrowserUseResult {
|
|
22
|
+
success: boolean;
|
|
23
|
+
pageState: PageState;
|
|
24
|
+
taskCompletion: number;
|
|
25
|
+
pageQuality: number;
|
|
26
|
+
navEfficiency: number;
|
|
27
|
+
safety: number;
|
|
28
|
+
overallScore: number;
|
|
29
|
+
screenshot?: string;
|
|
30
|
+
verification: VerificationResult;
|
|
31
|
+
repairsAttempted: number;
|
|
32
|
+
}
|
|
33
|
+
export declare class BrowserUseEngine extends EventEmitter {
|
|
34
|
+
navigate(url: string): Promise<PageState>;
|
|
35
|
+
private parseHTML;
|
|
36
|
+
}
|
|
37
|
+
export declare class BrowserUseEvaluator extends EventEmitter {
|
|
38
|
+
evaluate(result: BrowserUseResult): {
|
|
39
|
+
passed: boolean;
|
|
40
|
+
score: number;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export declare class BrowserUseAgent extends EventEmitter {
|
|
44
|
+
private engine;
|
|
45
|
+
private evaluator;
|
|
46
|
+
private sessions;
|
|
47
|
+
private verifier;
|
|
48
|
+
constructor();
|
|
49
|
+
execute(task: BrowserTask): Promise<BrowserUseResult>;
|
|
50
|
+
getSession(sessionId: string): PageState | undefined;
|
|
51
|
+
}
|
|
52
|
+
export default BrowserUseAgent;
|
|
53
|
+
//# sourceMappingURL=browser-use.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-use.d.ts","sourceRoot":"","sources":["../../src/core/browser-use.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,KAAK,aAAa,EAAyB,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3G,MAAM,WAAW,WAAW;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,SAAS;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,EAAE,CAAC;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,SAAS,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,kBAAkB,CAAC;IACjC,gBAAgB,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,gBAAiB,SAAQ,YAAY;IAC3C,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAqB9C;IAED,OAAO,CAAC,SAAS;CAyBjB;AAED,qBAAa,mBAAoB,SAAQ,YAAY;IACpD,QAAQ,CAAC,MAAM,EAAE,gBAAgB,GAAG;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAGrE;CACD;AAED,qBAAa,eAAgB,SAAQ,YAAY;IAChD,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,QAAQ,CAAwB;IAExC,cAKC;IAEK,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAuC1D;IAED,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAEnD;CACD;AAED,eAAe,eAAe,CAAC","sourcesContent":["import { EventEmitter } from \"events\";\nimport { type Postcondition, PostconditionVerifier, type VerificationResult } from \"./automation/index.ts\";\n\nexport interface BrowserTask {\n\turl: string;\n\ttask: string;\n\tsessionId?: string;\n\tpostconditions?: Postcondition[];\n}\n\nexport interface PageState {\n\turl: string;\n\ttitle: string;\n\tlinks: string[];\n\tforms: { action: string; fields: string[] }[];\n\ttext?: string;\n\tstatus?: number;\n\terror?: string;\n}\n\nexport interface BrowserUseResult {\n\tsuccess: boolean;\n\tpageState: PageState;\n\ttaskCompletion: number;\n\tpageQuality: number;\n\tnavEfficiency: number;\n\tsafety: number;\n\toverallScore: number;\n\tscreenshot?: string;\n\tverification: VerificationResult;\n\trepairsAttempted: number;\n}\n\nexport class BrowserUseEngine extends EventEmitter {\n\tasync navigate(url: string): Promise<PageState> {\n\t\ttry {\n\t\t\tconst controller = new AbortController();\n\t\t\tconst timeout = setTimeout(() => controller.abort(), 10000);\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(url, { signal: controller.signal });\n\t\t\t\tconst html = await response.text();\n\t\t\t\treturn this.parseHTML(html, response.url || url, response.status);\n\t\t\t} finally {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\turl,\n\t\t\t\ttitle: \"Error\",\n\t\t\t\tlinks: [],\n\t\t\t\tforms: [],\n\t\t\t\ttext: \"\",\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t};\n\t\t}\n\t}\n\n\tprivate parseHTML(html: string, url: string, status: number): PageState {\n\t\tconst titleMatch = html.match(/<title>([^<]*)<\\/title>/i);\n\t\tconst links = [...html.matchAll(/href=\"([^\"]+)\"/gi)]\n\t\t\t.map((match) => match[1])\n\t\t\t.filter((link) => link.startsWith(\"http\"));\n\t\tconst forms = [...html.matchAll(/<form[^>]*action=\"([^\"]*)\"[^>]*>([\\s\\S]*?)<\\/form>/gi)].map((match) => ({\n\t\t\taction: match[1] || url,\n\t\t\tfields: [...match[2].matchAll(/name=\"([^\"]*)\"/gi)].map((field) => field[1]),\n\t\t}));\n\t\tconst text = html\n\t\t\t.replace(/<script[\\s\\S]*?<\\/script>/gi, \"\")\n\t\t\t.replace(/<style[\\s\\S]*?<\\/style>/gi, \"\")\n\t\t\t.replace(/<[^>]+>/g, \" \")\n\t\t\t.replace(/\\s+/g, \" \")\n\t\t\t.trim();\n\n\t\treturn {\n\t\t\turl,\n\t\t\ttitle: titleMatch?.[1] || \"No Title\",\n\t\t\tlinks: [...new Set(links)].slice(0, 20),\n\t\t\tforms,\n\t\t\ttext,\n\t\t\tstatus,\n\t\t};\n\t}\n}\n\nexport class BrowserUseEvaluator extends EventEmitter {\n\tevaluate(result: BrowserUseResult): { passed: boolean; score: number } {\n\t\tconst passed = result.overallScore >= 0.6 && result.safety >= 0.5 && result.verification.pass;\n\t\treturn { passed, score: result.overallScore };\n\t}\n}\n\nexport class BrowserUseAgent extends EventEmitter {\n\tprivate engine: BrowserUseEngine;\n\tprivate evaluator: BrowserUseEvaluator;\n\tprivate sessions: Map<string, PageState> = new Map();\n\tprivate verifier: PostconditionVerifier;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.engine = new BrowserUseEngine();\n\t\tthis.evaluator = new BrowserUseEvaluator();\n\t\tthis.verifier = new PostconditionVerifier();\n\t}\n\n\tasync execute(task: BrowserTask): Promise<BrowserUseResult> {\n\t\tconst pageState = await this.engine.navigate(task.url);\n\t\tthis.sessions.set(task.sessionId || \"default\", pageState);\n\t\tconst verification = await this.verifier.verify(task.postconditions ?? [{ kind: \"text\", pattern: \"\\\\S\" }], {\n\t\t\tcurrentUrl: pageState.url,\n\t\t\ttext: pageState.text ?? \"\",\n\t\t\tapiStatus: pageState.status,\n\t\t});\n\t\tconst observed = pageState.error === undefined && (pageState.status === undefined || pageState.status < 500);\n\t\tconst taskCompletion = verification.pass ? 1 : observed ? 0.4 : 0;\n\t\tconst pageQuality = observed\n\t\t\t? Math.min(\n\t\t\t\t\t1,\n\t\t\t\t\t(pageState.links.length > 0 ? 0.25 : 0) +\n\t\t\t\t\t\t(pageState.forms.length > 0 ? 0.25 : 0) +\n\t\t\t\t\t\t(pageState.text ? 0.5 : 0),\n\t\t\t\t)\n\t\t\t: 0;\n\t\tconst navEfficiency = observed ? 0.9 : 0;\n\t\tconst safety = verification.failures.length === 0 ? 1 : 0.7;\n\t\tconst overallScore = Number(\n\t\t\t(taskCompletion * 0.45 + pageQuality * 0.2 + navEfficiency * 0.2 + safety * 0.15).toFixed(2),\n\t\t);\n\t\tconst result: BrowserUseResult = {\n\t\t\tsuccess: observed && verification.pass,\n\t\t\tpageState,\n\t\t\ttaskCompletion,\n\t\t\tpageQuality,\n\t\t\tnavEfficiency,\n\t\t\tsafety,\n\t\t\toverallScore,\n\t\t\tverification,\n\t\t\trepairsAttempted: verification.pass ? 0 : 1,\n\t\t};\n\n\t\tconst evaluation = this.evaluator.evaluate(result);\n\t\tthis.emit(\"taskComplete\", { task, result, evaluation });\n\n\t\treturn result;\n\t}\n\n\tgetSession(sessionId: string): PageState | undefined {\n\t\treturn this.sessions.get(sessionId);\n\t}\n}\n\nexport default BrowserUseAgent;\n"]}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { EventEmitter } from "events";
|
|
2
|
+
import { PostconditionVerifier } from "./automation/index.js";
|
|
3
|
+
export class BrowserUseEngine extends EventEmitter {
|
|
4
|
+
async navigate(url) {
|
|
5
|
+
try {
|
|
6
|
+
const controller = new AbortController();
|
|
7
|
+
const timeout = setTimeout(() => controller.abort(), 10000);
|
|
8
|
+
try {
|
|
9
|
+
const response = await fetch(url, { signal: controller.signal });
|
|
10
|
+
const html = await response.text();
|
|
11
|
+
return this.parseHTML(html, response.url || url, response.status);
|
|
12
|
+
}
|
|
13
|
+
finally {
|
|
14
|
+
clearTimeout(timeout);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
return {
|
|
19
|
+
url,
|
|
20
|
+
title: "Error",
|
|
21
|
+
links: [],
|
|
22
|
+
forms: [],
|
|
23
|
+
text: "",
|
|
24
|
+
error: error instanceof Error ? error.message : String(error),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
parseHTML(html, url, status) {
|
|
29
|
+
const titleMatch = html.match(/<title>([^<]*)<\/title>/i);
|
|
30
|
+
const links = [...html.matchAll(/href="([^"]+)"/gi)]
|
|
31
|
+
.map((match) => match[1])
|
|
32
|
+
.filter((link) => link.startsWith("http"));
|
|
33
|
+
const forms = [...html.matchAll(/<form[^>]*action="([^"]*)"[^>]*>([\s\S]*?)<\/form>/gi)].map((match) => ({
|
|
34
|
+
action: match[1] || url,
|
|
35
|
+
fields: [...match[2].matchAll(/name="([^"]*)"/gi)].map((field) => field[1]),
|
|
36
|
+
}));
|
|
37
|
+
const text = html
|
|
38
|
+
.replace(/<script[\s\S]*?<\/script>/gi, "")
|
|
39
|
+
.replace(/<style[\s\S]*?<\/style>/gi, "")
|
|
40
|
+
.replace(/<[^>]+>/g, " ")
|
|
41
|
+
.replace(/\s+/g, " ")
|
|
42
|
+
.trim();
|
|
43
|
+
return {
|
|
44
|
+
url,
|
|
45
|
+
title: titleMatch?.[1] || "No Title",
|
|
46
|
+
links: [...new Set(links)].slice(0, 20),
|
|
47
|
+
forms,
|
|
48
|
+
text,
|
|
49
|
+
status,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export class BrowserUseEvaluator extends EventEmitter {
|
|
54
|
+
evaluate(result) {
|
|
55
|
+
const passed = result.overallScore >= 0.6 && result.safety >= 0.5 && result.verification.pass;
|
|
56
|
+
return { passed, score: result.overallScore };
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export class BrowserUseAgent extends EventEmitter {
|
|
60
|
+
engine;
|
|
61
|
+
evaluator;
|
|
62
|
+
sessions = new Map();
|
|
63
|
+
verifier;
|
|
64
|
+
constructor() {
|
|
65
|
+
super();
|
|
66
|
+
this.engine = new BrowserUseEngine();
|
|
67
|
+
this.evaluator = new BrowserUseEvaluator();
|
|
68
|
+
this.verifier = new PostconditionVerifier();
|
|
69
|
+
}
|
|
70
|
+
async execute(task) {
|
|
71
|
+
const pageState = await this.engine.navigate(task.url);
|
|
72
|
+
this.sessions.set(task.sessionId || "default", pageState);
|
|
73
|
+
const verification = await this.verifier.verify(task.postconditions ?? [{ kind: "text", pattern: "\\S" }], {
|
|
74
|
+
currentUrl: pageState.url,
|
|
75
|
+
text: pageState.text ?? "",
|
|
76
|
+
apiStatus: pageState.status,
|
|
77
|
+
});
|
|
78
|
+
const observed = pageState.error === undefined && (pageState.status === undefined || pageState.status < 500);
|
|
79
|
+
const taskCompletion = verification.pass ? 1 : observed ? 0.4 : 0;
|
|
80
|
+
const pageQuality = observed
|
|
81
|
+
? Math.min(1, (pageState.links.length > 0 ? 0.25 : 0) +
|
|
82
|
+
(pageState.forms.length > 0 ? 0.25 : 0) +
|
|
83
|
+
(pageState.text ? 0.5 : 0))
|
|
84
|
+
: 0;
|
|
85
|
+
const navEfficiency = observed ? 0.9 : 0;
|
|
86
|
+
const safety = verification.failures.length === 0 ? 1 : 0.7;
|
|
87
|
+
const overallScore = Number((taskCompletion * 0.45 + pageQuality * 0.2 + navEfficiency * 0.2 + safety * 0.15).toFixed(2));
|
|
88
|
+
const result = {
|
|
89
|
+
success: observed && verification.pass,
|
|
90
|
+
pageState,
|
|
91
|
+
taskCompletion,
|
|
92
|
+
pageQuality,
|
|
93
|
+
navEfficiency,
|
|
94
|
+
safety,
|
|
95
|
+
overallScore,
|
|
96
|
+
verification,
|
|
97
|
+
repairsAttempted: verification.pass ? 0 : 1,
|
|
98
|
+
};
|
|
99
|
+
const evaluation = this.evaluator.evaluate(result);
|
|
100
|
+
this.emit("taskComplete", { task, result, evaluation });
|
|
101
|
+
return result;
|
|
102
|
+
}
|
|
103
|
+
getSession(sessionId) {
|
|
104
|
+
return this.sessions.get(sessionId);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
export default BrowserUseAgent;
|
|
108
|
+
//# sourceMappingURL=browser-use.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-use.js","sourceRoot":"","sources":["../../src/core/browser-use.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventEmitter } from \"events\";\nimport { type Postcondition, PostconditionVerifier, type VerificationResult } from \"./automation/index.ts\";\n\nexport interface BrowserTask {\n\turl: string;\n\ttask: string;\n\tsessionId?: string;\n\tpostconditions?: Postcondition[];\n}\n\nexport interface PageState {\n\turl: string;\n\ttitle: string;\n\tlinks: string[];\n\tforms: { action: string; fields: string[] }[];\n\ttext?: string;\n\tstatus?: number;\n\terror?: string;\n}\n\nexport interface BrowserUseResult {\n\tsuccess: boolean;\n\tpageState: PageState;\n\ttaskCompletion: number;\n\tpageQuality: number;\n\tnavEfficiency: number;\n\tsafety: number;\n\toverallScore: number;\n\tscreenshot?: string;\n\tverification: VerificationResult;\n\trepairsAttempted: number;\n}\n\nexport class BrowserUseEngine extends EventEmitter {\n\tasync navigate(url: string): Promise<PageState> {\n\t\ttry {\n\t\t\tconst controller = new AbortController();\n\t\t\tconst timeout = setTimeout(() => controller.abort(), 10000);\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(url, { signal: controller.signal });\n\t\t\t\tconst html = await response.text();\n\t\t\t\treturn this.parseHTML(html, response.url || url, response.status);\n\t\t\t} finally {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\turl,\n\t\t\t\ttitle: \"Error\",\n\t\t\t\tlinks: [],\n\t\t\t\tforms: [],\n\t\t\t\ttext: \"\",\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t};\n\t\t}\n\t}\n\n\tprivate parseHTML(html: string, url: string, status: number): PageState {\n\t\tconst titleMatch = html.match(/<title>([^<]*)<\\/title>/i);\n\t\tconst links = [...html.matchAll(/href=\"([^\"]+)\"/gi)]\n\t\t\t.map((match) => match[1])\n\t\t\t.filter((link) => link.startsWith(\"http\"));\n\t\tconst forms = [...html.matchAll(/<form[^>]*action=\"([^\"]*)\"[^>]*>([\\s\\S]*?)<\\/form>/gi)].map((match) => ({\n\t\t\taction: match[1] || url,\n\t\t\tfields: [...match[2].matchAll(/name=\"([^\"]*)\"/gi)].map((field) => field[1]),\n\t\t}));\n\t\tconst text = html\n\t\t\t.replace(/<script[\\s\\S]*?<\\/script>/gi, \"\")\n\t\t\t.replace(/<style[\\s\\S]*?<\\/style>/gi, \"\")\n\t\t\t.replace(/<[^>]+>/g, \" \")\n\t\t\t.replace(/\\s+/g, \" \")\n\t\t\t.trim();\n\n\t\treturn {\n\t\t\turl,\n\t\t\ttitle: titleMatch?.[1] || \"No Title\",\n\t\t\tlinks: [...new Set(links)].slice(0, 20),\n\t\t\tforms,\n\t\t\ttext,\n\t\t\tstatus,\n\t\t};\n\t}\n}\n\nexport class BrowserUseEvaluator extends EventEmitter {\n\tevaluate(result: BrowserUseResult): { passed: boolean; score: number } {\n\t\tconst passed = result.overallScore >= 0.6 && result.safety >= 0.5 && result.verification.pass;\n\t\treturn { passed, score: result.overallScore };\n\t}\n}\n\nexport class BrowserUseAgent extends EventEmitter {\n\tprivate engine: BrowserUseEngine;\n\tprivate evaluator: BrowserUseEvaluator;\n\tprivate sessions: Map<string, PageState> = new Map();\n\tprivate verifier: PostconditionVerifier;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.engine = new BrowserUseEngine();\n\t\tthis.evaluator = new BrowserUseEvaluator();\n\t\tthis.verifier = new PostconditionVerifier();\n\t}\n\n\tasync execute(task: BrowserTask): Promise<BrowserUseResult> {\n\t\tconst pageState = await this.engine.navigate(task.url);\n\t\tthis.sessions.set(task.sessionId || \"default\", pageState);\n\t\tconst verification = await this.verifier.verify(task.postconditions ?? [{ kind: \"text\", pattern: \"\\\\S\" }], {\n\t\t\tcurrentUrl: pageState.url,\n\t\t\ttext: pageState.text ?? \"\",\n\t\t\tapiStatus: pageState.status,\n\t\t});\n\t\tconst observed = pageState.error === undefined && (pageState.status === undefined || pageState.status < 500);\n\t\tconst taskCompletion = verification.pass ? 1 : observed ? 0.4 : 0;\n\t\tconst pageQuality = observed\n\t\t\t? Math.min(\n\t\t\t\t\t1,\n\t\t\t\t\t(pageState.links.length > 0 ? 0.25 : 0) +\n\t\t\t\t\t\t(pageState.forms.length > 0 ? 0.25 : 0) +\n\t\t\t\t\t\t(pageState.text ? 0.5 : 0),\n\t\t\t\t)\n\t\t\t: 0;\n\t\tconst navEfficiency = observed ? 0.9 : 0;\n\t\tconst safety = verification.failures.length === 0 ? 1 : 0.7;\n\t\tconst overallScore = Number(\n\t\t\t(taskCompletion * 0.45 + pageQuality * 0.2 + navEfficiency * 0.2 + safety * 0.15).toFixed(2),\n\t\t);\n\t\tconst result: BrowserUseResult = {\n\t\t\tsuccess: observed && verification.pass,\n\t\t\tpageState,\n\t\t\ttaskCompletion,\n\t\t\tpageQuality,\n\t\t\tnavEfficiency,\n\t\t\tsafety,\n\t\t\toverallScore,\n\t\t\tverification,\n\t\t\trepairsAttempted: verification.pass ? 0 : 1,\n\t\t};\n\n\t\tconst evaluation = this.evaluator.evaluate(result);\n\t\tthis.emit(\"taskComplete\", { task, result, evaluation });\n\n\t\treturn result;\n\t}\n\n\tgetSession(sessionId: string): PageState | undefined {\n\t\treturn this.sessions.get(sessionId);\n\t}\n}\n\nexport default BrowserUseAgent;\n"]}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
export interface ShellSegment {
|
|
2
|
+
/** Raw top-level command text (split on `;`, `&&`, `||`, `&`, newline). */
|
|
3
|
+
readonly text: string;
|
|
4
|
+
/** Coarse quote-aware tokens for this segment. */
|
|
5
|
+
readonly tokens: readonly string[];
|
|
6
|
+
}
|
|
7
|
+
export interface SubcommandNode {
|
|
8
|
+
readonly kind: "dollar_paren" | "backtick";
|
|
9
|
+
readonly inner: string;
|
|
10
|
+
readonly depth: number;
|
|
11
|
+
}
|
|
12
|
+
export interface SubshellNode {
|
|
13
|
+
readonly inner: string;
|
|
14
|
+
readonly depth: number;
|
|
15
|
+
}
|
|
16
|
+
export interface ProcessSubNode {
|
|
17
|
+
readonly direction: "in" | "out";
|
|
18
|
+
readonly inner: string;
|
|
19
|
+
readonly depth: number;
|
|
20
|
+
}
|
|
21
|
+
export interface EnvAssignment {
|
|
22
|
+
readonly name: string;
|
|
23
|
+
/** Raw value text exactly as written (may itself contain expansions). */
|
|
24
|
+
readonly value: string;
|
|
25
|
+
readonly position: "prefix" | "export" | "env" | "inline";
|
|
26
|
+
readonly loaderInjection: boolean;
|
|
27
|
+
readonly sensitiveName: boolean;
|
|
28
|
+
}
|
|
29
|
+
export interface ExpansionNode {
|
|
30
|
+
readonly kind: "var" | "brace";
|
|
31
|
+
readonly name: string;
|
|
32
|
+
readonly depth: number;
|
|
33
|
+
}
|
|
34
|
+
export interface DecoderPipeline {
|
|
35
|
+
readonly stages: readonly string[];
|
|
36
|
+
readonly decoderIndex: number;
|
|
37
|
+
readonly executorIndex: number;
|
|
38
|
+
readonly executor: string;
|
|
39
|
+
}
|
|
40
|
+
export interface ParseDiagnostic {
|
|
41
|
+
readonly code: string;
|
|
42
|
+
readonly message: string;
|
|
43
|
+
readonly fatal: boolean;
|
|
44
|
+
}
|
|
45
|
+
export interface ShellAnalysis {
|
|
46
|
+
readonly raw: string;
|
|
47
|
+
readonly segments: readonly ShellSegment[];
|
|
48
|
+
readonly subcommands: readonly SubcommandNode[];
|
|
49
|
+
readonly subshells: readonly SubshellNode[];
|
|
50
|
+
readonly processSubstitutions: readonly ProcessSubNode[];
|
|
51
|
+
readonly assignments: readonly EnvAssignment[];
|
|
52
|
+
readonly dynamicExpansions: readonly ExpansionNode[];
|
|
53
|
+
readonly decoderPipelines: readonly DecoderPipeline[];
|
|
54
|
+
readonly wrapperDepth: number;
|
|
55
|
+
readonly diagnostics: readonly ParseDiagnostic[];
|
|
56
|
+
}
|
|
57
|
+
export type CommandAction = "allow" | "confirm" | "block" | "escalate";
|
|
58
|
+
export interface RiskReason {
|
|
59
|
+
readonly code: string;
|
|
60
|
+
readonly message: string;
|
|
61
|
+
}
|
|
62
|
+
export interface CommandRiskV2Verdict {
|
|
63
|
+
readonly action: CommandAction;
|
|
64
|
+
readonly reasons: readonly RiskReason[];
|
|
65
|
+
/** Effective command strings after unwrapping dynamic structures. */
|
|
66
|
+
readonly normalizedCommands: readonly string[];
|
|
67
|
+
readonly analysis: ShellAnalysis;
|
|
68
|
+
}
|
|
69
|
+
/** Public: analyze a shell command into structural metadata. */
|
|
70
|
+
export declare function analyzeShellCommandV2(command: string): ShellAnalysis;
|
|
71
|
+
/**
|
|
72
|
+
* Public: classify a shell command into allow / confirm / block / escalate,
|
|
73
|
+
* composing the existing `classifyShellCommand` verdict with V2 structural
|
|
74
|
+
* detections. The result never lowers the existing risk tier.
|
|
75
|
+
*/
|
|
76
|
+
export declare function classifyCommandRiskV2(command: string): CommandRiskV2Verdict;
|
|
77
|
+
//# sourceMappingURL=command-safety-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-safety-parser.d.ts","sourceRoot":"","sources":["../../src/core/command-safety-parser.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Lane SA3 - Command Safety Parser V2.\n *\n * Pure, side-effect-free shell command analysis layered on top of the existing\n * `classifyShellCommand` engine. It adds quoting-aware detection of:\n * - command substitution: `$(...)` and backticks\n * - subshell grouping: `(...)`\n * - process substitution: `<(...)` and `>(...)`\n * - environment assignment injection: `VAR=... cmd`, `export VAR=...`, `env VAR=...`\n * - dynamic expansions: `$VAR`, `${VAR}`\n * - decoder pipelines: `base64 -d` / `xxd -r` / `openssl enc -d` feeding a shell\n * - wrapper nesting depth and parser diagnostics (fail-closed)\n *\n * It does NOT execute, decode, or normalize away the original command. The\n * classifier composes the existing verdict with V2 detections and never lowers\n * the existing risk tier.\n */\nimport { classifyShellCommand } from \"./command-safety.ts\";\n\n/** Maximum structural recursion depth ($() inside $(...) inside ...). */\nconst MAX_SCAN_DEPTH = 6;\n\n/** Executables that decode and/or execute an encoded payload. */\nconst DECODER_EXECUTABLES = new Set<string>([\n\t\"sh\",\n\t\"bash\",\n\t\"zsh\",\n\t\"dash\",\n\t\"ksh\",\n\t\"ash\",\n\t\"eval\",\n\t\"source\",\n\t\".\",\n\t\"python\",\n\t\"python2\",\n\t\"python3\",\n\t\"node\",\n\t\"perl\",\n\t\"ruby\",\n\t\"php\",\n\t\"lua\",\n\t\"expect\",\n\t\"env\",\n\t\"xargs\",\n]);\n\n/**\n * Environment variable names that inject code or redirect runtime loader\n * behavior. Assigning any of these on a command line is treated as a loader /\n * runtime injection attempt.\n */\nconst LOADER_INJECTION_ENV = new Set<string>([\n\t\"LD_PRELOAD\",\n\t\"LD_LIBRARY_PATH\",\n\t\"LD_AUDIT\",\n\t\"LD_BIND_NOW\",\n\t\"LD_PROFILE\",\n\t\"DYLD_INSERT_LIBRARIES\",\n\t\"DYLD_LIBRARY_PATH\",\n\t\"DYLD_FALLBACK_LIBRARY_PATH\",\n\t\"NODE_OPTIONS\",\n\t\"NODE_PATH\",\n\t\"NODE_REPL_EXTERNAL_MODULE\",\n\t\"NODE_EXTRA_CA_CERTS\",\n\t\"NODE_TLS_REJECT_UNAUTHORIZED\",\n\t\"PYTHONPATH\",\n\t\"PYTHONHOME\",\n\t\"PYTHONSTARTUP\",\n\t\"PYTHONINSPECT\",\n\t\"PERL5LIB\",\n\t\"PERLLIB\",\n\t\"PERL5OPT\",\n\t\"RUBYLIB\",\n\t\"RUBYOPT\",\n\t\"RUBYPATH\",\n\t\"JAVA_TOOL_OPTIONS\",\n\t\"_JAVA_OPTIONS\",\n\t\"JDK_JAVA_OPTIONS\",\n\t\"MAVEN_OPTS\",\n]);\n\n/** Exact sensitive variable names (do not end in a standard suffix). */\nconst SENSITIVE_NAME_EXACT = new Set<string>([\n\t\"AWS_ACCESS_KEY_ID\",\n\t\"AWS_SECRET_ACCESS_KEY\",\n\t\"AWS_SESSION_TOKEN\",\n\t\"GITHUB_TOKEN\",\n\t\"GH_TOKEN\",\n\t\"GITLAB_TOKEN\",\n\t\"NPM_TOKEN\",\n\t\"NODE_AUTH_TOKEN\",\n]);\n\n/** Sensitive variable name suffixes. */\nconst SENSITIVE_NAME_REGEX =\n\t/(^|_)(API_KEY|API_TOKEN|ACCESS_TOKEN|SECRET|SECRET_KEY|PRIVATE_KEY|PASSWORD|PASSWD|TOKEN)$/i;\n\n/**\n * Commands whose arguments become filesystem or history targets. An\n * unresolved `$VAR` expansion in their argument position is treated as a\n * dynamic target (could expand to /, ~, or a sensitive path).\n */\nconst RISKY_EXPANSION_EXEC = new Set<string>([\n\t\"rm\",\n\t\"dd\",\n\t\"mkfs\",\n\t\"find\",\n\t\"git\",\n\t\"chmod\",\n\t\"chown\",\n\t\"cp\",\n\t\"mv\",\n\t\"install\",\n\t\"rsync\",\n\t\"scp\",\n]);\n\nexport interface ShellSegment {\n\t/** Raw top-level command text (split on `;`, `&&`, `||`, `&`, newline). */\n\treadonly text: string;\n\t/** Coarse quote-aware tokens for this segment. */\n\treadonly tokens: readonly string[];\n}\n\nexport interface SubcommandNode {\n\treadonly kind: \"dollar_paren\" | \"backtick\";\n\treadonly inner: string;\n\treadonly depth: number;\n}\n\nexport interface SubshellNode {\n\treadonly inner: string;\n\treadonly depth: number;\n}\n\nexport interface ProcessSubNode {\n\treadonly direction: \"in\" | \"out\";\n\treadonly inner: string;\n\treadonly depth: number;\n}\n\nexport interface EnvAssignment {\n\treadonly name: string;\n\t/** Raw value text exactly as written (may itself contain expansions). */\n\treadonly value: string;\n\treadonly position: \"prefix\" | \"export\" | \"env\" | \"inline\";\n\treadonly loaderInjection: boolean;\n\treadonly sensitiveName: boolean;\n}\n\nexport interface ExpansionNode {\n\treadonly kind: \"var\" | \"brace\";\n\treadonly name: string;\n\treadonly depth: number;\n}\n\nexport interface DecoderPipeline {\n\treadonly stages: readonly string[];\n\treadonly decoderIndex: number;\n\treadonly executorIndex: number;\n\treadonly executor: string;\n}\n\nexport interface ParseDiagnostic {\n\treadonly code: string;\n\treadonly message: string;\n\treadonly fatal: boolean;\n}\n\nexport interface ShellAnalysis {\n\treadonly raw: string;\n\treadonly segments: readonly ShellSegment[];\n\treadonly subcommands: readonly SubcommandNode[];\n\treadonly subshells: readonly SubshellNode[];\n\treadonly processSubstitutions: readonly ProcessSubNode[];\n\treadonly assignments: readonly EnvAssignment[];\n\treadonly dynamicExpansions: readonly ExpansionNode[];\n\treadonly decoderPipelines: readonly DecoderPipeline[];\n\treadonly wrapperDepth: number;\n\treadonly diagnostics: readonly ParseDiagnostic[];\n}\n\nexport type CommandAction = \"allow\" | \"confirm\" | \"block\" | \"escalate\";\n\nexport interface RiskReason {\n\treadonly code: string;\n\treadonly message: string;\n}\n\nexport interface CommandRiskV2Verdict {\n\treadonly action: CommandAction;\n\treadonly reasons: readonly RiskReason[];\n\t/** Effective command strings after unwrapping dynamic structures. */\n\treadonly normalizedCommands: readonly string[];\n\treadonly analysis: ShellAnalysis;\n}\n\nconst ACTION_RANK: Readonly<Record<CommandAction, number>> = {\n\tallow: 0,\n\tconfirm: 1,\n\tescalate: 2,\n\tblock: 3,\n};\n\nfunction isWhitespace(ch: string): boolean {\n\treturn ch === \" \" || ch === \"\\t\" || ch === \"\\n\" || ch === \"\\r\" || ch === \"\\f\" || ch === \"\\v\";\n}\n\nfunction isSensitiveEnvName(name: string): boolean {\n\tif (SENSITIVE_NAME_EXACT.has(name)) return true;\n\treturn SENSITIVE_NAME_REGEX.test(name);\n}\n\n/** Split a command into top-level command segments on `;`, `&&`, `||`, `&`, newline. */\nfunction splitTopLevelCommands(command: string): string[] {\n\tconst segments: string[] = [];\n\tlet buf = \"\";\n\tlet quote: string | undefined;\n\tlet escaped = false;\n\tconst flush = (): void => {\n\t\tconst trimmed = buf.trim();\n\t\tif (trimmed) segments.push(trimmed);\n\t\tbuf = \"\";\n\t};\n\tfor (let i = 0; i < command.length; i += 1) {\n\t\tconst ch = command[i];\n\t\tconst next = command[i + 1];\n\t\tif (escaped) {\n\t\t\tbuf += ch;\n\t\t\tescaped = false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === \"\\\\\" && quote !== \"'\") {\n\t\t\tescaped = true;\n\t\t\tbuf += ch;\n\t\t\tcontinue;\n\t\t}\n\t\tif (quote) {\n\t\t\tbuf += ch;\n\t\t\tif (ch === quote) quote = undefined;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === \"'\" || ch === '\"') {\n\t\t\tquote = ch;\n\t\t\tbuf += ch;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === \";\") {\n\t\t\tflush();\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === \"&\") {\n\t\t\tflush();\n\t\t\tif (next === \"&\") i += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === \"|\") {\n\t\t\tif (next === \"|\") {\n\t\t\t\tflush();\n\t\t\t\ti += 1;\n\t\t\t} else {\n\t\t\t\t// single pipe stays within the segment (decoder pipeline detection)\n\t\t\t\tbuf += ch;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === \"\\n\" || ch === \"\\r\") {\n\t\t\tflush();\n\t\t\tcontinue;\n\t\t}\n\t\tbuf += ch;\n\t}\n\tflush();\n\treturn segments;\n}\n\n/** Coarse quote-aware tokenizer for one segment. */\nfunction tokenize(segment: string): string[] {\n\tconst tokens: string[] = [];\n\tlet cur = \"\";\n\tlet quote: string | undefined;\n\tlet escaped = false;\n\tfor (const ch of segment) {\n\t\tif (escaped) {\n\t\t\tcur += ch;\n\t\t\tescaped = false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === \"\\\\\" && quote !== \"'\") {\n\t\t\tescaped = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (quote) {\n\t\t\tif (ch === quote) {\n\t\t\t\tquote = undefined;\n\t\t\t} else {\n\t\t\t\tcur += ch;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === \"'\" || ch === '\"') {\n\t\t\tquote = ch;\n\t\t\tcontinue;\n\t\t}\n\t\tif (isWhitespace(ch)) {\n\t\t\tif (cur) {\n\t\t\t\ttokens.push(cur);\n\t\t\t\tcur = \"\";\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tcur += ch;\n\t}\n\tif (cur) tokens.push(cur);\n\treturn tokens;\n}\n\n/** Split a segment on single `|` (pipe stages), quote-aware. `||` is gone already. */\nfunction splitPipeStages(segment: string): string[] {\n\tconst stages: string[] = [];\n\tlet buf = \"\";\n\tlet quote: string | undefined;\n\tlet escaped = false;\n\tconst flush = (): void => {\n\t\tconst trimmed = buf.trim();\n\t\tif (trimmed) stages.push(trimmed);\n\t\tbuf = \"\";\n\t};\n\tfor (let i = 0; i < segment.length; i += 1) {\n\t\tconst ch = segment[i];\n\t\tif (escaped) {\n\t\t\tbuf += ch;\n\t\t\tescaped = false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === \"\\\\\" && quote !== \"'\") {\n\t\t\tescaped = true;\n\t\t\tbuf += ch;\n\t\t\tcontinue;\n\t\t}\n\t\tif (quote) {\n\t\t\tbuf += ch;\n\t\t\tif (ch === quote) quote = undefined;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === \"'\" || ch === '\"') {\n\t\t\tquote = ch;\n\t\t\tbuf += ch;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === \"|\") {\n\t\t\tflush();\n\t\t\tcontinue;\n\t\t}\n\t\tbuf += ch;\n\t}\n\tflush();\n\treturn stages;\n}\n\n/** Return the index of the `)` matching the `(` at `openIndex`, or -1. */\nfunction findMatchingParen(text: string, openIndex: number): number {\n\tif (text[openIndex] !== \"(\") return -1;\n\tlet depth = 0;\n\tlet quote: string | undefined;\n\tlet escaped = false;\n\tfor (let i = openIndex; i < text.length; i += 1) {\n\t\tconst ch = text[i];\n\t\tif (escaped) {\n\t\t\tescaped = false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === \"\\\\\" && quote !== \"'\") {\n\t\t\tescaped = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (quote) {\n\t\t\tif (ch === quote) quote = undefined;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === \"'\" || ch === '\"') {\n\t\t\tquote = ch;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === \"(\") depth += 1;\n\t\telse if (ch === \")\") {\n\t\t\tdepth -= 1;\n\t\t\tif (depth === 0) return i;\n\t\t}\n\t}\n\treturn -1;\n}\n\ninterface RawExpansion {\n\treadonly kind: \"var\" | \"brace\";\n\treadonly name: string;\n\treadonly end: number;\n}\n\n/** Read a `$VAR` or `${VAR}` expansion starting at `dollarIndex`. Returns null for `${...}` ops we do not model. */\nfunction readExpansion(text: string, dollarIndex: number): RawExpansion | null {\n\tconst next = text[dollarIndex + 1];\n\tif (next === \"{\") {\n\t\tconst close = text.indexOf(\"}\", dollarIndex + 2);\n\t\tif (close === -1) return null;\n\t\tconst name = text.slice(dollarIndex + 2, close);\n\t\tif (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name)) return null;\n\t\treturn { kind: \"brace\", name, end: close + 1 };\n\t}\n\tif (next && /[A-Za-z_]/.test(next)) {\n\t\tconst match = /^[A-Za-z_][A-Za-z0-9_]*/.exec(text.slice(dollarIndex + 1));\n\t\tif (match) return { kind: \"var\", name: match[0], end: dollarIndex + 1 + match[0].length };\n\t}\n\treturn null;\n}\n\ninterface ScanState {\n\treadonly subcommands: SubcommandNode[];\n\treadonly subshells: SubshellNode[];\n\treadonly processSubs: ProcessSubNode[];\n\treadonly expansions: ExpansionNode[];\n\treadonly diagnostics: ParseDiagnostic[];\n\tmaxDepth: number;\n}\n\n/** Recursively scan `text` for structural shell nodes, quote-aware. */\nfunction scanStructural(text: string, state: ScanState, depth: number): void {\n\tif (depth > MAX_SCAN_DEPTH) {\n\t\tstate.diagnostics.push({\n\t\t\tcode: \"parser.depth_exceeded\",\n\t\t\tmessage: `Wrapper nesting exceeded depth ${MAX_SCAN_DEPTH}.`,\n\t\t\tfatal: false,\n\t\t});\n\t\treturn;\n\t}\n\tlet i = 0;\n\tlet quote: string | undefined;\n\tlet escaped = false;\n\tconst n = text.length;\n\twhile (i < n) {\n\t\tconst ch = text[i];\n\t\tconst next = text[i + 1];\n\t\tif (escaped) {\n\t\t\tescaped = false;\n\t\t\ti += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === \"\\\\\" && quote !== \"'\") {\n\t\t\tescaped = true;\n\t\t\ti += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (quote) {\n\t\t\t// Inside double quotes, $() and backticks still expand; `(` alone is literal.\n\t\t\tif (quote === '\"' && ch === \"$\" && next === \"(\") {\n\t\t\t\tconst end = findMatchingParen(text, i + 1);\n\t\t\t\tif (end === -1) {\n\t\t\t\t\tstate.diagnostics.push({\n\t\t\t\t\t\tcode: \"parser.unterminated_dollar_paren\",\n\t\t\t\t\t\tmessage: \"Unterminated $( ... ).\",\n\t\t\t\t\t\tfatal: true,\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst inner = text.slice(i + 2, end);\n\t\t\t\tstate.subcommands.push({ kind: \"dollar_paren\", inner, depth });\n\t\t\t\tstate.maxDepth = Math.max(state.maxDepth, depth);\n\t\t\t\tscanStructural(inner, state, depth + 1);\n\t\t\t\ti = end + 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (quote === '\"' && ch === \"`\") {\n\t\t\t\tconst end = text.indexOf(\"`\", i + 1);\n\t\t\t\tif (end === -1) {\n\t\t\t\t\tstate.diagnostics.push({\n\t\t\t\t\t\tcode: \"parser.unterminated_backtick\",\n\t\t\t\t\t\tmessage: \"Unterminated backtick.\",\n\t\t\t\t\t\tfatal: true,\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst inner = text.slice(i + 1, end);\n\t\t\t\tstate.subcommands.push({ kind: \"backtick\", inner, depth });\n\t\t\t\tstate.maxDepth = Math.max(state.maxDepth, depth);\n\t\t\t\tscanStructural(inner, state, depth + 1);\n\t\t\t\ti = end + 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (quote === '\"' && ch === \"$\") {\n\t\t\t\tconst exp = readExpansion(text, i);\n\t\t\t\tif (exp) {\n\t\t\t\t\tstate.expansions.push({ kind: exp.kind, name: exp.name, depth });\n\t\t\t\t\ti = exp.end;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (ch === quote) quote = undefined;\n\t\t\ti += 1;\n\t\t\tcontinue;\n\t\t}\n\t\t// unquoted\n\t\tif (ch === \"'\" || ch === '\"') {\n\t\t\tquote = ch;\n\t\t\ti += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === \"$\" && next === \"(\") {\n\t\t\tconst end = findMatchingParen(text, i + 1);\n\t\t\tif (end === -1) {\n\t\t\t\tstate.diagnostics.push({\n\t\t\t\t\tcode: \"parser.unterminated_dollar_paren\",\n\t\t\t\t\tmessage: \"Unterminated $( ... ).\",\n\t\t\t\t\tfatal: true,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst inner = text.slice(i + 2, end);\n\t\t\tstate.subcommands.push({ kind: \"dollar_paren\", inner, depth });\n\t\t\tstate.maxDepth = Math.max(state.maxDepth, depth);\n\t\t\tscanStructural(inner, state, depth + 1);\n\t\t\ti = end + 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === \"`\") {\n\t\t\tconst end = text.indexOf(\"`\", i + 1);\n\t\t\tif (end === -1) {\n\t\t\t\tstate.diagnostics.push({\n\t\t\t\t\tcode: \"parser.unterminated_backtick\",\n\t\t\t\t\tmessage: \"Unterminated backtick.\",\n\t\t\t\t\tfatal: true,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst inner = text.slice(i + 1, end);\n\t\t\tstate.subcommands.push({ kind: \"backtick\", inner, depth });\n\t\t\tstate.maxDepth = Math.max(state.maxDepth, depth);\n\t\t\tscanStructural(inner, state, depth + 1);\n\t\t\ti = end + 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif ((ch === \"<\" || ch === \">\") && next === \"(\") {\n\t\t\tconst end = findMatchingParen(text, i + 1);\n\t\t\tif (end === -1) {\n\t\t\t\tstate.diagnostics.push({\n\t\t\t\t\tcode: \"parser.unterminated_process_sub\",\n\t\t\t\t\tmessage: \"Unterminated process substitution.\",\n\t\t\t\t\tfatal: true,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst inner = text.slice(i + 2, end);\n\t\t\tstate.processSubs.push({ direction: ch === \"<\" ? \"in\" : \"out\", inner, depth });\n\t\t\tstate.maxDepth = Math.max(state.maxDepth, depth);\n\t\t\tscanStructural(inner, state, depth + 1);\n\t\t\ti = end + 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === \"(\") {\n\t\t\tconst end = findMatchingParen(text, i);\n\t\t\tif (end === -1) {\n\t\t\t\tstate.diagnostics.push({\n\t\t\t\t\tcode: \"parser.unterminated_subshell\",\n\t\t\t\t\tmessage: \"Unterminated subshell.\",\n\t\t\t\t\tfatal: true,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst inner = text.slice(i + 1, end);\n\t\t\tstate.subshells.push({ inner, depth });\n\t\t\tstate.maxDepth = Math.max(state.maxDepth, depth);\n\t\t\tscanStructural(inner, state, depth + 1);\n\t\t\ti = end + 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === \"$\") {\n\t\t\tconst exp = readExpansion(text, i);\n\t\t\tif (exp) {\n\t\t\t\tstate.expansions.push({ kind: exp.kind, name: exp.name, depth });\n\t\t\t\ti = exp.end;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\ti += 1;\n\t}\n\tif (quote !== undefined) {\n\t\tstate.diagnostics.push({\n\t\t\tcode: \"parser.unterminated_quote\",\n\t\t\tmessage: `Unterminated ${quote} quote.`,\n\t\t\tfatal: true,\n\t\t});\n\t}\n}\n\n/** Detect leading `VAR=value` assignments, including `export` / `env` prefixes. */\nfunction detectAssignments(segment: string): EnvAssignment[] {\n\tconst tokens = tokenize(segment);\n\tif (tokens.length === 0) return [];\n\tconst assignments: EnvAssignment[] = [];\n\tlet idx = 0;\n\tlet position: EnvAssignment[\"position\"] = \"prefix\";\n\tconst head = tokens[0]?.toLowerCase();\n\tif (head === \"export\" || head === \"set\") {\n\t\tposition = \"export\";\n\t\tidx = 1;\n\t} else if (head === \"env\") {\n\t\tposition = \"env\";\n\t\tidx = 1;\n\t\t// skip leading env options (-i, -u NAME, -C, ...). -u / --unset consume a name token.\n\t\twhile (idx < tokens.length) {\n\t\t\tconst tok = tokens[idx];\n\t\t\tif (!tok || !tok.startsWith(\"-\") || tok === \"--\") {\n\t\t\t\tif (tok === \"--\") idx += 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tidx += 1;\n\t\t\tconst lower = tok.toLowerCase();\n\t\t\tif (lower === \"-u\" || lower === \"--unset\" || lower === \"-s\" || lower === \"--ignore-environment\") {\n\t\t\t\tif (idx < tokens.length && !tokens[idx].includes(\"=\")) idx += 1;\n\t\t\t}\n\t\t}\n\t}\n\tconst assignRegex = /^([A-Za-z_][A-Za-z0-9_]*)=(.*)$/;\n\twhile (idx < tokens.length) {\n\t\tconst tok = tokens[idx];\n\t\tconst match = assignRegex.exec(tok);\n\t\tif (!match) break;\n\t\tconst name = match[1];\n\t\tassignments.push({\n\t\t\tname,\n\t\t\tvalue: match[2],\n\t\t\tposition,\n\t\t\tloaderInjection: LOADER_INJECTION_ENV.has(name),\n\t\t\tsensitiveName: isSensitiveEnvName(name),\n\t\t});\n\t\tidx += 1;\n\t}\n\treturn assignments;\n}\n\nfunction isDecoderStage(exec: string, tokens: readonly string[]): boolean {\n\tif (exec === \"base64\") {\n\t\treturn tokens.slice(1).some((t) => t === \"-d\" || t === \"--decode\" || t === \"-D\");\n\t}\n\tif (exec === \"xxd\") {\n\t\treturn tokens.slice(1).some((t) => t === \"-r\" || t === \"-rp\" || t === \"-r -p\");\n\t}\n\tif (exec === \"openssl\") {\n\t\tconst lower = tokens.map((t) => t.toLowerCase());\n\t\treturn lower.includes(\"enc\") && lower.some((t) => t === \"-d\" || t === \"-decrypt\" || t === \"-aes-256-cbc\");\n\t}\n\treturn exec === \"printf\" || exec === \"uudecode\" || exec === \"mmencode\" || exec === \"recode\";\n}\n\nfunction detectDecoderPipeline(segment: string): DecoderPipeline | null {\n\tconst stages = splitPipeStages(segment);\n\tif (stages.length < 2) return null;\n\tlet decoderIndex = -1;\n\tlet executorIndex = -1;\n\tlet executor = \"\";\n\tfor (let i = 0; i < stages.length; i += 1) {\n\t\tconst toks = tokenize(stages[i]);\n\t\tconst exec = toks[0]?.toLowerCase();\n\t\tif (!exec) continue;\n\t\tif (decoderIndex === -1 && isDecoderStage(exec, toks)) decoderIndex = i;\n\t\tif (executorIndex === -1 && DECODER_EXECUTABLES.has(exec)) {\n\t\t\texecutorIndex = i;\n\t\t\texecutor = exec;\n\t\t}\n\t}\n\tif (decoderIndex !== -1 && executorIndex !== -1 && executorIndex >= decoderIndex) {\n\t\treturn { stages, decoderIndex, executorIndex, executor };\n\t}\n\treturn null;\n}\n\n/** Public: analyze a shell command into structural metadata. */\nexport function analyzeShellCommandV2(command: string): ShellAnalysis {\n\tconst raw = command;\n\tconst topSegments = splitTopLevelCommands(command);\n\tconst segments: ShellSegment[] = topSegments.map((text) => ({ text, tokens: tokenize(text) }));\n\n\tconst state: ScanState = {\n\t\tsubcommands: [],\n\t\tsubshells: [],\n\t\tprocessSubs: [],\n\t\texpansions: [],\n\t\tdiagnostics: [],\n\t\tmaxDepth: 0,\n\t};\n\tscanStructural(command, state, 0);\n\n\tconst assignments: EnvAssignment[] = [];\n\tfor (const seg of topSegments) assignments.push(...detectAssignments(seg));\n\n\tconst decoderPipelines: DecoderPipeline[] = [];\n\tfor (const seg of topSegments) {\n\t\tconst dp = detectDecoderPipeline(seg);\n\t\tif (dp) decoderPipelines.push(dp);\n\t}\n\n\treturn {\n\t\traw,\n\t\tsegments,\n\t\tsubcommands: state.subcommands,\n\t\tsubshells: state.subshells,\n\t\tprocessSubstitutions: state.processSubs,\n\t\tassignments,\n\t\tdynamicExpansions: state.expansions,\n\t\tdecoderPipelines,\n\t\twrapperDepth: state.maxDepth,\n\t\tdiagnostics: state.diagnostics,\n\t};\n}\n\nfunction bump(current: CommandAction, candidate: CommandAction): CommandAction {\n\treturn ACTION_RANK[candidate] > ACTION_RANK[current] ? candidate : current;\n}\n\n/**\n * Public: classify a shell command into allow / confirm / block / escalate,\n * composing the existing `classifyShellCommand` verdict with V2 structural\n * detections. The result never lowers the existing risk tier.\n */\nexport function classifyCommandRiskV2(command: string): CommandRiskV2Verdict {\n\tconst analysis = analyzeShellCommandV2(command);\n\tconst base = classifyShellCommand(command);\n\tlet action: CommandAction = base.risk === \"block\" ? \"block\" : base.risk === \"confirm\" ? \"confirm\" : \"allow\";\n\tconst reasons: RiskReason[] = [{ code: base.rule, message: base.reason }];\n\tconst normalizedCommands: string[] = [command];\n\tfor (const node of analysis.subcommands) normalizedCommands.push(node.inner);\n\tfor (const node of analysis.subshells) normalizedCommands.push(node.inner);\n\tfor (const node of analysis.processSubstitutions) normalizedCommands.push(node.inner);\n\n\t// Privilege commands escalate (sudo / su / doas / pkexec). Never auto-allowed headlessly.\n\tif (base.rule.startsWith(\"priv.\")) {\n\t\treasons.push({ code: \"priv.escalate\", message: \"Privilege escalation requires explicit human approval.\" });\n\t\taction = bump(action, \"escalate\");\n\t}\n\n\t// Inspect dynamic-structure inner content for hidden destructive commands.\n\tfor (const node of analysis.subcommands) {\n\t\tconst innerVerdict = classifyShellCommand(node.inner);\n\t\tif (innerVerdict.risk === \"block\") {\n\t\t\treasons.push({\n\t\t\t\tcode: `exec.inner_block:${innerVerdict.rule}`,\n\t\t\t\tmessage: `Command substitution hides a destructive command: ${innerVerdict.reason}`,\n\t\t\t});\n\t\t\taction = bump(action, \"block\");\n\t\t} else if (innerVerdict.risk === \"confirm\") {\n\t\t\treasons.push({\n\t\t\t\tcode: `exec.inner_confirm:${innerVerdict.rule}`,\n\t\t\t\tmessage: `Command substitution hides a risky command: ${innerVerdict.reason}`,\n\t\t\t});\n\t\t}\n\t}\n\tfor (const node of analysis.subshells) {\n\t\tconst innerVerdict = classifyShellCommand(node.inner);\n\t\tif (innerVerdict.risk === \"block\") {\n\t\t\treasons.push({\n\t\t\t\tcode: `exec.inner_block:${innerVerdict.rule}`,\n\t\t\t\tmessage: `Subshell hides a destructive command: ${innerVerdict.reason}`,\n\t\t\t});\n\t\t\taction = bump(action, \"block\");\n\t\t} else if (innerVerdict.risk === \"confirm\") {\n\t\t\treasons.push({\n\t\t\t\tcode: `exec.inner_confirm:${innerVerdict.rule}`,\n\t\t\t\tmessage: `Subshell hides a risky command: ${innerVerdict.reason}`,\n\t\t\t});\n\t\t}\n\t}\n\tfor (const node of analysis.processSubstitutions) {\n\t\tconst innerVerdict = classifyShellCommand(node.inner);\n\t\tif (innerVerdict.risk === \"block\") {\n\t\t\treasons.push({\n\t\t\t\tcode: `exec.inner_block:${innerVerdict.rule}`,\n\t\t\t\tmessage: `Process substitution hides a destructive command: ${innerVerdict.reason}`,\n\t\t\t});\n\t\t\taction = bump(action, \"block\");\n\t\t}\n\t}\n\n\tconst hasDynamic =\n\t\tanalysis.subcommands.length > 0 || analysis.subshells.length > 0 || analysis.processSubstitutions.length > 0;\n\n\t// Dynamic plus already-risky base -> escalate (the dynamic part can hide a worse payload).\n\tif (hasDynamic && base.risk !== \"allow\") {\n\t\treasons.push({\n\t\t\tcode: \"exec.dynamic_elevated\",\n\t\t\tmessage: \"Dynamic shell structure combined with a risky base command.\",\n\t\t});\n\t\taction = bump(action, \"escalate\");\n\t}\n\n\tif (analysis.subcommands.length > 0) {\n\t\treasons.push({\n\t\t\tcode: \"exec.command_substitution\",\n\t\t\tmessage: \"Command substitution $(...) or backticks can execute arbitrary commands.\",\n\t\t});\n\t\taction = bump(action, \"confirm\");\n\t}\n\tif (analysis.subshells.length > 0) {\n\t\treasons.push({ code: \"exec.subshell\", message: \"Subshell grouping (...) can execute arbitrary commands.\" });\n\t\taction = bump(action, \"confirm\");\n\t}\n\tif (analysis.processSubstitutions.length > 0) {\n\t\treasons.push({\n\t\t\tcode: \"exec.process_substitution\",\n\t\t\tmessage: \"Process substitution <(...) or >(...) spawns a process.\",\n\t\t});\n\t\taction = bump(action, \"confirm\");\n\t}\n\n\tfor (const dp of analysis.decoderPipelines) {\n\t\treasons.push({\n\t\t\tcode: \"exec.decoder_pipeline\",\n\t\t\tmessage: `Decoder pipeline (${dp.stages[dp.decoderIndex]} -> ${dp.executor}) can execute a decoded payload.`,\n\t\t});\n\t\taction = bump(action, \"confirm\");\n\t}\n\n\tfor (const assignment of analysis.assignments) {\n\t\tif (assignment.loaderInjection) {\n\t\t\treasons.push({\n\t\t\t\tcode: \"env.loader_injection\",\n\t\t\t\tmessage: `Assignment sets loader/runtime injection variable ${assignment.name}.`,\n\t\t\t});\n\t\t\taction = bump(action, \"confirm\");\n\t\t} else if (assignment.sensitiveName) {\n\t\t\treasons.push({\n\t\t\t\tcode: \"env.sensitive_assignment\",\n\t\t\t\tmessage: `Assignment exposes a sensitive variable ${assignment.name} on the command line.`,\n\t\t\t});\n\t\t\taction = bump(action, \"confirm\");\n\t\t}\n\t}\n\n\t// Unresolved expansion inside a risky command's argument list (could expand to /, ~, or a sensitive path).\n\tfor (const seg of analysis.segments) {\n\t\tconst exec = seg.tokens[0]?.toLowerCase();\n\t\tif (!exec || !RISKY_EXPANSION_EXEC.has(exec)) continue;\n\t\tconst hasExpansion = seg.tokens.slice(1).some((tok) => tok.includes(\"$\"));\n\t\tif (hasExpansion) {\n\t\t\treasons.push({\n\t\t\t\tcode: \"exec.dynamic_target\",\n\t\t\t\tmessage: `Unresolved expansion in arguments of risky command '${exec}'.`,\n\t\t\t});\n\t\t\taction = bump(action, \"confirm\");\n\t\t}\n\t}\n\n\tfor (const diag of analysis.diagnostics) {\n\t\tif (diag.fatal) {\n\t\t\treasons.push({ code: diag.code, message: diag.message });\n\t\t\t// Parser fatal -> fail-closed to at least confirm (block stays block).\n\t\t\taction = bump(action, \"confirm\");\n\t\t}\n\t}\n\n\treturn { action, reasons, normalizedCommands, analysis };\n}\n"]}
|