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,182 @@
|
|
|
1
|
+
import { existsSync, realpathSync } from "node:fs";
|
|
2
|
+
import { basename, dirname, isAbsolute, relative, resolve } from "node:path";
|
|
3
|
+
export function assertLoadoutAccess(guard, request) {
|
|
4
|
+
if (!guard)
|
|
5
|
+
return;
|
|
6
|
+
const decision = guard(request);
|
|
7
|
+
if (!decision.allowed) {
|
|
8
|
+
throw new Error(`loadout: ${decision.reason}`);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
const DEFAULT_BLOCKED_PATHS = ["**/.env*", "**/*secret*", "**/*key*", "**/.git", "**/.git/*"];
|
|
12
|
+
export function createLoadoutAccessPolicy(options) {
|
|
13
|
+
const cwd = normalizeRootPath(options.cwd);
|
|
14
|
+
return {
|
|
15
|
+
cwd,
|
|
16
|
+
activeTools: uniqueSorted(options.activeTools.map((toolName) => toolName.trim()).filter((toolName) => toolName !== "")),
|
|
17
|
+
readRoots: normalizeAccessSet(cwd, options.readSet),
|
|
18
|
+
writeRoots: normalizeAccessSet(cwd, options.writeSet),
|
|
19
|
+
blockedPaths: uniqueSorted(options.blockedPaths ?? DEFAULT_BLOCKED_PATHS),
|
|
20
|
+
commands: options.commands ?? { mode: "none" },
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export function isActiveLoadoutTool(policy, toolName) {
|
|
24
|
+
return policy.activeTools.includes(toolName.trim());
|
|
25
|
+
}
|
|
26
|
+
export function decideLoadoutAccess(policy, request) {
|
|
27
|
+
if (!isActiveLoadoutTool(policy, request.toolName)) {
|
|
28
|
+
return deny(`inactive tool: ${request.toolName}`);
|
|
29
|
+
}
|
|
30
|
+
if (request.operation === "execute")
|
|
31
|
+
return decideCommandAccess(policy, request);
|
|
32
|
+
return decidePathAccess(policy, request);
|
|
33
|
+
}
|
|
34
|
+
function decidePathAccess(policy, request) {
|
|
35
|
+
const normalizedPath = normalizeRequestPath(policy.cwd, request.path);
|
|
36
|
+
if (!normalizedPath)
|
|
37
|
+
return deny("invalid path");
|
|
38
|
+
if (isBlockedPath(policy, normalizedPath))
|
|
39
|
+
return deny("blocked path", normalizedPath);
|
|
40
|
+
if (request.operation === "read") {
|
|
41
|
+
const roots = uniqueSorted([...policy.readRoots, ...policy.writeRoots]);
|
|
42
|
+
if (roots.length === 0)
|
|
43
|
+
return deny("outside read scope: empty read/write set", normalizedPath);
|
|
44
|
+
if (roots.some((root) => containsPath(root, normalizedPath)))
|
|
45
|
+
return allow(normalizedPath);
|
|
46
|
+
return deny("outside read scope", normalizedPath);
|
|
47
|
+
}
|
|
48
|
+
if (policy.writeRoots.length === 0)
|
|
49
|
+
return deny("outside write scope: empty write set", normalizedPath);
|
|
50
|
+
if (policy.writeRoots.some((root) => containsPath(root, normalizedPath)))
|
|
51
|
+
return allow(normalizedPath);
|
|
52
|
+
return deny("outside write scope", normalizedPath);
|
|
53
|
+
}
|
|
54
|
+
function decideCommandAccess(policy, request) {
|
|
55
|
+
const normalizedCommand = request.command.trim();
|
|
56
|
+
if (normalizedCommand === "" || normalizedCommand.includes("\0"))
|
|
57
|
+
return denyCommand("invalid command");
|
|
58
|
+
if (policy.commands.mode === "none")
|
|
59
|
+
return denyCommand("command mode none");
|
|
60
|
+
if (policy.commands.blockPatterns?.some((pattern) => commandMatchesPattern(pattern, normalizedCommand))) {
|
|
61
|
+
return denyCommand("blocked command pattern");
|
|
62
|
+
}
|
|
63
|
+
if (policy.commands.allowPatterns?.some((pattern) => commandMatchesPattern(pattern, normalizedCommand))) {
|
|
64
|
+
return { allowed: true, reason: "allowed", normalizedCommand };
|
|
65
|
+
}
|
|
66
|
+
return denyCommand(`command mode ${policy.commands.mode} requires an explicit allow pattern`);
|
|
67
|
+
}
|
|
68
|
+
function allow(normalizedPath) {
|
|
69
|
+
return { allowed: true, reason: "allowed", normalizedPath };
|
|
70
|
+
}
|
|
71
|
+
function deny(reason, normalizedPath) {
|
|
72
|
+
return { allowed: false, reason, normalizedPath };
|
|
73
|
+
}
|
|
74
|
+
function denyCommand(reason) {
|
|
75
|
+
return { allowed: false, reason };
|
|
76
|
+
}
|
|
77
|
+
function normalizeRootPath(path) {
|
|
78
|
+
const normalized = normalizePathSeparators(path);
|
|
79
|
+
if (normalized.trim() === "" || normalized.includes("\0")) {
|
|
80
|
+
throw new Error("loadout access policy cwd must be a non-empty path");
|
|
81
|
+
}
|
|
82
|
+
return stripTrailingSeparator(canonicalizeExistingPrefix(resolve(normalized)));
|
|
83
|
+
}
|
|
84
|
+
function normalizeRequestPath(cwd, requestedPath) {
|
|
85
|
+
const normalized = normalizePathSeparators(requestedPath);
|
|
86
|
+
if (normalized.trim() === "" || normalized.includes("\0"))
|
|
87
|
+
return undefined;
|
|
88
|
+
return stripTrailingSeparator(canonicalizeExistingPrefix(resolve(cwd, normalized)));
|
|
89
|
+
}
|
|
90
|
+
function normalizeAccessSet(cwd, accessSet) {
|
|
91
|
+
if (!accessSet)
|
|
92
|
+
return [];
|
|
93
|
+
const roots = [];
|
|
94
|
+
for (const entry of accessSet) {
|
|
95
|
+
if (entry.symbols && entry.symbols.length > 0)
|
|
96
|
+
continue;
|
|
97
|
+
const normalized = normalizePathSeparators(entry.path);
|
|
98
|
+
if (normalized.trim() === "" || normalized.includes("\0"))
|
|
99
|
+
continue;
|
|
100
|
+
roots.push(stripTrailingSeparator(canonicalizeExistingPrefix(resolve(cwd, normalized))));
|
|
101
|
+
}
|
|
102
|
+
return uniqueSorted(roots);
|
|
103
|
+
}
|
|
104
|
+
function canonicalizeExistingPrefix(path) {
|
|
105
|
+
try {
|
|
106
|
+
return realpathSync.native(path);
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
if (existsSync(path))
|
|
110
|
+
return resolve(path);
|
|
111
|
+
const parent = dirname(path);
|
|
112
|
+
if (parent === path)
|
|
113
|
+
return resolve(path);
|
|
114
|
+
return resolve(canonicalizeExistingPrefix(parent), basename(path));
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
function containsPath(root, candidate) {
|
|
118
|
+
if (candidate === root)
|
|
119
|
+
return true;
|
|
120
|
+
const relativePath = relative(root, candidate);
|
|
121
|
+
return relativePath !== "" && !relativePath.startsWith("..") && !isAbsolute(relativePath);
|
|
122
|
+
}
|
|
123
|
+
function isBlockedPath(policy, normalizedPath) {
|
|
124
|
+
const relativeCandidate = toForwardSlashes(relative(policy.cwd, normalizedPath));
|
|
125
|
+
const candidates = uniqueSorted([toForwardSlashes(normalizedPath), relativeCandidate]);
|
|
126
|
+
return policy.blockedPaths.some((pattern) => candidates.some((candidate) => globMatch(pattern, candidate)));
|
|
127
|
+
}
|
|
128
|
+
function commandMatchesPattern(pattern, command) {
|
|
129
|
+
return pattern === command || globMatch(pattern, command);
|
|
130
|
+
}
|
|
131
|
+
function normalizePathSeparators(path) {
|
|
132
|
+
return path.replaceAll("\\", "/");
|
|
133
|
+
}
|
|
134
|
+
function stripTrailingSeparator(path) {
|
|
135
|
+
if (path === "/")
|
|
136
|
+
return path;
|
|
137
|
+
return path.endsWith("/") ? path.slice(0, -1) : path;
|
|
138
|
+
}
|
|
139
|
+
function toForwardSlashes(path) {
|
|
140
|
+
return path.replaceAll("\\", "/");
|
|
141
|
+
}
|
|
142
|
+
function globMatch(glob, value) {
|
|
143
|
+
return globToRegExp(normalizePathSeparators(glob)).test(toForwardSlashes(value));
|
|
144
|
+
}
|
|
145
|
+
function globToRegExp(glob) {
|
|
146
|
+
let pattern = "";
|
|
147
|
+
for (let index = 0; index < glob.length; index++) {
|
|
148
|
+
const char = glob[index];
|
|
149
|
+
if (char === "*") {
|
|
150
|
+
if (glob[index + 1] === "*") {
|
|
151
|
+
if (glob[index + 2] === "/") {
|
|
152
|
+
pattern += "(?:.*/)?";
|
|
153
|
+
index += 2;
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
pattern += ".*";
|
|
157
|
+
index++;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
pattern += "[^/]*";
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
else if (char === "?") {
|
|
165
|
+
pattern += "[^/]";
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
pattern += char.replace(/[.+^${}()|[\]\\]/g, "\\$&");
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return new RegExp(`^${pattern}$`);
|
|
172
|
+
}
|
|
173
|
+
function uniqueSorted(values) {
|
|
174
|
+
return [...new Set(values)].sort((a, b) => {
|
|
175
|
+
if (a < b)
|
|
176
|
+
return -1;
|
|
177
|
+
if (a > b)
|
|
178
|
+
return 1;
|
|
179
|
+
return 0;
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=loadout-access-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadout-access-policy.js","sourceRoot":"","sources":["../../src/core/loadout-access-policy.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, realpathSync } from \"node:fs\";\nimport { basename, dirname, isAbsolute, relative, resolve } from \"node:path\";\nimport type { LoadoutAccessEntry, LoadoutCommands } from \"./loadouts.ts\";\n\nexport type LoadoutAccessOperation = \"read\" | \"write\" | \"execute\";\n\nexport interface CreateLoadoutAccessPolicyOptions {\n\tcwd: string;\n\tactiveTools: readonly string[];\n\treadSet?: readonly LoadoutAccessEntry[];\n\twriteSet?: readonly LoadoutAccessEntry[];\n\tblockedPaths?: readonly string[];\n\tcommands?: LoadoutCommands;\n}\n\nexport interface LoadoutAccessPolicy {\n\tcwd: string;\n\tactiveTools: readonly string[];\n\treadRoots: readonly string[];\n\twriteRoots: readonly string[];\n\tblockedPaths: readonly string[];\n\tcommands: LoadoutCommands;\n}\n\nexport interface LoadoutPathAccessRequest {\n\toperation: \"read\" | \"write\";\n\ttoolName: string;\n\tpath: string;\n}\n\nexport interface LoadoutCommandAccessRequest {\n\toperation: \"execute\";\n\ttoolName: string;\n\tcommand: string;\n}\n\nexport type LoadoutAccessRequest = LoadoutPathAccessRequest | LoadoutCommandAccessRequest;\n\nexport interface LoadoutAccessDecision {\n\tallowed: boolean;\n\treason: string;\n\tnormalizedPath?: string;\n\tnormalizedCommand?: string;\n}\n\nexport type LoadoutAccessGuard = (request: LoadoutAccessRequest) => LoadoutAccessDecision;\n\nexport function assertLoadoutAccess(guard: LoadoutAccessGuard | undefined, request: LoadoutAccessRequest): void {\n\tif (!guard) return;\n\tconst decision = guard(request);\n\tif (!decision.allowed) {\n\t\tthrow new Error(`loadout: ${decision.reason}`);\n\t}\n}\n\nconst DEFAULT_BLOCKED_PATHS = [\"**/.env*\", \"**/*secret*\", \"**/*key*\", \"**/.git\", \"**/.git/*\"] as const;\n\nexport function createLoadoutAccessPolicy(options: CreateLoadoutAccessPolicyOptions): LoadoutAccessPolicy {\n\tconst cwd = normalizeRootPath(options.cwd);\n\treturn {\n\t\tcwd,\n\t\tactiveTools: uniqueSorted(\n\t\t\toptions.activeTools.map((toolName) => toolName.trim()).filter((toolName) => toolName !== \"\"),\n\t\t),\n\t\treadRoots: normalizeAccessSet(cwd, options.readSet),\n\t\twriteRoots: normalizeAccessSet(cwd, options.writeSet),\n\t\tblockedPaths: uniqueSorted(options.blockedPaths ?? DEFAULT_BLOCKED_PATHS),\n\t\tcommands: options.commands ?? { mode: \"none\" },\n\t};\n}\n\nexport function isActiveLoadoutTool(policy: Pick<LoadoutAccessPolicy, \"activeTools\">, toolName: string): boolean {\n\treturn policy.activeTools.includes(toolName.trim());\n}\n\nexport function decideLoadoutAccess(policy: LoadoutAccessPolicy, request: LoadoutAccessRequest): LoadoutAccessDecision {\n\tif (!isActiveLoadoutTool(policy, request.toolName)) {\n\t\treturn deny(`inactive tool: ${request.toolName}`);\n\t}\n\tif (request.operation === \"execute\") return decideCommandAccess(policy, request);\n\treturn decidePathAccess(policy, request);\n}\n\nfunction decidePathAccess(policy: LoadoutAccessPolicy, request: LoadoutPathAccessRequest): LoadoutAccessDecision {\n\tconst normalizedPath = normalizeRequestPath(policy.cwd, request.path);\n\tif (!normalizedPath) return deny(\"invalid path\");\n\tif (isBlockedPath(policy, normalizedPath)) return deny(\"blocked path\", normalizedPath);\n\n\tif (request.operation === \"read\") {\n\t\tconst roots = uniqueSorted([...policy.readRoots, ...policy.writeRoots]);\n\t\tif (roots.length === 0) return deny(\"outside read scope: empty read/write set\", normalizedPath);\n\t\tif (roots.some((root) => containsPath(root, normalizedPath))) return allow(normalizedPath);\n\t\treturn deny(\"outside read scope\", normalizedPath);\n\t}\n\n\tif (policy.writeRoots.length === 0) return deny(\"outside write scope: empty write set\", normalizedPath);\n\tif (policy.writeRoots.some((root) => containsPath(root, normalizedPath))) return allow(normalizedPath);\n\treturn deny(\"outside write scope\", normalizedPath);\n}\n\nfunction decideCommandAccess(policy: LoadoutAccessPolicy, request: LoadoutCommandAccessRequest): LoadoutAccessDecision {\n\tconst normalizedCommand = request.command.trim();\n\tif (normalizedCommand === \"\" || normalizedCommand.includes(\"\\0\")) return denyCommand(\"invalid command\");\n\tif (policy.commands.mode === \"none\") return denyCommand(\"command mode none\");\n\tif (policy.commands.blockPatterns?.some((pattern) => commandMatchesPattern(pattern, normalizedCommand))) {\n\t\treturn denyCommand(\"blocked command pattern\");\n\t}\n\tif (policy.commands.allowPatterns?.some((pattern) => commandMatchesPattern(pattern, normalizedCommand))) {\n\t\treturn { allowed: true, reason: \"allowed\", normalizedCommand };\n\t}\n\treturn denyCommand(`command mode ${policy.commands.mode} requires an explicit allow pattern`);\n}\n\nfunction allow(normalizedPath: string): LoadoutAccessDecision {\n\treturn { allowed: true, reason: \"allowed\", normalizedPath };\n}\n\nfunction deny(reason: string, normalizedPath?: string): LoadoutAccessDecision {\n\treturn { allowed: false, reason, normalizedPath };\n}\n\nfunction denyCommand(reason: string): LoadoutAccessDecision {\n\treturn { allowed: false, reason };\n}\n\nfunction normalizeRootPath(path: string): string {\n\tconst normalized = normalizePathSeparators(path);\n\tif (normalized.trim() === \"\" || normalized.includes(\"\\0\")) {\n\t\tthrow new Error(\"loadout access policy cwd must be a non-empty path\");\n\t}\n\treturn stripTrailingSeparator(canonicalizeExistingPrefix(resolve(normalized)));\n}\n\nfunction normalizeRequestPath(cwd: string, requestedPath: string): string | undefined {\n\tconst normalized = normalizePathSeparators(requestedPath);\n\tif (normalized.trim() === \"\" || normalized.includes(\"\\0\")) return undefined;\n\treturn stripTrailingSeparator(canonicalizeExistingPrefix(resolve(cwd, normalized)));\n}\n\nfunction normalizeAccessSet(cwd: string, accessSet: readonly LoadoutAccessEntry[] | undefined): string[] {\n\tif (!accessSet) return [];\n\tconst roots: string[] = [];\n\tfor (const entry of accessSet) {\n\t\tif (entry.symbols && entry.symbols.length > 0) continue;\n\t\tconst normalized = normalizePathSeparators(entry.path);\n\t\tif (normalized.trim() === \"\" || normalized.includes(\"\\0\")) continue;\n\t\troots.push(stripTrailingSeparator(canonicalizeExistingPrefix(resolve(cwd, normalized))));\n\t}\n\treturn uniqueSorted(roots);\n}\n\nfunction canonicalizeExistingPrefix(path: string): string {\n\ttry {\n\t\treturn realpathSync.native(path);\n\t} catch {\n\t\tif (existsSync(path)) return resolve(path);\n\t\tconst parent = dirname(path);\n\t\tif (parent === path) return resolve(path);\n\t\treturn resolve(canonicalizeExistingPrefix(parent), basename(path));\n\t}\n}\n\nfunction containsPath(root: string, candidate: string): boolean {\n\tif (candidate === root) return true;\n\tconst relativePath = relative(root, candidate);\n\treturn relativePath !== \"\" && !relativePath.startsWith(\"..\") && !isAbsolute(relativePath);\n}\n\nfunction isBlockedPath(policy: LoadoutAccessPolicy, normalizedPath: string): boolean {\n\tconst relativeCandidate = toForwardSlashes(relative(policy.cwd, normalizedPath));\n\tconst candidates = uniqueSorted([toForwardSlashes(normalizedPath), relativeCandidate]);\n\treturn policy.blockedPaths.some((pattern) => candidates.some((candidate) => globMatch(pattern, candidate)));\n}\n\nfunction commandMatchesPattern(pattern: string, command: string): boolean {\n\treturn pattern === command || globMatch(pattern, command);\n}\n\nfunction normalizePathSeparators(path: string): string {\n\treturn path.replaceAll(\"\\\\\", \"/\");\n}\n\nfunction stripTrailingSeparator(path: string): string {\n\tif (path === \"/\") return path;\n\treturn path.endsWith(\"/\") ? path.slice(0, -1) : path;\n}\n\nfunction toForwardSlashes(path: string): string {\n\treturn path.replaceAll(\"\\\\\", \"/\");\n}\n\nfunction globMatch(glob: string, value: string): boolean {\n\treturn globToRegExp(normalizePathSeparators(glob)).test(toForwardSlashes(value));\n}\n\nfunction globToRegExp(glob: string): RegExp {\n\tlet pattern = \"\";\n\tfor (let index = 0; index < glob.length; index++) {\n\t\tconst char = glob[index];\n\t\tif (char === \"*\") {\n\t\t\tif (glob[index + 1] === \"*\") {\n\t\t\t\tif (glob[index + 2] === \"/\") {\n\t\t\t\t\tpattern += \"(?:.*/)?\";\n\t\t\t\t\tindex += 2;\n\t\t\t\t} else {\n\t\t\t\t\tpattern += \".*\";\n\t\t\t\t\tindex++;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tpattern += \"[^/]*\";\n\t\t\t}\n\t\t} else if (char === \"?\") {\n\t\t\tpattern += \"[^/]\";\n\t\t} else {\n\t\t\tpattern += char.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\t\t}\n\t}\n\treturn new RegExp(`^${pattern}$`);\n}\n\nfunction uniqueSorted(values: readonly string[]): string[] {\n\treturn [...new Set(values)].sort((a, b) => {\n\t\tif (a < b) return -1;\n\t\tif (a > b) return 1;\n\t\treturn 0;\n\t});\n}\n"]}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Role + domain loadout composition.
|
|
3
|
+
*
|
|
4
|
+
* The composer is pure and additive: it never mutates built-in role loadouts or
|
|
5
|
+
* domain profiles. It can only narrow authority and active tools, while forcing
|
|
6
|
+
* baseline security hooks and downgrading writable filesystem MCP access for
|
|
7
|
+
* read-only authorities.
|
|
8
|
+
*/
|
|
9
|
+
import { type DomainProfile } from "./domain-loadouts.ts";
|
|
10
|
+
import { type StrippedCapability } from "./loadout-safety.ts";
|
|
11
|
+
import { type LoadoutAuthority, type LoadoutProfile, type LoadoutRole } from "./loadouts.ts";
|
|
12
|
+
export interface SamplingProfile {
|
|
13
|
+
readonly temperature?: number;
|
|
14
|
+
readonly topP?: number;
|
|
15
|
+
readonly topK?: number;
|
|
16
|
+
}
|
|
17
|
+
export interface ScopeHints {
|
|
18
|
+
readonly readScope?: readonly string[];
|
|
19
|
+
readonly writeScope?: readonly string[];
|
|
20
|
+
readonly executeScope?: readonly string[];
|
|
21
|
+
}
|
|
22
|
+
export interface CompositionTrace {
|
|
23
|
+
readonly roleAuthority: LoadoutAuthority;
|
|
24
|
+
readonly domainAuthority: LoadoutAuthority;
|
|
25
|
+
readonly grantAuthority?: LoadoutAuthority;
|
|
26
|
+
readonly composedAuthority: LoadoutAuthority;
|
|
27
|
+
readonly stripped: readonly StrippedCapability[];
|
|
28
|
+
readonly downgraded: readonly {
|
|
29
|
+
readonly mcp: string;
|
|
30
|
+
readonly to: string;
|
|
31
|
+
}[];
|
|
32
|
+
readonly warnings: readonly string[];
|
|
33
|
+
}
|
|
34
|
+
export interface ComposedLoadout extends LoadoutProfile {
|
|
35
|
+
readonly role: LoadoutRole;
|
|
36
|
+
readonly domainId: string;
|
|
37
|
+
readonly domainResolvedFromFallback: boolean;
|
|
38
|
+
readonly routingPrompt?: string;
|
|
39
|
+
readonly samplingProfile?: SamplingProfile;
|
|
40
|
+
readonly scopeHints?: ScopeHints;
|
|
41
|
+
readonly composition: CompositionTrace;
|
|
42
|
+
}
|
|
43
|
+
export interface ComposeLoadoutOptions {
|
|
44
|
+
readonly grantAuthority?: LoadoutAuthority;
|
|
45
|
+
readonly preserveRoleAuthority?: boolean;
|
|
46
|
+
readonly scopeHints?: ScopeHints;
|
|
47
|
+
readonly forcedSecurityHooks?: readonly string[];
|
|
48
|
+
readonly roleProfileOverride?: LoadoutProfile;
|
|
49
|
+
readonly samplingProfile?: SamplingProfile;
|
|
50
|
+
}
|
|
51
|
+
export type ComposeOptions = ComposeLoadoutOptions;
|
|
52
|
+
export declare function composeLoadout(role: LoadoutRole, domain: DomainProfile | string, options?: ComposeLoadoutOptions): ComposedLoadout;
|
|
53
|
+
//# sourceMappingURL=loadout-compose.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadout-compose.d.ts","sourceRoot":"","sources":["../../src/core/loadout-compose.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,aAAa,EAAoB,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAKN,KAAK,kBAAkB,EAMvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAIN,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,WAAW,EAGhB,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C;AAED,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,aAAa,EAAE,gBAAgB,CAAC;IACzC,QAAQ,CAAC,eAAe,EAAE,gBAAgB,CAAC;IAC3C,QAAQ,CAAC,cAAc,CAAC,EAAE,gBAAgB,CAAC;IAC3C,QAAQ,CAAC,iBAAiB,EAAE,gBAAgB,CAAC;IAC7C,QAAQ,CAAC,QAAQ,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACjD,QAAQ,CAAC,UAAU,EAAE,SAAS;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC9E,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,eAAgB,SAAQ,cAAc;IACtD,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,0BAA0B,EAAE,OAAO,CAAC;IAC7C,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,eAAe,CAAC,EAAE,eAAe,CAAC;IAC3C,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAC;CACvC;AAED,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,cAAc,CAAC,EAAE,gBAAgB,CAAC;IAC3C,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IACzC,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;IACjC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjD,QAAQ,CAAC,mBAAmB,CAAC,EAAE,cAAc,CAAC;IAC9C,QAAQ,CAAC,eAAe,CAAC,EAAE,eAAe,CAAC;CAC3C;AAED,MAAM,MAAM,cAAc,GAAG,qBAAqB,CAAC;AAYnD,wBAAgB,cAAc,CAC7B,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE,aAAa,GAAG,MAAM,EAC9B,OAAO,GAAE,qBAA0B,GACjC,eAAe,CA0DjB","sourcesContent":["/**\n * Role + domain loadout composition.\n *\n * The composer is pure and additive: it never mutates built-in role loadouts or\n * domain profiles. It can only narrow authority and active tools, while forcing\n * baseline security hooks and downgrading writable filesystem MCP access for\n * read-only authorities.\n */\n\nimport { type DomainProfile, getDomainProfile } from \"./domain-loadouts.ts\";\nimport {\n\tcapabilityGateNames,\n\tdowngradeMcpForAuthority,\n\tforceSecurityHooks,\n\tminAuthority,\n\ttype StrippedCapability,\n\tselectSafestCommandMode,\n\tstripWriteSkillsForAuthority,\n\tstripWriteToolsForAuthority,\n\tunionCapabilityGateNames,\n\tuniqueSorted,\n} from \"./loadout-safety.ts\";\nimport {\n\tBUILTIN_LOADOUTS,\n\ttype CapabilityGate,\n\tinferLoadoutForRole,\n\ttype LoadoutAuthority,\n\ttype LoadoutProfile,\n\ttype LoadoutRole,\n\ttype ToolGate,\n\tvalidateLoadoutProfile,\n} from \"./loadouts.ts\";\n\nexport interface SamplingProfile {\n\treadonly temperature?: number;\n\treadonly topP?: number;\n\treadonly topK?: number;\n}\n\nexport interface ScopeHints {\n\treadonly readScope?: readonly string[];\n\treadonly writeScope?: readonly string[];\n\treadonly executeScope?: readonly string[];\n}\n\nexport interface CompositionTrace {\n\treadonly roleAuthority: LoadoutAuthority;\n\treadonly domainAuthority: LoadoutAuthority;\n\treadonly grantAuthority?: LoadoutAuthority;\n\treadonly composedAuthority: LoadoutAuthority;\n\treadonly stripped: readonly StrippedCapability[];\n\treadonly downgraded: readonly { readonly mcp: string; readonly to: string }[];\n\treadonly warnings: readonly string[];\n}\n\nexport interface ComposedLoadout extends LoadoutProfile {\n\treadonly role: LoadoutRole;\n\treadonly domainId: string;\n\treadonly domainResolvedFromFallback: boolean;\n\treadonly routingPrompt?: string;\n\treadonly samplingProfile?: SamplingProfile;\n\treadonly scopeHints?: ScopeHints;\n\treadonly composition: CompositionTrace;\n}\n\nexport interface ComposeLoadoutOptions {\n\treadonly grantAuthority?: LoadoutAuthority;\n\treadonly preserveRoleAuthority?: boolean;\n\treadonly scopeHints?: ScopeHints;\n\treadonly forcedSecurityHooks?: readonly string[];\n\treadonly roleProfileOverride?: LoadoutProfile;\n\treadonly samplingProfile?: SamplingProfile;\n}\n\nexport type ComposeOptions = ComposeLoadoutOptions;\n\ninterface ResolvedDomainProfile {\n\treadonly profile: DomainProfile;\n\treadonly fallback: boolean;\n}\n\ninterface ComposedMcpGate {\n\treadonly gate: CapabilityGate;\n\treadonly downgraded: readonly { readonly mcp: string; readonly to: string }[];\n}\n\nexport function composeLoadout(\n\trole: LoadoutRole,\n\tdomain: DomainProfile | string,\n\toptions: ComposeLoadoutOptions = {},\n): ComposedLoadout {\n\tconst roleProfile = options.roleProfileOverride ?? BUILTIN_LOADOUTS[inferLoadoutForRole(role)];\n\tconst resolvedDomain = resolveDomainProfile(domain);\n\tconst domainProfile = resolvedDomain.profile;\n\tconst composedAuthority = minAuthority(roleProfile.authority, domainProfile.authority, options.grantAuthority);\n\n\tconst stripped: StrippedCapability[] = [];\n\tconst warnings: string[] = [];\n\n\tconst toolGate = composeToolGate(roleProfile.tools, domainProfile.tools, composedAuthority, stripped);\n\tconst skills = composeCapabilityGate(\"skill\", roleProfile.skills, domainProfile.skills, composedAuthority, stripped);\n\tconst mcp = composeMcpGate(roleProfile.mcp, domainProfile.mcp, composedAuthority);\n\tconst hooks = composeHookGate(roleProfile.hooks, domainProfile.hooks, options.forcedSecurityHooks);\n\tconst commands = selectSafestCommandMode(\n\t\tcomposedAuthority,\n\t\troleProfile.commands?.mode,\n\t\tdomainProfile.commands?.mode,\n\t);\n\n\twarnings.push(...selectorWarnings(\"role skills\", roleProfile.skills));\n\twarnings.push(...selectorWarnings(\"domain skills\", domainProfile.skills));\n\twarnings.push(...selectorWarnings(\"role mcp\", roleProfile.mcp));\n\twarnings.push(...selectorWarnings(\"domain mcp\", domainProfile.mcp));\n\twarnings.push(...selectorWarnings(\"role hooks\", roleProfile.hooks));\n\twarnings.push(...selectorWarnings(\"domain hooks\", domainProfile.hooks));\n\n\tconst composed: ComposedLoadout = {\n\t\tschemaVersion: \"omk.loadout.v1\",\n\t\tname: `${roleProfile.name}+${domainProfile.id}`,\n\t\tdescription: `Composed ${roleProfile.name} role loadout with ${domainProfile.id} domain profile`,\n\t\tauthority: composedAuthority,\n\t\ttools: toolGate,\n\t\tskills,\n\t\tmcp: mcp.gate,\n\t\thooks,\n\t\tcommands,\n\t\trole,\n\t\tdomainId: domainProfile.id,\n\t\tdomainResolvedFromFallback: resolvedDomain.fallback,\n\t\troutingPrompt: domainProfile.routingPrompt,\n\t\t...(options.samplingProfile ? { samplingProfile: options.samplingProfile } : {}),\n\t\t...(options.scopeHints ? { scopeHints: options.scopeHints } : {}),\n\t\tcomposition: {\n\t\t\troleAuthority: roleProfile.authority,\n\t\t\tdomainAuthority: domainProfile.authority,\n\t\t\t...(options.grantAuthority ? { grantAuthority: options.grantAuthority } : {}),\n\t\t\tcomposedAuthority,\n\t\t\tstripped: uniqueStripped(stripped),\n\t\t\tdowngraded: mcp.downgraded,\n\t\t\twarnings: uniqueSorted(warnings),\n\t\t},\n\t};\n\n\tconst validation = validateLoadoutProfile(composed);\n\tif (!validation.valid) {\n\t\tthrow new Error(`composed loadout is invalid: ${validation.errors.join(\"; \")}`);\n\t}\n\treturn composed;\n}\n\nfunction resolveDomainProfile(domain: DomainProfile | string): ResolvedDomainProfile {\n\tif (typeof domain !== \"string\") return { profile: domain, fallback: false };\n\tconst profile = getDomainProfile(domain);\n\treturn { profile, fallback: profile.id !== domain };\n}\n\nfunction composeToolGate(\n\troleGate: ToolGate,\n\tdomainGate: ToolGate,\n\tauthority: LoadoutAuthority,\n\tstripped: StrippedCapability[],\n): ToolGate {\n\tconst roleAllow = roleGate.allow ?? [];\n\tconst domainAllow = domainGate.allow ?? [];\n\tconst allowed = intersectNames(roleAllow, domainAllow);\n\tconst strippedTools = stripWriteToolsForAuthority(allowed, authority);\n\tstripped.push(...strippedTools.stripped);\n\tconst require = uniqueSorted([...(roleGate.require ?? []), ...(domainGate.require ?? [])]);\n\tconst exclude = uniqueSorted([...(roleGate.exclude ?? []), ...(domainGate.exclude ?? [])]);\n\treturn cleanToolGate({\n\t\tallow: strippedTools.names,\n\t\t...(require.length > 0 ? { require } : {}),\n\t\t...(exclude.length > 0 ? { exclude } : {}),\n\t});\n}\n\nfunction composeCapabilityGate(\n\tkind: \"skill\",\n\troleGate: CapabilityGate | undefined,\n\tdomainGate: CapabilityGate | undefined,\n\tauthority: LoadoutAuthority,\n\tstripped: StrippedCapability[],\n): CapabilityGate {\n\tconst allowNames = uniqueSorted([...capabilityGateNames(roleGate), ...capabilityGateNames(domainGate)]);\n\tconst requireNames = uniqueSorted([\n\t\t...capabilityGateNames(roleGate, \"require\"),\n\t\t...capabilityGateNames(domainGate, \"require\"),\n\t]);\n\tconst excludeNames = unionCapabilityGateNames(\"exclude\", roleGate, domainGate);\n\tconst strippedAllow = stripWriteSkillsForAuthority(allowNames, authority);\n\tconst strippedRequire = stripWriteSkillsForAuthority(requireNames, authority);\n\tstripped.push(...strippedAllow.stripped, ...strippedRequire.stripped);\n\treturn cleanCapabilityGate(kind, strippedAllow.names, strippedRequire.names, excludeNames);\n}\n\nfunction composeMcpGate(\n\troleGate: CapabilityGate | undefined,\n\tdomainGate: CapabilityGate | undefined,\n\tauthority: LoadoutAuthority,\n): ComposedMcpGate {\n\tconst allowDowngrade = downgradeMcpForAuthority(\n\t\tuniqueSorted([...capabilityGateNames(roleGate), ...capabilityGateNames(domainGate)]),\n\t\tauthority,\n\t);\n\tconst requireDowngrade = downgradeMcpForAuthority(\n\t\tuniqueSorted([...capabilityGateNames(roleGate, \"require\"), ...capabilityGateNames(domainGate, \"require\")]),\n\t\tauthority,\n\t);\n\tconst excludeNames = unionCapabilityGateNames(\"exclude\", roleGate, domainGate);\n\treturn {\n\t\tgate: cleanCapabilityGate(\"mcp\", allowDowngrade.names, requireDowngrade.names, excludeNames),\n\t\tdowngraded: uniqueMcpDowngrades([...allowDowngrade.downgraded, ...requireDowngrade.downgraded]),\n\t};\n}\n\nfunction composeHookGate(\n\troleGate: CapabilityGate | undefined,\n\tdomainGate: CapabilityGate | undefined,\n\tforcedSecurityHooks: readonly string[] | undefined,\n): CapabilityGate {\n\tconst allowNames = forceSecurityHooks(\n\t\tuniqueSorted([...capabilityGateNames(roleGate), ...capabilityGateNames(domainGate)]),\n\t\tforcedSecurityHooks,\n\t);\n\tconst requireNames = uniqueSorted([\n\t\t...capabilityGateNames(roleGate, \"require\"),\n\t\t...capabilityGateNames(domainGate, \"require\"),\n\t]);\n\tconst excludeNames = unionCapabilityGateNames(\"exclude\", roleGate, domainGate);\n\treturn cleanCapabilityGate(\"hook\", allowNames, requireNames, excludeNames);\n}\n\nfunction cleanToolGate(gate: ToolGate): ToolGate {\n\treturn {\n\t\tallow: uniqueSorted(gate.allow ?? []),\n\t\t...(gate.require && gate.require.length > 0 ? { require: uniqueSorted(gate.require) } : {}),\n\t\t...(gate.exclude && gate.exclude.length > 0 ? { exclude: uniqueSorted(gate.exclude) } : {}),\n\t};\n}\n\nfunction cleanCapabilityGate(\n\tkind: \"skill\" | \"mcp\" | \"hook\",\n\tallow: readonly string[],\n\trequire: readonly string[],\n\texclude: readonly string[],\n): CapabilityGate {\n\treturn {\n\t\tallow: [{ kind, names: uniqueSorted(allow) }],\n\t\t...(require.length > 0 ? { require: [{ kind, names: uniqueSorted(require) }] } : {}),\n\t\t...(exclude.length > 0 ? { exclude: [{ kind, names: uniqueSorted(exclude) }] } : {}),\n\t};\n}\n\nfunction intersectNames(left: readonly string[], right: readonly string[]): string[] {\n\tconst rightSet = new Set(right);\n\treturn uniqueSorted(left.filter((value) => rightSet.has(value)));\n}\n\nfunction selectorWarnings(label: string, gate: CapabilityGate | undefined): string[] {\n\tconst warnings: string[] = [];\n\tfor (const group of [\"allow\", \"exclude\", \"require\"] as const) {\n\t\tfor (const selector of gate?.[group] ?? []) {\n\t\t\tif (selector.names === undefined || selector.names.length === 0) {\n\t\t\t\twarnings.push(\n\t\t\t\t\t`${label}.${group} contains a non-name selector that cannot be represented by composed gates`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\treturn warnings;\n}\n\nfunction uniqueStripped(values: readonly StrippedCapability[]): StrippedCapability[] {\n\tconst seen = new Set<string>();\n\tconst result: StrippedCapability[] = [];\n\tfor (const value of values) {\n\t\tconst key = `${value.kind}\\0${value.name}\\0${value.reason}`;\n\t\tif (seen.has(key)) continue;\n\t\tseen.add(key);\n\t\tresult.push(value);\n\t}\n\treturn result.sort((a, b) => compareString(a.kind, b.kind) || compareString(a.name, b.name));\n}\n\nfunction uniqueMcpDowngrades(\n\tvalues: readonly { readonly mcp: string; readonly to: string }[],\n): { readonly mcp: string; readonly to: string }[] {\n\tconst seen = new Set<string>();\n\tconst result: { readonly mcp: string; readonly to: string }[] = [];\n\tfor (const value of values) {\n\t\tconst key = `${value.mcp}\\0${value.to}`;\n\t\tif (seen.has(key)) continue;\n\t\tseen.add(key);\n\t\tresult.push(value);\n\t}\n\treturn result.sort((a, b) => compareString(a.mcp, b.mcp) || compareString(a.to, b.to));\n}\n\nfunction compareString(a: string, b: string): number {\n\tif (a < b) return -1;\n\tif (a > b) return 1;\n\treturn 0;\n}\n"]}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Role + domain loadout composition.
|
|
3
|
+
*
|
|
4
|
+
* The composer is pure and additive: it never mutates built-in role loadouts or
|
|
5
|
+
* domain profiles. It can only narrow authority and active tools, while forcing
|
|
6
|
+
* baseline security hooks and downgrading writable filesystem MCP access for
|
|
7
|
+
* read-only authorities.
|
|
8
|
+
*/
|
|
9
|
+
import { getDomainProfile } from "./domain-loadouts.js";
|
|
10
|
+
import { capabilityGateNames, downgradeMcpForAuthority, forceSecurityHooks, minAuthority, selectSafestCommandMode, stripWriteSkillsForAuthority, stripWriteToolsForAuthority, unionCapabilityGateNames, uniqueSorted, } from "./loadout-safety.js";
|
|
11
|
+
import { BUILTIN_LOADOUTS, inferLoadoutForRole, validateLoadoutProfile, } from "./loadouts.js";
|
|
12
|
+
export function composeLoadout(role, domain, options = {}) {
|
|
13
|
+
const roleProfile = options.roleProfileOverride ?? BUILTIN_LOADOUTS[inferLoadoutForRole(role)];
|
|
14
|
+
const resolvedDomain = resolveDomainProfile(domain);
|
|
15
|
+
const domainProfile = resolvedDomain.profile;
|
|
16
|
+
const composedAuthority = minAuthority(roleProfile.authority, domainProfile.authority, options.grantAuthority);
|
|
17
|
+
const stripped = [];
|
|
18
|
+
const warnings = [];
|
|
19
|
+
const toolGate = composeToolGate(roleProfile.tools, domainProfile.tools, composedAuthority, stripped);
|
|
20
|
+
const skills = composeCapabilityGate("skill", roleProfile.skills, domainProfile.skills, composedAuthority, stripped);
|
|
21
|
+
const mcp = composeMcpGate(roleProfile.mcp, domainProfile.mcp, composedAuthority);
|
|
22
|
+
const hooks = composeHookGate(roleProfile.hooks, domainProfile.hooks, options.forcedSecurityHooks);
|
|
23
|
+
const commands = selectSafestCommandMode(composedAuthority, roleProfile.commands?.mode, domainProfile.commands?.mode);
|
|
24
|
+
warnings.push(...selectorWarnings("role skills", roleProfile.skills));
|
|
25
|
+
warnings.push(...selectorWarnings("domain skills", domainProfile.skills));
|
|
26
|
+
warnings.push(...selectorWarnings("role mcp", roleProfile.mcp));
|
|
27
|
+
warnings.push(...selectorWarnings("domain mcp", domainProfile.mcp));
|
|
28
|
+
warnings.push(...selectorWarnings("role hooks", roleProfile.hooks));
|
|
29
|
+
warnings.push(...selectorWarnings("domain hooks", domainProfile.hooks));
|
|
30
|
+
const composed = {
|
|
31
|
+
schemaVersion: "omk.loadout.v1",
|
|
32
|
+
name: `${roleProfile.name}+${domainProfile.id}`,
|
|
33
|
+
description: `Composed ${roleProfile.name} role loadout with ${domainProfile.id} domain profile`,
|
|
34
|
+
authority: composedAuthority,
|
|
35
|
+
tools: toolGate,
|
|
36
|
+
skills,
|
|
37
|
+
mcp: mcp.gate,
|
|
38
|
+
hooks,
|
|
39
|
+
commands,
|
|
40
|
+
role,
|
|
41
|
+
domainId: domainProfile.id,
|
|
42
|
+
domainResolvedFromFallback: resolvedDomain.fallback,
|
|
43
|
+
routingPrompt: domainProfile.routingPrompt,
|
|
44
|
+
...(options.samplingProfile ? { samplingProfile: options.samplingProfile } : {}),
|
|
45
|
+
...(options.scopeHints ? { scopeHints: options.scopeHints } : {}),
|
|
46
|
+
composition: {
|
|
47
|
+
roleAuthority: roleProfile.authority,
|
|
48
|
+
domainAuthority: domainProfile.authority,
|
|
49
|
+
...(options.grantAuthority ? { grantAuthority: options.grantAuthority } : {}),
|
|
50
|
+
composedAuthority,
|
|
51
|
+
stripped: uniqueStripped(stripped),
|
|
52
|
+
downgraded: mcp.downgraded,
|
|
53
|
+
warnings: uniqueSorted(warnings),
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
const validation = validateLoadoutProfile(composed);
|
|
57
|
+
if (!validation.valid) {
|
|
58
|
+
throw new Error(`composed loadout is invalid: ${validation.errors.join("; ")}`);
|
|
59
|
+
}
|
|
60
|
+
return composed;
|
|
61
|
+
}
|
|
62
|
+
function resolveDomainProfile(domain) {
|
|
63
|
+
if (typeof domain !== "string")
|
|
64
|
+
return { profile: domain, fallback: false };
|
|
65
|
+
const profile = getDomainProfile(domain);
|
|
66
|
+
return { profile, fallback: profile.id !== domain };
|
|
67
|
+
}
|
|
68
|
+
function composeToolGate(roleGate, domainGate, authority, stripped) {
|
|
69
|
+
const roleAllow = roleGate.allow ?? [];
|
|
70
|
+
const domainAllow = domainGate.allow ?? [];
|
|
71
|
+
const allowed = intersectNames(roleAllow, domainAllow);
|
|
72
|
+
const strippedTools = stripWriteToolsForAuthority(allowed, authority);
|
|
73
|
+
stripped.push(...strippedTools.stripped);
|
|
74
|
+
const require = uniqueSorted([...(roleGate.require ?? []), ...(domainGate.require ?? [])]);
|
|
75
|
+
const exclude = uniqueSorted([...(roleGate.exclude ?? []), ...(domainGate.exclude ?? [])]);
|
|
76
|
+
return cleanToolGate({
|
|
77
|
+
allow: strippedTools.names,
|
|
78
|
+
...(require.length > 0 ? { require } : {}),
|
|
79
|
+
...(exclude.length > 0 ? { exclude } : {}),
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
function composeCapabilityGate(kind, roleGate, domainGate, authority, stripped) {
|
|
83
|
+
const allowNames = uniqueSorted([...capabilityGateNames(roleGate), ...capabilityGateNames(domainGate)]);
|
|
84
|
+
const requireNames = uniqueSorted([
|
|
85
|
+
...capabilityGateNames(roleGate, "require"),
|
|
86
|
+
...capabilityGateNames(domainGate, "require"),
|
|
87
|
+
]);
|
|
88
|
+
const excludeNames = unionCapabilityGateNames("exclude", roleGate, domainGate);
|
|
89
|
+
const strippedAllow = stripWriteSkillsForAuthority(allowNames, authority);
|
|
90
|
+
const strippedRequire = stripWriteSkillsForAuthority(requireNames, authority);
|
|
91
|
+
stripped.push(...strippedAllow.stripped, ...strippedRequire.stripped);
|
|
92
|
+
return cleanCapabilityGate(kind, strippedAllow.names, strippedRequire.names, excludeNames);
|
|
93
|
+
}
|
|
94
|
+
function composeMcpGate(roleGate, domainGate, authority) {
|
|
95
|
+
const allowDowngrade = downgradeMcpForAuthority(uniqueSorted([...capabilityGateNames(roleGate), ...capabilityGateNames(domainGate)]), authority);
|
|
96
|
+
const requireDowngrade = downgradeMcpForAuthority(uniqueSorted([...capabilityGateNames(roleGate, "require"), ...capabilityGateNames(domainGate, "require")]), authority);
|
|
97
|
+
const excludeNames = unionCapabilityGateNames("exclude", roleGate, domainGate);
|
|
98
|
+
return {
|
|
99
|
+
gate: cleanCapabilityGate("mcp", allowDowngrade.names, requireDowngrade.names, excludeNames),
|
|
100
|
+
downgraded: uniqueMcpDowngrades([...allowDowngrade.downgraded, ...requireDowngrade.downgraded]),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
function composeHookGate(roleGate, domainGate, forcedSecurityHooks) {
|
|
104
|
+
const allowNames = forceSecurityHooks(uniqueSorted([...capabilityGateNames(roleGate), ...capabilityGateNames(domainGate)]), forcedSecurityHooks);
|
|
105
|
+
const requireNames = uniqueSorted([
|
|
106
|
+
...capabilityGateNames(roleGate, "require"),
|
|
107
|
+
...capabilityGateNames(domainGate, "require"),
|
|
108
|
+
]);
|
|
109
|
+
const excludeNames = unionCapabilityGateNames("exclude", roleGate, domainGate);
|
|
110
|
+
return cleanCapabilityGate("hook", allowNames, requireNames, excludeNames);
|
|
111
|
+
}
|
|
112
|
+
function cleanToolGate(gate) {
|
|
113
|
+
return {
|
|
114
|
+
allow: uniqueSorted(gate.allow ?? []),
|
|
115
|
+
...(gate.require && gate.require.length > 0 ? { require: uniqueSorted(gate.require) } : {}),
|
|
116
|
+
...(gate.exclude && gate.exclude.length > 0 ? { exclude: uniqueSorted(gate.exclude) } : {}),
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
function cleanCapabilityGate(kind, allow, require, exclude) {
|
|
120
|
+
return {
|
|
121
|
+
allow: [{ kind, names: uniqueSorted(allow) }],
|
|
122
|
+
...(require.length > 0 ? { require: [{ kind, names: uniqueSorted(require) }] } : {}),
|
|
123
|
+
...(exclude.length > 0 ? { exclude: [{ kind, names: uniqueSorted(exclude) }] } : {}),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
function intersectNames(left, right) {
|
|
127
|
+
const rightSet = new Set(right);
|
|
128
|
+
return uniqueSorted(left.filter((value) => rightSet.has(value)));
|
|
129
|
+
}
|
|
130
|
+
function selectorWarnings(label, gate) {
|
|
131
|
+
const warnings = [];
|
|
132
|
+
for (const group of ["allow", "exclude", "require"]) {
|
|
133
|
+
for (const selector of gate?.[group] ?? []) {
|
|
134
|
+
if (selector.names === undefined || selector.names.length === 0) {
|
|
135
|
+
warnings.push(`${label}.${group} contains a non-name selector that cannot be represented by composed gates`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return warnings;
|
|
140
|
+
}
|
|
141
|
+
function uniqueStripped(values) {
|
|
142
|
+
const seen = new Set();
|
|
143
|
+
const result = [];
|
|
144
|
+
for (const value of values) {
|
|
145
|
+
const key = `${value.kind}\0${value.name}\0${value.reason}`;
|
|
146
|
+
if (seen.has(key))
|
|
147
|
+
continue;
|
|
148
|
+
seen.add(key);
|
|
149
|
+
result.push(value);
|
|
150
|
+
}
|
|
151
|
+
return result.sort((a, b) => compareString(a.kind, b.kind) || compareString(a.name, b.name));
|
|
152
|
+
}
|
|
153
|
+
function uniqueMcpDowngrades(values) {
|
|
154
|
+
const seen = new Set();
|
|
155
|
+
const result = [];
|
|
156
|
+
for (const value of values) {
|
|
157
|
+
const key = `${value.mcp}\0${value.to}`;
|
|
158
|
+
if (seen.has(key))
|
|
159
|
+
continue;
|
|
160
|
+
seen.add(key);
|
|
161
|
+
result.push(value);
|
|
162
|
+
}
|
|
163
|
+
return result.sort((a, b) => compareString(a.mcp, b.mcp) || compareString(a.to, b.to));
|
|
164
|
+
}
|
|
165
|
+
function compareString(a, b) {
|
|
166
|
+
if (a < b)
|
|
167
|
+
return -1;
|
|
168
|
+
if (a > b)
|
|
169
|
+
return 1;
|
|
170
|
+
return 0;
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=loadout-compose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadout-compose.js","sourceRoot":"","sources":["../../src/core/loadout-compose.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Role + domain loadout composition.\n *\n * The composer is pure and additive: it never mutates built-in role loadouts or\n * domain profiles. It can only narrow authority and active tools, while forcing\n * baseline security hooks and downgrading writable filesystem MCP access for\n * read-only authorities.\n */\n\nimport { type DomainProfile, getDomainProfile } from \"./domain-loadouts.ts\";\nimport {\n\tcapabilityGateNames,\n\tdowngradeMcpForAuthority,\n\tforceSecurityHooks,\n\tminAuthority,\n\ttype StrippedCapability,\n\tselectSafestCommandMode,\n\tstripWriteSkillsForAuthority,\n\tstripWriteToolsForAuthority,\n\tunionCapabilityGateNames,\n\tuniqueSorted,\n} from \"./loadout-safety.ts\";\nimport {\n\tBUILTIN_LOADOUTS,\n\ttype CapabilityGate,\n\tinferLoadoutForRole,\n\ttype LoadoutAuthority,\n\ttype LoadoutProfile,\n\ttype LoadoutRole,\n\ttype ToolGate,\n\tvalidateLoadoutProfile,\n} from \"./loadouts.ts\";\n\nexport interface SamplingProfile {\n\treadonly temperature?: number;\n\treadonly topP?: number;\n\treadonly topK?: number;\n}\n\nexport interface ScopeHints {\n\treadonly readScope?: readonly string[];\n\treadonly writeScope?: readonly string[];\n\treadonly executeScope?: readonly string[];\n}\n\nexport interface CompositionTrace {\n\treadonly roleAuthority: LoadoutAuthority;\n\treadonly domainAuthority: LoadoutAuthority;\n\treadonly grantAuthority?: LoadoutAuthority;\n\treadonly composedAuthority: LoadoutAuthority;\n\treadonly stripped: readonly StrippedCapability[];\n\treadonly downgraded: readonly { readonly mcp: string; readonly to: string }[];\n\treadonly warnings: readonly string[];\n}\n\nexport interface ComposedLoadout extends LoadoutProfile {\n\treadonly role: LoadoutRole;\n\treadonly domainId: string;\n\treadonly domainResolvedFromFallback: boolean;\n\treadonly routingPrompt?: string;\n\treadonly samplingProfile?: SamplingProfile;\n\treadonly scopeHints?: ScopeHints;\n\treadonly composition: CompositionTrace;\n}\n\nexport interface ComposeLoadoutOptions {\n\treadonly grantAuthority?: LoadoutAuthority;\n\treadonly preserveRoleAuthority?: boolean;\n\treadonly scopeHints?: ScopeHints;\n\treadonly forcedSecurityHooks?: readonly string[];\n\treadonly roleProfileOverride?: LoadoutProfile;\n\treadonly samplingProfile?: SamplingProfile;\n}\n\nexport type ComposeOptions = ComposeLoadoutOptions;\n\ninterface ResolvedDomainProfile {\n\treadonly profile: DomainProfile;\n\treadonly fallback: boolean;\n}\n\ninterface ComposedMcpGate {\n\treadonly gate: CapabilityGate;\n\treadonly downgraded: readonly { readonly mcp: string; readonly to: string }[];\n}\n\nexport function composeLoadout(\n\trole: LoadoutRole,\n\tdomain: DomainProfile | string,\n\toptions: ComposeLoadoutOptions = {},\n): ComposedLoadout {\n\tconst roleProfile = options.roleProfileOverride ?? BUILTIN_LOADOUTS[inferLoadoutForRole(role)];\n\tconst resolvedDomain = resolveDomainProfile(domain);\n\tconst domainProfile = resolvedDomain.profile;\n\tconst composedAuthority = minAuthority(roleProfile.authority, domainProfile.authority, options.grantAuthority);\n\n\tconst stripped: StrippedCapability[] = [];\n\tconst warnings: string[] = [];\n\n\tconst toolGate = composeToolGate(roleProfile.tools, domainProfile.tools, composedAuthority, stripped);\n\tconst skills = composeCapabilityGate(\"skill\", roleProfile.skills, domainProfile.skills, composedAuthority, stripped);\n\tconst mcp = composeMcpGate(roleProfile.mcp, domainProfile.mcp, composedAuthority);\n\tconst hooks = composeHookGate(roleProfile.hooks, domainProfile.hooks, options.forcedSecurityHooks);\n\tconst commands = selectSafestCommandMode(\n\t\tcomposedAuthority,\n\t\troleProfile.commands?.mode,\n\t\tdomainProfile.commands?.mode,\n\t);\n\n\twarnings.push(...selectorWarnings(\"role skills\", roleProfile.skills));\n\twarnings.push(...selectorWarnings(\"domain skills\", domainProfile.skills));\n\twarnings.push(...selectorWarnings(\"role mcp\", roleProfile.mcp));\n\twarnings.push(...selectorWarnings(\"domain mcp\", domainProfile.mcp));\n\twarnings.push(...selectorWarnings(\"role hooks\", roleProfile.hooks));\n\twarnings.push(...selectorWarnings(\"domain hooks\", domainProfile.hooks));\n\n\tconst composed: ComposedLoadout = {\n\t\tschemaVersion: \"omk.loadout.v1\",\n\t\tname: `${roleProfile.name}+${domainProfile.id}`,\n\t\tdescription: `Composed ${roleProfile.name} role loadout with ${domainProfile.id} domain profile`,\n\t\tauthority: composedAuthority,\n\t\ttools: toolGate,\n\t\tskills,\n\t\tmcp: mcp.gate,\n\t\thooks,\n\t\tcommands,\n\t\trole,\n\t\tdomainId: domainProfile.id,\n\t\tdomainResolvedFromFallback: resolvedDomain.fallback,\n\t\troutingPrompt: domainProfile.routingPrompt,\n\t\t...(options.samplingProfile ? { samplingProfile: options.samplingProfile } : {}),\n\t\t...(options.scopeHints ? { scopeHints: options.scopeHints } : {}),\n\t\tcomposition: {\n\t\t\troleAuthority: roleProfile.authority,\n\t\t\tdomainAuthority: domainProfile.authority,\n\t\t\t...(options.grantAuthority ? { grantAuthority: options.grantAuthority } : {}),\n\t\t\tcomposedAuthority,\n\t\t\tstripped: uniqueStripped(stripped),\n\t\t\tdowngraded: mcp.downgraded,\n\t\t\twarnings: uniqueSorted(warnings),\n\t\t},\n\t};\n\n\tconst validation = validateLoadoutProfile(composed);\n\tif (!validation.valid) {\n\t\tthrow new Error(`composed loadout is invalid: ${validation.errors.join(\"; \")}`);\n\t}\n\treturn composed;\n}\n\nfunction resolveDomainProfile(domain: DomainProfile | string): ResolvedDomainProfile {\n\tif (typeof domain !== \"string\") return { profile: domain, fallback: false };\n\tconst profile = getDomainProfile(domain);\n\treturn { profile, fallback: profile.id !== domain };\n}\n\nfunction composeToolGate(\n\troleGate: ToolGate,\n\tdomainGate: ToolGate,\n\tauthority: LoadoutAuthority,\n\tstripped: StrippedCapability[],\n): ToolGate {\n\tconst roleAllow = roleGate.allow ?? [];\n\tconst domainAllow = domainGate.allow ?? [];\n\tconst allowed = intersectNames(roleAllow, domainAllow);\n\tconst strippedTools = stripWriteToolsForAuthority(allowed, authority);\n\tstripped.push(...strippedTools.stripped);\n\tconst require = uniqueSorted([...(roleGate.require ?? []), ...(domainGate.require ?? [])]);\n\tconst exclude = uniqueSorted([...(roleGate.exclude ?? []), ...(domainGate.exclude ?? [])]);\n\treturn cleanToolGate({\n\t\tallow: strippedTools.names,\n\t\t...(require.length > 0 ? { require } : {}),\n\t\t...(exclude.length > 0 ? { exclude } : {}),\n\t});\n}\n\nfunction composeCapabilityGate(\n\tkind: \"skill\",\n\troleGate: CapabilityGate | undefined,\n\tdomainGate: CapabilityGate | undefined,\n\tauthority: LoadoutAuthority,\n\tstripped: StrippedCapability[],\n): CapabilityGate {\n\tconst allowNames = uniqueSorted([...capabilityGateNames(roleGate), ...capabilityGateNames(domainGate)]);\n\tconst requireNames = uniqueSorted([\n\t\t...capabilityGateNames(roleGate, \"require\"),\n\t\t...capabilityGateNames(domainGate, \"require\"),\n\t]);\n\tconst excludeNames = unionCapabilityGateNames(\"exclude\", roleGate, domainGate);\n\tconst strippedAllow = stripWriteSkillsForAuthority(allowNames, authority);\n\tconst strippedRequire = stripWriteSkillsForAuthority(requireNames, authority);\n\tstripped.push(...strippedAllow.stripped, ...strippedRequire.stripped);\n\treturn cleanCapabilityGate(kind, strippedAllow.names, strippedRequire.names, excludeNames);\n}\n\nfunction composeMcpGate(\n\troleGate: CapabilityGate | undefined,\n\tdomainGate: CapabilityGate | undefined,\n\tauthority: LoadoutAuthority,\n): ComposedMcpGate {\n\tconst allowDowngrade = downgradeMcpForAuthority(\n\t\tuniqueSorted([...capabilityGateNames(roleGate), ...capabilityGateNames(domainGate)]),\n\t\tauthority,\n\t);\n\tconst requireDowngrade = downgradeMcpForAuthority(\n\t\tuniqueSorted([...capabilityGateNames(roleGate, \"require\"), ...capabilityGateNames(domainGate, \"require\")]),\n\t\tauthority,\n\t);\n\tconst excludeNames = unionCapabilityGateNames(\"exclude\", roleGate, domainGate);\n\treturn {\n\t\tgate: cleanCapabilityGate(\"mcp\", allowDowngrade.names, requireDowngrade.names, excludeNames),\n\t\tdowngraded: uniqueMcpDowngrades([...allowDowngrade.downgraded, ...requireDowngrade.downgraded]),\n\t};\n}\n\nfunction composeHookGate(\n\troleGate: CapabilityGate | undefined,\n\tdomainGate: CapabilityGate | undefined,\n\tforcedSecurityHooks: readonly string[] | undefined,\n): CapabilityGate {\n\tconst allowNames = forceSecurityHooks(\n\t\tuniqueSorted([...capabilityGateNames(roleGate), ...capabilityGateNames(domainGate)]),\n\t\tforcedSecurityHooks,\n\t);\n\tconst requireNames = uniqueSorted([\n\t\t...capabilityGateNames(roleGate, \"require\"),\n\t\t...capabilityGateNames(domainGate, \"require\"),\n\t]);\n\tconst excludeNames = unionCapabilityGateNames(\"exclude\", roleGate, domainGate);\n\treturn cleanCapabilityGate(\"hook\", allowNames, requireNames, excludeNames);\n}\n\nfunction cleanToolGate(gate: ToolGate): ToolGate {\n\treturn {\n\t\tallow: uniqueSorted(gate.allow ?? []),\n\t\t...(gate.require && gate.require.length > 0 ? { require: uniqueSorted(gate.require) } : {}),\n\t\t...(gate.exclude && gate.exclude.length > 0 ? { exclude: uniqueSorted(gate.exclude) } : {}),\n\t};\n}\n\nfunction cleanCapabilityGate(\n\tkind: \"skill\" | \"mcp\" | \"hook\",\n\tallow: readonly string[],\n\trequire: readonly string[],\n\texclude: readonly string[],\n): CapabilityGate {\n\treturn {\n\t\tallow: [{ kind, names: uniqueSorted(allow) }],\n\t\t...(require.length > 0 ? { require: [{ kind, names: uniqueSorted(require) }] } : {}),\n\t\t...(exclude.length > 0 ? { exclude: [{ kind, names: uniqueSorted(exclude) }] } : {}),\n\t};\n}\n\nfunction intersectNames(left: readonly string[], right: readonly string[]): string[] {\n\tconst rightSet = new Set(right);\n\treturn uniqueSorted(left.filter((value) => rightSet.has(value)));\n}\n\nfunction selectorWarnings(label: string, gate: CapabilityGate | undefined): string[] {\n\tconst warnings: string[] = [];\n\tfor (const group of [\"allow\", \"exclude\", \"require\"] as const) {\n\t\tfor (const selector of gate?.[group] ?? []) {\n\t\t\tif (selector.names === undefined || selector.names.length === 0) {\n\t\t\t\twarnings.push(\n\t\t\t\t\t`${label}.${group} contains a non-name selector that cannot be represented by composed gates`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\treturn warnings;\n}\n\nfunction uniqueStripped(values: readonly StrippedCapability[]): StrippedCapability[] {\n\tconst seen = new Set<string>();\n\tconst result: StrippedCapability[] = [];\n\tfor (const value of values) {\n\t\tconst key = `${value.kind}\\0${value.name}\\0${value.reason}`;\n\t\tif (seen.has(key)) continue;\n\t\tseen.add(key);\n\t\tresult.push(value);\n\t}\n\treturn result.sort((a, b) => compareString(a.kind, b.kind) || compareString(a.name, b.name));\n}\n\nfunction uniqueMcpDowngrades(\n\tvalues: readonly { readonly mcp: string; readonly to: string }[],\n): { readonly mcp: string; readonly to: string }[] {\n\tconst seen = new Set<string>();\n\tconst result: { readonly mcp: string; readonly to: string }[] = [];\n\tfor (const value of values) {\n\t\tconst key = `${value.mcp}\\0${value.to}`;\n\t\tif (seen.has(key)) continue;\n\t\tseen.add(key);\n\t\tresult.push(value);\n\t}\n\treturn result.sort((a, b) => compareString(a.mcp, b.mcp) || compareString(a.to, b.to));\n}\n\nfunction compareString(a: string, b: string): number {\n\tif (a < b) return -1;\n\tif (a > b) return 1;\n\treturn 0;\n}\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bridge from runtime loadout state into the AgentSession access policy shape.
|
|
3
|
+
*
|
|
4
|
+
* This wrapper keeps policy creation fail-closed for blocker-bearing states and
|
|
5
|
+
* exposes a lightweight integrity check for SDK/domain-dispatch integration.
|
|
6
|
+
*/
|
|
7
|
+
import type { LoadoutAccessPolicy } from "./loadout-access-policy.ts";
|
|
8
|
+
import { type LoadoutRuntimeState } from "./loadout-runtime.ts";
|
|
9
|
+
import type { LoadoutCommands } from "./loadouts.ts";
|
|
10
|
+
export interface PolicyBridgeOptions {
|
|
11
|
+
readonly cwd: string;
|
|
12
|
+
readonly blockedPaths?: readonly string[];
|
|
13
|
+
readonly commands?: LoadoutCommands;
|
|
14
|
+
readonly additionalSecurityChecks?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface PolicyIntegrityResult {
|
|
17
|
+
readonly valid: boolean;
|
|
18
|
+
readonly warnings: readonly string[];
|
|
19
|
+
}
|
|
20
|
+
export declare function createLoadoutPolicyFromRuntimeState(state: LoadoutRuntimeState, options: PolicyBridgeOptions): LoadoutAccessPolicy;
|
|
21
|
+
export declare function validatePolicyIntegrity(policy: LoadoutAccessPolicy, state: LoadoutRuntimeState): PolicyIntegrityResult;
|
|
22
|
+
//# sourceMappingURL=loadout-policy-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadout-policy-bridge.d.ts","sourceRoot":"","sources":["../../src/core/loadout-policy-bridge.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAA4B,KAAK,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC1F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,QAAQ,CAAC,EAAE,eAAe,CAAC;IACpC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,OAAO,CAAC;CAC5C;AAED,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,wBAAgB,mCAAmC,CAClD,KAAK,EAAE,mBAAmB,EAC1B,OAAO,EAAE,mBAAmB,GAC1B,mBAAmB,CASrB;AAED,wBAAgB,uBAAuB,CACtC,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE,mBAAmB,GACxB,qBAAqB,CAcvB","sourcesContent":["/**\n * Bridge from runtime loadout state into the AgentSession access policy shape.\n *\n * This wrapper keeps policy creation fail-closed for blocker-bearing states and\n * exposes a lightweight integrity check for SDK/domain-dispatch integration.\n */\n\nimport type { LoadoutAccessPolicy } from \"./loadout-access-policy.ts\";\nimport { buildLoadoutAccessPolicy, type LoadoutRuntimeState } from \"./loadout-runtime.ts\";\nimport type { LoadoutCommands } from \"./loadouts.ts\";\n\nexport interface PolicyBridgeOptions {\n\treadonly cwd: string;\n\treadonly blockedPaths?: readonly string[];\n\treadonly commands?: LoadoutCommands;\n\treadonly additionalSecurityChecks?: boolean;\n}\n\nexport interface PolicyIntegrityResult {\n\treadonly valid: boolean;\n\treadonly warnings: readonly string[];\n}\n\nexport function createLoadoutPolicyFromRuntimeState(\n\tstate: LoadoutRuntimeState,\n\toptions: PolicyBridgeOptions,\n): LoadoutAccessPolicy {\n\tif (state.blockers.length > 0) {\n\t\tthrow new Error(`cannot create loadout access policy with blockers: ${state.blockers.join(\"; \")}`);\n\t}\n\treturn buildLoadoutAccessPolicy(state, {\n\t\tcwd: options.cwd,\n\t\tblockedPaths: options.blockedPaths,\n\t\tcommands: options.commands,\n\t});\n}\n\nexport function validatePolicyIntegrity(\n\tpolicy: LoadoutAccessPolicy,\n\tstate: LoadoutRuntimeState,\n): PolicyIntegrityResult {\n\tconst warnings: string[] = [];\n\tif (!sameStringSet(policy.activeTools, state.activeTools)) {\n\t\twarnings.push(\"policy active tools do not match runtime active tools\");\n\t}\n\tconst expectedReadRoots = countPathRoots(state.schedulerFields.readSet);\n\tconst expectedWriteRoots = countPathRoots(state.schedulerFields.writeSet);\n\tif (policy.readRoots.length !== expectedReadRoots) {\n\t\twarnings.push(\"policy read roots do not match runtime scheduler read set\");\n\t}\n\tif (policy.writeRoots.length !== expectedWriteRoots) {\n\t\twarnings.push(\"policy write roots do not match runtime scheduler write set\");\n\t}\n\treturn { valid: warnings.length === 0, warnings };\n}\n\nfunction countPathRoots(entries: readonly { readonly path: string; readonly symbols?: readonly string[] }[]): number {\n\treturn entries.filter((entry) => entry.symbols === undefined || entry.symbols.length === 0).length;\n}\n\nfunction sameStringSet(left: readonly string[], right: readonly string[]): boolean {\n\tconst normalizedLeft = uniqueSorted(left);\n\tconst normalizedRight = uniqueSorted(right);\n\tif (normalizedLeft.length !== normalizedRight.length) return false;\n\treturn normalizedLeft.every((value, index) => value === normalizedRight[index]);\n}\n\nfunction uniqueSorted(values: readonly string[]): string[] {\n\treturn [...new Set(values)].sort((a, b) => {\n\t\tif (a < b) return -1;\n\t\tif (a > b) return 1;\n\t\treturn 0;\n\t});\n}\n"]}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bridge from runtime loadout state into the AgentSession access policy shape.
|
|
3
|
+
*
|
|
4
|
+
* This wrapper keeps policy creation fail-closed for blocker-bearing states and
|
|
5
|
+
* exposes a lightweight integrity check for SDK/domain-dispatch integration.
|
|
6
|
+
*/
|
|
7
|
+
import { buildLoadoutAccessPolicy } from "./loadout-runtime.js";
|
|
8
|
+
export function createLoadoutPolicyFromRuntimeState(state, options) {
|
|
9
|
+
if (state.blockers.length > 0) {
|
|
10
|
+
throw new Error(`cannot create loadout access policy with blockers: ${state.blockers.join("; ")}`);
|
|
11
|
+
}
|
|
12
|
+
return buildLoadoutAccessPolicy(state, {
|
|
13
|
+
cwd: options.cwd,
|
|
14
|
+
blockedPaths: options.blockedPaths,
|
|
15
|
+
commands: options.commands,
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
export function validatePolicyIntegrity(policy, state) {
|
|
19
|
+
const warnings = [];
|
|
20
|
+
if (!sameStringSet(policy.activeTools, state.activeTools)) {
|
|
21
|
+
warnings.push("policy active tools do not match runtime active tools");
|
|
22
|
+
}
|
|
23
|
+
const expectedReadRoots = countPathRoots(state.schedulerFields.readSet);
|
|
24
|
+
const expectedWriteRoots = countPathRoots(state.schedulerFields.writeSet);
|
|
25
|
+
if (policy.readRoots.length !== expectedReadRoots) {
|
|
26
|
+
warnings.push("policy read roots do not match runtime scheduler read set");
|
|
27
|
+
}
|
|
28
|
+
if (policy.writeRoots.length !== expectedWriteRoots) {
|
|
29
|
+
warnings.push("policy write roots do not match runtime scheduler write set");
|
|
30
|
+
}
|
|
31
|
+
return { valid: warnings.length === 0, warnings };
|
|
32
|
+
}
|
|
33
|
+
function countPathRoots(entries) {
|
|
34
|
+
return entries.filter((entry) => entry.symbols === undefined || entry.symbols.length === 0).length;
|
|
35
|
+
}
|
|
36
|
+
function sameStringSet(left, right) {
|
|
37
|
+
const normalizedLeft = uniqueSorted(left);
|
|
38
|
+
const normalizedRight = uniqueSorted(right);
|
|
39
|
+
if (normalizedLeft.length !== normalizedRight.length)
|
|
40
|
+
return false;
|
|
41
|
+
return normalizedLeft.every((value, index) => value === normalizedRight[index]);
|
|
42
|
+
}
|
|
43
|
+
function uniqueSorted(values) {
|
|
44
|
+
return [...new Set(values)].sort((a, b) => {
|
|
45
|
+
if (a < b)
|
|
46
|
+
return -1;
|
|
47
|
+
if (a > b)
|
|
48
|
+
return 1;
|
|
49
|
+
return 0;
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=loadout-policy-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadout-policy-bridge.js","sourceRoot":"","sources":["../../src/core/loadout-policy-bridge.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,wBAAwB,EAA4B,MAAM,sBAAsB,CAAC;AAe1F,MAAM,UAAU,mCAAmC,CAClD,KAA0B,EAC1B,OAA4B,EACN;IACtB,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,sDAAsD,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpG,CAAC;IACD,OAAO,wBAAwB,CAAC,KAAK,EAAE;QACtC,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,QAAQ,EAAE,OAAO,CAAC,QAAQ;KAC1B,CAAC,CAAC;AAAA,CACH;AAED,MAAM,UAAU,uBAAuB,CACtC,MAA2B,EAC3B,KAA0B,EACF;IACxB,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;QAC3D,QAAQ,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,iBAAiB,GAAG,cAAc,CAAC,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IACxE,MAAM,kBAAkB,GAAG,cAAc,CAAC,KAAK,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC1E,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,iBAAiB,EAAE,CAAC;QACnD,QAAQ,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,kBAAkB,EAAE,CAAC;QACrD,QAAQ,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;AAAA,CAClD;AAED,SAAS,cAAc,CAAC,OAAmF,EAAU;IACpH,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;AAAA,CACnG;AAED,SAAS,aAAa,CAAC,IAAuB,EAAE,KAAwB,EAAW;IAClF,MAAM,cAAc,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,eAAe,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAC5C,IAAI,cAAc,CAAC,MAAM,KAAK,eAAe,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACnE,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;AAAA,CAChF;AAED,SAAS,YAAY,CAAC,MAAyB,EAAY;IAC1D,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,CAAC,CAAC;QACpB,OAAO,CAAC,CAAC;IAAA,CACT,CAAC,CAAC;AAAA,CACH","sourcesContent":["/**\n * Bridge from runtime loadout state into the AgentSession access policy shape.\n *\n * This wrapper keeps policy creation fail-closed for blocker-bearing states and\n * exposes a lightweight integrity check for SDK/domain-dispatch integration.\n */\n\nimport type { LoadoutAccessPolicy } from \"./loadout-access-policy.ts\";\nimport { buildLoadoutAccessPolicy, type LoadoutRuntimeState } from \"./loadout-runtime.ts\";\nimport type { LoadoutCommands } from \"./loadouts.ts\";\n\nexport interface PolicyBridgeOptions {\n\treadonly cwd: string;\n\treadonly blockedPaths?: readonly string[];\n\treadonly commands?: LoadoutCommands;\n\treadonly additionalSecurityChecks?: boolean;\n}\n\nexport interface PolicyIntegrityResult {\n\treadonly valid: boolean;\n\treadonly warnings: readonly string[];\n}\n\nexport function createLoadoutPolicyFromRuntimeState(\n\tstate: LoadoutRuntimeState,\n\toptions: PolicyBridgeOptions,\n): LoadoutAccessPolicy {\n\tif (state.blockers.length > 0) {\n\t\tthrow new Error(`cannot create loadout access policy with blockers: ${state.blockers.join(\"; \")}`);\n\t}\n\treturn buildLoadoutAccessPolicy(state, {\n\t\tcwd: options.cwd,\n\t\tblockedPaths: options.blockedPaths,\n\t\tcommands: options.commands,\n\t});\n}\n\nexport function validatePolicyIntegrity(\n\tpolicy: LoadoutAccessPolicy,\n\tstate: LoadoutRuntimeState,\n): PolicyIntegrityResult {\n\tconst warnings: string[] = [];\n\tif (!sameStringSet(policy.activeTools, state.activeTools)) {\n\t\twarnings.push(\"policy active tools do not match runtime active tools\");\n\t}\n\tconst expectedReadRoots = countPathRoots(state.schedulerFields.readSet);\n\tconst expectedWriteRoots = countPathRoots(state.schedulerFields.writeSet);\n\tif (policy.readRoots.length !== expectedReadRoots) {\n\t\twarnings.push(\"policy read roots do not match runtime scheduler read set\");\n\t}\n\tif (policy.writeRoots.length !== expectedWriteRoots) {\n\t\twarnings.push(\"policy write roots do not match runtime scheduler write set\");\n\t}\n\treturn { valid: warnings.length === 0, warnings };\n}\n\nfunction countPathRoots(entries: readonly { readonly path: string; readonly symbols?: readonly string[] }[]): number {\n\treturn entries.filter((entry) => entry.symbols === undefined || entry.symbols.length === 0).length;\n}\n\nfunction sameStringSet(left: readonly string[], right: readonly string[]): boolean {\n\tconst normalizedLeft = uniqueSorted(left);\n\tconst normalizedRight = uniqueSorted(right);\n\tif (normalizedLeft.length !== normalizedRight.length) return false;\n\treturn normalizedLeft.every((value, index) => value === normalizedRight[index]);\n}\n\nfunction uniqueSorted(values: readonly string[]): string[] {\n\treturn [...new Set(values)].sort((a, b) => {\n\t\tif (a < b) return -1;\n\t\tif (a > b) return 1;\n\t\treturn 0;\n\t});\n}\n"]}
|