open-multi-agent-kit 0.80.6 → 0.80.8
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 +4 -20
- package/README.md +66 -16
- 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 +7 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/config-selector.d.ts +1 -1
- package/dist/cli/config-selector.d.ts.map +1 -1
- package/dist/cli/config-selector.js +2 -2
- 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 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +34 -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 +36 -8
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +294 -14
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage.d.ts +3 -3
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +4 -4
- package/dist/core/auth-storage.js.map +1 -1
- 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 +2 -1
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/browser-use.d.ts +45 -0
- package/dist/core/browser-use.d.ts.map +1 -0
- package/dist/core/browser-use.js +70 -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 +11 -0
- package/dist/core/command-safety.d.ts.map +1 -0
- package/dist/core/command-safety.js +631 -0
- package/dist/core/command-safety.js.map +1 -0
- 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 +2 -8
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +3 -84
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +11 -608
- 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 +4 -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 +108 -0
- package/dist/core/exact-cache-policy.d.ts.map +1 -0
- package/dist/core/exact-cache-policy.js +184 -0
- package/dist/core/exact-cache-policy.js.map +1 -0
- 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 +2 -4
- 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 +80 -0
- package/dist/core/extensions/builtin/command-safety-gate.d.ts.map +1 -0
- package/dist/core/extensions/builtin/command-safety-gate.js +159 -0
- package/dist/core/extensions/builtin/command-safety-gate.js.map +1 -0
- 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 +70 -0
- package/dist/core/extensions/builtin/todo-checklist.js.map +1 -0
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +50 -47
- 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 +13 -13
- 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/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 +25 -0
- package/dist/core/hook-inventory.d.ts.map +1 -0
- package/dist/core/hook-inventory.js +119 -0
- package/dist/core/hook-inventory.js.map +1 -0
- 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-access-policy.d.ts +41 -0
- package/dist/core/loadout-access-policy.d.ts.map +1 -0
- package/dist/core/loadout-access-policy.js +182 -0
- package/dist/core/loadout-access-policy.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 +106 -0
- package/dist/core/loadout-runtime.d.ts.map +1 -0
- package/dist/core/loadout-runtime.js +193 -0
- package/dist/core/loadout-runtime.js.map +1 -0
- 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 +149 -0
- package/dist/core/loadouts.d.ts.map +1 -0
- package/dist/core/loadouts.js +553 -0
- package/dist/core/loadouts.js.map +1 -0
- 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 +41 -0
- package/dist/core/mcp-inventory.d.ts.map +1 -1
- package/dist/core/mcp-inventory.js +57 -1
- package/dist/core/mcp-inventory.js.map +1 -1
- package/dist/core/mcp-presets.d.ts +98 -0
- package/dist/core/mcp-presets.d.ts.map +1 -0
- package/dist/core/mcp-presets.js +377 -0
- package/dist/core/mcp-presets.js.map +1 -0
- 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 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +2 -2
- 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 +1 -1
- 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 +6 -0
- package/dist/core/package-gallery.d.ts.map +1 -0
- package/dist/core/package-gallery.js +6 -0
- package/dist/core/package-gallery.js.map +1 -0
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +10 -10
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/package-procurement.d.ts +268 -0
- package/dist/core/package-procurement.d.ts.map +1 -0
- package/dist/core/package-procurement.js +709 -0
- package/dist/core/package-procurement.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/read-anchors.d.ts +110 -0
- package/dist/core/read-anchors.d.ts.map +1 -0
- package/dist/core/read-anchors.js +193 -0
- package/dist/core/read-anchors.js.map +1 -0
- package/dist/core/recovery-checkpoint.d.ts +196 -0
- package/dist/core/recovery-checkpoint.d.ts.map +1 -0
- package/dist/core/recovery-checkpoint.js +382 -0
- package/dist/core/recovery-checkpoint.js.map +1 -0
- package/dist/core/resource-loader.d.ts +15 -21
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +62 -8
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/sandbox/backend.d.ts +25 -0
- package/dist/core/sandbox/backend.d.ts.map +1 -0
- package/dist/core/sandbox/backend.js +150 -0
- package/dist/core/sandbox/backend.js.map +1 -0
- package/dist/core/sandbox/env.d.ts +6 -0
- package/dist/core/sandbox/env.d.ts.map +1 -0
- package/dist/core/sandbox/env.js +46 -0
- package/dist/core/sandbox/env.js.map +1 -0
- package/dist/core/sandbox/path-resolver.d.ts +4 -0
- package/dist/core/sandbox/path-resolver.d.ts.map +1 -0
- package/dist/core/sandbox/path-resolver.js +44 -0
- package/dist/core/sandbox/path-resolver.js.map +1 -0
- package/dist/core/sandbox/policy.d.ts +87 -0
- package/dist/core/sandbox/policy.d.ts.map +1 -0
- package/dist/core/sandbox/policy.js +280 -0
- package/dist/core/sandbox/policy.js.map +1 -0
- package/dist/core/sandbox/spawn.d.ts +20 -0
- package/dist/core/sandbox/spawn.d.ts.map +1 -0
- package/dist/core/sandbox/spawn.js +80 -0
- package/dist/core/sandbox/spawn.js.map +1 -0
- 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 +15 -4
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +50 -4
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/semantic-cache-policy.d.ts +51 -0
- package/dist/core/semantic-cache-policy.d.ts.map +1 -0
- package/dist/core/semantic-cache-policy.js +228 -0
- package/dist/core/semantic-cache-policy.js.map +1 -0
- 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 +1 -1
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +1 -4
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +2 -7
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/skills.d.ts +1 -0
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +46 -5
- 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 +63 -24
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/telemetry.d.ts.map +1 -1
- package/dist/core/telemetry.js +1 -1
- package/dist/core/telemetry.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 +1 -5
- package/dist/core/timings.js.map +1 -1
- 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 +28 -4
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +55 -11
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit.d.ts +3 -2
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +4 -1
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/find.d.ts +1 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +1 -1
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts +1 -1
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +1 -1
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/index.d.ts +1 -1
- 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 -1
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +1 -1
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/output-accumulator.d.ts.map +1 -1
- package/dist/core/tools/output-accumulator.js +1 -1
- package/dist/core/tools/output-accumulator.js.map +1 -1
- package/dist/core/tools/read.d.ts +2 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +6 -3
- 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 -1
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +4 -1
- 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/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 +6 -8
- 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 +28 -0
- package/dist/modes/interactive/components/control-panel-gradient-motion.d.ts.map +1 -0
- package/dist/modes/interactive/components/control-panel-gradient-motion.js +112 -0
- package/dist/modes/interactive/components/control-panel-gradient-motion.js.map +1 -0
- package/dist/modes/interactive/components/control-panel-gradient.d.ts +28 -0
- package/dist/modes/interactive/components/control-panel-gradient.d.ts.map +1 -0
- package/dist/modes/interactive/components/control-panel-gradient.js +128 -0
- package/dist/modes/interactive/components/control-panel-gradient.js.map +1 -0
- package/dist/modes/interactive/components/control-panel-layout.d.ts +23 -0
- package/dist/modes/interactive/components/control-panel-layout.d.ts.map +1 -0
- package/dist/modes/interactive/components/control-panel-layout.js +165 -0
- package/dist/modes/interactive/components/control-panel-layout.js.map +1 -0
- package/dist/modes/interactive/components/control-panel-runtime-status.d.ts +5 -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 +20 -0
- package/dist/modes/interactive/components/control-panel-runtime-status.js.map +1 -0
- package/dist/modes/interactive/components/control-panel.d.ts +24 -20
- package/dist/modes/interactive/components/control-panel.d.ts.map +1 -1
- package/dist/modes/interactive/components/control-panel.js +88 -69
- 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 +2 -2
- 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 +2 -2
- 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 +1 -1
- 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 +4 -4
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +20 -42
- 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 -1
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/theme-selector.js +1 -1
- 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 +5 -8
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +79 -189
- 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 +22 -31
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/print-mode.d.ts +3 -3
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +2 -2
- 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-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 +3 -3
- 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/clipboard-image.d.ts.map +1 -1
- package/dist/utils/clipboard-image.js +1 -1
- package/dist/utils/clipboard-image.js.map +1 -1
- 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/omk-user-agent.d.ts +2 -0
- package/dist/utils/omk-user-agent.d.ts.map +1 -0
- package/dist/utils/{pi-user-agent.js → omk-user-agent.js} +2 -2
- package/dist/utils/omk-user-agent.js.map +1 -0
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js +1 -1
- package/dist/utils/tools-manager.js.map +1 -1
- package/dist/utils/version-check.d.ts +5 -5
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js +8 -11
- package/dist/utils/version-check.js.map +1 -1
- 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 +1 -1
- 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/examples/README.md +1 -1
- package/examples/extensions/README.md +12 -12
- 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/auto-commit-on-exit.ts +6 -6
- package/examples/extensions/bash-spawn-hook.ts +3 -3
- package/examples/extensions/bookmark.ts +5 -5
- package/examples/extensions/border-status-editor.ts +9 -9
- package/examples/extensions/built-in-tool-renderer.ts +7 -7
- package/examples/extensions/claude-rules.ts +4 -4
- package/examples/extensions/commands.ts +5 -5
- package/examples/extensions/confirm-destructive.ts +3 -3
- package/examples/extensions/custom-compaction.ts +4 -4
- package/examples/extensions/custom-footer.ts +4 -4
- package/examples/extensions/custom-header.ts +11 -11
- package/examples/extensions/custom-provider-anthropic/index.ts +5 -5
- 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 +4 -4
- 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/dirty-repo-guard.ts +7 -7
- package/examples/extensions/doom-overlay/README.md +2 -3
- 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_pi.c → doomgeneric_omk.c} +1 -1
- package/examples/extensions/doom-overlay/doom-component.ts +2 -2
- package/examples/extensions/doom-overlay/doom-keys.ts +1 -1
- package/examples/extensions/doom-overlay/index.ts +3 -3
- package/examples/extensions/dynamic-resources/dynamic.json +1 -1
- package/examples/extensions/dynamic-resources/index.ts +2 -2
- package/examples/extensions/dynamic-tools.ts +4 -4
- package/examples/extensions/event-bus.ts +8 -8
- package/examples/extensions/file-trigger.ts +3 -3
- package/examples/extensions/git-checkpoint.ts +7 -7
- package/examples/extensions/git-merge-and-resolve.ts +14 -14
- package/examples/extensions/github-issue-autocomplete.ts +7 -12
- package/examples/extensions/gondolin/index.ts +16 -16
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/handoff.ts +4 -4
- package/examples/extensions/hello.ts +3 -3
- package/examples/extensions/hidden-thinking-label.ts +4 -4
- package/examples/extensions/inline-bash.ts +5 -5
- package/examples/extensions/input-transform-streaming.ts +5 -5
- package/examples/extensions/input-transform.ts +5 -5
- package/examples/extensions/interactive-shell.ts +3 -3
- package/examples/extensions/mac-system-theme.ts +5 -5
- package/examples/extensions/message-renderer.ts +5 -5
- package/examples/extensions/minimal-mode.ts +10 -10
- package/examples/extensions/modal-editor.ts +4 -4
- package/examples/extensions/model-status.ts +3 -3
- package/examples/extensions/notify.ts +5 -5
- package/examples/extensions/overlay-qa-tests.ts +22 -22
- package/examples/extensions/overlay-test.ts +4 -4
- package/examples/extensions/permission-gate.ts +2 -2
- package/examples/extensions/pirate.ts +4 -4
- package/examples/extensions/plan-mode/index.ts +25 -25
- package/examples/extensions/preset.ts +31 -31
- package/examples/extensions/prompt-customizer.ts +3 -3
- package/examples/extensions/protected-paths.ts +2 -2
- package/examples/extensions/provider-payload.ts +8 -5
- package/examples/extensions/qna.ts +3 -3
- package/examples/extensions/question.ts +3 -3
- package/examples/extensions/questionnaire.ts +3 -3
- package/examples/extensions/rainbow-editor.ts +3 -3
- package/examples/extensions/reload-runtime.ts +4 -4
- package/examples/extensions/rpc-demo.ts +10 -10
- package/examples/extensions/sandbox/index.ts +16 -16
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/send-user-message.ts +13 -13
- package/examples/extensions/session-name.ts +4 -4
- package/examples/extensions/shutdown-command.ts +10 -10
- package/examples/extensions/snake.ts +4 -4
- package/examples/extensions/space-invaders.ts +4 -4
- package/examples/extensions/ssh.ts +12 -12
- package/examples/extensions/status-line.ts +4 -4
- package/examples/extensions/structured-output.ts +3 -3
- package/examples/extensions/subagent/README.md +13 -13
- package/examples/extensions/subagent/agents.ts +1 -1
- package/examples/extensions/subagent/index.ts +13 -13
- package/examples/extensions/summarize.ts +4 -4
- package/examples/extensions/system-prompt-header.ts +3 -3
- package/examples/extensions/tic-tac-toe.ts +17 -17
- package/examples/extensions/timed-confirm.ts +4 -4
- package/examples/extensions/titlebar-spinner.ts +9 -9
- package/examples/extensions/todo.ts +7 -7
- package/examples/extensions/tool-override.ts +6 -6
- package/examples/extensions/tools.ts +11 -11
- package/examples/extensions/trigger-compact.ts +3 -3
- package/examples/extensions/truncated-tool.ts +4 -4
- package/examples/extensions/widget-placement.ts +2 -2
- package/examples/extensions/with-deps/index.ts +2 -2
- 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 +7 -7
- package/examples/extensions/working-message-test.ts +3 -3
- package/examples/rpc-extension-ui.ts +1 -9
- package/examples/sdk/01-minimal.ts +1 -1
- package/examples/sdk/02-custom-model.ts +1 -1
- package/examples/sdk/03-custom-prompt.ts +1 -1
- package/examples/sdk/04-skills.ts +1 -1
- package/examples/sdk/05-tools.ts +1 -1
- package/examples/sdk/06-extensions.ts +11 -11
- package/examples/sdk/08-prompt-templates.ts +1 -1
- package/examples/sdk/09-api-keys-and-oauth.ts +2 -2
- package/examples/sdk/12-full-control.ts +1 -1
- package/examples/sdk/README.md +3 -3
- package/npm-shrinkwrap.json +1805 -0
- package/package.json +8 -14
- package/dist/core/harness-control-events.d.ts +0 -79
- package/dist/core/harness-control-events.d.ts.map +0 -1
- package/dist/core/harness-control-events.js +0 -339
- package/dist/core/harness-control-events.js.map +0 -1
- package/dist/core/harness-control-replay.d.ts +0 -26
- package/dist/core/harness-control-replay.d.ts.map +0 -1
- package/dist/core/harness-control-replay.js +0 -155
- package/dist/core/harness-control-replay.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 -28
- package/dist/modes/interactive/components/mcp-selector.d.ts.map +0 -1
- package/dist/modes/interactive/components/mcp-selector.js +0 -138
- package/dist/modes/interactive/components/mcp-selector.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/utils/pi-user-agent.d.ts +0 -2
- package/dist/utils/pi-user-agent.d.ts.map +0 -1
- package/dist/utils/pi-user-agent.js.map +0 -1
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal hook inventory for the loadout runtime.
|
|
3
|
+
*
|
|
4
|
+
* The external harness resolves `scriptPath` to an actual shell script.
|
|
5
|
+
* This module provides canonical names plus safe policy metadata so the
|
|
6
|
+
* loadout layer can validate selectors without executing hooks.
|
|
7
|
+
*/
|
|
8
|
+
import type { HookPolicyMetadata } from "./hooks/index.ts";
|
|
9
|
+
export interface HookDescriptor {
|
|
10
|
+
name: string;
|
|
11
|
+
scriptPath?: string;
|
|
12
|
+
builtin: boolean;
|
|
13
|
+
policy: HookPolicyMetadata;
|
|
14
|
+
}
|
|
15
|
+
export interface HookInventory {
|
|
16
|
+
hooks: readonly HookDescriptor[];
|
|
17
|
+
}
|
|
18
|
+
export declare const BUILTIN_HOOKS: readonly HookDescriptor[];
|
|
19
|
+
/**
|
|
20
|
+
* Load the hook inventory. Builtin hooks are always present; if an agent
|
|
21
|
+
* directory is provided and its `hooks` subdirectory exists, any shell scripts
|
|
22
|
+
* discovered there are appended as non-builtin descriptors.
|
|
23
|
+
*/
|
|
24
|
+
export declare function loadHookInventory(agentDir?: string): HookInventory;
|
|
25
|
+
//# sourceMappingURL=hook-inventory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-inventory.d.ts","sourceRoot":"","sources":["../../src/core/hook-inventory.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAG3D,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,kBAAkB,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC7B,KAAK,EAAE,SAAS,cAAc,EAAE,CAAC;CACjC;AAMD,eAAO,MAAM,aAAa,EAAE,SAAS,cAAc,EAyElD,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,aAAa,CAsBlE","sourcesContent":["/**\n * Minimal hook inventory for the loadout runtime.\n *\n * The external harness resolves `scriptPath` to an actual shell script.\n * This module provides canonical names plus safe policy metadata so the\n * loadout layer can validate selectors without executing hooks.\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { HookPolicyMetadata } from \"./hooks/index.ts\";\nimport { DEFAULT_HOOK_POLICY, sanitizeHookPolicy } from \"./hooks/index.ts\";\n\nexport interface HookDescriptor {\n\tname: string;\n\tscriptPath?: string;\n\tbuiltin: boolean;\n\tpolicy: HookPolicyMetadata;\n}\n\nexport interface HookInventory {\n\thooks: readonly HookDescriptor[];\n}\n\nfunction builtinHook(name: string, policy: HookPolicyMetadata): HookDescriptor {\n\treturn { name, builtin: true, policy: sanitizeHookPolicy(policy) };\n}\n\nexport const BUILTIN_HOOKS: readonly HookDescriptor[] = [\n\tbuiltinHook(\"pre-shell-guard\", {\n\t\tstages: [\"tool_call\"],\n\t\teffects: [\"validator\"],\n\t\tfailureMode: \"fail-closed\",\n\t\ttimeoutMs: 3_000,\n\t}),\n\tbuiltinHook(\"protect-secrets\", {\n\t\tstages: [\"tool_call\", \"tool_result\"],\n\t\teffects: [\"validator\"],\n\t\tfailureMode: \"fail-closed\",\n\t\ttimeoutMs: 5_000,\n\t}),\n\tbuiltinHook(\"session-context\", {\n\t\tstages: [\"session_start\"],\n\t\teffects: [\"mutator\"],\n\t\tfailureMode: \"fail-closed\",\n\t\ttimeoutMs: 5_000,\n\t}),\n\tbuiltinHook(\"precompact-checkpoint\", {\n\t\tstages: [\"pre_compact\"],\n\t\teffects: [\"observer\"],\n\t\tfailureMode: \"fail-closed\",\n\t\ttimeoutMs: 5_000,\n\t}),\n\tbuiltinHook(\"typecheck-after-edit\", {\n\t\tstages: [\"tool_result\"],\n\t\teffects: [\"validator\"],\n\t\tfailureMode: \"fail-closed\",\n\t\ttimeoutMs: 30_000,\n\t}),\n\tbuiltinHook(\"stop-verify\", {\n\t\tstages: [\"session_stop\"],\n\t\teffects: [\"validator\"],\n\t\tfailureMode: \"fail-closed\",\n\t\ttimeoutMs: 30_000,\n\t}),\n\tbuiltinHook(\"subagent-stop-audit\", {\n\t\tstages: [\"session_stop\"],\n\t\teffects: [\"validator\"],\n\t\tfailureMode: \"fail-closed\",\n\t\ttimeoutMs: 10_000,\n\t}),\n\tbuiltinHook(\"npm-audit-summary\", {\n\t\tstages: [\"session_stop\"],\n\t\teffects: [\"observer\"],\n\t\tfailureMode: \"fail-closed\",\n\t\ttimeoutMs: 30_000,\n\t}),\n\tbuiltinHook(\"bounded-evidence\", {\n\t\tstages: [\"tool_result\", \"session_stop\"],\n\t\teffects: [\"validator\"],\n\t\tfailureMode: \"fail-closed\",\n\t\ttimeoutMs: 10_000,\n\t}),\n\tbuiltinHook(\"document-artifact-guard\", {\n\t\tstages: [\"tool_result\"],\n\t\teffects: [\"validator\"],\n\t\tfailureMode: \"fail-closed\",\n\t\ttimeoutMs: 5_000,\n\t}),\n\tbuiltinHook(\"component-spec-before-build\", {\n\t\tstages: [\"tool_call\"],\n\t\teffects: [\"validator\"],\n\t\tfailureMode: \"fail-closed\",\n\t\ttimeoutMs: 5_000,\n\t}),\n\tbuiltinHook(\"visual-diff-after-edit\", {\n\t\tstages: [\"tool_result\"],\n\t\teffects: [\"validator\"],\n\t\tfailureMode: \"fail-closed\",\n\t\ttimeoutMs: 10_000,\n\t}),\n];\n\n/**\n * Load the hook inventory. Builtin hooks are always present; if an agent\n * directory is provided and its `hooks` subdirectory exists, any shell scripts\n * discovered there are appended as non-builtin descriptors.\n */\nexport function loadHookInventory(agentDir?: string): HookInventory {\n\tconst hooks: HookDescriptor[] = [...BUILTIN_HOOKS];\n\tif (agentDir) {\n\t\ttry {\n\t\t\tconst hooksDir = path.join(agentDir, \"hooks\");\n\t\t\tconst entries = fs.readdirSync(hooksDir).sort();\n\t\t\tfor (const entry of entries) {\n\t\t\t\tif (!entry.endsWith(\".sh\")) continue;\n\t\t\t\tconst name = entry.slice(0, -3);\n\t\t\t\tif (hooks.some((h) => h.name === name)) continue;\n\t\t\t\thooks.push({\n\t\t\t\t\tname,\n\t\t\t\t\tscriptPath: path.join(hooksDir, entry),\n\t\t\t\t\tbuiltin: false,\n\t\t\t\t\tpolicy: sanitizeHookPolicy(DEFAULT_HOOK_POLICY),\n\t\t\t\t});\n\t\t\t}\n\t\t} catch {\n\t\t\t// Hooks directory may be absent; builtin inventory is sufficient.\n\t\t}\n\t}\n\treturn { hooks };\n}\n"]}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal hook inventory for the loadout runtime.
|
|
3
|
+
*
|
|
4
|
+
* The external harness resolves `scriptPath` to an actual shell script.
|
|
5
|
+
* This module provides canonical names plus safe policy metadata so the
|
|
6
|
+
* loadout layer can validate selectors without executing hooks.
|
|
7
|
+
*/
|
|
8
|
+
import fs from "node:fs";
|
|
9
|
+
import path from "node:path";
|
|
10
|
+
import { DEFAULT_HOOK_POLICY, sanitizeHookPolicy } from "./hooks/index.js";
|
|
11
|
+
function builtinHook(name, policy) {
|
|
12
|
+
return { name, builtin: true, policy: sanitizeHookPolicy(policy) };
|
|
13
|
+
}
|
|
14
|
+
export const BUILTIN_HOOKS = [
|
|
15
|
+
builtinHook("pre-shell-guard", {
|
|
16
|
+
stages: ["tool_call"],
|
|
17
|
+
effects: ["validator"],
|
|
18
|
+
failureMode: "fail-closed",
|
|
19
|
+
timeoutMs: 3_000,
|
|
20
|
+
}),
|
|
21
|
+
builtinHook("protect-secrets", {
|
|
22
|
+
stages: ["tool_call", "tool_result"],
|
|
23
|
+
effects: ["validator"],
|
|
24
|
+
failureMode: "fail-closed",
|
|
25
|
+
timeoutMs: 5_000,
|
|
26
|
+
}),
|
|
27
|
+
builtinHook("session-context", {
|
|
28
|
+
stages: ["session_start"],
|
|
29
|
+
effects: ["mutator"],
|
|
30
|
+
failureMode: "fail-closed",
|
|
31
|
+
timeoutMs: 5_000,
|
|
32
|
+
}),
|
|
33
|
+
builtinHook("precompact-checkpoint", {
|
|
34
|
+
stages: ["pre_compact"],
|
|
35
|
+
effects: ["observer"],
|
|
36
|
+
failureMode: "fail-closed",
|
|
37
|
+
timeoutMs: 5_000,
|
|
38
|
+
}),
|
|
39
|
+
builtinHook("typecheck-after-edit", {
|
|
40
|
+
stages: ["tool_result"],
|
|
41
|
+
effects: ["validator"],
|
|
42
|
+
failureMode: "fail-closed",
|
|
43
|
+
timeoutMs: 30_000,
|
|
44
|
+
}),
|
|
45
|
+
builtinHook("stop-verify", {
|
|
46
|
+
stages: ["session_stop"],
|
|
47
|
+
effects: ["validator"],
|
|
48
|
+
failureMode: "fail-closed",
|
|
49
|
+
timeoutMs: 30_000,
|
|
50
|
+
}),
|
|
51
|
+
builtinHook("subagent-stop-audit", {
|
|
52
|
+
stages: ["session_stop"],
|
|
53
|
+
effects: ["validator"],
|
|
54
|
+
failureMode: "fail-closed",
|
|
55
|
+
timeoutMs: 10_000,
|
|
56
|
+
}),
|
|
57
|
+
builtinHook("npm-audit-summary", {
|
|
58
|
+
stages: ["session_stop"],
|
|
59
|
+
effects: ["observer"],
|
|
60
|
+
failureMode: "fail-closed",
|
|
61
|
+
timeoutMs: 30_000,
|
|
62
|
+
}),
|
|
63
|
+
builtinHook("bounded-evidence", {
|
|
64
|
+
stages: ["tool_result", "session_stop"],
|
|
65
|
+
effects: ["validator"],
|
|
66
|
+
failureMode: "fail-closed",
|
|
67
|
+
timeoutMs: 10_000,
|
|
68
|
+
}),
|
|
69
|
+
builtinHook("document-artifact-guard", {
|
|
70
|
+
stages: ["tool_result"],
|
|
71
|
+
effects: ["validator"],
|
|
72
|
+
failureMode: "fail-closed",
|
|
73
|
+
timeoutMs: 5_000,
|
|
74
|
+
}),
|
|
75
|
+
builtinHook("component-spec-before-build", {
|
|
76
|
+
stages: ["tool_call"],
|
|
77
|
+
effects: ["validator"],
|
|
78
|
+
failureMode: "fail-closed",
|
|
79
|
+
timeoutMs: 5_000,
|
|
80
|
+
}),
|
|
81
|
+
builtinHook("visual-diff-after-edit", {
|
|
82
|
+
stages: ["tool_result"],
|
|
83
|
+
effects: ["validator"],
|
|
84
|
+
failureMode: "fail-closed",
|
|
85
|
+
timeoutMs: 10_000,
|
|
86
|
+
}),
|
|
87
|
+
];
|
|
88
|
+
/**
|
|
89
|
+
* Load the hook inventory. Builtin hooks are always present; if an agent
|
|
90
|
+
* directory is provided and its `hooks` subdirectory exists, any shell scripts
|
|
91
|
+
* discovered there are appended as non-builtin descriptors.
|
|
92
|
+
*/
|
|
93
|
+
export function loadHookInventory(agentDir) {
|
|
94
|
+
const hooks = [...BUILTIN_HOOKS];
|
|
95
|
+
if (agentDir) {
|
|
96
|
+
try {
|
|
97
|
+
const hooksDir = path.join(agentDir, "hooks");
|
|
98
|
+
const entries = fs.readdirSync(hooksDir).sort();
|
|
99
|
+
for (const entry of entries) {
|
|
100
|
+
if (!entry.endsWith(".sh"))
|
|
101
|
+
continue;
|
|
102
|
+
const name = entry.slice(0, -3);
|
|
103
|
+
if (hooks.some((h) => h.name === name))
|
|
104
|
+
continue;
|
|
105
|
+
hooks.push({
|
|
106
|
+
name,
|
|
107
|
+
scriptPath: path.join(hooksDir, entry),
|
|
108
|
+
builtin: false,
|
|
109
|
+
policy: sanitizeHookPolicy(DEFAULT_HOOK_POLICY),
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
// Hooks directory may be absent; builtin inventory is sufficient.
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return { hooks };
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=hook-inventory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-inventory.js","sourceRoot":"","sources":["../../src/core/hook-inventory.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Minimal hook inventory for the loadout runtime.\n *\n * The external harness resolves `scriptPath` to an actual shell script.\n * This module provides canonical names plus safe policy metadata so the\n * loadout layer can validate selectors without executing hooks.\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { HookPolicyMetadata } from \"./hooks/index.ts\";\nimport { DEFAULT_HOOK_POLICY, sanitizeHookPolicy } from \"./hooks/index.ts\";\n\nexport interface HookDescriptor {\n\tname: string;\n\tscriptPath?: string;\n\tbuiltin: boolean;\n\tpolicy: HookPolicyMetadata;\n}\n\nexport interface HookInventory {\n\thooks: readonly HookDescriptor[];\n}\n\nfunction builtinHook(name: string, policy: HookPolicyMetadata): HookDescriptor {\n\treturn { name, builtin: true, policy: sanitizeHookPolicy(policy) };\n}\n\nexport const BUILTIN_HOOKS: readonly HookDescriptor[] = [\n\tbuiltinHook(\"pre-shell-guard\", {\n\t\tstages: [\"tool_call\"],\n\t\teffects: [\"validator\"],\n\t\tfailureMode: \"fail-closed\",\n\t\ttimeoutMs: 3_000,\n\t}),\n\tbuiltinHook(\"protect-secrets\", {\n\t\tstages: [\"tool_call\", \"tool_result\"],\n\t\teffects: [\"validator\"],\n\t\tfailureMode: \"fail-closed\",\n\t\ttimeoutMs: 5_000,\n\t}),\n\tbuiltinHook(\"session-context\", {\n\t\tstages: [\"session_start\"],\n\t\teffects: [\"mutator\"],\n\t\tfailureMode: \"fail-closed\",\n\t\ttimeoutMs: 5_000,\n\t}),\n\tbuiltinHook(\"precompact-checkpoint\", {\n\t\tstages: [\"pre_compact\"],\n\t\teffects: [\"observer\"],\n\t\tfailureMode: \"fail-closed\",\n\t\ttimeoutMs: 5_000,\n\t}),\n\tbuiltinHook(\"typecheck-after-edit\", {\n\t\tstages: [\"tool_result\"],\n\t\teffects: [\"validator\"],\n\t\tfailureMode: \"fail-closed\",\n\t\ttimeoutMs: 30_000,\n\t}),\n\tbuiltinHook(\"stop-verify\", {\n\t\tstages: [\"session_stop\"],\n\t\teffects: [\"validator\"],\n\t\tfailureMode: \"fail-closed\",\n\t\ttimeoutMs: 30_000,\n\t}),\n\tbuiltinHook(\"subagent-stop-audit\", {\n\t\tstages: [\"session_stop\"],\n\t\teffects: [\"validator\"],\n\t\tfailureMode: \"fail-closed\",\n\t\ttimeoutMs: 10_000,\n\t}),\n\tbuiltinHook(\"npm-audit-summary\", {\n\t\tstages: [\"session_stop\"],\n\t\teffects: [\"observer\"],\n\t\tfailureMode: \"fail-closed\",\n\t\ttimeoutMs: 30_000,\n\t}),\n\tbuiltinHook(\"bounded-evidence\", {\n\t\tstages: [\"tool_result\", \"session_stop\"],\n\t\teffects: [\"validator\"],\n\t\tfailureMode: \"fail-closed\",\n\t\ttimeoutMs: 10_000,\n\t}),\n\tbuiltinHook(\"document-artifact-guard\", {\n\t\tstages: [\"tool_result\"],\n\t\teffects: [\"validator\"],\n\t\tfailureMode: \"fail-closed\",\n\t\ttimeoutMs: 5_000,\n\t}),\n\tbuiltinHook(\"component-spec-before-build\", {\n\t\tstages: [\"tool_call\"],\n\t\teffects: [\"validator\"],\n\t\tfailureMode: \"fail-closed\",\n\t\ttimeoutMs: 5_000,\n\t}),\n\tbuiltinHook(\"visual-diff-after-edit\", {\n\t\tstages: [\"tool_result\"],\n\t\teffects: [\"validator\"],\n\t\tfailureMode: \"fail-closed\",\n\t\ttimeoutMs: 10_000,\n\t}),\n];\n\n/**\n * Load the hook inventory. Builtin hooks are always present; if an agent\n * directory is provided and its `hooks` subdirectory exists, any shell scripts\n * discovered there are appended as non-builtin descriptors.\n */\nexport function loadHookInventory(agentDir?: string): HookInventory {\n\tconst hooks: HookDescriptor[] = [...BUILTIN_HOOKS];\n\tif (agentDir) {\n\t\ttry {\n\t\t\tconst hooksDir = path.join(agentDir, \"hooks\");\n\t\t\tconst entries = fs.readdirSync(hooksDir).sort();\n\t\t\tfor (const entry of entries) {\n\t\t\t\tif (!entry.endsWith(\".sh\")) continue;\n\t\t\t\tconst name = entry.slice(0, -3);\n\t\t\t\tif (hooks.some((h) => h.name === name)) continue;\n\t\t\t\thooks.push({\n\t\t\t\t\tname,\n\t\t\t\t\tscriptPath: path.join(hooksDir, entry),\n\t\t\t\t\tbuiltin: false,\n\t\t\t\t\tpolicy: sanitizeHookPolicy(DEFAULT_HOOK_POLICY),\n\t\t\t\t});\n\t\t\t}\n\t\t} catch {\n\t\t\t// Hooks directory may be absent; builtin inventory is sufficient.\n\t\t}\n\t}\n\treturn { hooks };\n}\n"]}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
import type { FailClosedToolCallResult, FailClosedToolResult, HookFailure } from "./types.ts";
|
|
1
|
+
import type { FailClosedToolCallResult, FailClosedToolResult, HookFailure, HookPolicyMetadata } from "./types.ts";
|
|
2
2
|
export declare const FAIL_CLOSED_REASON = "Tool execution was blocked by fail-closed hook policy.";
|
|
3
|
+
export declare const MAX_HOOK_TIMEOUT_MS = 30000;
|
|
4
|
+
export declare const DEFAULT_HOOK_POLICY: HookPolicyMetadata;
|
|
3
5
|
export declare function sanitizeHookFailure(failure?: unknown): HookFailure;
|
|
6
|
+
export declare function sanitizeHookPolicy(policy?: unknown): HookPolicyMetadata;
|
|
4
7
|
export declare function formatFailClosedReason(failure?: unknown): string;
|
|
5
8
|
export declare function createFailClosedToolCallResult(failure?: unknown): FailClosedToolCallResult;
|
|
6
9
|
export declare function createFailClosedToolResult(failure?: unknown): FailClosedToolResult;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fail-closed.d.ts","sourceRoot":"","sources":["../../../src/core/hooks/fail-closed.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,wBAAwB,EACxB,oBAAoB,EACpB,WAAW,
|
|
1
|
+
{"version":3,"file":"fail-closed.d.ts","sourceRoot":"","sources":["../../../src/core/hooks/fail-closed.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,wBAAwB,EACxB,oBAAoB,EACpB,WAAW,EAIX,kBAAkB,EAElB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,kBAAkB,2DAA2D,CAAC;AAC3F,eAAO,MAAM,mBAAmB,QAAS,CAAC;AAC1C,eAAO,MAAM,mBAAmB,EAAE,kBAKhC,CAAC;AA0FH,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,WAAW,CAWlE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,kBAAkB,CAgBvE;AAED,wBAAgB,sBAAsB,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAGhE;AAED,wBAAgB,8BAA8B,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,wBAAwB,CAK1F;AAED,wBAAgB,0BAA0B,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,oBAAoB,CAMlF","sourcesContent":["import type {\n\tFailClosedToolCallResult,\n\tFailClosedToolResult,\n\tHookFailure,\n\tHookFailureCode,\n\tHookFailureStage,\n\tHookPolicyEffect,\n\tHookPolicyMetadata,\n\tHookPolicyStage,\n} from \"./types.ts\";\n\nexport const FAIL_CLOSED_REASON = \"Tool execution was blocked by fail-closed hook policy.\";\nexport const MAX_HOOK_TIMEOUT_MS = 30_000;\nexport const DEFAULT_HOOK_POLICY: HookPolicyMetadata = freezeHookPolicy({\n\tstages: [\"tool_call\", \"tool_result\"],\n\teffects: [\"validator\"],\n\tfailureMode: \"fail-closed\",\n\ttimeoutMs: 5_000,\n});\n\nconst DEFAULT_HOOK_FAILURE: HookFailure = freezeHookFailure({\n\ttype: \"hook_failure\",\n\tsanitized: true,\n\tcode: \"hook_failed\",\n\tstage: \"unknown\",\n});\n\nconst HOOK_FAILURE_CODES: ReadonlySet<string> = new Set<string>([\n\t\"hook_failed\",\n\t\"hook_rejected\",\n\t\"hook_timeout\",\n\t\"hook_unavailable\",\n]);\n\nconst HOOK_FAILURE_STAGES: ReadonlySet<string> = new Set<string>([\"tool_call\", \"tool_result\", \"unknown\"]);\nconst HOOK_POLICY_STAGES: readonly HookPolicyStage[] = [\n\t\"tool_call\",\n\t\"tool_result\",\n\t\"session_start\",\n\t\"pre_compact\",\n\t\"session_stop\",\n];\nconst HOOK_POLICY_EFFECTS: readonly HookPolicyEffect[] = [\"validator\", \"mutator\", \"observer\"];\nconst HOOK_POLICY_STAGE_SET: ReadonlySet<string> = new Set<string>(HOOK_POLICY_STAGES);\nconst HOOK_POLICY_EFFECT_SET: ReadonlySet<string> = new Set<string>(HOOK_POLICY_EFFECTS);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction isHookFailureCode(value: unknown): value is HookFailureCode {\n\treturn typeof value === \"string\" && HOOK_FAILURE_CODES.has(value);\n}\n\nfunction isHookFailureStage(value: unknown): value is HookFailureStage {\n\treturn typeof value === \"string\" && HOOK_FAILURE_STAGES.has(value);\n}\n\nfunction isHookPolicyStage(value: unknown): value is HookPolicyStage {\n\treturn typeof value === \"string\" && HOOK_POLICY_STAGE_SET.has(value);\n}\n\nfunction isHookPolicyEffect(value: unknown): value is HookPolicyEffect {\n\treturn typeof value === \"string\" && HOOK_POLICY_EFFECT_SET.has(value);\n}\n\nfunction readHookFailureCode(value: unknown): HookFailureCode {\n\treturn isHookFailureCode(value) ? value : DEFAULT_HOOK_FAILURE.code;\n}\n\nfunction readHookFailureStage(value: unknown): HookFailureStage {\n\treturn isHookFailureStage(value) ? value : DEFAULT_HOOK_FAILURE.stage;\n}\n\nfunction freezeHookFailure(failure: HookFailure): HookFailure {\n\treturn Object.freeze({ ...failure });\n}\n\nfunction freezeHookPolicy(policy: HookPolicyMetadata): HookPolicyMetadata {\n\treturn Object.freeze({\n\t\tstages: Object.freeze([...policy.stages]),\n\t\teffects: Object.freeze([...policy.effects]),\n\t\tfailureMode: \"fail-closed\",\n\t\ttimeoutMs: policy.timeoutMs,\n\t});\n}\n\nfunction sanitizePolicyStages(value: unknown): readonly HookPolicyStage[] {\n\tif (!Array.isArray(value)) return [...DEFAULT_HOOK_POLICY.stages];\n\tconst present = new Set(value.filter(isHookPolicyStage));\n\tif (present.size === 0) return [...DEFAULT_HOOK_POLICY.stages];\n\treturn HOOK_POLICY_STAGES.filter((stage) => present.has(stage));\n}\n\nfunction sanitizePolicyEffects(value: unknown): readonly HookPolicyEffect[] {\n\tif (!Array.isArray(value)) return [...DEFAULT_HOOK_POLICY.effects];\n\tconst present = new Set(value.filter(isHookPolicyEffect));\n\tif (present.size === 0) return [...DEFAULT_HOOK_POLICY.effects];\n\treturn HOOK_POLICY_EFFECTS.filter((effect) => present.has(effect));\n}\n\nfunction sanitizePolicyTimeout(value: unknown): number {\n\tif (typeof value !== \"number\" || !Number.isFinite(value)) return DEFAULT_HOOK_POLICY.timeoutMs;\n\tconst timeoutMs = Math.trunc(value);\n\tif (timeoutMs <= 0 || timeoutMs > MAX_HOOK_TIMEOUT_MS) return DEFAULT_HOOK_POLICY.timeoutMs;\n\treturn timeoutMs;\n}\n\nexport function sanitizeHookFailure(failure?: unknown): HookFailure {\n\tif (!isRecord(failure)) {\n\t\treturn freezeHookFailure(DEFAULT_HOOK_FAILURE);\n\t}\n\n\treturn freezeHookFailure({\n\t\ttype: \"hook_failure\",\n\t\tsanitized: true,\n\t\tcode: readHookFailureCode(failure.code),\n\t\tstage: readHookFailureStage(failure.stage),\n\t});\n}\n\nexport function sanitizeHookPolicy(policy?: unknown): HookPolicyMetadata {\n\tif (!isRecord(policy)) {\n\t\treturn freezeHookPolicy({\n\t\t\tstages: [...DEFAULT_HOOK_POLICY.stages],\n\t\t\teffects: [...DEFAULT_HOOK_POLICY.effects],\n\t\t\tfailureMode: \"fail-closed\",\n\t\t\ttimeoutMs: DEFAULT_HOOK_POLICY.timeoutMs,\n\t\t});\n\t}\n\n\treturn freezeHookPolicy({\n\t\tstages: sanitizePolicyStages(policy.stages),\n\t\teffects: sanitizePolicyEffects(policy.effects),\n\t\tfailureMode: \"fail-closed\",\n\t\ttimeoutMs: sanitizePolicyTimeout(policy.timeoutMs),\n\t});\n}\n\nexport function formatFailClosedReason(failure?: unknown): string {\n\tvoid failure;\n\treturn FAIL_CLOSED_REASON;\n}\n\nexport function createFailClosedToolCallResult(failure?: unknown): FailClosedToolCallResult {\n\treturn {\n\t\tblock: true,\n\t\treason: formatFailClosedReason(failure),\n\t};\n}\n\nexport function createFailClosedToolResult(failure?: unknown): FailClosedToolResult {\n\treturn {\n\t\tcontent: [{ type: \"text\", text: formatFailClosedReason(failure) }],\n\t\tdetails: sanitizeHookFailure(failure),\n\t\tisError: true,\n\t};\n}\n"]}
|
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
export const FAIL_CLOSED_REASON = "Tool execution was blocked by fail-closed hook policy.";
|
|
2
|
-
const
|
|
2
|
+
export const MAX_HOOK_TIMEOUT_MS = 30_000;
|
|
3
|
+
export const DEFAULT_HOOK_POLICY = freezeHookPolicy({
|
|
4
|
+
stages: ["tool_call", "tool_result"],
|
|
5
|
+
effects: ["validator"],
|
|
6
|
+
failureMode: "fail-closed",
|
|
7
|
+
timeoutMs: 5_000,
|
|
8
|
+
});
|
|
9
|
+
const DEFAULT_HOOK_FAILURE = freezeHookFailure({
|
|
3
10
|
type: "hook_failure",
|
|
4
11
|
sanitized: true,
|
|
5
12
|
code: "hook_failed",
|
|
6
13
|
stage: "unknown",
|
|
7
|
-
};
|
|
14
|
+
});
|
|
8
15
|
const HOOK_FAILURE_CODES = new Set([
|
|
9
16
|
"hook_failed",
|
|
10
17
|
"hook_rejected",
|
|
@@ -12,6 +19,16 @@ const HOOK_FAILURE_CODES = new Set([
|
|
|
12
19
|
"hook_unavailable",
|
|
13
20
|
]);
|
|
14
21
|
const HOOK_FAILURE_STAGES = new Set(["tool_call", "tool_result", "unknown"]);
|
|
22
|
+
const HOOK_POLICY_STAGES = [
|
|
23
|
+
"tool_call",
|
|
24
|
+
"tool_result",
|
|
25
|
+
"session_start",
|
|
26
|
+
"pre_compact",
|
|
27
|
+
"session_stop",
|
|
28
|
+
];
|
|
29
|
+
const HOOK_POLICY_EFFECTS = ["validator", "mutator", "observer"];
|
|
30
|
+
const HOOK_POLICY_STAGE_SET = new Set(HOOK_POLICY_STAGES);
|
|
31
|
+
const HOOK_POLICY_EFFECT_SET = new Set(HOOK_POLICY_EFFECTS);
|
|
15
32
|
function isRecord(value) {
|
|
16
33
|
return typeof value === "object" && value !== null;
|
|
17
34
|
}
|
|
@@ -21,22 +38,79 @@ function isHookFailureCode(value) {
|
|
|
21
38
|
function isHookFailureStage(value) {
|
|
22
39
|
return typeof value === "string" && HOOK_FAILURE_STAGES.has(value);
|
|
23
40
|
}
|
|
41
|
+
function isHookPolicyStage(value) {
|
|
42
|
+
return typeof value === "string" && HOOK_POLICY_STAGE_SET.has(value);
|
|
43
|
+
}
|
|
44
|
+
function isHookPolicyEffect(value) {
|
|
45
|
+
return typeof value === "string" && HOOK_POLICY_EFFECT_SET.has(value);
|
|
46
|
+
}
|
|
24
47
|
function readHookFailureCode(value) {
|
|
25
48
|
return isHookFailureCode(value) ? value : DEFAULT_HOOK_FAILURE.code;
|
|
26
49
|
}
|
|
27
50
|
function readHookFailureStage(value) {
|
|
28
51
|
return isHookFailureStage(value) ? value : DEFAULT_HOOK_FAILURE.stage;
|
|
29
52
|
}
|
|
53
|
+
function freezeHookFailure(failure) {
|
|
54
|
+
return Object.freeze({ ...failure });
|
|
55
|
+
}
|
|
56
|
+
function freezeHookPolicy(policy) {
|
|
57
|
+
return Object.freeze({
|
|
58
|
+
stages: Object.freeze([...policy.stages]),
|
|
59
|
+
effects: Object.freeze([...policy.effects]),
|
|
60
|
+
failureMode: "fail-closed",
|
|
61
|
+
timeoutMs: policy.timeoutMs,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
function sanitizePolicyStages(value) {
|
|
65
|
+
if (!Array.isArray(value))
|
|
66
|
+
return [...DEFAULT_HOOK_POLICY.stages];
|
|
67
|
+
const present = new Set(value.filter(isHookPolicyStage));
|
|
68
|
+
if (present.size === 0)
|
|
69
|
+
return [...DEFAULT_HOOK_POLICY.stages];
|
|
70
|
+
return HOOK_POLICY_STAGES.filter((stage) => present.has(stage));
|
|
71
|
+
}
|
|
72
|
+
function sanitizePolicyEffects(value) {
|
|
73
|
+
if (!Array.isArray(value))
|
|
74
|
+
return [...DEFAULT_HOOK_POLICY.effects];
|
|
75
|
+
const present = new Set(value.filter(isHookPolicyEffect));
|
|
76
|
+
if (present.size === 0)
|
|
77
|
+
return [...DEFAULT_HOOK_POLICY.effects];
|
|
78
|
+
return HOOK_POLICY_EFFECTS.filter((effect) => present.has(effect));
|
|
79
|
+
}
|
|
80
|
+
function sanitizePolicyTimeout(value) {
|
|
81
|
+
if (typeof value !== "number" || !Number.isFinite(value))
|
|
82
|
+
return DEFAULT_HOOK_POLICY.timeoutMs;
|
|
83
|
+
const timeoutMs = Math.trunc(value);
|
|
84
|
+
if (timeoutMs <= 0 || timeoutMs > MAX_HOOK_TIMEOUT_MS)
|
|
85
|
+
return DEFAULT_HOOK_POLICY.timeoutMs;
|
|
86
|
+
return timeoutMs;
|
|
87
|
+
}
|
|
30
88
|
export function sanitizeHookFailure(failure) {
|
|
31
89
|
if (!isRecord(failure)) {
|
|
32
|
-
return
|
|
90
|
+
return freezeHookFailure(DEFAULT_HOOK_FAILURE);
|
|
33
91
|
}
|
|
34
|
-
return {
|
|
92
|
+
return freezeHookFailure({
|
|
35
93
|
type: "hook_failure",
|
|
36
94
|
sanitized: true,
|
|
37
95
|
code: readHookFailureCode(failure.code),
|
|
38
96
|
stage: readHookFailureStage(failure.stage),
|
|
39
|
-
};
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
export function sanitizeHookPolicy(policy) {
|
|
100
|
+
if (!isRecord(policy)) {
|
|
101
|
+
return freezeHookPolicy({
|
|
102
|
+
stages: [...DEFAULT_HOOK_POLICY.stages],
|
|
103
|
+
effects: [...DEFAULT_HOOK_POLICY.effects],
|
|
104
|
+
failureMode: "fail-closed",
|
|
105
|
+
timeoutMs: DEFAULT_HOOK_POLICY.timeoutMs,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
return freezeHookPolicy({
|
|
109
|
+
stages: sanitizePolicyStages(policy.stages),
|
|
110
|
+
effects: sanitizePolicyEffects(policy.effects),
|
|
111
|
+
failureMode: "fail-closed",
|
|
112
|
+
timeoutMs: sanitizePolicyTimeout(policy.timeoutMs),
|
|
113
|
+
});
|
|
40
114
|
}
|
|
41
115
|
export function formatFailClosedReason(failure) {
|
|
42
116
|
void failure;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fail-closed.js","sourceRoot":"","sources":["../../../src/core/hooks/fail-closed.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fail-closed.js","sourceRoot":"","sources":["../../../src/core/hooks/fail-closed.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,MAAM,kBAAkB,GAAG,wDAAwD,CAAC;AAC3F,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAC1C,MAAM,CAAC,MAAM,mBAAmB,GAAuB,gBAAgB,CAAC;IACvE,MAAM,EAAE,CAAC,WAAW,EAAE,aAAa,CAAC;IACpC,OAAO,EAAE,CAAC,WAAW,CAAC;IACtB,WAAW,EAAE,aAAa;IAC1B,SAAS,EAAE,KAAK;CAChB,CAAC,CAAC;AAEH,MAAM,oBAAoB,GAAgB,iBAAiB,CAAC;IAC3D,IAAI,EAAE,cAAc;IACpB,SAAS,EAAE,IAAI;IACf,IAAI,EAAE,aAAa;IACnB,KAAK,EAAE,SAAS;CAChB,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAAwB,IAAI,GAAG,CAAS;IAC/D,aAAa;IACb,eAAe;IACf,cAAc;IACd,kBAAkB;CAClB,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAAwB,IAAI,GAAG,CAAS,CAAC,WAAW,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC;AAC1G,MAAM,kBAAkB,GAA+B;IACtD,WAAW;IACX,aAAa;IACb,eAAe;IACf,aAAa;IACb,cAAc;CACd,CAAC;AACF,MAAM,mBAAmB,GAAgC,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AAC9F,MAAM,qBAAqB,GAAwB,IAAI,GAAG,CAAS,kBAAkB,CAAC,CAAC;AACvF,MAAM,sBAAsB,GAAwB,IAAI,GAAG,CAAS,mBAAmB,CAAC,CAAC;AAEzF,SAAS,QAAQ,CAAC,KAAc,EAAoC;IACnE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AAAA,CACnD;AAED,SAAS,iBAAiB,CAAC,KAAc,EAA4B;IACpE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAAA,CAClE;AAED,SAAS,kBAAkB,CAAC,KAAc,EAA6B;IACtE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAAA,CACnE;AAED,SAAS,iBAAiB,CAAC,KAAc,EAA4B;IACpE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAAA,CACrE;AAED,SAAS,kBAAkB,CAAC,KAAc,EAA6B;IACtE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAAA,CACtE;AAED,SAAS,mBAAmB,CAAC,KAAc,EAAmB;IAC7D,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC;AAAA,CACpE;AAED,SAAS,oBAAoB,CAAC,KAAc,EAAoB;IAC/D,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC;AAAA,CACtE;AAED,SAAS,iBAAiB,CAAC,OAAoB,EAAe;IAC7D,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;AAAA,CACrC;AAED,SAAS,gBAAgB,CAAC,MAA0B,EAAsB;IACzE,OAAO,MAAM,CAAC,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QACzC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAC3C,WAAW,EAAE,aAAa;QAC1B,SAAS,EAAE,MAAM,CAAC,SAAS;KAC3B,CAAC,CAAC;AAAA,CACH;AAED,SAAS,oBAAoB,CAAC,KAAc,EAA8B;IACzE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC;IACzD,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC/D,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AAAA,CAChE;AAED,SAAS,qBAAqB,CAAC,KAAc,EAA+B;IAC3E,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC1D,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAChE,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AAAA,CACnE;AAED,SAAS,qBAAqB,CAAC,KAAc,EAAU;IACtD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,mBAAmB,CAAC,SAAS,CAAC;IAC/F,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,SAAS,IAAI,CAAC,IAAI,SAAS,GAAG,mBAAmB;QAAE,OAAO,mBAAmB,CAAC,SAAS,CAAC;IAC5F,OAAO,SAAS,CAAC;AAAA,CACjB;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAiB,EAAe;IACnE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,OAAO,iBAAiB,CAAC,oBAAoB,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,iBAAiB,CAAC;QACxB,IAAI,EAAE,cAAc;QACpB,SAAS,EAAE,IAAI;QACf,IAAI,EAAE,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC;QACvC,KAAK,EAAE,oBAAoB,CAAC,OAAO,CAAC,KAAK,CAAC;KAC1C,CAAC,CAAC;AAAA,CACH;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAgB,EAAsB;IACxE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACvB,OAAO,gBAAgB,CAAC;YACvB,MAAM,EAAE,CAAC,GAAG,mBAAmB,CAAC,MAAM,CAAC;YACvC,OAAO,EAAE,CAAC,GAAG,mBAAmB,CAAC,OAAO,CAAC;YACzC,WAAW,EAAE,aAAa;YAC1B,SAAS,EAAE,mBAAmB,CAAC,SAAS;SACxC,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,gBAAgB,CAAC;QACvB,MAAM,EAAE,oBAAoB,CAAC,MAAM,CAAC,MAAM,CAAC;QAC3C,OAAO,EAAE,qBAAqB,CAAC,MAAM,CAAC,OAAO,CAAC;QAC9C,WAAW,EAAE,aAAa;QAC1B,SAAS,EAAE,qBAAqB,CAAC,MAAM,CAAC,SAAS,CAAC;KAClD,CAAC,CAAC;AAAA,CACH;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAiB,EAAU;IACjE,KAAK,OAAO,CAAC;IACb,OAAO,kBAAkB,CAAC;AAAA,CAC1B;AAED,MAAM,UAAU,8BAA8B,CAAC,OAAiB,EAA4B;IAC3F,OAAO;QACN,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,sBAAsB,CAAC,OAAO,CAAC;KACvC,CAAC;AAAA,CACF;AAED,MAAM,UAAU,0BAA0B,CAAC,OAAiB,EAAwB;IACnF,OAAO;QACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,sBAAsB,CAAC,OAAO,CAAC,EAAE,CAAC;QAClE,OAAO,EAAE,mBAAmB,CAAC,OAAO,CAAC;QACrC,OAAO,EAAE,IAAI;KACb,CAAC;AAAA,CACF","sourcesContent":["import type {\n\tFailClosedToolCallResult,\n\tFailClosedToolResult,\n\tHookFailure,\n\tHookFailureCode,\n\tHookFailureStage,\n\tHookPolicyEffect,\n\tHookPolicyMetadata,\n\tHookPolicyStage,\n} from \"./types.ts\";\n\nexport const FAIL_CLOSED_REASON = \"Tool execution was blocked by fail-closed hook policy.\";\nexport const MAX_HOOK_TIMEOUT_MS = 30_000;\nexport const DEFAULT_HOOK_POLICY: HookPolicyMetadata = freezeHookPolicy({\n\tstages: [\"tool_call\", \"tool_result\"],\n\teffects: [\"validator\"],\n\tfailureMode: \"fail-closed\",\n\ttimeoutMs: 5_000,\n});\n\nconst DEFAULT_HOOK_FAILURE: HookFailure = freezeHookFailure({\n\ttype: \"hook_failure\",\n\tsanitized: true,\n\tcode: \"hook_failed\",\n\tstage: \"unknown\",\n});\n\nconst HOOK_FAILURE_CODES: ReadonlySet<string> = new Set<string>([\n\t\"hook_failed\",\n\t\"hook_rejected\",\n\t\"hook_timeout\",\n\t\"hook_unavailable\",\n]);\n\nconst HOOK_FAILURE_STAGES: ReadonlySet<string> = new Set<string>([\"tool_call\", \"tool_result\", \"unknown\"]);\nconst HOOK_POLICY_STAGES: readonly HookPolicyStage[] = [\n\t\"tool_call\",\n\t\"tool_result\",\n\t\"session_start\",\n\t\"pre_compact\",\n\t\"session_stop\",\n];\nconst HOOK_POLICY_EFFECTS: readonly HookPolicyEffect[] = [\"validator\", \"mutator\", \"observer\"];\nconst HOOK_POLICY_STAGE_SET: ReadonlySet<string> = new Set<string>(HOOK_POLICY_STAGES);\nconst HOOK_POLICY_EFFECT_SET: ReadonlySet<string> = new Set<string>(HOOK_POLICY_EFFECTS);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction isHookFailureCode(value: unknown): value is HookFailureCode {\n\treturn typeof value === \"string\" && HOOK_FAILURE_CODES.has(value);\n}\n\nfunction isHookFailureStage(value: unknown): value is HookFailureStage {\n\treturn typeof value === \"string\" && HOOK_FAILURE_STAGES.has(value);\n}\n\nfunction isHookPolicyStage(value: unknown): value is HookPolicyStage {\n\treturn typeof value === \"string\" && HOOK_POLICY_STAGE_SET.has(value);\n}\n\nfunction isHookPolicyEffect(value: unknown): value is HookPolicyEffect {\n\treturn typeof value === \"string\" && HOOK_POLICY_EFFECT_SET.has(value);\n}\n\nfunction readHookFailureCode(value: unknown): HookFailureCode {\n\treturn isHookFailureCode(value) ? value : DEFAULT_HOOK_FAILURE.code;\n}\n\nfunction readHookFailureStage(value: unknown): HookFailureStage {\n\treturn isHookFailureStage(value) ? value : DEFAULT_HOOK_FAILURE.stage;\n}\n\nfunction freezeHookFailure(failure: HookFailure): HookFailure {\n\treturn Object.freeze({ ...failure });\n}\n\nfunction freezeHookPolicy(policy: HookPolicyMetadata): HookPolicyMetadata {\n\treturn Object.freeze({\n\t\tstages: Object.freeze([...policy.stages]),\n\t\teffects: Object.freeze([...policy.effects]),\n\t\tfailureMode: \"fail-closed\",\n\t\ttimeoutMs: policy.timeoutMs,\n\t});\n}\n\nfunction sanitizePolicyStages(value: unknown): readonly HookPolicyStage[] {\n\tif (!Array.isArray(value)) return [...DEFAULT_HOOK_POLICY.stages];\n\tconst present = new Set(value.filter(isHookPolicyStage));\n\tif (present.size === 0) return [...DEFAULT_HOOK_POLICY.stages];\n\treturn HOOK_POLICY_STAGES.filter((stage) => present.has(stage));\n}\n\nfunction sanitizePolicyEffects(value: unknown): readonly HookPolicyEffect[] {\n\tif (!Array.isArray(value)) return [...DEFAULT_HOOK_POLICY.effects];\n\tconst present = new Set(value.filter(isHookPolicyEffect));\n\tif (present.size === 0) return [...DEFAULT_HOOK_POLICY.effects];\n\treturn HOOK_POLICY_EFFECTS.filter((effect) => present.has(effect));\n}\n\nfunction sanitizePolicyTimeout(value: unknown): number {\n\tif (typeof value !== \"number\" || !Number.isFinite(value)) return DEFAULT_HOOK_POLICY.timeoutMs;\n\tconst timeoutMs = Math.trunc(value);\n\tif (timeoutMs <= 0 || timeoutMs > MAX_HOOK_TIMEOUT_MS) return DEFAULT_HOOK_POLICY.timeoutMs;\n\treturn timeoutMs;\n}\n\nexport function sanitizeHookFailure(failure?: unknown): HookFailure {\n\tif (!isRecord(failure)) {\n\t\treturn freezeHookFailure(DEFAULT_HOOK_FAILURE);\n\t}\n\n\treturn freezeHookFailure({\n\t\ttype: \"hook_failure\",\n\t\tsanitized: true,\n\t\tcode: readHookFailureCode(failure.code),\n\t\tstage: readHookFailureStage(failure.stage),\n\t});\n}\n\nexport function sanitizeHookPolicy(policy?: unknown): HookPolicyMetadata {\n\tif (!isRecord(policy)) {\n\t\treturn freezeHookPolicy({\n\t\t\tstages: [...DEFAULT_HOOK_POLICY.stages],\n\t\t\teffects: [...DEFAULT_HOOK_POLICY.effects],\n\t\t\tfailureMode: \"fail-closed\",\n\t\t\ttimeoutMs: DEFAULT_HOOK_POLICY.timeoutMs,\n\t\t});\n\t}\n\n\treturn freezeHookPolicy({\n\t\tstages: sanitizePolicyStages(policy.stages),\n\t\teffects: sanitizePolicyEffects(policy.effects),\n\t\tfailureMode: \"fail-closed\",\n\t\ttimeoutMs: sanitizePolicyTimeout(policy.timeoutMs),\n\t});\n}\n\nexport function formatFailClosedReason(failure?: unknown): string {\n\tvoid failure;\n\treturn FAIL_CLOSED_REASON;\n}\n\nexport function createFailClosedToolCallResult(failure?: unknown): FailClosedToolCallResult {\n\treturn {\n\t\tblock: true,\n\t\treason: formatFailClosedReason(failure),\n\t};\n}\n\nexport function createFailClosedToolResult(failure?: unknown): FailClosedToolResult {\n\treturn {\n\t\tcontent: [{ type: \"text\", text: formatFailClosedReason(failure) }],\n\t\tdetails: sanitizeHookFailure(failure),\n\t\tisError: true,\n\t};\n}\n"]}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { createFailClosedToolCallResult, createFailClosedToolResult, FAIL_CLOSED_REASON, formatFailClosedReason, sanitizeHookFailure, } from "./fail-closed.ts";
|
|
2
|
-
export type { FailClosedTextContent, FailClosedToolCallResult, FailClosedToolResult, HookFailure, HookFailureCode, HookFailureStage, } from "./types.ts";
|
|
1
|
+
export { createFailClosedToolCallResult, createFailClosedToolResult, DEFAULT_HOOK_POLICY, FAIL_CLOSED_REASON, formatFailClosedReason, MAX_HOOK_TIMEOUT_MS, sanitizeHookFailure, sanitizeHookPolicy, } from "./fail-closed.ts";
|
|
2
|
+
export type { FailClosedTextContent, FailClosedToolCallResult, FailClosedToolResult, HookFailure, HookFailureCode, HookFailureMode, HookFailureStage, HookPolicyEffect, HookPolicyMetadata, HookPolicyStage, } from "./types.ts";
|
|
3
3
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,8BAA8B,EAC9B,0BAA0B,EAC1B,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,8BAA8B,EAC9B,0BAA0B,EAC1B,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACX,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,EACpB,WAAW,EACX,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,GACf,MAAM,YAAY,CAAC","sourcesContent":["export {\n\tcreateFailClosedToolCallResult,\n\tcreateFailClosedToolResult,\n\tDEFAULT_HOOK_POLICY,\n\tFAIL_CLOSED_REASON,\n\tformatFailClosedReason,\n\tMAX_HOOK_TIMEOUT_MS,\n\tsanitizeHookFailure,\n\tsanitizeHookPolicy,\n} from \"./fail-closed.ts\";\nexport type {\n\tFailClosedTextContent,\n\tFailClosedToolCallResult,\n\tFailClosedToolResult,\n\tHookFailure,\n\tHookFailureCode,\n\tHookFailureMode,\n\tHookFailureStage,\n\tHookPolicyEffect,\n\tHookPolicyMetadata,\n\tHookPolicyStage,\n} from \"./types.ts\";\n"]}
|
package/dist/core/hooks/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { createFailClosedToolCallResult, createFailClosedToolResult, FAIL_CLOSED_REASON, formatFailClosedReason, sanitizeHookFailure, } from "./fail-closed.js";
|
|
1
|
+
export { createFailClosedToolCallResult, createFailClosedToolResult, DEFAULT_HOOK_POLICY, FAIL_CLOSED_REASON, formatFailClosedReason, MAX_HOOK_TIMEOUT_MS, sanitizeHookFailure, sanitizeHookPolicy, } from "./fail-closed.js";
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,8BAA8B,EAC9B,0BAA0B,EAC1B,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,8BAA8B,EAC9B,0BAA0B,EAC1B,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,GAClB,MAAM,kBAAkB,CAAC","sourcesContent":["export {\n\tcreateFailClosedToolCallResult,\n\tcreateFailClosedToolResult,\n\tDEFAULT_HOOK_POLICY,\n\tFAIL_CLOSED_REASON,\n\tformatFailClosedReason,\n\tMAX_HOOK_TIMEOUT_MS,\n\tsanitizeHookFailure,\n\tsanitizeHookPolicy,\n} from \"./fail-closed.ts\";\nexport type {\n\tFailClosedTextContent,\n\tFailClosedToolCallResult,\n\tFailClosedToolResult,\n\tHookFailure,\n\tHookFailureCode,\n\tHookFailureMode,\n\tHookFailureStage,\n\tHookPolicyEffect,\n\tHookPolicyMetadata,\n\tHookPolicyStage,\n} from \"./types.ts\";\n"]}
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
export type HookFailureCode = "hook_failed" | "hook_rejected" | "hook_timeout" | "hook_unavailable";
|
|
2
2
|
export type HookFailureStage = "tool_call" | "tool_result" | "unknown";
|
|
3
|
+
export type HookPolicyStage = "tool_call" | "tool_result" | "session_start" | "pre_compact" | "session_stop";
|
|
4
|
+
export type HookPolicyEffect = "validator" | "mutator" | "observer";
|
|
5
|
+
export type HookFailureMode = "fail-closed";
|
|
6
|
+
export interface HookPolicyMetadata {
|
|
7
|
+
stages: readonly HookPolicyStage[];
|
|
8
|
+
effects: readonly HookPolicyEffect[];
|
|
9
|
+
failureMode: HookFailureMode;
|
|
10
|
+
timeoutMs: number;
|
|
11
|
+
}
|
|
3
12
|
/**
|
|
4
13
|
* Sanitized hook failure metadata safe to expose in tool results.
|
|
5
14
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/hooks/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG,aAAa,GAAG,eAAe,GAAG,cAAc,GAAG,kBAAkB,CAAC;AAEpG,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,aAAa,GAAG,SAAS,CAAC;AAEvE;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,IAAI,CAAC;IAChB,IAAI,EAAE,eAAe,CAAC;IACtB,KAAK,EAAE,gBAAgB,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,wBAAwB;IACxC,KAAK,EAAE,IAAI,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACpC,OAAO,EAAE,qBAAqB,EAAE,CAAC;IACjC,OAAO,EAAE,WAAW,CAAC;IACrB,OAAO,EAAE,IAAI,CAAC;CACd","sourcesContent":["export type HookFailureCode = \"hook_failed\" | \"hook_rejected\" | \"hook_timeout\" | \"hook_unavailable\";\n\nexport type HookFailureStage = \"tool_call\" | \"tool_result\" | \"unknown\";\n\n/**\n * Sanitized hook failure metadata safe to expose in tool results.\n *\n * This structure intentionally carries only bounded coded values. It must not\n * include raw causes, stacks, commands, content, or filesystem paths.\n */\nexport interface HookFailure {\n\ttype: \"hook_failure\";\n\tsanitized: true;\n\tcode: HookFailureCode;\n\tstage: HookFailureStage;\n}\n\nexport interface FailClosedTextContent {\n\ttype: \"text\";\n\ttext: string;\n}\n\nexport interface FailClosedToolCallResult {\n\tblock: true;\n\treason: string;\n}\n\nexport interface FailClosedToolResult {\n\tcontent: FailClosedTextContent[];\n\tdetails: HookFailure;\n\tisError: true;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/hooks/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG,aAAa,GAAG,eAAe,GAAG,cAAc,GAAG,kBAAkB,CAAC;AAEpG,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,aAAa,GAAG,SAAS,CAAC;AAEvE,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG,aAAa,GAAG,eAAe,GAAG,aAAa,GAAG,cAAc,CAAC;AAE7G,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,SAAS,GAAG,UAAU,CAAC;AAEpE,MAAM,MAAM,eAAe,GAAG,aAAa,CAAC;AAE5C,MAAM,WAAW,kBAAkB;IAClC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;IACnC,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACrC,WAAW,EAAE,eAAe,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,IAAI,CAAC;IAChB,IAAI,EAAE,eAAe,CAAC;IACtB,KAAK,EAAE,gBAAgB,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,wBAAwB;IACxC,KAAK,EAAE,IAAI,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACpC,OAAO,EAAE,qBAAqB,EAAE,CAAC;IACjC,OAAO,EAAE,WAAW,CAAC;IACrB,OAAO,EAAE,IAAI,CAAC;CACd","sourcesContent":["export type HookFailureCode = \"hook_failed\" | \"hook_rejected\" | \"hook_timeout\" | \"hook_unavailable\";\n\nexport type HookFailureStage = \"tool_call\" | \"tool_result\" | \"unknown\";\n\nexport type HookPolicyStage = \"tool_call\" | \"tool_result\" | \"session_start\" | \"pre_compact\" | \"session_stop\";\n\nexport type HookPolicyEffect = \"validator\" | \"mutator\" | \"observer\";\n\nexport type HookFailureMode = \"fail-closed\";\n\nexport interface HookPolicyMetadata {\n\tstages: readonly HookPolicyStage[];\n\teffects: readonly HookPolicyEffect[];\n\tfailureMode: HookFailureMode;\n\ttimeoutMs: number;\n}\n\n/**\n * Sanitized hook failure metadata safe to expose in tool results.\n *\n * This structure intentionally carries only bounded coded values. It must not\n * include raw causes, stacks, commands, content, or filesystem paths.\n */\nexport interface HookFailure {\n\ttype: \"hook_failure\";\n\tsanitized: true;\n\tcode: HookFailureCode;\n\tstage: HookFailureStage;\n}\n\nexport interface FailClosedTextContent {\n\ttype: \"text\";\n\ttext: string;\n}\n\nexport interface FailClosedToolCallResult {\n\tblock: true;\n\treason: string;\n}\n\nexport interface FailClosedToolResult {\n\tcontent: FailClosedTextContent[];\n\tdetails: HookFailure;\n\tisError: true;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/hooks/types.ts"],"names":[],"mappings":"","sourcesContent":["export type HookFailureCode = \"hook_failed\" | \"hook_rejected\" | \"hook_timeout\" | \"hook_unavailable\";\n\nexport type HookFailureStage = \"tool_call\" | \"tool_result\" | \"unknown\";\n\n/**\n * Sanitized hook failure metadata safe to expose in tool results.\n *\n * This structure intentionally carries only bounded coded values. It must not\n * include raw causes, stacks, commands, content, or filesystem paths.\n */\nexport interface HookFailure {\n\ttype: \"hook_failure\";\n\tsanitized: true;\n\tcode: HookFailureCode;\n\tstage: HookFailureStage;\n}\n\nexport interface FailClosedTextContent {\n\ttype: \"text\";\n\ttext: string;\n}\n\nexport interface FailClosedToolCallResult {\n\tblock: true;\n\treason: string;\n}\n\nexport interface FailClosedToolResult {\n\tcontent: FailClosedTextContent[];\n\tdetails: HookFailure;\n\tisError: true;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/hooks/types.ts"],"names":[],"mappings":"","sourcesContent":["export type HookFailureCode = \"hook_failed\" | \"hook_rejected\" | \"hook_timeout\" | \"hook_unavailable\";\n\nexport type HookFailureStage = \"tool_call\" | \"tool_result\" | \"unknown\";\n\nexport type HookPolicyStage = \"tool_call\" | \"tool_result\" | \"session_start\" | \"pre_compact\" | \"session_stop\";\n\nexport type HookPolicyEffect = \"validator\" | \"mutator\" | \"observer\";\n\nexport type HookFailureMode = \"fail-closed\";\n\nexport interface HookPolicyMetadata {\n\tstages: readonly HookPolicyStage[];\n\teffects: readonly HookPolicyEffect[];\n\tfailureMode: HookFailureMode;\n\ttimeoutMs: number;\n}\n\n/**\n * Sanitized hook failure metadata safe to expose in tool results.\n *\n * This structure intentionally carries only bounded coded values. It must not\n * include raw causes, stacks, commands, content, or filesystem paths.\n */\nexport interface HookFailure {\n\ttype: \"hook_failure\";\n\tsanitized: true;\n\tcode: HookFailureCode;\n\tstage: HookFailureStage;\n}\n\nexport interface FailClosedTextContent {\n\ttype: \"text\";\n\ttext: string;\n}\n\nexport interface FailClosedToolCallResult {\n\tblock: true;\n\treason: string;\n}\n\nexport interface FailClosedToolResult {\n\tcontent: FailClosedTextContent[];\n\tdetails: HookFailure;\n\tisError: true;\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type Keybinding, type KeybindingsConfig, type KeyId, KeybindingsManager as TuiKeybindingsManager } from "
|
|
1
|
+
import { type Keybinding, type KeybindingsConfig, type KeyId, KeybindingsManager as TuiKeybindingsManager } from "omk-tui";
|
|
2
2
|
export interface AppKeybindings {
|
|
3
3
|
"app.interrupt": true;
|
|
4
4
|
"app.clear": true;
|
|
@@ -7,7 +7,6 @@ export interface AppKeybindings {
|
|
|
7
7
|
"app.thinking.cycle": true;
|
|
8
8
|
"app.model.cycleForward": true;
|
|
9
9
|
"app.model.cycleBackward": true;
|
|
10
|
-
"app.model.providerPrevious": true;
|
|
11
10
|
"app.model.select": true;
|
|
12
11
|
"app.tools.expand": true;
|
|
13
12
|
"app.thinking.toggle": true;
|
|
@@ -44,7 +43,7 @@ export interface AppKeybindings {
|
|
|
44
43
|
"app.tree.filter.cycleBackward": true;
|
|
45
44
|
}
|
|
46
45
|
export type AppKeybinding = keyof AppKeybindings;
|
|
47
|
-
declare module "
|
|
46
|
+
declare module "omk-tui" {
|
|
48
47
|
interface Keybindings extends AppKeybindings {
|
|
49
48
|
}
|
|
50
49
|
}
|
|
@@ -201,10 +200,6 @@ export declare const KEYBINDINGS: {
|
|
|
201
200
|
readonly defaultKeys: "shift+ctrl+p";
|
|
202
201
|
readonly description: "Cycle to previous model";
|
|
203
202
|
};
|
|
204
|
-
readonly "app.model.providerPrevious": {
|
|
205
|
-
readonly defaultKeys: "shift+tab";
|
|
206
|
-
readonly description: "Cycle to previous provider in the model selector";
|
|
207
|
-
};
|
|
208
203
|
readonly "app.model.select": {
|
|
209
204
|
readonly defaultKeys: "ctrl+l";
|
|
210
205
|
readonly description: "Open model selector";
|
|
@@ -351,13 +346,6 @@ export declare class KeybindingsManager extends TuiKeybindingsManager {
|
|
|
351
346
|
constructor(userBindings?: KeybindingsConfig, configPath?: string);
|
|
352
347
|
static create(agentDir?: string): KeybindingsManager;
|
|
353
348
|
reload(): void;
|
|
354
|
-
matchInScope(data: string, keybindings: readonly Keybinding[]): {
|
|
355
|
-
keybinding: Keybinding | undefined;
|
|
356
|
-
conflicts: Array<{
|
|
357
|
-
key: KeyId;
|
|
358
|
-
keybindings: Keybinding[];
|
|
359
|
-
}>;
|
|
360
|
-
};
|
|
361
349
|
getEffectiveConfig(): KeybindingsConfig;
|
|
362
350
|
private static loadFromFile;
|
|
363
351
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keybindings.d.ts","sourceRoot":"","sources":["../../src/core/keybindings.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,UAAU,EAEf,KAAK,iBAAiB,EACtB,KAAK,KAAK,EAGV,kBAAkB,IAAI,qBAAqB,EAC3C,MAAM,yBAAyB,CAAC;AAKjC,MAAM,WAAW,cAAc;IAC9B,eAAe,EAAE,IAAI,CAAC;IACtB,WAAW,EAAE,IAAI,CAAC;IAClB,UAAU,EAAE,IAAI,CAAC;IACjB,aAAa,EAAE,IAAI,CAAC;IACpB,oBAAoB,EAAE,IAAI,CAAC;IAC3B,wBAAwB,EAAE,IAAI,CAAC;IAC/B,yBAAyB,EAAE,IAAI,CAAC;IAChC,4BAA4B,EAAE,IAAI,CAAC;IACnC,kBAAkB,EAAE,IAAI,CAAC;IACzB,kBAAkB,EAAE,IAAI,CAAC;IACzB,qBAAqB,EAAE,IAAI,CAAC;IAC5B,+BAA+B,EAAE,IAAI,CAAC;IACtC,qBAAqB,EAAE,IAAI,CAAC;IAC5B,sBAAsB,EAAE,IAAI,CAAC;IAC7B,qBAAqB,EAAE,IAAI,CAAC;IAC5B,0BAA0B,EAAE,IAAI,CAAC;IACjC,iBAAiB,EAAE,IAAI,CAAC;IACxB,kBAAkB,EAAE,IAAI,CAAC;IACzB,kBAAkB,EAAE,IAAI,CAAC;IACzB,oBAAoB,EAAE,IAAI,CAAC;IAC3B,mBAAmB,EAAE,IAAI,CAAC;IAC1B,uBAAuB,EAAE,IAAI,CAAC;IAC9B,oBAAoB,EAAE,IAAI,CAAC;IAC3B,+BAA+B,EAAE,IAAI,CAAC;IACtC,wBAAwB,EAAE,IAAI,CAAC;IAC/B,wBAAwB,EAAE,IAAI,CAAC;IAC/B,oBAAoB,EAAE,IAAI,CAAC;IAC3B,oBAAoB,EAAE,IAAI,CAAC;IAC3B,+BAA+B,EAAE,IAAI,CAAC;IACtC,iBAAiB,EAAE,IAAI,CAAC;IACxB,sBAAsB,EAAE,IAAI,CAAC;IAC7B,qBAAqB,EAAE,IAAI,CAAC;IAC5B,2BAA2B,EAAE,IAAI,CAAC;IAClC,sBAAsB,EAAE,IAAI,CAAC;IAC7B,wBAAwB,EAAE,IAAI,CAAC;IAC/B,yBAAyB,EAAE,IAAI,CAAC;IAChC,yBAAyB,EAAE,IAAI,CAAC;IAChC,0BAA0B,EAAE,IAAI,CAAC;IACjC,6BAA6B,EAAE,IAAI,CAAC;IACpC,qBAAqB,EAAE,IAAI,CAAC;IAC5B,8BAA8B,EAAE,IAAI,CAAC;IACrC,+BAA+B,EAAE,IAAI,CAAC;CACtC;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,cAAc,CAAC;AAEjD,OAAO,QAAQ,yBAAyB,CAAC,CAAC;IACzC,UAAU,WAAY,SAAQ,cAAc;KAAG;CAC/C;AAED,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+IkB,CAAC;AAwF3C,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAC7E,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,QAAQ,EAAE,OAAO,CAAC;CAClB,CAiBA;AA8BD,qBAAa,kBAAmB,SAAQ,qBAAqB;IAC5D,OAAO,CAAC,UAAU,CAAqB;IAEvC,YAAY,YAAY,GAAE,iBAAsB,EAAE,UAAU,CAAC,EAAE,MAAM,EAGpE;IAED,MAAM,CAAC,MAAM,CAAC,QAAQ,GAAE,MAAsB,GAAG,kBAAkB,CAIlE;IAED,MAAM,IAAI,IAAI,CAGb;IAED,YAAY,CACX,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,SAAS,UAAU,EAAE,GAChC;QAAE,UAAU,EAAE,UAAU,GAAG,SAAS,CAAC;QAAC,SAAS,EAAE,KAAK,CAAC;YAAE,GAAG,EAAE,KAAK,CAAC;YAAC,WAAW,EAAE,UAAU,EAAE,CAAA;SAAE,CAAC,CAAA;KAAE,CA4BrG;IAED,kBAAkB,IAAI,iBAAiB,CAEtC;IAED,OAAO,CAAC,MAAM,CAAC,YAAY;CAK3B;AAED,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC","sourcesContent":["import {\n\ttype Keybinding,\n\ttype KeybindingDefinitions,\n\ttype KeybindingsConfig,\n\ttype KeyId,\n\tmatchesKey,\n\tTUI_KEYBINDINGS,\n\tKeybindingsManager as TuiKeybindingsManager,\n} from \"@earendil-works/omk-tui\";\nimport { existsSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { getAgentDir } from \"../config.ts\";\n\nexport interface AppKeybindings {\n\t\"app.interrupt\": true;\n\t\"app.clear\": true;\n\t\"app.exit\": true;\n\t\"app.suspend\": true;\n\t\"app.thinking.cycle\": true;\n\t\"app.model.cycleForward\": true;\n\t\"app.model.cycleBackward\": true;\n\t\"app.model.providerPrevious\": true;\n\t\"app.model.select\": true;\n\t\"app.tools.expand\": true;\n\t\"app.thinking.toggle\": true;\n\t\"app.session.toggleNamedFilter\": true;\n\t\"app.editor.external\": true;\n\t\"app.message.followUp\": true;\n\t\"app.message.dequeue\": true;\n\t\"app.clipboard.pasteImage\": true;\n\t\"app.session.new\": true;\n\t\"app.session.tree\": true;\n\t\"app.session.fork\": true;\n\t\"app.session.resume\": true;\n\t\"app.tree.foldOrUp\": true;\n\t\"app.tree.unfoldOrDown\": true;\n\t\"app.tree.editLabel\": true;\n\t\"app.tree.toggleLabelTimestamp\": true;\n\t\"app.session.togglePath\": true;\n\t\"app.session.toggleSort\": true;\n\t\"app.session.rename\": true;\n\t\"app.session.delete\": true;\n\t\"app.session.deleteNoninvasive\": true;\n\t\"app.models.save\": true;\n\t\"app.models.enableAll\": true;\n\t\"app.models.clearAll\": true;\n\t\"app.models.toggleProvider\": true;\n\t\"app.models.reorderUp\": true;\n\t\"app.models.reorderDown\": true;\n\t\"app.tree.filter.default\": true;\n\t\"app.tree.filter.noTools\": true;\n\t\"app.tree.filter.userOnly\": true;\n\t\"app.tree.filter.labeledOnly\": true;\n\t\"app.tree.filter.all\": true;\n\t\"app.tree.filter.cycleForward\": true;\n\t\"app.tree.filter.cycleBackward\": true;\n}\n\nexport type AppKeybinding = keyof AppKeybindings;\n\ndeclare module \"@earendil-works/omk-tui\" {\n\tinterface Keybindings extends AppKeybindings {}\n}\n\nexport const KEYBINDINGS = {\n\t...TUI_KEYBINDINGS,\n\t\"app.interrupt\": { defaultKeys: \"escape\", description: \"Cancel or abort\" },\n\t\"app.clear\": { defaultKeys: \"ctrl+c\", description: \"Clear editor\" },\n\t\"app.exit\": { defaultKeys: \"ctrl+d\", description: \"Exit when editor is empty\" },\n\t\"app.suspend\": {\n\t\tdefaultKeys: process.platform === \"win32\" ? [] : \"ctrl+z\",\n\t\tdescription: \"Suspend to background\",\n\t},\n\t\"app.thinking.cycle\": {\n\t\tdefaultKeys: \"shift+tab\",\n\t\tdescription: \"Cycle thinking level\",\n\t},\n\t\"app.model.cycleForward\": {\n\t\tdefaultKeys: \"ctrl+p\",\n\t\tdescription: \"Cycle to next model\",\n\t},\n\t\"app.model.cycleBackward\": {\n\t\tdefaultKeys: \"shift+ctrl+p\",\n\t\tdescription: \"Cycle to previous model\",\n\t},\n\t\"app.model.providerPrevious\": {\n\t\tdefaultKeys: \"shift+tab\",\n\t\tdescription: \"Cycle to previous provider in the model selector\",\n\t},\n\t\"app.model.select\": { defaultKeys: \"ctrl+l\", description: \"Open model selector\" },\n\t\"app.tools.expand\": { defaultKeys: \"ctrl+o\", description: \"Toggle tool output\" },\n\t\"app.thinking.toggle\": {\n\t\tdefaultKeys: \"ctrl+t\",\n\t\tdescription: \"Toggle thinking blocks\",\n\t},\n\t\"app.session.toggleNamedFilter\": {\n\t\tdefaultKeys: \"ctrl+n\",\n\t\tdescription: \"Toggle named session filter\",\n\t},\n\t\"app.editor.external\": {\n\t\tdefaultKeys: \"ctrl+g\",\n\t\tdescription: \"Open external editor\",\n\t},\n\t\"app.message.followUp\": {\n\t\tdefaultKeys: \"alt+enter\",\n\t\tdescription: \"Queue follow-up message\",\n\t},\n\t\"app.message.dequeue\": {\n\t\tdefaultKeys: \"alt+up\",\n\t\tdescription: \"Restore queued messages\",\n\t},\n\t\"app.clipboard.pasteImage\": {\n\t\tdefaultKeys: process.platform === \"win32\" ? \"alt+v\" : \"ctrl+v\",\n\t\tdescription: \"Paste image from clipboard\",\n\t},\n\t\"app.session.new\": { defaultKeys: [], description: \"Start a new session\" },\n\t\"app.session.tree\": { defaultKeys: [], description: \"Open session tree\" },\n\t\"app.session.fork\": { defaultKeys: [], description: \"Fork current session\" },\n\t\"app.session.resume\": { defaultKeys: [], description: \"Resume a session\" },\n\t\"app.tree.foldOrUp\": {\n\t\tdefaultKeys: [\"ctrl+left\", \"alt+left\"],\n\t\tdescription: \"Fold tree branch or move up\",\n\t},\n\t\"app.tree.unfoldOrDown\": {\n\t\tdefaultKeys: [\"ctrl+right\", \"alt+right\"],\n\t\tdescription: \"Unfold tree branch or move down\",\n\t},\n\t\"app.tree.editLabel\": {\n\t\tdefaultKeys: \"shift+l\",\n\t\tdescription: \"Edit tree label\",\n\t},\n\t\"app.tree.toggleLabelTimestamp\": {\n\t\tdefaultKeys: \"shift+t\",\n\t\tdescription: \"Toggle tree label timestamps\",\n\t},\n\t\"app.session.togglePath\": {\n\t\tdefaultKeys: \"ctrl+p\",\n\t\tdescription: \"Toggle session path display\",\n\t},\n\t\"app.session.toggleSort\": {\n\t\tdefaultKeys: \"ctrl+s\",\n\t\tdescription: \"Toggle session sort mode\",\n\t},\n\t\"app.session.rename\": {\n\t\tdefaultKeys: \"ctrl+r\",\n\t\tdescription: \"Rename session\",\n\t},\n\t\"app.session.delete\": {\n\t\tdefaultKeys: \"ctrl+d\",\n\t\tdescription: \"Delete session\",\n\t},\n\t\"app.session.deleteNoninvasive\": {\n\t\tdefaultKeys: \"ctrl+backspace\",\n\t\tdescription: \"Delete session when query is empty\",\n\t},\n\t\"app.models.save\": {\n\t\tdefaultKeys: \"ctrl+s\",\n\t\tdescription: \"Save model selection\",\n\t},\n\t\"app.models.enableAll\": {\n\t\tdefaultKeys: \"ctrl+a\",\n\t\tdescription: \"Enable all models\",\n\t},\n\t\"app.models.clearAll\": {\n\t\tdefaultKeys: \"ctrl+x\",\n\t\tdescription: \"Clear all models\",\n\t},\n\t\"app.models.toggleProvider\": {\n\t\tdefaultKeys: \"ctrl+p\",\n\t\tdescription: \"Toggle all models for provider\",\n\t},\n\t\"app.models.reorderUp\": {\n\t\tdefaultKeys: \"alt+up\",\n\t\tdescription: \"Move model up in order\",\n\t},\n\t\"app.models.reorderDown\": {\n\t\tdefaultKeys: \"alt+down\",\n\t\tdescription: \"Move model down in order\",\n\t},\n\t\"app.tree.filter.default\": {\n\t\tdefaultKeys: \"ctrl+d\",\n\t\tdescription: \"Tree filter: default view\",\n\t},\n\t\"app.tree.filter.noTools\": {\n\t\tdefaultKeys: \"ctrl+t\",\n\t\tdescription: \"Tree filter: hide tool results\",\n\t},\n\t\"app.tree.filter.userOnly\": {\n\t\tdefaultKeys: \"ctrl+u\",\n\t\tdescription: \"Tree filter: user messages only\",\n\t},\n\t\"app.tree.filter.labeledOnly\": {\n\t\tdefaultKeys: \"ctrl+l\",\n\t\tdescription: \"Tree filter: labeled entries only\",\n\t},\n\t\"app.tree.filter.all\": {\n\t\tdefaultKeys: \"ctrl+a\",\n\t\tdescription: \"Tree filter: show all entries\",\n\t},\n\t\"app.tree.filter.cycleForward\": {\n\t\tdefaultKeys: \"ctrl+o\",\n\t\tdescription: \"Tree filter: cycle forward\",\n\t},\n\t\"app.tree.filter.cycleBackward\": {\n\t\tdefaultKeys: \"shift+ctrl+o\",\n\t\tdescription: \"Tree filter: cycle backward\",\n\t},\n} as const satisfies KeybindingDefinitions;\n\nconst KEYBINDING_NAME_MIGRATIONS = {\n\tcursorUp: \"tui.editor.cursorUp\",\n\tcursorDown: \"tui.editor.cursorDown\",\n\tcursorLeft: \"tui.editor.cursorLeft\",\n\tcursorRight: \"tui.editor.cursorRight\",\n\tcursorWordLeft: \"tui.editor.cursorWordLeft\",\n\tcursorWordRight: \"tui.editor.cursorWordRight\",\n\tcursorLineStart: \"tui.editor.cursorLineStart\",\n\tcursorLineEnd: \"tui.editor.cursorLineEnd\",\n\tjumpForward: \"tui.editor.jumpForward\",\n\tjumpBackward: \"tui.editor.jumpBackward\",\n\tpageUp: \"tui.editor.pageUp\",\n\tpageDown: \"tui.editor.pageDown\",\n\tdeleteCharBackward: \"tui.editor.deleteCharBackward\",\n\tdeleteCharForward: \"tui.editor.deleteCharForward\",\n\tdeleteWordBackward: \"tui.editor.deleteWordBackward\",\n\tdeleteWordForward: \"tui.editor.deleteWordForward\",\n\tdeleteToLineStart: \"tui.editor.deleteToLineStart\",\n\tdeleteToLineEnd: \"tui.editor.deleteToLineEnd\",\n\tyank: \"tui.editor.yank\",\n\tyankPop: \"tui.editor.yankPop\",\n\tundo: \"tui.editor.undo\",\n\tnewLine: \"tui.input.newLine\",\n\tsubmit: \"tui.input.submit\",\n\ttab: \"tui.input.tab\",\n\tcopy: \"tui.input.copy\",\n\tselectUp: \"tui.select.up\",\n\tselectDown: \"tui.select.down\",\n\tselectPageUp: \"tui.select.pageUp\",\n\tselectPageDown: \"tui.select.pageDown\",\n\tselectConfirm: \"tui.select.confirm\",\n\tselectCancel: \"tui.select.cancel\",\n\tinterrupt: \"app.interrupt\",\n\tclear: \"app.clear\",\n\texit: \"app.exit\",\n\tsuspend: \"app.suspend\",\n\tcycleThinkingLevel: \"app.thinking.cycle\",\n\tcycleModelForward: \"app.model.cycleForward\",\n\tcycleModelBackward: \"app.model.cycleBackward\",\n\tselectModel: \"app.model.select\",\n\texpandTools: \"app.tools.expand\",\n\ttoggleThinking: \"app.thinking.toggle\",\n\ttoggleSessionNamedFilter: \"app.session.toggleNamedFilter\",\n\texternalEditor: \"app.editor.external\",\n\tfollowUp: \"app.message.followUp\",\n\tdequeue: \"app.message.dequeue\",\n\tpasteImage: \"app.clipboard.pasteImage\",\n\tnewSession: \"app.session.new\",\n\ttree: \"app.session.tree\",\n\tfork: \"app.session.fork\",\n\tresume: \"app.session.resume\",\n\ttreeFoldOrUp: \"app.tree.foldOrUp\",\n\ttreeUnfoldOrDown: \"app.tree.unfoldOrDown\",\n\ttreeEditLabel: \"app.tree.editLabel\",\n\ttreeToggleLabelTimestamp: \"app.tree.toggleLabelTimestamp\",\n\ttoggleSessionPath: \"app.session.togglePath\",\n\ttoggleSessionSort: \"app.session.toggleSort\",\n\trenameSession: \"app.session.rename\",\n\tdeleteSession: \"app.session.delete\",\n\tdeleteSessionNoninvasive: \"app.session.deleteNoninvasive\",\n} as const satisfies Record<string, Keybinding>;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isLegacyKeybindingName(key: string): key is keyof typeof KEYBINDING_NAME_MIGRATIONS {\n\treturn key in KEYBINDING_NAME_MIGRATIONS;\n}\n\nfunction toKeybindingsConfig(value: unknown): KeybindingsConfig {\n\tif (!isRecord(value)) return {};\n\n\tconst config: KeybindingsConfig = {};\n\tfor (const [key, binding] of Object.entries(value)) {\n\t\tif (typeof binding === \"string\") {\n\t\t\tconfig[key] = binding as KeyId;\n\t\t\tcontinue;\n\t\t}\n\t\tif (Array.isArray(binding) && binding.every((entry) => typeof entry === \"string\")) {\n\t\t\tconfig[key] = binding as KeyId[];\n\t\t}\n\t}\n\treturn config;\n}\n\nexport function migrateKeybindingsConfig(rawConfig: Record<string, unknown>): {\n\tconfig: Record<string, unknown>;\n\tmigrated: boolean;\n} {\n\tconst config: Record<string, unknown> = {};\n\tlet migrated = false;\n\n\tfor (const [key, value] of Object.entries(rawConfig)) {\n\t\tconst nextKey = isLegacyKeybindingName(key) ? KEYBINDING_NAME_MIGRATIONS[key] : key;\n\t\tif (nextKey !== key) {\n\t\t\tmigrated = true;\n\t\t}\n\t\tif (key !== nextKey && Object.hasOwn(rawConfig, nextKey)) {\n\t\t\tmigrated = true;\n\t\t\tcontinue;\n\t\t}\n\t\tconfig[nextKey] = value;\n\t}\n\n\treturn { config: orderKeybindingsConfig(config), migrated };\n}\n\nfunction orderKeybindingsConfig(config: Record<string, unknown>): Record<string, unknown> {\n\tconst ordered: Record<string, unknown> = {};\n\tfor (const keybinding of Object.keys(KEYBINDINGS)) {\n\t\tif (Object.hasOwn(config, keybinding)) {\n\t\t\tordered[keybinding] = config[keybinding];\n\t\t}\n\t}\n\n\tconst extras = Object.keys(config)\n\t\t.filter((key) => !Object.hasOwn(ordered, key))\n\t\t.sort();\n\tfor (const key of extras) {\n\t\tordered[key] = config[key];\n\t}\n\n\treturn ordered;\n}\n\nfunction loadRawConfig(path: string): Record<string, unknown> | undefined {\n\tif (!existsSync(path)) return undefined;\n\ttry {\n\t\tconst parsed = JSON.parse(readFileSync(path, \"utf-8\")) as unknown;\n\t\treturn isRecord(parsed) ? parsed : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nexport class KeybindingsManager extends TuiKeybindingsManager {\n\tprivate configPath: string | undefined;\n\n\tconstructor(userBindings: KeybindingsConfig = {}, configPath?: string) {\n\t\tsuper(KEYBINDINGS, userBindings);\n\t\tthis.configPath = configPath;\n\t}\n\n\tstatic create(agentDir: string = getAgentDir()): KeybindingsManager {\n\t\tconst configPath = join(agentDir, \"keybindings.json\");\n\t\tconst userBindings = KeybindingsManager.loadFromFile(configPath);\n\t\treturn new KeybindingsManager(userBindings, configPath);\n\t}\n\n\treload(): void {\n\t\tif (!this.configPath) return;\n\t\tthis.setUserBindings(KeybindingsManager.loadFromFile(this.configPath));\n\t}\n\n\tmatchInScope(\n\t\tdata: string,\n\t\tkeybindings: readonly Keybinding[],\n\t): { keybinding: Keybinding | undefined; conflicts: Array<{ key: KeyId; keybindings: Keybinding[] }> } {\n\t\tconst matches: Array<{ keybinding: Keybinding; key: KeyId }> = [];\n\t\tfor (const keybinding of keybindings) {\n\t\t\tfor (const key of this.getKeys(keybinding)) {\n\t\t\t\tif (matchesKey(data, key)) {\n\t\t\t\t\tmatches.push({ keybinding, key });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (matches.length <= 1) {\n\t\t\treturn { keybinding: matches[0]?.keybinding, conflicts: [] };\n\t\t}\n\n\t\tconst conflictsByKey = new Map<KeyId, Set<Keybinding>>();\n\t\tfor (const match of matches) {\n\t\t\tconst conflict = conflictsByKey.get(match.key) ?? new Set<Keybinding>();\n\t\t\tconflict.add(match.keybinding);\n\t\t\tconflictsByKey.set(match.key, conflict);\n\t\t}\n\n\t\treturn {\n\t\t\tkeybinding: undefined,\n\t\t\tconflicts: [...conflictsByKey]\n\t\t\t\t.map(([key, conflicted]) => ({ key, keybindings: [...conflicted] }))\n\t\t\t\t.filter((conflict) => conflict.keybindings.length > 1),\n\t\t};\n\t}\n\n\tgetEffectiveConfig(): KeybindingsConfig {\n\t\treturn this.getResolvedBindings();\n\t}\n\n\tprivate static loadFromFile(path: string): KeybindingsConfig {\n\t\tconst rawConfig = loadRawConfig(path);\n\t\tif (!rawConfig) return {};\n\t\treturn toKeybindingsConfig(migrateKeybindingsConfig(rawConfig).config);\n\t}\n}\n\nexport type { Keybinding, KeyId, KeybindingsConfig };\n"]}
|
|
1
|
+
{"version":3,"file":"keybindings.d.ts","sourceRoot":"","sources":["../../src/core/keybindings.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from \"fs\";\nimport {\n\ttype Keybinding,\n\ttype KeybindingDefinitions,\n\ttype KeybindingsConfig,\n\ttype KeyId,\n\tTUI_KEYBINDINGS,\n\tKeybindingsManager as TuiKeybindingsManager,\n} from \"omk-tui\";\nimport { join } from \"path\";\nimport { getAgentDir } from \"../config.ts\";\n\nexport interface AppKeybindings {\n\t\"app.interrupt\": true;\n\t\"app.clear\": true;\n\t\"app.exit\": true;\n\t\"app.suspend\": true;\n\t\"app.thinking.cycle\": true;\n\t\"app.model.cycleForward\": true;\n\t\"app.model.cycleBackward\": true;\n\t\"app.model.select\": true;\n\t\"app.tools.expand\": true;\n\t\"app.thinking.toggle\": true;\n\t\"app.session.toggleNamedFilter\": true;\n\t\"app.editor.external\": true;\n\t\"app.message.followUp\": true;\n\t\"app.message.dequeue\": true;\n\t\"app.clipboard.pasteImage\": true;\n\t\"app.session.new\": true;\n\t\"app.session.tree\": true;\n\t\"app.session.fork\": true;\n\t\"app.session.resume\": true;\n\t\"app.tree.foldOrUp\": true;\n\t\"app.tree.unfoldOrDown\": true;\n\t\"app.tree.editLabel\": true;\n\t\"app.tree.toggleLabelTimestamp\": true;\n\t\"app.session.togglePath\": true;\n\t\"app.session.toggleSort\": true;\n\t\"app.session.rename\": true;\n\t\"app.session.delete\": true;\n\t\"app.session.deleteNoninvasive\": true;\n\t\"app.models.save\": true;\n\t\"app.models.enableAll\": true;\n\t\"app.models.clearAll\": true;\n\t\"app.models.toggleProvider\": true;\n\t\"app.models.reorderUp\": true;\n\t\"app.models.reorderDown\": true;\n\t\"app.tree.filter.default\": true;\n\t\"app.tree.filter.noTools\": true;\n\t\"app.tree.filter.userOnly\": true;\n\t\"app.tree.filter.labeledOnly\": true;\n\t\"app.tree.filter.all\": true;\n\t\"app.tree.filter.cycleForward\": true;\n\t\"app.tree.filter.cycleBackward\": true;\n}\n\nexport type AppKeybinding = keyof AppKeybindings;\n\ndeclare module \"omk-tui\" {\n\tinterface Keybindings extends AppKeybindings {}\n}\n\nexport const KEYBINDINGS = {\n\t...TUI_KEYBINDINGS,\n\t\"app.interrupt\": { defaultKeys: \"escape\", description: \"Cancel or abort\" },\n\t\"app.clear\": { defaultKeys: \"ctrl+c\", description: \"Clear editor\" },\n\t\"app.exit\": { defaultKeys: \"ctrl+d\", description: \"Exit when editor is empty\" },\n\t\"app.suspend\": {\n\t\tdefaultKeys: process.platform === \"win32\" ? [] : \"ctrl+z\",\n\t\tdescription: \"Suspend to background\",\n\t},\n\t\"app.thinking.cycle\": {\n\t\tdefaultKeys: \"shift+tab\",\n\t\tdescription: \"Cycle thinking level\",\n\t},\n\t\"app.model.cycleForward\": {\n\t\tdefaultKeys: \"ctrl+p\",\n\t\tdescription: \"Cycle to next model\",\n\t},\n\t\"app.model.cycleBackward\": {\n\t\tdefaultKeys: \"shift+ctrl+p\",\n\t\tdescription: \"Cycle to previous model\",\n\t},\n\t\"app.model.select\": { defaultKeys: \"ctrl+l\", description: \"Open model selector\" },\n\t\"app.tools.expand\": { defaultKeys: \"ctrl+o\", description: \"Toggle tool output\" },\n\t\"app.thinking.toggle\": {\n\t\tdefaultKeys: \"ctrl+t\",\n\t\tdescription: \"Toggle thinking blocks\",\n\t},\n\t\"app.session.toggleNamedFilter\": {\n\t\tdefaultKeys: \"ctrl+n\",\n\t\tdescription: \"Toggle named session filter\",\n\t},\n\t\"app.editor.external\": {\n\t\tdefaultKeys: \"ctrl+g\",\n\t\tdescription: \"Open external editor\",\n\t},\n\t\"app.message.followUp\": {\n\t\tdefaultKeys: \"alt+enter\",\n\t\tdescription: \"Queue follow-up message\",\n\t},\n\t\"app.message.dequeue\": {\n\t\tdefaultKeys: \"alt+up\",\n\t\tdescription: \"Restore queued messages\",\n\t},\n\t\"app.clipboard.pasteImage\": {\n\t\tdefaultKeys: process.platform === \"win32\" ? \"alt+v\" : \"ctrl+v\",\n\t\tdescription: \"Paste image from clipboard\",\n\t},\n\t\"app.session.new\": { defaultKeys: [], description: \"Start a new session\" },\n\t\"app.session.tree\": { defaultKeys: [], description: \"Open session tree\" },\n\t\"app.session.fork\": { defaultKeys: [], description: \"Fork current session\" },\n\t\"app.session.resume\": { defaultKeys: [], description: \"Resume a session\" },\n\t\"app.tree.foldOrUp\": {\n\t\tdefaultKeys: [\"ctrl+left\", \"alt+left\"],\n\t\tdescription: \"Fold tree branch or move up\",\n\t},\n\t\"app.tree.unfoldOrDown\": {\n\t\tdefaultKeys: [\"ctrl+right\", \"alt+right\"],\n\t\tdescription: \"Unfold tree branch or move down\",\n\t},\n\t\"app.tree.editLabel\": {\n\t\tdefaultKeys: \"shift+l\",\n\t\tdescription: \"Edit tree label\",\n\t},\n\t\"app.tree.toggleLabelTimestamp\": {\n\t\tdefaultKeys: \"shift+t\",\n\t\tdescription: \"Toggle tree label timestamps\",\n\t},\n\t\"app.session.togglePath\": {\n\t\tdefaultKeys: \"ctrl+p\",\n\t\tdescription: \"Toggle session path display\",\n\t},\n\t\"app.session.toggleSort\": {\n\t\tdefaultKeys: \"ctrl+s\",\n\t\tdescription: \"Toggle session sort mode\",\n\t},\n\t\"app.session.rename\": {\n\t\tdefaultKeys: \"ctrl+r\",\n\t\tdescription: \"Rename session\",\n\t},\n\t\"app.session.delete\": {\n\t\tdefaultKeys: \"ctrl+d\",\n\t\tdescription: \"Delete session\",\n\t},\n\t\"app.session.deleteNoninvasive\": {\n\t\tdefaultKeys: \"ctrl+backspace\",\n\t\tdescription: \"Delete session when query is empty\",\n\t},\n\t\"app.models.save\": {\n\t\tdefaultKeys: \"ctrl+s\",\n\t\tdescription: \"Save model selection\",\n\t},\n\t\"app.models.enableAll\": {\n\t\tdefaultKeys: \"ctrl+a\",\n\t\tdescription: \"Enable all models\",\n\t},\n\t\"app.models.clearAll\": {\n\t\tdefaultKeys: \"ctrl+x\",\n\t\tdescription: \"Clear all models\",\n\t},\n\t\"app.models.toggleProvider\": {\n\t\tdefaultKeys: \"ctrl+p\",\n\t\tdescription: \"Toggle all models for provider\",\n\t},\n\t\"app.models.reorderUp\": {\n\t\tdefaultKeys: \"alt+up\",\n\t\tdescription: \"Move model up in order\",\n\t},\n\t\"app.models.reorderDown\": {\n\t\tdefaultKeys: \"alt+down\",\n\t\tdescription: \"Move model down in order\",\n\t},\n\t\"app.tree.filter.default\": {\n\t\tdefaultKeys: \"ctrl+d\",\n\t\tdescription: \"Tree filter: default view\",\n\t},\n\t\"app.tree.filter.noTools\": {\n\t\tdefaultKeys: \"ctrl+t\",\n\t\tdescription: \"Tree filter: hide tool results\",\n\t},\n\t\"app.tree.filter.userOnly\": {\n\t\tdefaultKeys: \"ctrl+u\",\n\t\tdescription: \"Tree filter: user messages only\",\n\t},\n\t\"app.tree.filter.labeledOnly\": {\n\t\tdefaultKeys: \"ctrl+l\",\n\t\tdescription: \"Tree filter: labeled entries only\",\n\t},\n\t\"app.tree.filter.all\": {\n\t\tdefaultKeys: \"ctrl+a\",\n\t\tdescription: \"Tree filter: show all entries\",\n\t},\n\t\"app.tree.filter.cycleForward\": {\n\t\tdefaultKeys: \"ctrl+o\",\n\t\tdescription: \"Tree filter: cycle forward\",\n\t},\n\t\"app.tree.filter.cycleBackward\": {\n\t\tdefaultKeys: \"shift+ctrl+o\",\n\t\tdescription: \"Tree filter: cycle backward\",\n\t},\n} as const satisfies KeybindingDefinitions;\n\nconst KEYBINDING_NAME_MIGRATIONS = {\n\tcursorUp: \"tui.editor.cursorUp\",\n\tcursorDown: \"tui.editor.cursorDown\",\n\tcursorLeft: \"tui.editor.cursorLeft\",\n\tcursorRight: \"tui.editor.cursorRight\",\n\tcursorWordLeft: \"tui.editor.cursorWordLeft\",\n\tcursorWordRight: \"tui.editor.cursorWordRight\",\n\tcursorLineStart: \"tui.editor.cursorLineStart\",\n\tcursorLineEnd: \"tui.editor.cursorLineEnd\",\n\tjumpForward: \"tui.editor.jumpForward\",\n\tjumpBackward: \"tui.editor.jumpBackward\",\n\tpageUp: \"tui.editor.pageUp\",\n\tpageDown: \"tui.editor.pageDown\",\n\tdeleteCharBackward: \"tui.editor.deleteCharBackward\",\n\tdeleteCharForward: \"tui.editor.deleteCharForward\",\n\tdeleteWordBackward: \"tui.editor.deleteWordBackward\",\n\tdeleteWordForward: \"tui.editor.deleteWordForward\",\n\tdeleteToLineStart: \"tui.editor.deleteToLineStart\",\n\tdeleteToLineEnd: \"tui.editor.deleteToLineEnd\",\n\tyank: \"tui.editor.yank\",\n\tyankPop: \"tui.editor.yankPop\",\n\tundo: \"tui.editor.undo\",\n\tnewLine: \"tui.input.newLine\",\n\tsubmit: \"tui.input.submit\",\n\ttab: \"tui.input.tab\",\n\tcopy: \"tui.input.copy\",\n\tselectUp: \"tui.select.up\",\n\tselectDown: \"tui.select.down\",\n\tselectPageUp: \"tui.select.pageUp\",\n\tselectPageDown: \"tui.select.pageDown\",\n\tselectConfirm: \"tui.select.confirm\",\n\tselectCancel: \"tui.select.cancel\",\n\tinterrupt: \"app.interrupt\",\n\tclear: \"app.clear\",\n\texit: \"app.exit\",\n\tsuspend: \"app.suspend\",\n\tcycleThinkingLevel: \"app.thinking.cycle\",\n\tcycleModelForward: \"app.model.cycleForward\",\n\tcycleModelBackward: \"app.model.cycleBackward\",\n\tselectModel: \"app.model.select\",\n\texpandTools: \"app.tools.expand\",\n\ttoggleThinking: \"app.thinking.toggle\",\n\ttoggleSessionNamedFilter: \"app.session.toggleNamedFilter\",\n\texternalEditor: \"app.editor.external\",\n\tfollowUp: \"app.message.followUp\",\n\tdequeue: \"app.message.dequeue\",\n\tpasteImage: \"app.clipboard.pasteImage\",\n\tnewSession: \"app.session.new\",\n\ttree: \"app.session.tree\",\n\tfork: \"app.session.fork\",\n\tresume: \"app.session.resume\",\n\ttreeFoldOrUp: \"app.tree.foldOrUp\",\n\ttreeUnfoldOrDown: \"app.tree.unfoldOrDown\",\n\ttreeEditLabel: \"app.tree.editLabel\",\n\ttreeToggleLabelTimestamp: \"app.tree.toggleLabelTimestamp\",\n\ttoggleSessionPath: \"app.session.togglePath\",\n\ttoggleSessionSort: \"app.session.toggleSort\",\n\trenameSession: \"app.session.rename\",\n\tdeleteSession: \"app.session.delete\",\n\tdeleteSessionNoninvasive: \"app.session.deleteNoninvasive\",\n} as const satisfies Record<string, Keybinding>;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isLegacyKeybindingName(key: string): key is keyof typeof KEYBINDING_NAME_MIGRATIONS {\n\treturn key in KEYBINDING_NAME_MIGRATIONS;\n}\n\nfunction toKeybindingsConfig(value: unknown): KeybindingsConfig {\n\tif (!isRecord(value)) return {};\n\n\tconst config: KeybindingsConfig = {};\n\tfor (const [key, binding] of Object.entries(value)) {\n\t\tif (typeof binding === \"string\") {\n\t\t\tconfig[key] = binding as KeyId;\n\t\t\tcontinue;\n\t\t}\n\t\tif (Array.isArray(binding) && binding.every((entry) => typeof entry === \"string\")) {\n\t\t\tconfig[key] = binding as KeyId[];\n\t\t}\n\t}\n\treturn config;\n}\n\nexport function migrateKeybindingsConfig(rawConfig: Record<string, unknown>): {\n\tconfig: Record<string, unknown>;\n\tmigrated: boolean;\n} {\n\tconst config: Record<string, unknown> = {};\n\tlet migrated = false;\n\n\tfor (const [key, value] of Object.entries(rawConfig)) {\n\t\tconst nextKey = isLegacyKeybindingName(key) ? KEYBINDING_NAME_MIGRATIONS[key] : key;\n\t\tif (nextKey !== key) {\n\t\t\tmigrated = true;\n\t\t}\n\t\tif (key !== nextKey && Object.hasOwn(rawConfig, nextKey)) {\n\t\t\tmigrated = true;\n\t\t\tcontinue;\n\t\t}\n\t\tconfig[nextKey] = value;\n\t}\n\n\treturn { config: orderKeybindingsConfig(config), migrated };\n}\n\nfunction orderKeybindingsConfig(config: Record<string, unknown>): Record<string, unknown> {\n\tconst ordered: Record<string, unknown> = {};\n\tfor (const keybinding of Object.keys(KEYBINDINGS)) {\n\t\tif (Object.hasOwn(config, keybinding)) {\n\t\t\tordered[keybinding] = config[keybinding];\n\t\t}\n\t}\n\n\tconst extras = Object.keys(config)\n\t\t.filter((key) => !Object.hasOwn(ordered, key))\n\t\t.sort();\n\tfor (const key of extras) {\n\t\tordered[key] = config[key];\n\t}\n\n\treturn ordered;\n}\n\nfunction loadRawConfig(path: string): Record<string, unknown> | undefined {\n\tif (!existsSync(path)) return undefined;\n\ttry {\n\t\tconst parsed = JSON.parse(readFileSync(path, \"utf-8\")) as unknown;\n\t\treturn isRecord(parsed) ? parsed : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nexport class KeybindingsManager extends TuiKeybindingsManager {\n\tprivate configPath: string | undefined;\n\n\tconstructor(userBindings: KeybindingsConfig = {}, configPath?: string) {\n\t\tsuper(KEYBINDINGS, userBindings);\n\t\tthis.configPath = configPath;\n\t}\n\n\tstatic create(agentDir: string = getAgentDir()): KeybindingsManager {\n\t\tconst configPath = join(agentDir, \"keybindings.json\");\n\t\tconst userBindings = KeybindingsManager.loadFromFile(configPath);\n\t\treturn new KeybindingsManager(userBindings, configPath);\n\t}\n\n\treload(): void {\n\t\tif (!this.configPath) return;\n\t\tthis.setUserBindings(KeybindingsManager.loadFromFile(this.configPath));\n\t}\n\n\tgetEffectiveConfig(): KeybindingsConfig {\n\t\treturn this.getResolvedBindings();\n\t}\n\n\tprivate static loadFromFile(path: string): KeybindingsConfig {\n\t\tconst rawConfig = loadRawConfig(path);\n\t\tif (!rawConfig) return {};\n\t\treturn toKeybindingsConfig(migrateKeybindingsConfig(rawConfig).config);\n\t}\n}\n\nexport type { Keybinding, KeyId, KeybindingsConfig };\n"]}
|
package/dist/core/keybindings.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { matchesKey, TUI_KEYBINDINGS, KeybindingsManager as TuiKeybindingsManager, } from "@earendil-works/omk-tui";
|
|
2
1
|
import { existsSync, readFileSync } from "fs";
|
|
2
|
+
import { TUI_KEYBINDINGS, KeybindingsManager as TuiKeybindingsManager, } from "omk-tui";
|
|
3
3
|
import { join } from "path";
|
|
4
4
|
import { getAgentDir } from "../config.js";
|
|
5
5
|
export const KEYBINDINGS = {
|
|
@@ -23,10 +23,6 @@ export const KEYBINDINGS = {
|
|
|
23
23
|
defaultKeys: "shift+ctrl+p",
|
|
24
24
|
description: "Cycle to previous model",
|
|
25
25
|
},
|
|
26
|
-
"app.model.providerPrevious": {
|
|
27
|
-
defaultKeys: "shift+tab",
|
|
28
|
-
description: "Cycle to previous provider in the model selector",
|
|
29
|
-
},
|
|
30
26
|
"app.model.select": { defaultKeys: "ctrl+l", description: "Open model selector" },
|
|
31
27
|
"app.tools.expand": { defaultKeys: "ctrl+o", description: "Toggle tool output" },
|
|
32
28
|
"app.thinking.toggle": {
|
|
@@ -286,32 +282,6 @@ export class KeybindingsManager extends TuiKeybindingsManager {
|
|
|
286
282
|
return;
|
|
287
283
|
this.setUserBindings(KeybindingsManager.loadFromFile(this.configPath));
|
|
288
284
|
}
|
|
289
|
-
matchInScope(data, keybindings) {
|
|
290
|
-
const matches = [];
|
|
291
|
-
for (const keybinding of keybindings) {
|
|
292
|
-
for (const key of this.getKeys(keybinding)) {
|
|
293
|
-
if (matchesKey(data, key)) {
|
|
294
|
-
matches.push({ keybinding, key });
|
|
295
|
-
break;
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
if (matches.length <= 1) {
|
|
300
|
-
return { keybinding: matches[0]?.keybinding, conflicts: [] };
|
|
301
|
-
}
|
|
302
|
-
const conflictsByKey = new Map();
|
|
303
|
-
for (const match of matches) {
|
|
304
|
-
const conflict = conflictsByKey.get(match.key) ?? new Set();
|
|
305
|
-
conflict.add(match.keybinding);
|
|
306
|
-
conflictsByKey.set(match.key, conflict);
|
|
307
|
-
}
|
|
308
|
-
return {
|
|
309
|
-
keybinding: undefined,
|
|
310
|
-
conflicts: [...conflictsByKey]
|
|
311
|
-
.map(([key, conflicted]) => ({ key, keybindings: [...conflicted] }))
|
|
312
|
-
.filter((conflict) => conflict.keybindings.length > 1),
|
|
313
|
-
};
|
|
314
|
-
}
|
|
315
285
|
getEffectiveConfig() {
|
|
316
286
|
return this.getResolvedBindings();
|
|
317
287
|
}
|