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,48 @@
|
|
|
1
|
+
import type { LoopDefinition, LoopRunOutcome, LoopState, LoopValidationDiagnostic, LoopWorkItem } from "./loop-types.ts";
|
|
2
|
+
export type LoopGateAction = "allow" | "block" | "human-gate" | "escalate";
|
|
3
|
+
export type LoopVerifierStatus = "pass" | "fail" | "blocked";
|
|
4
|
+
export interface LoopVerifierEvidence {
|
|
5
|
+
readonly independent: boolean;
|
|
6
|
+
readonly status?: LoopVerifierStatus;
|
|
7
|
+
readonly evidenceRefs?: readonly string[];
|
|
8
|
+
readonly verifierId?: string;
|
|
9
|
+
readonly implementerId?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface LoopHumanGateEvidence {
|
|
12
|
+
readonly approved: boolean;
|
|
13
|
+
readonly approvalRef?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface LoopWorktreeEvidence {
|
|
16
|
+
readonly isolated: boolean;
|
|
17
|
+
readonly worktreeId?: string;
|
|
18
|
+
readonly branch?: string;
|
|
19
|
+
readonly cleanCheckout?: boolean;
|
|
20
|
+
}
|
|
21
|
+
export interface LoopDurableStateEvidence {
|
|
22
|
+
readonly stateRevision?: string;
|
|
23
|
+
readonly runLogRef?: string;
|
|
24
|
+
readonly budgetReservationId?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface LoopGateEvidence {
|
|
27
|
+
readonly writeScope?: readonly string[];
|
|
28
|
+
readonly changedFiles?: readonly string[];
|
|
29
|
+
readonly evidenceRefs?: readonly string[];
|
|
30
|
+
readonly verifier?: LoopVerifierEvidence;
|
|
31
|
+
readonly humanGate?: LoopHumanGateEvidence;
|
|
32
|
+
readonly worktree?: LoopWorktreeEvidence;
|
|
33
|
+
readonly durableState?: LoopDurableStateEvidence;
|
|
34
|
+
}
|
|
35
|
+
export interface LoopSafetyGateResult {
|
|
36
|
+
readonly passed: boolean;
|
|
37
|
+
readonly action: LoopGateAction;
|
|
38
|
+
readonly outcome?: LoopRunOutcome;
|
|
39
|
+
readonly diagnostics: readonly LoopValidationDiagnostic[];
|
|
40
|
+
}
|
|
41
|
+
export interface LoopWriteScopeValidationResult {
|
|
42
|
+
readonly passed: boolean;
|
|
43
|
+
readonly diagnostics: readonly LoopValidationDiagnostic[];
|
|
44
|
+
}
|
|
45
|
+
export declare function evaluateLoopSafetyGates(definition: LoopDefinition, state: LoopState, item: LoopWorkItem, evidence: LoopGateEvidence): LoopSafetyGateResult;
|
|
46
|
+
export declare function calculateLoopDriftScore(definition: LoopDefinition, item: LoopWorkItem): number;
|
|
47
|
+
export declare function validateLoopWriteScope(definition: LoopDefinition, paths: readonly string[]): LoopWriteScopeValidationResult;
|
|
48
|
+
//# sourceMappingURL=loop-gates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop-gates.d.ts","sourceRoot":"","sources":["../../src/core/loop-gates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,cAAc,EACd,cAAc,EACd,SAAS,EACT,wBAAwB,EACxB,YAAY,EACZ,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,OAAO,GAAG,YAAY,GAAG,UAAU,CAAC;AAE3E,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAE7D,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAC;IACrC,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CACtC;AAED,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IACzC,QAAQ,CAAC,SAAS,CAAC,EAAE,qBAAqB,CAAC;IAC3C,QAAQ,CAAC,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IACzC,QAAQ,CAAC,YAAY,CAAC,EAAE,wBAAwB,CAAC;CACjD;AAED,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,SAAS,wBAAwB,EAAE,CAAC;CAC1D;AAED,MAAM,WAAW,8BAA8B;IAC9C,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,SAAS,wBAAwB,EAAE,CAAC;CAC1D;AAoBD,wBAAgB,uBAAuB,CACtC,UAAU,EAAE,cAAc,EAC1B,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,YAAY,EAClB,QAAQ,EAAE,gBAAgB,GACxB,oBAAoB,CAwDtB;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,cAAc,EAAE,IAAI,EAAE,YAAY,GAAG,MAAM,CAiB9F;AAED,wBAAgB,sBAAsB,CACrC,UAAU,EAAE,cAAc,EAC1B,KAAK,EAAE,SAAS,MAAM,EAAE,GACtB,8BAA8B,CAwChC","sourcesContent":["import type {\n\tLoopDefinition,\n\tLoopRunOutcome,\n\tLoopState,\n\tLoopValidationDiagnostic,\n\tLoopWorkItem,\n} from \"./loop-types.ts\";\n\nexport type LoopGateAction = \"allow\" | \"block\" | \"human-gate\" | \"escalate\";\n\nexport type LoopVerifierStatus = \"pass\" | \"fail\" | \"blocked\";\n\nexport interface LoopVerifierEvidence {\n\treadonly independent: boolean;\n\treadonly status?: LoopVerifierStatus;\n\treadonly evidenceRefs?: readonly string[];\n\treadonly verifierId?: string;\n\treadonly implementerId?: string;\n}\n\nexport interface LoopHumanGateEvidence {\n\treadonly approved: boolean;\n\treadonly approvalRef?: string;\n}\n\nexport interface LoopWorktreeEvidence {\n\treadonly isolated: boolean;\n\treadonly worktreeId?: string;\n\treadonly branch?: string;\n\treadonly cleanCheckout?: boolean;\n}\n\nexport interface LoopDurableStateEvidence {\n\treadonly stateRevision?: string;\n\treadonly runLogRef?: string;\n\treadonly budgetReservationId?: string;\n}\n\nexport interface LoopGateEvidence {\n\treadonly writeScope?: readonly string[];\n\treadonly changedFiles?: readonly string[];\n\treadonly evidenceRefs?: readonly string[];\n\treadonly verifier?: LoopVerifierEvidence;\n\treadonly humanGate?: LoopHumanGateEvidence;\n\treadonly worktree?: LoopWorktreeEvidence;\n\treadonly durableState?: LoopDurableStateEvidence;\n}\n\nexport interface LoopSafetyGateResult {\n\treadonly passed: boolean;\n\treadonly action: LoopGateAction;\n\treadonly outcome?: LoopRunOutcome;\n\treadonly diagnostics: readonly LoopValidationDiagnostic[];\n}\n\nexport interface LoopWriteScopeValidationResult {\n\treadonly passed: boolean;\n\treadonly diagnostics: readonly LoopValidationDiagnostic[];\n}\n\nconst TOKEN_STOP_WORDS = new Set([\n\t\"a\",\n\t\"an\",\n\t\"and\",\n\t\"are\",\n\t\"as\",\n\t\"for\",\n\t\"in\",\n\t\"inside\",\n\t\"is\",\n\t\"of\",\n\t\"on\",\n\t\"or\",\n\t\"the\",\n\t\"to\",\n\t\"with\",\n]);\n\nexport function evaluateLoopSafetyGates(\n\tdefinition: LoopDefinition,\n\tstate: LoopState,\n\titem: LoopWorkItem,\n\tevidence: LoopGateEvidence,\n): LoopSafetyGateResult {\n\tconst diagnostics: LoopValidationDiagnostic[] = [];\n\n\tif (state.killSwitch) {\n\t\tdiagnostics.push({ code: \"loop-kill-switch\", message: \"Loop kill switch is active.\" });\n\t}\n\tif (state.status === \"paused\" || state.status === \"retired\") {\n\t\tdiagnostics.push({ code: \"loop-not-active\", message: `Loop status ${state.status} cannot take action.` });\n\t}\n\n\tif (item.attemptCount >= definition.budget.maxAttemptsPerItem) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"max-attempts-exceeded\",\n\t\t\tmessage: `Item ${item.id} reached maxAttemptsPerItem=${definition.budget.maxAttemptsPerItem}.`,\n\t\t});\n\t}\n\n\tif (!evidence.writeScope) {\n\t\tdiagnostics.push({ code: \"write-scope-missing\", message: \"Exact writeScope evidence is required.\" });\n\t} else {\n\t\tdiagnostics.push(...validateLoopWriteScope(definition, evidence.writeScope).diagnostics);\n\t\tdiagnostics.push(...validateRequestedWriteScopeDoesNotOverlapDenied(definition, evidence.writeScope));\n\t}\n\n\tif (evidence.writeScope && evidence.changedFiles) {\n\t\tdiagnostics.push(...validateChangedFilesWithinRequestedScope(evidence.writeScope, evidence.changedFiles));\n\t}\n\n\tif (requiresWorktreeIsolation(definition)) {\n\t\tdiagnostics.push(...validateWorktreeEvidence(definition, evidence.worktree));\n\t}\n\n\tif (definition.durableState?.requireReplayableEvidence === true) {\n\t\tdiagnostics.push(...validateDurableStateEvidence(evidence.durableState));\n\t}\n\n\tif (requiresHumanApproval(definition, item)) {\n\t\tconst approvalRef = evidence.humanGate?.approvalRef?.trim();\n\t\tconst approvalRefSatisfied = definition.humanGates?.approvalRefsRequired === false || Boolean(approvalRef);\n\t\tif (evidence.humanGate?.approved !== true || !approvalRefSatisfied) {\n\t\t\tdiagnostics.push({\n\t\t\t\tcode: \"human-gate-required\",\n\t\t\t\tmessage: \"High-risk work item requires human approval evidence.\",\n\t\t\t});\n\t\t}\n\t}\n\n\tif (!hasEvidenceRefs(evidence.evidenceRefs)) {\n\t\tdiagnostics.push({ code: \"evidence-refs-missing\", message: \"Completion evidenceRefs are required.\" });\n\t}\n\n\tif (requiresIndependentVerifier(definition)) {\n\t\tdiagnostics.push(...validateIndependentVerifier(evidence.verifier));\n\t}\n\n\treturn safetyGateResult(diagnostics);\n}\n\nexport function calculateLoopDriftScore(definition: LoopDefinition, item: LoopWorkItem): number {\n\tconst itemTokens = tokenize([item.title, item.sourceRef, item.actingOn].join(\" \"));\n\tconst objectiveTokens = tokenize(definition.objective);\n\tconst objectiveOverlap = overlapRatio(itemTokens, objectiveTokens);\n\tconst nonGoalOverlap = Math.max(\n\t\t0,\n\t\t...definition.nonGoals.map((nonGoal) => overlapRatio(itemTokens, tokenize(nonGoal))),\n\t);\n\tconst scopeMatched = matchesWatchedScope(definition, item);\n\n\tlet score = 0.45;\n\tscore -= objectiveOverlap * 0.25;\n\tscore += objectiveOverlap === 0 ? 0.2 : 0;\n\tscore += scopeMatched ? -0.2 : 0.2;\n\tscore += nonGoalOverlap * 0.7;\n\n\treturn clamp01(score);\n}\n\nexport function validateLoopWriteScope(\n\tdefinition: LoopDefinition,\n\tpaths: readonly string[],\n): LoopWriteScopeValidationResult {\n\tconst diagnostics: LoopValidationDiagnostic[] = [];\n\n\tif (paths.length === 0 && (definition.level === \"L2\" || definition.level === \"L3\")) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"write-scope-empty\",\n\t\t\tmessage: `${definition.level} loops require explicit write paths.`,\n\t\t});\n\t}\n\n\tif (definition.safety.maxWriteScopeCount !== undefined && paths.length > definition.safety.maxWriteScopeCount) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"write-scope-count-exceeded\",\n\t\t\tmessage: `Write scope count ${paths.length} exceeds maxWriteScopeCount=${definition.safety.maxWriteScopeCount}.`,\n\t\t});\n\t}\n\n\tfor (const path of paths) {\n\t\tconst normalizedPath = normalizePath(path);\n\t\tif (!normalizedPath) {\n\t\t\tdiagnostics.push({ code: \"write-scope-empty-path\", message: \"Write scope contains an empty path.\" });\n\t\t\tcontinue;\n\t\t}\n\t\tif (!matchesAnyScope(normalizedPath, definition.safety.allowedWriteScopes)) {\n\t\t\tdiagnostics.push({\n\t\t\t\tcode: \"write-scope-outside-allowed\",\n\t\t\t\tmessage: `Path ${normalizedPath} is outside allowedWriteScopes.`,\n\t\t\t\tpath: normalizedPath,\n\t\t\t});\n\t\t}\n\t\tif (matchesAnyScope(normalizedPath, definition.safety.deniedWriteScopes ?? [])) {\n\t\t\tdiagnostics.push({\n\t\t\t\tcode: \"write-scope-denied\",\n\t\t\t\tmessage: `Path ${normalizedPath} is inside deniedWriteScopes.`,\n\t\t\t\tpath: normalizedPath,\n\t\t\t});\n\t\t}\n\t}\n\n\treturn { passed: diagnostics.length === 0, diagnostics };\n}\n\nfunction safetyGateResult(diagnostics: readonly LoopValidationDiagnostic[]): LoopSafetyGateResult {\n\tif (diagnostics.length === 0) {\n\t\treturn { passed: true, action: \"allow\", diagnostics: [] };\n\t}\n\n\tif (hasDiagnostic(diagnostics, \"loop-kill-switch\")) {\n\t\treturn { passed: false, action: \"block\", outcome: \"killed\", diagnostics };\n\t}\n\tif (hasDiagnostic(diagnostics, \"max-attempts-exceeded\")) {\n\t\treturn { passed: false, action: \"escalate\", outcome: \"escalated\", diagnostics };\n\t}\n\tif (hasDiagnostic(diagnostics, \"human-gate-required\")) {\n\t\treturn { passed: false, action: \"human-gate\", outcome: \"escalated\", diagnostics };\n\t}\n\treturn { passed: false, action: \"block\", outcome: \"verifier-failed\", diagnostics };\n}\n\nfunction hasDiagnostic(diagnostics: readonly LoopValidationDiagnostic[], code: string): boolean {\n\treturn diagnostics.some((diagnostic) => diagnostic.code === code);\n}\n\nfunction requiresIndependentVerifier(definition: LoopDefinition): boolean {\n\treturn definition.level === \"L2\" || definition.level === \"L3\" || definition.safety.requireIndependentVerifier;\n}\n\nfunction validateIndependentVerifier(verifier: LoopVerifierEvidence | undefined): LoopValidationDiagnostic[] {\n\tif (!verifier) {\n\t\treturn [{ code: \"independent-verifier-required\", message: \"L2/L3 actions require an independent verifier.\" }];\n\t}\n\n\tconst diagnostics: LoopValidationDiagnostic[] = [];\n\tconst sameActor = Boolean(\n\t\tverifier.verifierId && verifier.implementerId && verifier.verifierId.trim() === verifier.implementerId.trim(),\n\t);\n\tif (!verifier.independent || sameActor) {\n\t\tdiagnostics.push({ code: \"independent-verifier-required\", message: \"Verifier must be independent.\" });\n\t}\n\tif (verifier.status && verifier.status !== \"pass\") {\n\t\tdiagnostics.push({ code: \"verifier-failed\", message: `Verifier status is ${verifier.status}.` });\n\t}\n\tif (!hasEvidenceRefs(verifier.evidenceRefs)) {\n\t\tdiagnostics.push({ code: \"verifier-evidence-missing\", message: \"Verifier evidenceRefs are required.\" });\n\t}\n\treturn diagnostics;\n}\n\nfunction requiresWorktreeIsolation(definition: LoopDefinition): boolean {\n\treturn definition.worktree?.mode === \"per-run\" || definition.worktree?.mode === \"per-item\";\n}\n\nfunction validateWorktreeEvidence(\n\tdefinition: LoopDefinition,\n\tworktree: LoopWorktreeEvidence | undefined,\n): LoopValidationDiagnostic[] {\n\tif (!worktree) {\n\t\treturn [\n\t\t\t{\n\t\t\t\tcode: \"worktree-isolation-required\",\n\t\t\t\tmessage: \"Isolated loop actions require worktree evidence.\",\n\t\t\t},\n\t\t];\n\t}\n\n\tconst diagnostics: LoopValidationDiagnostic[] = [];\n\tif (worktree.isolated !== true) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"worktree-isolation-required\",\n\t\t\tmessage: \"Loop worktree evidence must confirm isolation.\",\n\t\t});\n\t}\n\tif (!worktree.worktreeId?.trim()) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"worktree-id-required\",\n\t\t\tmessage: \"Loop worktree evidence must include a worktreeId.\",\n\t\t});\n\t}\n\tif (definition.worktree?.requireCleanCheckout === true && worktree.cleanCheckout !== true) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"worktree-clean-checkout-required\",\n\t\t\tmessage: \"Loop worktree must start from a clean checkout.\",\n\t\t});\n\t}\n\tconst branchPrefix = definition.worktree?.branchPrefix;\n\tif (\n\t\tbranchPrefix &&\n\t\tworktree.branch &&\n\t\t!pathHasScopePrefix(normalizePath(worktree.branch), normalizePath(branchPrefix))\n\t) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"worktree-branch-prefix-mismatch\",\n\t\t\tmessage: `Loop worktree branch must use prefix ${branchPrefix}.`,\n\t\t\tpath: worktree.branch,\n\t\t});\n\t}\n\treturn diagnostics;\n}\n\nfunction validateDurableStateEvidence(durableState: LoopDurableStateEvidence | undefined): LoopValidationDiagnostic[] {\n\tconst diagnostics: LoopValidationDiagnostic[] = [];\n\tif (!durableState?.stateRevision?.trim()) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"state-revision-missing\",\n\t\t\tmessage: \"Replayable loop actions require a stateRevision.\",\n\t\t});\n\t}\n\tif (!durableState?.runLogRef?.trim()) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"run-log-ref-missing\",\n\t\t\tmessage: \"Replayable loop actions require a runLogRef.\",\n\t\t});\n\t}\n\tif (!durableState?.budgetReservationId?.trim()) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"budget-reservation-missing\",\n\t\t\tmessage: \"Replayable loop actions require a budgetReservationId.\",\n\t\t});\n\t}\n\treturn diagnostics;\n}\n\nfunction requiresHumanApproval(definition: LoopDefinition, item: LoopWorkItem): boolean {\n\tconst gatedRisks = definition.humanGates?.requiredForRisks;\n\tif (gatedRisks !== undefined) {\n\t\treturn gatedRisks.includes(item.risk);\n\t}\n\treturn definition.safety.requireHumanGateForHighRisk && item.risk === \"high\";\n}\n\nfunction validateRequestedWriteScopeDoesNotOverlapDenied(\n\tdefinition: LoopDefinition,\n\trequestedScopes: readonly string[],\n): LoopValidationDiagnostic[] {\n\tconst deniedScopes = definition.safety.deniedWriteScopes ?? [];\n\tconst diagnostics: LoopValidationDiagnostic[] = [];\n\tfor (const requestedScope of requestedScopes) {\n\t\tconst normalizedRequested = normalizePath(requestedScope);\n\t\tif (!normalizedRequested) {\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const deniedScope of deniedScopes) {\n\t\t\tconst normalizedDenied = normalizePath(deniedScope);\n\t\t\tif (normalizedDenied && scopesOverlap(normalizedRequested, normalizedDenied)) {\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\tcode: \"write-scope-denied-overlap\",\n\t\t\t\t\tmessage: `Requested writeScope ${normalizedRequested} overlaps deniedWriteScope ${normalizedDenied}.`,\n\t\t\t\t\tpath: normalizedRequested,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\treturn diagnostics;\n}\n\nfunction validateChangedFilesWithinRequestedScope(\n\twriteScope: readonly string[],\n\tchangedFiles: readonly string[],\n): LoopValidationDiagnostic[] {\n\tconst diagnostics: LoopValidationDiagnostic[] = [];\n\tfor (const changedFile of changedFiles) {\n\t\tconst normalizedFile = normalizePath(changedFile);\n\t\tif (!normalizedFile) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (!matchesAnyScope(normalizedFile, writeScope)) {\n\t\t\tdiagnostics.push({\n\t\t\t\tcode: \"changed-file-outside-write-scope\",\n\t\t\t\tmessage: `Changed file ${normalizedFile} is outside the requested writeScope.`,\n\t\t\t\tpath: normalizedFile,\n\t\t\t});\n\t\t}\n\t}\n\treturn diagnostics;\n}\n\nfunction hasEvidenceRefs(refs: readonly string[] | undefined): boolean {\n\treturn Boolean(refs?.some((ref) => ref.trim().length > 0));\n}\n\nfunction matchesWatchedScope(definition: LoopDefinition, item: LoopWorkItem): boolean {\n\tconst haystack = normalizePath([item.actingOn, item.sourceRef, item.title].join(\" \"));\n\tconst watchedPaths = definition.watchedScope.paths ?? [];\n\tif (watchedPaths.some((scope) => pathHasScopePrefix(normalizePath(item.actingOn), normalizePath(scope)))) {\n\t\treturn true;\n\t}\n\tconst watchedTickets = definition.watchedScope.tickets ?? [];\n\tif (watchedTickets.some((ticket) => haystack.includes(normalizePath(ticket)))) {\n\t\treturn true;\n\t}\n\tconst watchedBranches = definition.watchedScope.branches ?? [];\n\tif (watchedBranches.some((branch) => haystack.includes(normalizePath(branch)))) {\n\t\treturn true;\n\t}\n\treturn definition.watchedScope.repos.some((repo) => haystack.includes(normalizePath(repo)));\n}\n\nfunction tokenize(text: string): Set<string> {\n\tconst matches = text.toLowerCase().match(/[a-z0-9][a-z0-9_-]*/g) ?? [];\n\treturn new Set(matches.filter((token) => token.length > 1 && !TOKEN_STOP_WORDS.has(token)));\n}\n\nfunction overlapRatio(source: Set<string>, target: Set<string>): number {\n\tif (target.size === 0) {\n\t\treturn 0;\n\t}\n\tlet overlap = 0;\n\tfor (const token of target) {\n\t\tif (source.has(token)) {\n\t\t\toverlap++;\n\t\t}\n\t}\n\treturn overlap / target.size;\n}\n\nfunction clamp01(value: number): number {\n\tif (value < 0) {\n\t\treturn 0;\n\t}\n\tif (value > 1) {\n\t\treturn 1;\n\t}\n\treturn value;\n}\n\nfunction matchesAnyScope(path: string, scopes: readonly string[]): boolean {\n\treturn scopes.some((scope) => scopeMatchesPath(path, scope));\n}\n\nfunction scopesOverlap(first: string, second: string): boolean {\n\treturn scopeMatchesPath(first, second) || scopeMatchesPath(second, first);\n}\n\nfunction scopeMatchesPath(path: string, scope: string): boolean {\n\tconst normalizedPath = normalizePath(path);\n\tconst normalizedScope = normalizePath(scope);\n\tif (!normalizedPath || !normalizedScope) {\n\t\treturn false;\n\t}\n\tif (normalizedScope.includes(\"*\")) {\n\t\treturn globToRegExp(normalizedScope).test(normalizedPath);\n\t}\n\treturn pathHasScopePrefix(normalizedPath, normalizedScope);\n}\n\nfunction pathHasScopePrefix(path: string, scope: string): boolean {\n\treturn path === scope || path.startsWith(`${scope}/`);\n}\n\nfunction normalizePath(path: string): string {\n\treturn path.trim().replace(/\\\\/g, \"/\").replace(/\\/+/g, \"/\").replace(/^\\.\\//, \"\").replace(/\\/$/, \"\");\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\tconst nextChar = glob[index + 1];\n\t\tif (char === \"*\" && nextChar === \"*\") {\n\t\t\tpattern += \".*\";\n\t\t\tindex++;\n\t\t} else if (char === \"*\") {\n\t\t\tpattern += \"[^/]*\";\n\t\t} else {\n\t\t\tpattern += escapeRegExp(char);\n\t\t}\n\t}\n\treturn new RegExp(`${pattern}$`);\n}\n\nfunction escapeRegExp(char: string): string {\n\treturn char.replace(/[|\\\\{}()[\\]^$+?.]/g, \"\\\\$&\");\n}\n"]}
|
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
const TOKEN_STOP_WORDS = new Set([
|
|
2
|
+
"a",
|
|
3
|
+
"an",
|
|
4
|
+
"and",
|
|
5
|
+
"are",
|
|
6
|
+
"as",
|
|
7
|
+
"for",
|
|
8
|
+
"in",
|
|
9
|
+
"inside",
|
|
10
|
+
"is",
|
|
11
|
+
"of",
|
|
12
|
+
"on",
|
|
13
|
+
"or",
|
|
14
|
+
"the",
|
|
15
|
+
"to",
|
|
16
|
+
"with",
|
|
17
|
+
]);
|
|
18
|
+
export function evaluateLoopSafetyGates(definition, state, item, evidence) {
|
|
19
|
+
const diagnostics = [];
|
|
20
|
+
if (state.killSwitch) {
|
|
21
|
+
diagnostics.push({ code: "loop-kill-switch", message: "Loop kill switch is active." });
|
|
22
|
+
}
|
|
23
|
+
if (state.status === "paused" || state.status === "retired") {
|
|
24
|
+
diagnostics.push({ code: "loop-not-active", message: `Loop status ${state.status} cannot take action.` });
|
|
25
|
+
}
|
|
26
|
+
if (item.attemptCount >= definition.budget.maxAttemptsPerItem) {
|
|
27
|
+
diagnostics.push({
|
|
28
|
+
code: "max-attempts-exceeded",
|
|
29
|
+
message: `Item ${item.id} reached maxAttemptsPerItem=${definition.budget.maxAttemptsPerItem}.`,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
if (!evidence.writeScope) {
|
|
33
|
+
diagnostics.push({ code: "write-scope-missing", message: "Exact writeScope evidence is required." });
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
diagnostics.push(...validateLoopWriteScope(definition, evidence.writeScope).diagnostics);
|
|
37
|
+
diagnostics.push(...validateRequestedWriteScopeDoesNotOverlapDenied(definition, evidence.writeScope));
|
|
38
|
+
}
|
|
39
|
+
if (evidence.writeScope && evidence.changedFiles) {
|
|
40
|
+
diagnostics.push(...validateChangedFilesWithinRequestedScope(evidence.writeScope, evidence.changedFiles));
|
|
41
|
+
}
|
|
42
|
+
if (requiresWorktreeIsolation(definition)) {
|
|
43
|
+
diagnostics.push(...validateWorktreeEvidence(definition, evidence.worktree));
|
|
44
|
+
}
|
|
45
|
+
if (definition.durableState?.requireReplayableEvidence === true) {
|
|
46
|
+
diagnostics.push(...validateDurableStateEvidence(evidence.durableState));
|
|
47
|
+
}
|
|
48
|
+
if (requiresHumanApproval(definition, item)) {
|
|
49
|
+
const approvalRef = evidence.humanGate?.approvalRef?.trim();
|
|
50
|
+
const approvalRefSatisfied = definition.humanGates?.approvalRefsRequired === false || Boolean(approvalRef);
|
|
51
|
+
if (evidence.humanGate?.approved !== true || !approvalRefSatisfied) {
|
|
52
|
+
diagnostics.push({
|
|
53
|
+
code: "human-gate-required",
|
|
54
|
+
message: "High-risk work item requires human approval evidence.",
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (!hasEvidenceRefs(evidence.evidenceRefs)) {
|
|
59
|
+
diagnostics.push({ code: "evidence-refs-missing", message: "Completion evidenceRefs are required." });
|
|
60
|
+
}
|
|
61
|
+
if (requiresIndependentVerifier(definition)) {
|
|
62
|
+
diagnostics.push(...validateIndependentVerifier(evidence.verifier));
|
|
63
|
+
}
|
|
64
|
+
return safetyGateResult(diagnostics);
|
|
65
|
+
}
|
|
66
|
+
export function calculateLoopDriftScore(definition, item) {
|
|
67
|
+
const itemTokens = tokenize([item.title, item.sourceRef, item.actingOn].join(" "));
|
|
68
|
+
const objectiveTokens = tokenize(definition.objective);
|
|
69
|
+
const objectiveOverlap = overlapRatio(itemTokens, objectiveTokens);
|
|
70
|
+
const nonGoalOverlap = Math.max(0, ...definition.nonGoals.map((nonGoal) => overlapRatio(itemTokens, tokenize(nonGoal))));
|
|
71
|
+
const scopeMatched = matchesWatchedScope(definition, item);
|
|
72
|
+
let score = 0.45;
|
|
73
|
+
score -= objectiveOverlap * 0.25;
|
|
74
|
+
score += objectiveOverlap === 0 ? 0.2 : 0;
|
|
75
|
+
score += scopeMatched ? -0.2 : 0.2;
|
|
76
|
+
score += nonGoalOverlap * 0.7;
|
|
77
|
+
return clamp01(score);
|
|
78
|
+
}
|
|
79
|
+
export function validateLoopWriteScope(definition, paths) {
|
|
80
|
+
const diagnostics = [];
|
|
81
|
+
if (paths.length === 0 && (definition.level === "L2" || definition.level === "L3")) {
|
|
82
|
+
diagnostics.push({
|
|
83
|
+
code: "write-scope-empty",
|
|
84
|
+
message: `${definition.level} loops require explicit write paths.`,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
if (definition.safety.maxWriteScopeCount !== undefined && paths.length > definition.safety.maxWriteScopeCount) {
|
|
88
|
+
diagnostics.push({
|
|
89
|
+
code: "write-scope-count-exceeded",
|
|
90
|
+
message: `Write scope count ${paths.length} exceeds maxWriteScopeCount=${definition.safety.maxWriteScopeCount}.`,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
for (const path of paths) {
|
|
94
|
+
const normalizedPath = normalizePath(path);
|
|
95
|
+
if (!normalizedPath) {
|
|
96
|
+
diagnostics.push({ code: "write-scope-empty-path", message: "Write scope contains an empty path." });
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
if (!matchesAnyScope(normalizedPath, definition.safety.allowedWriteScopes)) {
|
|
100
|
+
diagnostics.push({
|
|
101
|
+
code: "write-scope-outside-allowed",
|
|
102
|
+
message: `Path ${normalizedPath} is outside allowedWriteScopes.`,
|
|
103
|
+
path: normalizedPath,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
if (matchesAnyScope(normalizedPath, definition.safety.deniedWriteScopes ?? [])) {
|
|
107
|
+
diagnostics.push({
|
|
108
|
+
code: "write-scope-denied",
|
|
109
|
+
message: `Path ${normalizedPath} is inside deniedWriteScopes.`,
|
|
110
|
+
path: normalizedPath,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return { passed: diagnostics.length === 0, diagnostics };
|
|
115
|
+
}
|
|
116
|
+
function safetyGateResult(diagnostics) {
|
|
117
|
+
if (diagnostics.length === 0) {
|
|
118
|
+
return { passed: true, action: "allow", diagnostics: [] };
|
|
119
|
+
}
|
|
120
|
+
if (hasDiagnostic(diagnostics, "loop-kill-switch")) {
|
|
121
|
+
return { passed: false, action: "block", outcome: "killed", diagnostics };
|
|
122
|
+
}
|
|
123
|
+
if (hasDiagnostic(diagnostics, "max-attempts-exceeded")) {
|
|
124
|
+
return { passed: false, action: "escalate", outcome: "escalated", diagnostics };
|
|
125
|
+
}
|
|
126
|
+
if (hasDiagnostic(diagnostics, "human-gate-required")) {
|
|
127
|
+
return { passed: false, action: "human-gate", outcome: "escalated", diagnostics };
|
|
128
|
+
}
|
|
129
|
+
return { passed: false, action: "block", outcome: "verifier-failed", diagnostics };
|
|
130
|
+
}
|
|
131
|
+
function hasDiagnostic(diagnostics, code) {
|
|
132
|
+
return diagnostics.some((diagnostic) => diagnostic.code === code);
|
|
133
|
+
}
|
|
134
|
+
function requiresIndependentVerifier(definition) {
|
|
135
|
+
return definition.level === "L2" || definition.level === "L3" || definition.safety.requireIndependentVerifier;
|
|
136
|
+
}
|
|
137
|
+
function validateIndependentVerifier(verifier) {
|
|
138
|
+
if (!verifier) {
|
|
139
|
+
return [{ code: "independent-verifier-required", message: "L2/L3 actions require an independent verifier." }];
|
|
140
|
+
}
|
|
141
|
+
const diagnostics = [];
|
|
142
|
+
const sameActor = Boolean(verifier.verifierId && verifier.implementerId && verifier.verifierId.trim() === verifier.implementerId.trim());
|
|
143
|
+
if (!verifier.independent || sameActor) {
|
|
144
|
+
diagnostics.push({ code: "independent-verifier-required", message: "Verifier must be independent." });
|
|
145
|
+
}
|
|
146
|
+
if (verifier.status && verifier.status !== "pass") {
|
|
147
|
+
diagnostics.push({ code: "verifier-failed", message: `Verifier status is ${verifier.status}.` });
|
|
148
|
+
}
|
|
149
|
+
if (!hasEvidenceRefs(verifier.evidenceRefs)) {
|
|
150
|
+
diagnostics.push({ code: "verifier-evidence-missing", message: "Verifier evidenceRefs are required." });
|
|
151
|
+
}
|
|
152
|
+
return diagnostics;
|
|
153
|
+
}
|
|
154
|
+
function requiresWorktreeIsolation(definition) {
|
|
155
|
+
return definition.worktree?.mode === "per-run" || definition.worktree?.mode === "per-item";
|
|
156
|
+
}
|
|
157
|
+
function validateWorktreeEvidence(definition, worktree) {
|
|
158
|
+
if (!worktree) {
|
|
159
|
+
return [
|
|
160
|
+
{
|
|
161
|
+
code: "worktree-isolation-required",
|
|
162
|
+
message: "Isolated loop actions require worktree evidence.",
|
|
163
|
+
},
|
|
164
|
+
];
|
|
165
|
+
}
|
|
166
|
+
const diagnostics = [];
|
|
167
|
+
if (worktree.isolated !== true) {
|
|
168
|
+
diagnostics.push({
|
|
169
|
+
code: "worktree-isolation-required",
|
|
170
|
+
message: "Loop worktree evidence must confirm isolation.",
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
if (!worktree.worktreeId?.trim()) {
|
|
174
|
+
diagnostics.push({
|
|
175
|
+
code: "worktree-id-required",
|
|
176
|
+
message: "Loop worktree evidence must include a worktreeId.",
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
if (definition.worktree?.requireCleanCheckout === true && worktree.cleanCheckout !== true) {
|
|
180
|
+
diagnostics.push({
|
|
181
|
+
code: "worktree-clean-checkout-required",
|
|
182
|
+
message: "Loop worktree must start from a clean checkout.",
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
const branchPrefix = definition.worktree?.branchPrefix;
|
|
186
|
+
if (branchPrefix &&
|
|
187
|
+
worktree.branch &&
|
|
188
|
+
!pathHasScopePrefix(normalizePath(worktree.branch), normalizePath(branchPrefix))) {
|
|
189
|
+
diagnostics.push({
|
|
190
|
+
code: "worktree-branch-prefix-mismatch",
|
|
191
|
+
message: `Loop worktree branch must use prefix ${branchPrefix}.`,
|
|
192
|
+
path: worktree.branch,
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
return diagnostics;
|
|
196
|
+
}
|
|
197
|
+
function validateDurableStateEvidence(durableState) {
|
|
198
|
+
const diagnostics = [];
|
|
199
|
+
if (!durableState?.stateRevision?.trim()) {
|
|
200
|
+
diagnostics.push({
|
|
201
|
+
code: "state-revision-missing",
|
|
202
|
+
message: "Replayable loop actions require a stateRevision.",
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
if (!durableState?.runLogRef?.trim()) {
|
|
206
|
+
diagnostics.push({
|
|
207
|
+
code: "run-log-ref-missing",
|
|
208
|
+
message: "Replayable loop actions require a runLogRef.",
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
if (!durableState?.budgetReservationId?.trim()) {
|
|
212
|
+
diagnostics.push({
|
|
213
|
+
code: "budget-reservation-missing",
|
|
214
|
+
message: "Replayable loop actions require a budgetReservationId.",
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
return diagnostics;
|
|
218
|
+
}
|
|
219
|
+
function requiresHumanApproval(definition, item) {
|
|
220
|
+
const gatedRisks = definition.humanGates?.requiredForRisks;
|
|
221
|
+
if (gatedRisks !== undefined) {
|
|
222
|
+
return gatedRisks.includes(item.risk);
|
|
223
|
+
}
|
|
224
|
+
return definition.safety.requireHumanGateForHighRisk && item.risk === "high";
|
|
225
|
+
}
|
|
226
|
+
function validateRequestedWriteScopeDoesNotOverlapDenied(definition, requestedScopes) {
|
|
227
|
+
const deniedScopes = definition.safety.deniedWriteScopes ?? [];
|
|
228
|
+
const diagnostics = [];
|
|
229
|
+
for (const requestedScope of requestedScopes) {
|
|
230
|
+
const normalizedRequested = normalizePath(requestedScope);
|
|
231
|
+
if (!normalizedRequested) {
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
for (const deniedScope of deniedScopes) {
|
|
235
|
+
const normalizedDenied = normalizePath(deniedScope);
|
|
236
|
+
if (normalizedDenied && scopesOverlap(normalizedRequested, normalizedDenied)) {
|
|
237
|
+
diagnostics.push({
|
|
238
|
+
code: "write-scope-denied-overlap",
|
|
239
|
+
message: `Requested writeScope ${normalizedRequested} overlaps deniedWriteScope ${normalizedDenied}.`,
|
|
240
|
+
path: normalizedRequested,
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return diagnostics;
|
|
246
|
+
}
|
|
247
|
+
function validateChangedFilesWithinRequestedScope(writeScope, changedFiles) {
|
|
248
|
+
const diagnostics = [];
|
|
249
|
+
for (const changedFile of changedFiles) {
|
|
250
|
+
const normalizedFile = normalizePath(changedFile);
|
|
251
|
+
if (!normalizedFile) {
|
|
252
|
+
continue;
|
|
253
|
+
}
|
|
254
|
+
if (!matchesAnyScope(normalizedFile, writeScope)) {
|
|
255
|
+
diagnostics.push({
|
|
256
|
+
code: "changed-file-outside-write-scope",
|
|
257
|
+
message: `Changed file ${normalizedFile} is outside the requested writeScope.`,
|
|
258
|
+
path: normalizedFile,
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return diagnostics;
|
|
263
|
+
}
|
|
264
|
+
function hasEvidenceRefs(refs) {
|
|
265
|
+
return Boolean(refs?.some((ref) => ref.trim().length > 0));
|
|
266
|
+
}
|
|
267
|
+
function matchesWatchedScope(definition, item) {
|
|
268
|
+
const haystack = normalizePath([item.actingOn, item.sourceRef, item.title].join(" "));
|
|
269
|
+
const watchedPaths = definition.watchedScope.paths ?? [];
|
|
270
|
+
if (watchedPaths.some((scope) => pathHasScopePrefix(normalizePath(item.actingOn), normalizePath(scope)))) {
|
|
271
|
+
return true;
|
|
272
|
+
}
|
|
273
|
+
const watchedTickets = definition.watchedScope.tickets ?? [];
|
|
274
|
+
if (watchedTickets.some((ticket) => haystack.includes(normalizePath(ticket)))) {
|
|
275
|
+
return true;
|
|
276
|
+
}
|
|
277
|
+
const watchedBranches = definition.watchedScope.branches ?? [];
|
|
278
|
+
if (watchedBranches.some((branch) => haystack.includes(normalizePath(branch)))) {
|
|
279
|
+
return true;
|
|
280
|
+
}
|
|
281
|
+
return definition.watchedScope.repos.some((repo) => haystack.includes(normalizePath(repo)));
|
|
282
|
+
}
|
|
283
|
+
function tokenize(text) {
|
|
284
|
+
const matches = text.toLowerCase().match(/[a-z0-9][a-z0-9_-]*/g) ?? [];
|
|
285
|
+
return new Set(matches.filter((token) => token.length > 1 && !TOKEN_STOP_WORDS.has(token)));
|
|
286
|
+
}
|
|
287
|
+
function overlapRatio(source, target) {
|
|
288
|
+
if (target.size === 0) {
|
|
289
|
+
return 0;
|
|
290
|
+
}
|
|
291
|
+
let overlap = 0;
|
|
292
|
+
for (const token of target) {
|
|
293
|
+
if (source.has(token)) {
|
|
294
|
+
overlap++;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
return overlap / target.size;
|
|
298
|
+
}
|
|
299
|
+
function clamp01(value) {
|
|
300
|
+
if (value < 0) {
|
|
301
|
+
return 0;
|
|
302
|
+
}
|
|
303
|
+
if (value > 1) {
|
|
304
|
+
return 1;
|
|
305
|
+
}
|
|
306
|
+
return value;
|
|
307
|
+
}
|
|
308
|
+
function matchesAnyScope(path, scopes) {
|
|
309
|
+
return scopes.some((scope) => scopeMatchesPath(path, scope));
|
|
310
|
+
}
|
|
311
|
+
function scopesOverlap(first, second) {
|
|
312
|
+
return scopeMatchesPath(first, second) || scopeMatchesPath(second, first);
|
|
313
|
+
}
|
|
314
|
+
function scopeMatchesPath(path, scope) {
|
|
315
|
+
const normalizedPath = normalizePath(path);
|
|
316
|
+
const normalizedScope = normalizePath(scope);
|
|
317
|
+
if (!normalizedPath || !normalizedScope) {
|
|
318
|
+
return false;
|
|
319
|
+
}
|
|
320
|
+
if (normalizedScope.includes("*")) {
|
|
321
|
+
return globToRegExp(normalizedScope).test(normalizedPath);
|
|
322
|
+
}
|
|
323
|
+
return pathHasScopePrefix(normalizedPath, normalizedScope);
|
|
324
|
+
}
|
|
325
|
+
function pathHasScopePrefix(path, scope) {
|
|
326
|
+
return path === scope || path.startsWith(`${scope}/`);
|
|
327
|
+
}
|
|
328
|
+
function normalizePath(path) {
|
|
329
|
+
return path.trim().replace(/\\/g, "/").replace(/\/+/g, "/").replace(/^\.\//, "").replace(/\/$/, "");
|
|
330
|
+
}
|
|
331
|
+
function globToRegExp(glob) {
|
|
332
|
+
let pattern = "^";
|
|
333
|
+
for (let index = 0; index < glob.length; index++) {
|
|
334
|
+
const char = glob[index];
|
|
335
|
+
const nextChar = glob[index + 1];
|
|
336
|
+
if (char === "*" && nextChar === "*") {
|
|
337
|
+
pattern += ".*";
|
|
338
|
+
index++;
|
|
339
|
+
}
|
|
340
|
+
else if (char === "*") {
|
|
341
|
+
pattern += "[^/]*";
|
|
342
|
+
}
|
|
343
|
+
else {
|
|
344
|
+
pattern += escapeRegExp(char);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
return new RegExp(`${pattern}$`);
|
|
348
|
+
}
|
|
349
|
+
function escapeRegExp(char) {
|
|
350
|
+
return char.replace(/[|\\{}()[\]^$+?.]/g, "\\$&");
|
|
351
|
+
}
|
|
352
|
+
//# sourceMappingURL=loop-gates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop-gates.js","sourceRoot":"","sources":["../../src/core/loop-gates.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tLoopDefinition,\n\tLoopRunOutcome,\n\tLoopState,\n\tLoopValidationDiagnostic,\n\tLoopWorkItem,\n} from \"./loop-types.ts\";\n\nexport type LoopGateAction = \"allow\" | \"block\" | \"human-gate\" | \"escalate\";\n\nexport type LoopVerifierStatus = \"pass\" | \"fail\" | \"blocked\";\n\nexport interface LoopVerifierEvidence {\n\treadonly independent: boolean;\n\treadonly status?: LoopVerifierStatus;\n\treadonly evidenceRefs?: readonly string[];\n\treadonly verifierId?: string;\n\treadonly implementerId?: string;\n}\n\nexport interface LoopHumanGateEvidence {\n\treadonly approved: boolean;\n\treadonly approvalRef?: string;\n}\n\nexport interface LoopWorktreeEvidence {\n\treadonly isolated: boolean;\n\treadonly worktreeId?: string;\n\treadonly branch?: string;\n\treadonly cleanCheckout?: boolean;\n}\n\nexport interface LoopDurableStateEvidence {\n\treadonly stateRevision?: string;\n\treadonly runLogRef?: string;\n\treadonly budgetReservationId?: string;\n}\n\nexport interface LoopGateEvidence {\n\treadonly writeScope?: readonly string[];\n\treadonly changedFiles?: readonly string[];\n\treadonly evidenceRefs?: readonly string[];\n\treadonly verifier?: LoopVerifierEvidence;\n\treadonly humanGate?: LoopHumanGateEvidence;\n\treadonly worktree?: LoopWorktreeEvidence;\n\treadonly durableState?: LoopDurableStateEvidence;\n}\n\nexport interface LoopSafetyGateResult {\n\treadonly passed: boolean;\n\treadonly action: LoopGateAction;\n\treadonly outcome?: LoopRunOutcome;\n\treadonly diagnostics: readonly LoopValidationDiagnostic[];\n}\n\nexport interface LoopWriteScopeValidationResult {\n\treadonly passed: boolean;\n\treadonly diagnostics: readonly LoopValidationDiagnostic[];\n}\n\nconst TOKEN_STOP_WORDS = new Set([\n\t\"a\",\n\t\"an\",\n\t\"and\",\n\t\"are\",\n\t\"as\",\n\t\"for\",\n\t\"in\",\n\t\"inside\",\n\t\"is\",\n\t\"of\",\n\t\"on\",\n\t\"or\",\n\t\"the\",\n\t\"to\",\n\t\"with\",\n]);\n\nexport function evaluateLoopSafetyGates(\n\tdefinition: LoopDefinition,\n\tstate: LoopState,\n\titem: LoopWorkItem,\n\tevidence: LoopGateEvidence,\n): LoopSafetyGateResult {\n\tconst diagnostics: LoopValidationDiagnostic[] = [];\n\n\tif (state.killSwitch) {\n\t\tdiagnostics.push({ code: \"loop-kill-switch\", message: \"Loop kill switch is active.\" });\n\t}\n\tif (state.status === \"paused\" || state.status === \"retired\") {\n\t\tdiagnostics.push({ code: \"loop-not-active\", message: `Loop status ${state.status} cannot take action.` });\n\t}\n\n\tif (item.attemptCount >= definition.budget.maxAttemptsPerItem) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"max-attempts-exceeded\",\n\t\t\tmessage: `Item ${item.id} reached maxAttemptsPerItem=${definition.budget.maxAttemptsPerItem}.`,\n\t\t});\n\t}\n\n\tif (!evidence.writeScope) {\n\t\tdiagnostics.push({ code: \"write-scope-missing\", message: \"Exact writeScope evidence is required.\" });\n\t} else {\n\t\tdiagnostics.push(...validateLoopWriteScope(definition, evidence.writeScope).diagnostics);\n\t\tdiagnostics.push(...validateRequestedWriteScopeDoesNotOverlapDenied(definition, evidence.writeScope));\n\t}\n\n\tif (evidence.writeScope && evidence.changedFiles) {\n\t\tdiagnostics.push(...validateChangedFilesWithinRequestedScope(evidence.writeScope, evidence.changedFiles));\n\t}\n\n\tif (requiresWorktreeIsolation(definition)) {\n\t\tdiagnostics.push(...validateWorktreeEvidence(definition, evidence.worktree));\n\t}\n\n\tif (definition.durableState?.requireReplayableEvidence === true) {\n\t\tdiagnostics.push(...validateDurableStateEvidence(evidence.durableState));\n\t}\n\n\tif (requiresHumanApproval(definition, item)) {\n\t\tconst approvalRef = evidence.humanGate?.approvalRef?.trim();\n\t\tconst approvalRefSatisfied = definition.humanGates?.approvalRefsRequired === false || Boolean(approvalRef);\n\t\tif (evidence.humanGate?.approved !== true || !approvalRefSatisfied) {\n\t\t\tdiagnostics.push({\n\t\t\t\tcode: \"human-gate-required\",\n\t\t\t\tmessage: \"High-risk work item requires human approval evidence.\",\n\t\t\t});\n\t\t}\n\t}\n\n\tif (!hasEvidenceRefs(evidence.evidenceRefs)) {\n\t\tdiagnostics.push({ code: \"evidence-refs-missing\", message: \"Completion evidenceRefs are required.\" });\n\t}\n\n\tif (requiresIndependentVerifier(definition)) {\n\t\tdiagnostics.push(...validateIndependentVerifier(evidence.verifier));\n\t}\n\n\treturn safetyGateResult(diagnostics);\n}\n\nexport function calculateLoopDriftScore(definition: LoopDefinition, item: LoopWorkItem): number {\n\tconst itemTokens = tokenize([item.title, item.sourceRef, item.actingOn].join(\" \"));\n\tconst objectiveTokens = tokenize(definition.objective);\n\tconst objectiveOverlap = overlapRatio(itemTokens, objectiveTokens);\n\tconst nonGoalOverlap = Math.max(\n\t\t0,\n\t\t...definition.nonGoals.map((nonGoal) => overlapRatio(itemTokens, tokenize(nonGoal))),\n\t);\n\tconst scopeMatched = matchesWatchedScope(definition, item);\n\n\tlet score = 0.45;\n\tscore -= objectiveOverlap * 0.25;\n\tscore += objectiveOverlap === 0 ? 0.2 : 0;\n\tscore += scopeMatched ? -0.2 : 0.2;\n\tscore += nonGoalOverlap * 0.7;\n\n\treturn clamp01(score);\n}\n\nexport function validateLoopWriteScope(\n\tdefinition: LoopDefinition,\n\tpaths: readonly string[],\n): LoopWriteScopeValidationResult {\n\tconst diagnostics: LoopValidationDiagnostic[] = [];\n\n\tif (paths.length === 0 && (definition.level === \"L2\" || definition.level === \"L3\")) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"write-scope-empty\",\n\t\t\tmessage: `${definition.level} loops require explicit write paths.`,\n\t\t});\n\t}\n\n\tif (definition.safety.maxWriteScopeCount !== undefined && paths.length > definition.safety.maxWriteScopeCount) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"write-scope-count-exceeded\",\n\t\t\tmessage: `Write scope count ${paths.length} exceeds maxWriteScopeCount=${definition.safety.maxWriteScopeCount}.`,\n\t\t});\n\t}\n\n\tfor (const path of paths) {\n\t\tconst normalizedPath = normalizePath(path);\n\t\tif (!normalizedPath) {\n\t\t\tdiagnostics.push({ code: \"write-scope-empty-path\", message: \"Write scope contains an empty path.\" });\n\t\t\tcontinue;\n\t\t}\n\t\tif (!matchesAnyScope(normalizedPath, definition.safety.allowedWriteScopes)) {\n\t\t\tdiagnostics.push({\n\t\t\t\tcode: \"write-scope-outside-allowed\",\n\t\t\t\tmessage: `Path ${normalizedPath} is outside allowedWriteScopes.`,\n\t\t\t\tpath: normalizedPath,\n\t\t\t});\n\t\t}\n\t\tif (matchesAnyScope(normalizedPath, definition.safety.deniedWriteScopes ?? [])) {\n\t\t\tdiagnostics.push({\n\t\t\t\tcode: \"write-scope-denied\",\n\t\t\t\tmessage: `Path ${normalizedPath} is inside deniedWriteScopes.`,\n\t\t\t\tpath: normalizedPath,\n\t\t\t});\n\t\t}\n\t}\n\n\treturn { passed: diagnostics.length === 0, diagnostics };\n}\n\nfunction safetyGateResult(diagnostics: readonly LoopValidationDiagnostic[]): LoopSafetyGateResult {\n\tif (diagnostics.length === 0) {\n\t\treturn { passed: true, action: \"allow\", diagnostics: [] };\n\t}\n\n\tif (hasDiagnostic(diagnostics, \"loop-kill-switch\")) {\n\t\treturn { passed: false, action: \"block\", outcome: \"killed\", diagnostics };\n\t}\n\tif (hasDiagnostic(diagnostics, \"max-attempts-exceeded\")) {\n\t\treturn { passed: false, action: \"escalate\", outcome: \"escalated\", diagnostics };\n\t}\n\tif (hasDiagnostic(diagnostics, \"human-gate-required\")) {\n\t\treturn { passed: false, action: \"human-gate\", outcome: \"escalated\", diagnostics };\n\t}\n\treturn { passed: false, action: \"block\", outcome: \"verifier-failed\", diagnostics };\n}\n\nfunction hasDiagnostic(diagnostics: readonly LoopValidationDiagnostic[], code: string): boolean {\n\treturn diagnostics.some((diagnostic) => diagnostic.code === code);\n}\n\nfunction requiresIndependentVerifier(definition: LoopDefinition): boolean {\n\treturn definition.level === \"L2\" || definition.level === \"L3\" || definition.safety.requireIndependentVerifier;\n}\n\nfunction validateIndependentVerifier(verifier: LoopVerifierEvidence | undefined): LoopValidationDiagnostic[] {\n\tif (!verifier) {\n\t\treturn [{ code: \"independent-verifier-required\", message: \"L2/L3 actions require an independent verifier.\" }];\n\t}\n\n\tconst diagnostics: LoopValidationDiagnostic[] = [];\n\tconst sameActor = Boolean(\n\t\tverifier.verifierId && verifier.implementerId && verifier.verifierId.trim() === verifier.implementerId.trim(),\n\t);\n\tif (!verifier.independent || sameActor) {\n\t\tdiagnostics.push({ code: \"independent-verifier-required\", message: \"Verifier must be independent.\" });\n\t}\n\tif (verifier.status && verifier.status !== \"pass\") {\n\t\tdiagnostics.push({ code: \"verifier-failed\", message: `Verifier status is ${verifier.status}.` });\n\t}\n\tif (!hasEvidenceRefs(verifier.evidenceRefs)) {\n\t\tdiagnostics.push({ code: \"verifier-evidence-missing\", message: \"Verifier evidenceRefs are required.\" });\n\t}\n\treturn diagnostics;\n}\n\nfunction requiresWorktreeIsolation(definition: LoopDefinition): boolean {\n\treturn definition.worktree?.mode === \"per-run\" || definition.worktree?.mode === \"per-item\";\n}\n\nfunction validateWorktreeEvidence(\n\tdefinition: LoopDefinition,\n\tworktree: LoopWorktreeEvidence | undefined,\n): LoopValidationDiagnostic[] {\n\tif (!worktree) {\n\t\treturn [\n\t\t\t{\n\t\t\t\tcode: \"worktree-isolation-required\",\n\t\t\t\tmessage: \"Isolated loop actions require worktree evidence.\",\n\t\t\t},\n\t\t];\n\t}\n\n\tconst diagnostics: LoopValidationDiagnostic[] = [];\n\tif (worktree.isolated !== true) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"worktree-isolation-required\",\n\t\t\tmessage: \"Loop worktree evidence must confirm isolation.\",\n\t\t});\n\t}\n\tif (!worktree.worktreeId?.trim()) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"worktree-id-required\",\n\t\t\tmessage: \"Loop worktree evidence must include a worktreeId.\",\n\t\t});\n\t}\n\tif (definition.worktree?.requireCleanCheckout === true && worktree.cleanCheckout !== true) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"worktree-clean-checkout-required\",\n\t\t\tmessage: \"Loop worktree must start from a clean checkout.\",\n\t\t});\n\t}\n\tconst branchPrefix = definition.worktree?.branchPrefix;\n\tif (\n\t\tbranchPrefix &&\n\t\tworktree.branch &&\n\t\t!pathHasScopePrefix(normalizePath(worktree.branch), normalizePath(branchPrefix))\n\t) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"worktree-branch-prefix-mismatch\",\n\t\t\tmessage: `Loop worktree branch must use prefix ${branchPrefix}.`,\n\t\t\tpath: worktree.branch,\n\t\t});\n\t}\n\treturn diagnostics;\n}\n\nfunction validateDurableStateEvidence(durableState: LoopDurableStateEvidence | undefined): LoopValidationDiagnostic[] {\n\tconst diagnostics: LoopValidationDiagnostic[] = [];\n\tif (!durableState?.stateRevision?.trim()) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"state-revision-missing\",\n\t\t\tmessage: \"Replayable loop actions require a stateRevision.\",\n\t\t});\n\t}\n\tif (!durableState?.runLogRef?.trim()) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"run-log-ref-missing\",\n\t\t\tmessage: \"Replayable loop actions require a runLogRef.\",\n\t\t});\n\t}\n\tif (!durableState?.budgetReservationId?.trim()) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"budget-reservation-missing\",\n\t\t\tmessage: \"Replayable loop actions require a budgetReservationId.\",\n\t\t});\n\t}\n\treturn diagnostics;\n}\n\nfunction requiresHumanApproval(definition: LoopDefinition, item: LoopWorkItem): boolean {\n\tconst gatedRisks = definition.humanGates?.requiredForRisks;\n\tif (gatedRisks !== undefined) {\n\t\treturn gatedRisks.includes(item.risk);\n\t}\n\treturn definition.safety.requireHumanGateForHighRisk && item.risk === \"high\";\n}\n\nfunction validateRequestedWriteScopeDoesNotOverlapDenied(\n\tdefinition: LoopDefinition,\n\trequestedScopes: readonly string[],\n): LoopValidationDiagnostic[] {\n\tconst deniedScopes = definition.safety.deniedWriteScopes ?? [];\n\tconst diagnostics: LoopValidationDiagnostic[] = [];\n\tfor (const requestedScope of requestedScopes) {\n\t\tconst normalizedRequested = normalizePath(requestedScope);\n\t\tif (!normalizedRequested) {\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const deniedScope of deniedScopes) {\n\t\t\tconst normalizedDenied = normalizePath(deniedScope);\n\t\t\tif (normalizedDenied && scopesOverlap(normalizedRequested, normalizedDenied)) {\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\tcode: \"write-scope-denied-overlap\",\n\t\t\t\t\tmessage: `Requested writeScope ${normalizedRequested} overlaps deniedWriteScope ${normalizedDenied}.`,\n\t\t\t\t\tpath: normalizedRequested,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\treturn diagnostics;\n}\n\nfunction validateChangedFilesWithinRequestedScope(\n\twriteScope: readonly string[],\n\tchangedFiles: readonly string[],\n): LoopValidationDiagnostic[] {\n\tconst diagnostics: LoopValidationDiagnostic[] = [];\n\tfor (const changedFile of changedFiles) {\n\t\tconst normalizedFile = normalizePath(changedFile);\n\t\tif (!normalizedFile) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (!matchesAnyScope(normalizedFile, writeScope)) {\n\t\t\tdiagnostics.push({\n\t\t\t\tcode: \"changed-file-outside-write-scope\",\n\t\t\t\tmessage: `Changed file ${normalizedFile} is outside the requested writeScope.`,\n\t\t\t\tpath: normalizedFile,\n\t\t\t});\n\t\t}\n\t}\n\treturn diagnostics;\n}\n\nfunction hasEvidenceRefs(refs: readonly string[] | undefined): boolean {\n\treturn Boolean(refs?.some((ref) => ref.trim().length > 0));\n}\n\nfunction matchesWatchedScope(definition: LoopDefinition, item: LoopWorkItem): boolean {\n\tconst haystack = normalizePath([item.actingOn, item.sourceRef, item.title].join(\" \"));\n\tconst watchedPaths = definition.watchedScope.paths ?? [];\n\tif (watchedPaths.some((scope) => pathHasScopePrefix(normalizePath(item.actingOn), normalizePath(scope)))) {\n\t\treturn true;\n\t}\n\tconst watchedTickets = definition.watchedScope.tickets ?? [];\n\tif (watchedTickets.some((ticket) => haystack.includes(normalizePath(ticket)))) {\n\t\treturn true;\n\t}\n\tconst watchedBranches = definition.watchedScope.branches ?? [];\n\tif (watchedBranches.some((branch) => haystack.includes(normalizePath(branch)))) {\n\t\treturn true;\n\t}\n\treturn definition.watchedScope.repos.some((repo) => haystack.includes(normalizePath(repo)));\n}\n\nfunction tokenize(text: string): Set<string> {\n\tconst matches = text.toLowerCase().match(/[a-z0-9][a-z0-9_-]*/g) ?? [];\n\treturn new Set(matches.filter((token) => token.length > 1 && !TOKEN_STOP_WORDS.has(token)));\n}\n\nfunction overlapRatio(source: Set<string>, target: Set<string>): number {\n\tif (target.size === 0) {\n\t\treturn 0;\n\t}\n\tlet overlap = 0;\n\tfor (const token of target) {\n\t\tif (source.has(token)) {\n\t\t\toverlap++;\n\t\t}\n\t}\n\treturn overlap / target.size;\n}\n\nfunction clamp01(value: number): number {\n\tif (value < 0) {\n\t\treturn 0;\n\t}\n\tif (value > 1) {\n\t\treturn 1;\n\t}\n\treturn value;\n}\n\nfunction matchesAnyScope(path: string, scopes: readonly string[]): boolean {\n\treturn scopes.some((scope) => scopeMatchesPath(path, scope));\n}\n\nfunction scopesOverlap(first: string, second: string): boolean {\n\treturn scopeMatchesPath(first, second) || scopeMatchesPath(second, first);\n}\n\nfunction scopeMatchesPath(path: string, scope: string): boolean {\n\tconst normalizedPath = normalizePath(path);\n\tconst normalizedScope = normalizePath(scope);\n\tif (!normalizedPath || !normalizedScope) {\n\t\treturn false;\n\t}\n\tif (normalizedScope.includes(\"*\")) {\n\t\treturn globToRegExp(normalizedScope).test(normalizedPath);\n\t}\n\treturn pathHasScopePrefix(normalizedPath, normalizedScope);\n}\n\nfunction pathHasScopePrefix(path: string, scope: string): boolean {\n\treturn path === scope || path.startsWith(`${scope}/`);\n}\n\nfunction normalizePath(path: string): string {\n\treturn path.trim().replace(/\\\\/g, \"/\").replace(/\\/+/g, \"/\").replace(/^\\.\\//, \"\").replace(/\\/$/, \"\");\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\tconst nextChar = glob[index + 1];\n\t\tif (char === \"*\" && nextChar === \"*\") {\n\t\t\tpattern += \".*\";\n\t\t\tindex++;\n\t\t} else if (char === \"*\") {\n\t\t\tpattern += \"[^/]*\";\n\t\t} else {\n\t\t\tpattern += escapeRegExp(char);\n\t\t}\n\t}\n\treturn new RegExp(`${pattern}$`);\n}\n\nfunction escapeRegExp(char: string): string {\n\treturn char.replace(/[|\\\\{}()[\\]^$+?.]/g, \"\\\\$&\");\n}\n"]}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { LoopBudgetPolicy, LoopConnectorBinding, LoopDefinition, LoopDurableStatePolicy, LoopHumanGatePolicy, LoopLevel, LoopSafetyPolicy, LoopSchedulePolicy, LoopSkillBinding, LoopSubagentPolicy, LoopValidationDiagnostic, LoopWatchedScope, LoopWorktreeIsolationPolicy } from "./loop-types.ts";
|
|
2
|
+
export type LoopPatternRisk = "low" | "medium" | "high";
|
|
3
|
+
export type LoopPatternTool = "grok" | "claude-code" | "codex" | "github-actions" | "cursor" | "windsurf" | "aider";
|
|
4
|
+
export type LoopPatternTokenCost = "low" | "medium" | "high" | "very-high";
|
|
5
|
+
export interface LoopPatternCost {
|
|
6
|
+
readonly tokensNoop?: number;
|
|
7
|
+
readonly tokensReport?: number;
|
|
8
|
+
readonly tokensAction?: number;
|
|
9
|
+
readonly suggestedDailyCap?: number;
|
|
10
|
+
readonly earlyExitRequired?: boolean;
|
|
11
|
+
readonly tokens_noop?: number;
|
|
12
|
+
readonly tokens_report?: number;
|
|
13
|
+
readonly tokens_action?: number;
|
|
14
|
+
readonly suggested_daily_cap?: number;
|
|
15
|
+
readonly early_exit_required?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface LoopPatternRegistryEntry {
|
|
18
|
+
readonly id: string;
|
|
19
|
+
readonly name: string;
|
|
20
|
+
readonly file: string;
|
|
21
|
+
readonly goal: string;
|
|
22
|
+
readonly cadence: string;
|
|
23
|
+
readonly risk: LoopPatternRisk;
|
|
24
|
+
readonly tools: readonly LoopPatternTool[];
|
|
25
|
+
readonly skills: readonly string[];
|
|
26
|
+
readonly state: string;
|
|
27
|
+
readonly phases: readonly string[];
|
|
28
|
+
readonly humanGates?: readonly string[];
|
|
29
|
+
readonly human_gates?: readonly string[];
|
|
30
|
+
readonly starter: string;
|
|
31
|
+
readonly weekOneMode?: LoopLevel;
|
|
32
|
+
readonly week_one_mode?: LoopLevel;
|
|
33
|
+
readonly tokenCost?: LoopPatternTokenCost;
|
|
34
|
+
readonly token_cost?: LoopPatternTokenCost;
|
|
35
|
+
readonly cost: LoopPatternCost;
|
|
36
|
+
readonly nonGoals?: readonly string[];
|
|
37
|
+
readonly non_goals?: readonly string[];
|
|
38
|
+
readonly triggerKeywords?: readonly string[];
|
|
39
|
+
readonly trigger_keywords?: readonly string[];
|
|
40
|
+
readonly skillTriggers?: Readonly<Record<string, readonly string[]>>;
|
|
41
|
+
readonly skill_triggers?: Readonly<Record<string, readonly string[]>>;
|
|
42
|
+
readonly connectors?: readonly LoopConnectorBinding[];
|
|
43
|
+
readonly worktree?: Partial<LoopWorktreeIsolationPolicy>;
|
|
44
|
+
readonly subagents?: Partial<LoopSubagentPolicy>;
|
|
45
|
+
readonly durableState?: Partial<LoopDurableStatePolicy>;
|
|
46
|
+
readonly durable_state?: Partial<LoopDurableStatePolicy>;
|
|
47
|
+
readonly humanGatePolicy?: Partial<LoopHumanGatePolicy>;
|
|
48
|
+
readonly human_gate_policy?: Partial<LoopHumanGatePolicy>;
|
|
49
|
+
}
|
|
50
|
+
export interface LoopPatternRegistryValidationResult {
|
|
51
|
+
readonly valid: boolean;
|
|
52
|
+
readonly diagnostics: readonly LoopValidationDiagnostic[];
|
|
53
|
+
}
|
|
54
|
+
export interface CompileLoopDefinitionOptions {
|
|
55
|
+
readonly id?: string;
|
|
56
|
+
readonly repo: string;
|
|
57
|
+
readonly scope?: Partial<LoopWatchedScope>;
|
|
58
|
+
readonly level?: LoopLevel;
|
|
59
|
+
readonly statePath?: string;
|
|
60
|
+
readonly runLogPath?: string;
|
|
61
|
+
readonly allowedWriteScopes?: readonly string[];
|
|
62
|
+
readonly deniedWriteScopes?: readonly string[];
|
|
63
|
+
readonly budget?: Partial<LoopBudgetPolicy>;
|
|
64
|
+
readonly safety?: Partial<LoopSafetyPolicy>;
|
|
65
|
+
readonly schedule?: Partial<LoopSchedulePolicy>;
|
|
66
|
+
readonly worktree?: Partial<LoopWorktreeIsolationPolicy>;
|
|
67
|
+
readonly skills?: readonly LoopSkillBinding[];
|
|
68
|
+
readonly connectors?: readonly LoopConnectorBinding[];
|
|
69
|
+
readonly subagents?: Partial<LoopSubagentPolicy>;
|
|
70
|
+
readonly durableState?: Partial<LoopDurableStatePolicy>;
|
|
71
|
+
readonly humanGates?: Partial<LoopHumanGatePolicy>;
|
|
72
|
+
}
|
|
73
|
+
export declare const OMK_LOOP_SKELETONS: readonly LoopPatternRegistryEntry[];
|
|
74
|
+
export declare function validateLoopPatternRegistry(entries: readonly LoopPatternRegistryEntry[]): LoopPatternRegistryValidationResult;
|
|
75
|
+
export declare function compileLoopDefinitionFromPattern(entry: LoopPatternRegistryEntry, options: CompileLoopDefinitionOptions): LoopDefinition;
|
|
76
|
+
export declare function detectStarterDrift(entry: LoopPatternRegistryEntry, availableStarterIds: readonly string[]): LoopPatternRegistryValidationResult;
|
|
77
|
+
//# sourceMappingURL=loop-registry.d.ts.map
|