open-multi-agent-kit 0.80.6 → 0.80.7
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 +11 -1
- package/README.md +22 -14
- 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 +1 -1
- package/dist/cli/config-selector.js.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +9 -8
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session.d.ts +45 -6
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +197 -13
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage.d.ts +4 -1
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +5 -5
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/bash-executor.d.ts.map +1 -1
- package/dist/core/bash-executor.js +1 -1
- package/dist/core/bash-executor.js.map +1 -1
- 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 +528 -0
- package/dist/core/command-safety.js.map +1 -0
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/core/compaction/branch-summarization.js +14 -4
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +18 -1
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +80 -42
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/compaction/pruner-policy.d.ts +84 -0
- package/dist/core/compaction/pruner-policy.d.ts.map +1 -0
- package/dist/core/compaction/pruner-policy.js +273 -0
- package/dist/core/compaction/pruner-policy.js.map +1 -0
- package/dist/core/context-graph-identity-resolution.d.ts +114 -0
- package/dist/core/context-graph-identity-resolution.d.ts.map +1 -0
- package/dist/core/context-graph-identity-resolution.js +127 -0
- package/dist/core/context-graph-identity-resolution.js.map +1 -0
- package/dist/core/context-graph-memory-store.d.ts +153 -0
- package/dist/core/context-graph-memory-store.d.ts.map +1 -0
- package/dist/core/context-graph-memory-store.js +377 -0
- package/dist/core/context-graph-memory-store.js.map +1 -0
- package/dist/core/context-graph-ontology-generation.d.ts +104 -0
- package/dist/core/context-graph-ontology-generation.d.ts.map +1 -0
- package/dist/core/context-graph-ontology-generation.js +135 -0
- package/dist/core/context-graph-ontology-generation.js.map +1 -0
- package/dist/core/context-graph-ontology-registry.d.ts +766 -0
- package/dist/core/context-graph-ontology-registry.d.ts.map +1 -0
- package/dist/core/context-graph-ontology-registry.js +1133 -0
- package/dist/core/context-graph-ontology-registry.js.map +1 -0
- package/dist/core/context-graph-policy.d.ts +68 -0
- package/dist/core/context-graph-policy.d.ts.map +1 -0
- package/dist/core/context-graph-policy.js +221 -0
- package/dist/core/context-graph-policy.js.map +1 -0
- package/dist/core/context-graph-reasoning.d.ts +130 -0
- package/dist/core/context-graph-reasoning.d.ts.map +1 -0
- package/dist/core/context-graph-reasoning.js +442 -0
- package/dist/core/context-graph-reasoning.js.map +1 -0
- package/dist/core/context-graph-retrieval.d.ts +120 -0
- package/dist/core/context-graph-retrieval.d.ts.map +1 -0
- package/dist/core/context-graph-retrieval.js +288 -0
- package/dist/core/context-graph-retrieval.js.map +1 -0
- package/dist/core/contract-verification.d.ts +78 -0
- package/dist/core/contract-verification.d.ts.map +1 -0
- package/dist/core/contract-verification.js +110 -0
- package/dist/core/contract-verification.js.map +1 -0
- package/dist/core/exact-cache-policy.d.ts +100 -0
- package/dist/core/exact-cache-policy.d.ts.map +1 -0
- package/dist/core/exact-cache-policy.js +175 -0
- package/dist/core/exact-cache-policy.js.map +1 -0
- package/dist/core/exec.d.ts +2 -0
- package/dist/core/exec.d.ts.map +1 -1
- package/dist/core/exec.js +1 -0
- package/dist/core/exec.js.map +1 -1
- package/dist/core/export-html/template.js +2 -2
- package/dist/core/extensions/builtin/command-safety-gate.d.ts +77 -0
- package/dist/core/extensions/builtin/command-safety-gate.d.ts.map +1 -0
- package/dist/core/extensions/builtin/command-safety-gate.js +147 -0
- package/dist/core/extensions/builtin/command-safety-gate.js.map +1 -0
- package/dist/core/extensions/loader.d.ts +4 -4
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +94 -56
- package/dist/core/extensions/loader.js.map +1 -1
- 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 +38 -10
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/freedom/banner.d.ts +14 -0
- package/dist/core/freedom/banner.d.ts.map +1 -0
- package/dist/core/freedom/banner.js +22 -0
- package/dist/core/freedom/banner.js.map +1 -0
- package/dist/core/freedom/config.d.ts +27 -0
- package/dist/core/freedom/config.d.ts.map +1 -0
- package/dist/core/freedom/config.js +216 -0
- package/dist/core/freedom/config.js.map +1 -0
- package/dist/core/freedom/index.d.ts +23 -0
- package/dist/core/freedom/index.d.ts.map +1 -0
- package/dist/core/freedom/index.js +19 -0
- package/dist/core/freedom/index.js.map +1 -0
- package/dist/core/freedom/policy.d.ts +42 -0
- package/dist/core/freedom/policy.d.ts.map +1 -0
- package/dist/core/freedom/policy.js +47 -0
- package/dist/core/freedom/policy.js.map +1 -0
- package/dist/core/freedom/safety-floor.d.ts +73 -0
- package/dist/core/freedom/safety-floor.d.ts.map +1 -0
- package/dist/core/freedom/safety-floor.js +275 -0
- package/dist/core/freedom/safety-floor.js.map +1 -0
- package/dist/core/harness-control-events.d.ts +13 -1
- package/dist/core/harness-control-events.d.ts.map +1 -1
- package/dist/core/harness-control-events.js +216 -41
- package/dist/core/harness-control-events.js.map +1 -1
- package/dist/core/harness-control-replay.d.ts +7 -2
- package/dist/core/harness-control-replay.d.ts.map +1 -1
- package/dist/core/harness-control-replay.js +36 -4
- package/dist/core/harness-control-replay.js.map +1 -1
- package/dist/core/headroom-middleware.d.ts +35 -0
- package/dist/core/headroom-middleware.d.ts.map +1 -0
- package/dist/core/headroom-middleware.js +166 -0
- package/dist/core/headroom-middleware.js.map +1 -0
- package/dist/core/hook-inventory.d.ts +23 -0
- package/dist/core/hook-inventory.d.ts.map +1 -0
- package/dist/core/hook-inventory.js +50 -0
- package/dist/core/hook-inventory.js.map +1 -0
- package/dist/core/lean-context-middleware.d.ts +12 -0
- package/dist/core/lean-context-middleware.d.ts.map +1 -0
- package/dist/core/lean-context-middleware.js +87 -0
- package/dist/core/lean-context-middleware.js.map +1 -0
- package/dist/core/lean-context-policy.d.ts +45 -0
- package/dist/core/lean-context-policy.d.ts.map +1 -0
- package/dist/core/lean-context-policy.js +108 -0
- package/dist/core/lean-context-policy.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-runtime.d.ts +84 -0
- package/dist/core/loadout-runtime.d.ts.map +1 -0
- package/dist/core/loadout-runtime.js +157 -0
- package/dist/core/loadout-runtime.js.map +1 -0
- package/dist/core/loadouts.d.ts +147 -0
- package/dist/core/loadouts.d.ts.map +1 -0
- package/dist/core/loadouts.js +442 -0
- package/dist/core/loadouts.js.map +1 -0
- package/dist/core/mcp-inventory.d.ts +34 -0
- package/dist/core/mcp-inventory.d.ts.map +1 -1
- package/dist/core/mcp-inventory.js +53 -1
- package/dist/core/mcp-inventory.js.map +1 -1
- package/dist/core/mcp-presets.d.ts +57 -0
- package/dist/core/mcp-presets.d.ts.map +1 -0
- package/dist/core/mcp-presets.js +81 -0
- package/dist/core/mcp-presets.js.map +1 -0
- package/dist/core/model-registry.d.ts +1 -0
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +40 -17
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +1 -0
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/native-adoption-benchmark.d.ts +166 -0
- package/dist/core/native-adoption-benchmark.d.ts.map +1 -0
- package/dist/core/native-adoption-benchmark.js +624 -0
- package/dist/core/native-adoption-benchmark.js.map +1 -0
- package/dist/core/observability-trace.d.ts +80 -0
- package/dist/core/observability-trace.d.ts.map +1 -0
- package/dist/core/observability-trace.js +140 -0
- package/dist/core/observability-trace.js.map +1 -0
- package/dist/core/orchestration/checkpoint.d.ts +83 -0
- package/dist/core/orchestration/checkpoint.d.ts.map +1 -0
- package/dist/core/orchestration/checkpoint.js +152 -0
- package/dist/core/orchestration/checkpoint.js.map +1 -0
- package/dist/core/orchestration/errors.d.ts +74 -0
- package/dist/core/orchestration/errors.d.ts.map +1 -0
- package/dist/core/orchestration/errors.js +52 -0
- package/dist/core/orchestration/errors.js.map +1 -0
- package/dist/core/orchestration/merge-queue.d.ts +121 -0
- package/dist/core/orchestration/merge-queue.d.ts.map +1 -0
- package/dist/core/orchestration/merge-queue.js +149 -0
- package/dist/core/orchestration/merge-queue.js.map +1 -0
- package/dist/core/orchestration/recovery.d.ts +106 -0
- package/dist/core/orchestration/recovery.d.ts.map +1 -0
- package/dist/core/orchestration/recovery.js +110 -0
- package/dist/core/orchestration/recovery.js.map +1 -0
- package/dist/core/orchestration/replay-ledger.d.ts +76 -0
- package/dist/core/orchestration/replay-ledger.d.ts.map +1 -0
- package/dist/core/orchestration/replay-ledger.js +395 -0
- package/dist/core/orchestration/replay-ledger.js.map +1 -0
- package/dist/core/orchestration/scheduler-state.d.ts +78 -0
- package/dist/core/orchestration/scheduler-state.d.ts.map +1 -0
- package/dist/core/orchestration/scheduler-state.js +185 -0
- package/dist/core/orchestration/scheduler-state.js.map +1 -0
- package/dist/core/orchestration/scheduler-store.d.ts +309 -0
- package/dist/core/orchestration/scheduler-store.d.ts.map +1 -0
- package/dist/core/orchestration/scheduler-store.js +368 -0
- package/dist/core/orchestration/scheduler-store.js.map +1 -0
- package/dist/core/orchestration/sqlite-scheduler-store.d.ts +57 -0
- package/dist/core/orchestration/sqlite-scheduler-store.d.ts.map +1 -0
- package/dist/core/orchestration/sqlite-scheduler-store.js +528 -0
- package/dist/core/orchestration/sqlite-scheduler-store.js.map +1 -0
- package/dist/core/orchestration/transaction-coordinator.d.ts +217 -0
- package/dist/core/orchestration/transaction-coordinator.d.ts.map +1 -0
- package/dist/core/orchestration/transaction-coordinator.js +281 -0
- package/dist/core/orchestration/transaction-coordinator.js.map +1 -0
- package/dist/core/orchestration/verification-contract.d.ts +197 -0
- package/dist/core/orchestration/verification-contract.d.ts.map +1 -0
- package/dist/core/orchestration/verification-contract.js +145 -0
- package/dist/core/orchestration/verification-contract.js.map +1 -0
- package/dist/core/package-composition.d.ts +68 -0
- package/dist/core/package-composition.d.ts.map +1 -0
- package/dist/core/package-composition.js +304 -0
- package/dist/core/package-composition.js.map +1 -0
- package/dist/core/package-gallery.d.ts +124 -0
- package/dist/core/package-gallery.d.ts.map +1 -0
- package/dist/core/package-gallery.js +392 -0
- package/dist/core/package-gallery.js.map +1 -0
- package/dist/core/package-manager.d.ts +69 -0
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +367 -69
- 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 +697 -0
- package/dist/core/package-procurement.js.map +1 -0
- package/dist/core/package-trial-runtime.d.ts +75 -0
- package/dist/core/package-trial-runtime.d.ts.map +1 -0
- package/dist/core/package-trial-runtime.js +73 -0
- package/dist/core/package-trial-runtime.js.map +1 -0
- package/dist/core/package-trial-sandbox.d.ts +27 -0
- package/dist/core/package-trial-sandbox.d.ts.map +1 -0
- package/dist/core/package-trial-sandbox.js +102 -0
- package/dist/core/package-trial-sandbox.js.map +1 -0
- package/dist/core/policy-overlays-runtime.d.ts +141 -0
- package/dist/core/policy-overlays-runtime.d.ts.map +1 -0
- package/dist/core/policy-overlays-runtime.js +720 -0
- package/dist/core/policy-overlays-runtime.js.map +1 -0
- package/dist/core/read-anchor-registry.d.ts +27 -0
- package/dist/core/read-anchor-registry.d.ts.map +1 -0
- package/dist/core/read-anchor-registry.js +103 -0
- package/dist/core/read-anchor-registry.js.map +1 -0
- 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/read-content-cache.d.ts +22 -0
- package/dist/core/read-content-cache.d.ts.map +1 -0
- package/dist/core/read-content-cache.js +79 -0
- package/dist/core/read-content-cache.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/resolve-config-value.d.ts +1 -1
- package/dist/core/resolve-config-value.d.ts.map +1 -1
- package/dist/core/resolve-config-value.js +30 -2
- package/dist/core/resolve-config-value.js.map +1 -1
- package/dist/core/resource-loader.d.ts +23 -21
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +93 -15
- 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/sdk.d.ts +83 -4
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +143 -55
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/semantic-cache-policy.d.ts +45 -0
- package/dist/core/semantic-cache-policy.d.ts.map +1 -0
- package/dist/core/semantic-cache-policy.js +220 -0
- package/dist/core/semantic-cache-policy.js.map +1 -0
- package/dist/core/session-digest.d.ts +57 -0
- package/dist/core/session-digest.d.ts.map +1 -0
- package/dist/core/session-digest.js +193 -0
- package/dist/core/session-digest.js.map +1 -0
- package/dist/core/session-manager.d.ts +2 -2
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +5 -4
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +14 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +43 -2
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +25 -7
- 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 +1 -1
- package/dist/core/timings.d.ts.map +1 -1
- package/dist/core/timings.js +2 -2
- package/dist/core/timings.js.map +1 -1
- package/dist/core/tools/bash.d.ts +28 -3
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +53 -10
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit.d.ts +12 -0
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +24 -0
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/find.d.ts +3 -0
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +3 -0
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts +3 -0
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +4 -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 +3 -0
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +3 -0
- 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 +13 -0
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +29 -2
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/write.d.ts +3 -0
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +3 -0
- package/dist/core/tools/write.js.map +1 -1
- package/dist/index.d.ts +19 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -2
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +4 -6
- package/dist/main.js.map +1 -1
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +1 -1
- package/dist/migrations.js.map +1 -1
- 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 +146 -0
- package/dist/modes/interactive/components/control-panel-gradient-motion.js.map +1 -0
- package/dist/modes/interactive/components/control-panel-gradient.d.ts +27 -0
- package/dist/modes/interactive/components/control-panel-gradient.d.ts.map +1 -0
- package/dist/modes/interactive/components/control-panel-gradient.js +127 -0
- package/dist/modes/interactive/components/control-panel-gradient.js.map +1 -0
- package/dist/modes/interactive/components/control-panel.d.ts +28 -1
- package/dist/modes/interactive/components/control-panel.d.ts.map +1 -1
- package/dist/modes/interactive/components/control-panel.js +153 -3
- package/dist/modes/interactive/components/control-panel.js.map +1 -1
- package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
- package/dist/modes/interactive/components/earendil-announcement.js +1 -1
- package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-editor.js +1 -1
- package/dist/modes/interactive/components/extension-editor.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +8 -0
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/mcp-selector.d.ts +2 -0
- package/dist/modes/interactive/components/mcp-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/mcp-selector.js +18 -1
- package/dist/modes/interactive/components/mcp-selector.js.map +1 -1
- package/dist/modes/interactive/components/model-selector-state.d.ts +101 -0
- package/dist/modes/interactive/components/model-selector-state.d.ts.map +1 -0
- package/dist/modes/interactive/components/model-selector-state.js +261 -0
- package/dist/modes/interactive/components/model-selector-state.js.map +1 -0
- package/dist/modes/interactive/components/model-selector.d.ts +44 -10
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +163 -110
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/theme-selector.d.ts +1 -0
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/theme-selector.js +10 -1
- package/dist/modes/interactive/components/theme-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +4 -2
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +61 -13
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/omk-blackboard.json +91 -0
- package/dist/modes/interactive/theme/omk-freedom-grid.json +91 -0
- package/dist/modes/interactive/theme/omk-neon-ops.json +90 -0
- package/dist/modes/interactive/theme/omk-slate-light.json +91 -0
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +14 -0
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/print-mode.d.ts +2 -2
- 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-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +4 -0
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +114 -49
- package/dist/package-manager-cli.js.map +1 -1
- 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/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/packages.md +47 -6
- package/docs/prompt-templates.md +2 -0
- package/docs/usage.md +16 -6
- package/examples/README.md +1 -1
- package/examples/extensions/README.md +11 -11
- package/examples/extensions/auto-commit-on-exit.ts +6 -6
- package/examples/extensions/bash-spawn-hook.ts +4 -4
- package/examples/extensions/bookmark.ts +5 -5
- package/examples/extensions/border-status-editor.ts +7 -7
- package/examples/extensions/built-in-tool-renderer.ts +6 -6
- 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 +3 -3
- package/examples/extensions/custom-footer.ts +2 -2
- package/examples/extensions/custom-header.ts +5 -5
- package/examples/extensions/custom-provider-anthropic/index.ts +4 -4
- 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 +3 -3
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/dirty-repo-guard.ts +7 -7
- package/examples/extensions/doom-overlay/README.md +3 -3
- package/examples/extensions/doom-overlay/doom/build.sh +2 -2
- package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +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 +6 -6
- 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 +2 -2
- package/examples/extensions/hello.ts +2 -2
- 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 +4 -4
- package/examples/extensions/minimal-mode.ts +9 -9
- package/examples/extensions/modal-editor.ts +3 -3
- package/examples/extensions/model-status.ts +3 -3
- package/examples/extensions/notify.ts +5 -5
- package/examples/extensions/overlay-qa-tests.ts +20 -20
- package/examples/extensions/overlay-test.ts +3 -3
- package/examples/extensions/permission-gate.ts +2 -2
- package/examples/extensions/pirate.ts +4 -4
- package/examples/extensions/plan-mode/index.ts +22 -22
- package/examples/extensions/preset.ts +30 -30
- package/examples/extensions/prompt-customizer.ts +3 -3
- package/examples/extensions/protected-paths.ts +2 -2
- package/examples/extensions/provider-payload.ts +5 -5
- package/examples/extensions/qna.ts +2 -2
- package/examples/extensions/question.ts +2 -2
- package/examples/extensions/questionnaire.ts +2 -2
- 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 +17 -17
- 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 +3 -3
- package/examples/extensions/space-invaders.ts +3 -3
- package/examples/extensions/ssh.ts +12 -12
- package/examples/extensions/status-line.ts +4 -4
- package/examples/extensions/structured-output.ts +2 -2
- package/examples/extensions/subagent/README.md +13 -13
- package/examples/extensions/subagent/agents.ts +2 -2
- package/examples/extensions/subagent/index.ts +53 -21
- package/examples/extensions/summarize.ts +2 -2
- package/examples/extensions/system-prompt-header.ts +3 -3
- package/examples/extensions/tic-tac-toe.ts +15 -15
- package/examples/extensions/timed-confirm.ts +4 -4
- package/examples/extensions/titlebar-spinner.ts +9 -9
- package/examples/extensions/todo.ts +5 -5
- package/examples/extensions/tool-override.ts +5 -5
- package/examples/extensions/tools.ts +10 -10
- package/examples/extensions/trigger-compact.ts +3 -3
- package/examples/extensions/truncated-tool.ts +3 -3
- 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/sdk/01-minimal.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/07-context-files.ts +2 -0
- package/examples/sdk/08-prompt-templates.ts +1 -1
- package/examples/sdk/09-api-keys-and-oauth.ts +2 -2
- package/examples/sdk/README.md +2 -2
- package/node_modules/@earendil-works/omk-agent-core/README.md +488 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/agent-loop.d.ts +24 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/agent-loop.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/agent-loop.js +553 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/agent-loop.js.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/agent.d.ts +118 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/agent.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/agent.js +402 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/agent.js.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/agent-harness.d.ts +95 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/agent-harness.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/agent-harness.js +996 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/agent-harness.js.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/branch-summarization.d.ts +53 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/branch-summarization.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/branch-summarization.js +175 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/branch-summarization.js.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/compaction.d.ts +117 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/compaction.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/compaction.js +568 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/compaction.js.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/utils.d.ts +25 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/utils.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/utils.js +131 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/utils.js.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/env/nodejs.d.ts +51 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/env/nodejs.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/env/nodejs.js +510 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/env/nodejs.js.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/messages.d.ts +51 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/messages.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/messages.js +102 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/messages.js.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/prompt-templates.d.ts +48 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/prompt-templates.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/prompt-templates.js +230 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/prompt-templates.js.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-repo.d.ts +26 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-repo.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-repo.js +101 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-repo.js.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-storage.d.ts +36 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-storage.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-storage.js +273 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-storage.js.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-repo.d.ts +18 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-repo.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-repo.js +42 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-repo.js.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-storage.d.ts +25 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-storage.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-storage.js +114 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-storage.js.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/repo-utils.d.ts +11 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/repo-utils.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/repo-utils.js +39 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/repo-utils.js.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/session.d.ts +33 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/session.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/session.js +210 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/session.js.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/uuid.d.ts +2 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/uuid.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/uuid.js +50 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/uuid.js.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/skills.d.ts +44 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/skills.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/skills.js +311 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/skills.js.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/system-prompt.d.ts +3 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/system-prompt.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/system-prompt.js +30 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/system-prompt.js.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/types.d.ts +616 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/types.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/types.js +94 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/types.js.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/shell-output.d.ts +14 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/shell-output.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/shell-output.js +126 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/shell-output.js.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/truncate.d.ts +70 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/truncate.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/truncate.js +297 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/truncate.js.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/index.d.ts +20 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/index.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/index.js +25 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/index.js.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/node.d.ts +3 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/node.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/node.js +3 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/node.js.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/proxy.d.ts +69 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/proxy.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/proxy.js +278 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/proxy.js.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/types.d.ts +393 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/types.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/types.js +2 -0
- package/node_modules/@earendil-works/omk-agent-core/dist/types.js.map +1 -0
- package/node_modules/@earendil-works/omk-agent-core/package.json +60 -0
- package/node_modules/@earendil-works/omk-ai/README.md +1389 -0
- package/node_modules/@earendil-works/omk-ai/dist/api-registry.d.ts +20 -0
- package/node_modules/@earendil-works/omk-ai/dist/api-registry.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/api-registry.js +44 -0
- package/node_modules/@earendil-works/omk-ai/dist/api-registry.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/bedrock-provider.d.ts +5 -0
- package/node_modules/@earendil-works/omk-ai/dist/bedrock-provider.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/bedrock-provider.js +6 -0
- package/node_modules/@earendil-works/omk-ai/dist/bedrock-provider.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/cli.d.ts +3 -0
- package/node_modules/@earendil-works/omk-ai/dist/cli.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/cli.js +130 -0
- package/node_modules/@earendil-works/omk-ai/dist/cli.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/env-api-keys.d.ts +20 -0
- package/node_modules/@earendil-works/omk-ai/dist/env-api-keys.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/env-api-keys.js +199 -0
- package/node_modules/@earendil-works/omk-ai/dist/env-api-keys.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/image-models.d.ts +10 -0
- package/node_modules/@earendil-works/omk-ai/dist/image-models.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/image-models.generated.d.ts +515 -0
- package/node_modules/@earendil-works/omk-ai/dist/image-models.generated.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/image-models.generated.js +517 -0
- package/node_modules/@earendil-works/omk-ai/dist/image-models.generated.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/image-models.js +23 -0
- package/node_modules/@earendil-works/omk-ai/dist/image-models.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/images-api-registry.d.ts +14 -0
- package/node_modules/@earendil-works/omk-ai/dist/images-api-registry.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/images-api-registry.js +22 -0
- package/node_modules/@earendil-works/omk-ai/dist/images-api-registry.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/images.d.ts +4 -0
- package/node_modules/@earendil-works/omk-ai/dist/images.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/images.js +16 -0
- package/node_modules/@earendil-works/omk-ai/dist/images.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/index.d.ts +33 -0
- package/node_modules/@earendil-works/omk-ai/dist/index.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/index.js +21 -0
- package/node_modules/@earendil-works/omk-ai/dist/index.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/models.d.ts +18 -0
- package/node_modules/@earendil-works/omk-ai/dist/models.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/models.generated.d.ts +18762 -0
- package/node_modules/@earendil-works/omk-ai/dist/models.generated.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/models.generated.js +17197 -0
- package/node_modules/@earendil-works/omk-ai/dist/models.generated.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/models.js +78 -0
- package/node_modules/@earendil-works/omk-ai/dist/models.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/oauth.d.ts +2 -0
- package/node_modules/@earendil-works/omk-ai/dist/oauth.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/oauth.js +2 -0
- package/node_modules/@earendil-works/omk-ai/dist/oauth.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/provider-network.d.ts +39 -0
- package/node_modules/@earendil-works/omk-ai/dist/provider-network.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/provider-network.js +170 -0
- package/node_modules/@earendil-works/omk-ai/dist/provider-network.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/amazon-bedrock.d.ts +38 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/amazon-bedrock.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/amazon-bedrock.js +826 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/amazon-bedrock.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/anthropic.d.ts +77 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/anthropic.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/anthropic.js +1123 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/anthropic.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/azure-openai-responses.d.ts +15 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/azure-openai-responses.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/azure-openai-responses.js +221 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/azure-openai-responses.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/cloudflare.d.ts +13 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/cloudflare.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/cloudflare.js +26 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/cloudflare.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/faux.d.ts +56 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/faux.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/faux.js +368 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/faux.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/github-copilot-headers.d.ts +8 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/github-copilot-headers.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/github-copilot-headers.js +29 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/github-copilot-headers.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/google-shared.d.ts +70 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/google-shared.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/google-shared.js +331 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/google-shared.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/google-vertex.d.ts +15 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/google-vertex.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/google-vertex.js +442 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/google-vertex.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/google.d.ts +13 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/google.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/google.js +402 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/google.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/images/openrouter.d.ts +3 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/images/openrouter.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/images/openrouter.js +128 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/images/openrouter.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/images/register-builtins.d.ts +4 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/images/register-builtins.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/images/register-builtins.js +34 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/images/register-builtins.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/mistral.d.ts +25 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/mistral.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/mistral.js +534 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/mistral.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-codex-responses.d.ts +30 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-codex-responses.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-codex-responses.js +1171 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-codex-responses.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-completions.d.ts +19 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-completions.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-completions.js +977 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-completions.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-prompt-cache.d.ts +11 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-prompt-cache.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-prompt-cache.js +22 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-prompt-cache.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses-shared.d.ts +18 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses-shared.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses-shared.js +496 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses-shared.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses.d.ts +13 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses.js +233 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/register-builtins.d.ts +35 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/register-builtins.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/register-builtins.js +254 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/register-builtins.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/simple-options.d.ts +8 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/simple-options.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/simple-options.js +42 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/simple-options.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/tool-schema.d.ts +13 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/tool-schema.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/tool-schema.js +82 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/tool-schema.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/transform-messages.d.ts +8 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/transform-messages.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/transform-messages.js +184 -0
- package/node_modules/@earendil-works/omk-ai/dist/providers/transform-messages.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/session-resources.d.ts +4 -0
- package/node_modules/@earendil-works/omk-ai/dist/session-resources.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/session-resources.js +22 -0
- package/node_modules/@earendil-works/omk-ai/dist/session-resources.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/stream.d.ts +8 -0
- package/node_modules/@earendil-works/omk-ai/dist/stream.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/stream.js +77 -0
- package/node_modules/@earendil-works/omk-ai/dist/stream.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/types.d.ts +570 -0
- package/node_modules/@earendil-works/omk-ai/dist/types.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/types.js +2 -0
- package/node_modules/@earendil-works/omk-ai/dist/types.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/abort-signals.d.ts +6 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/abort-signals.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/abort-signals.js +34 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/abort-signals.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/diagnostics.d.ts +19 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/diagnostics.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/diagnostics.js +25 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/diagnostics.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/event-stream.d.ts +21 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/event-stream.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/event-stream.js +81 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/event-stream.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/hash.d.ts +3 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/hash.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/hash.js +14 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/hash.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/headers.d.ts +2 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/headers.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/headers.js +8 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/headers.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/json-parse.d.ts +16 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/json-parse.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/json-parse.js +113 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/json-parse.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/node-http-proxy.d.ts +10 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/node-http-proxy.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/node-http-proxy.js +97 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/node-http-proxy.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/anthropic.d.ts +25 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/anthropic.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/anthropic.js +335 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/anthropic.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/device-code.d.ts +21 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/device-code.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/device-code.js +56 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/device-code.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/github-copilot.d.ts +30 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/github-copilot.js +280 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/github-copilot.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/index.d.ts +58 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/index.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/index.js +122 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/index.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/oauth-page.d.ts +3 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/oauth-page.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/oauth-page.js +105 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/oauth-page.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/openai-codex.d.ts +43 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/openai-codex.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/openai-codex.js +487 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/openai-codex.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/pkce.d.ts +13 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/pkce.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/pkce.js +31 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/pkce.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/types.d.ts +64 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/types.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/types.js +2 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/types.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/overflow.d.ts +57 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/overflow.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/overflow.js +154 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/overflow.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/sanitize-unicode.d.ts +22 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/sanitize-unicode.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/sanitize-unicode.js +26 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/sanitize-unicode.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/typebox-helpers.d.ts +17 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/typebox-helpers.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/typebox-helpers.js +21 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/typebox-helpers.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/validation.d.ts +18 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/validation.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/validation.js +281 -0
- package/node_modules/@earendil-works/omk-ai/dist/utils/validation.js.map +1 -0
- package/node_modules/@earendil-works/omk-ai/package.json +106 -0
- package/node_modules/@earendil-works/omk-tui/README.md +791 -0
- package/node_modules/@earendil-works/omk-tui/dist/autocomplete.d.ts +54 -0
- package/node_modules/@earendil-works/omk-tui/dist/autocomplete.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/autocomplete.js +632 -0
- package/node_modules/@earendil-works/omk-tui/dist/autocomplete.js.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/box.d.ts +22 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/box.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/box.js +104 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/box.js.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/cancellable-loader.d.ts +22 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/cancellable-loader.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/cancellable-loader.js +35 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/cancellable-loader.js.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/editor.d.ts +249 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/editor.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/editor.js +1857 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/editor.js.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/image.d.ts +28 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/image.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/image.js +89 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/image.js.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/input.d.ts +37 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/input.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/input.js +378 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/input.js.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/loader.d.ts +31 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/loader.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/loader.js +69 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/loader.js.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/markdown.d.ts +96 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/markdown.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/markdown.js +644 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/markdown.js.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/select-list.d.ts +50 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/select-list.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/select-list.js +159 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/select-list.js.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/settings-list.d.ts +50 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/settings-list.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/settings-list.js +185 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/settings-list.js.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/spacer.d.ts +12 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/spacer.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/spacer.js +23 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/spacer.js.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/text.d.ts +19 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/text.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/text.js +89 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/text.js.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/truncated-text.d.ts +13 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/truncated-text.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/truncated-text.js +51 -0
- package/node_modules/@earendil-works/omk-tui/dist/components/truncated-text.js.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/editor-component.d.ts +39 -0
- package/node_modules/@earendil-works/omk-tui/dist/editor-component.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/editor-component.js +2 -0
- package/node_modules/@earendil-works/omk-tui/dist/editor-component.js.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/fuzzy.d.ts +16 -0
- package/node_modules/@earendil-works/omk-tui/dist/fuzzy.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/fuzzy.js +110 -0
- package/node_modules/@earendil-works/omk-tui/dist/fuzzy.js.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/index.d.ts +23 -0
- package/node_modules/@earendil-works/omk-tui/dist/index.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/index.js +32 -0
- package/node_modules/@earendil-works/omk-tui/dist/index.js.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/keybindings.d.ts +212 -0
- package/node_modules/@earendil-works/omk-tui/dist/keybindings.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/keybindings.js +252 -0
- package/node_modules/@earendil-works/omk-tui/dist/keybindings.js.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/keys.d.ts +184 -0
- package/node_modules/@earendil-works/omk-tui/dist/keys.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/keys.js +1173 -0
- package/node_modules/@earendil-works/omk-tui/dist/keys.js.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/kill-ring.d.ts +28 -0
- package/node_modules/@earendil-works/omk-tui/dist/kill-ring.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/kill-ring.js +44 -0
- package/node_modules/@earendil-works/omk-tui/dist/kill-ring.js.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/native-modifiers.d.ts +3 -0
- package/node_modules/@earendil-works/omk-tui/dist/native-modifiers.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/native-modifiers.js +53 -0
- package/node_modules/@earendil-works/omk-tui/dist/native-modifiers.js.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/stdin-buffer.d.ts +50 -0
- package/node_modules/@earendil-works/omk-tui/dist/stdin-buffer.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/stdin-buffer.js +361 -0
- package/node_modules/@earendil-works/omk-tui/dist/stdin-buffer.js.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/terminal-image.d.ts +90 -0
- package/node_modules/@earendil-works/omk-tui/dist/terminal-image.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/terminal-image.js +366 -0
- package/node_modules/@earendil-works/omk-tui/dist/terminal-image.js.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/terminal.d.ts +113 -0
- package/node_modules/@earendil-works/omk-tui/dist/terminal.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/terminal.js +472 -0
- package/node_modules/@earendil-works/omk-tui/dist/terminal.js.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/tui.d.ts +242 -0
- package/node_modules/@earendil-works/omk-tui/dist/tui.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/tui.js +1221 -0
- package/node_modules/@earendil-works/omk-tui/dist/tui.js.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/undo-stack.d.ts +17 -0
- package/node_modules/@earendil-works/omk-tui/dist/undo-stack.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/undo-stack.js +25 -0
- package/node_modules/@earendil-works/omk-tui/dist/undo-stack.js.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/utils.d.ts +84 -0
- package/node_modules/@earendil-works/omk-tui/dist/utils.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/utils.js +1032 -0
- package/node_modules/@earendil-works/omk-tui/dist/utils.js.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/word-navigation.d.ts +25 -0
- package/node_modules/@earendil-works/omk-tui/dist/word-navigation.d.ts.map +1 -0
- package/node_modules/@earendil-works/omk-tui/dist/word-navigation.js +96 -0
- package/node_modules/@earendil-works/omk-tui/dist/word-navigation.js.map +1 -0
- package/node_modules/@earendil-works/omk-tui/native/darwin/prebuilds/darwin-arm64/darwin-modifiers.node +0 -0
- package/node_modules/@earendil-works/omk-tui/native/darwin/prebuilds/darwin-x64/darwin-modifiers.node +0 -0
- package/node_modules/@earendil-works/omk-tui/native/win32/prebuilds/win32-arm64/win32-console-mode.node +0 -0
- package/node_modules/@earendil-works/omk-tui/native/win32/prebuilds/win32-x64/win32-console-mode.node +0 -0
- package/node_modules/@earendil-works/omk-tui/package.json +47 -0
- package/package.json +22 -6
- 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 @@
|
|
|
1
|
+
{"version":3,"file":"headroom-middleware.js","sourceRoot":"","sources":["../../src/core/headroom-middleware.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BeforeProviderSend, Context, TextContent, ToolResultMessage } from \"@earendil-works/omk-ai\";\nimport { estimateLeanContextTokens } from \"./lean-context-policy.ts\";\n\nconst DEFAULT_THRESHOLD_TOKENS = 2_048;\nconst LEAN_CONTEXT_STUB_PREFIX = \"[lean-context]\";\n\nconst DEFAULT_SECRET_PATTERNS: readonly RegExp[] = [\n\t/-----BEGIN [A-Z0-9 ]*PRIVATE KEY-----/i,\n\t/\\b(?:api[_-]?key|access[_-]?token|auth[_-]?token|refresh[_-]?token|client[_-]?secret|secret|password|passwd|pwd)\\b\\s*[:=]\\s*[\"']?[^\\s\"']{8,}/i,\n\t/\\bauthorization\\s*:\\s*bearer\\s+[A-Za-z0-9._~+/=-]{10,}/i,\n\t/\\b(?:gh[pousr]_|sk-|xox[baprs]-)[A-Za-z0-9_=-]{10,}/i,\n];\n\nexport interface HeadroomCompressTextInput {\n\treadonly text: string;\n\treadonly estimatedTokens: number;\n\treadonly thresholdTokens: number;\n\treadonly toolCallId: string;\n\treadonly toolName: string;\n\treadonly contentIndex: number;\n\treadonly isError: boolean;\n\treadonly details?: unknown;\n}\n\nexport type HeadroomCompressText = (input: HeadroomCompressTextInput) => string | undefined;\n\nexport interface HeadroomBeforeProviderSendOptions {\n\treadonly compressText: HeadroomCompressText;\n\treadonly thresholdTokens?: number;\n\treadonly logsThresholdTokens?: number;\n\treadonly enabled?: boolean;\n}\n\nexport interface HeadroomBeforeProviderSendStats {\n\treadonly seenToolResultTextBlocks: number;\n\treadonly compressedBlocks: number;\n\treadonly skippedBelowThresholdBlocks: number;\n\treadonly skippedSecretBlocks: number;\n\treadonly skippedLeanContextBlocks: number;\n\treadonly failedOpenBlocks: number;\n\treadonly inputTokens: number;\n\treadonly outputTokens: number;\n}\n\nexport interface HeadroomBeforeProviderSend {\n\treadonly beforeProviderSend: BeforeProviderSend;\n\tgetStats(): HeadroomBeforeProviderSendStats;\n\treset(): void;\n}\n\nexport function createHeadroomBeforeProviderSend(\n\toptions: HeadroomBeforeProviderSendOptions,\n): HeadroomBeforeProviderSend {\n\tlet stats = createEmptyStats();\n\n\treturn {\n\t\tbeforeProviderSend(input) {\n\t\t\tif (options.enabled === false) return undefined;\n\t\t\tconst result = transformContext(input.context, options, stats);\n\t\t\tstats = result.stats;\n\t\t\treturn result.changed ? result.context : undefined;\n\t\t},\n\t\tgetStats() {\n\t\t\treturn { ...stats };\n\t\t},\n\t\treset() {\n\t\t\tstats = createEmptyStats();\n\t\t},\n\t};\n}\n\ninterface ContextTransformResult {\n\treadonly context: Context;\n\treadonly stats: HeadroomBeforeProviderSendStats;\n\treadonly changed: boolean;\n}\n\nfunction transformContext(\n\tcontext: Context,\n\toptions: HeadroomBeforeProviderSendOptions,\n\tinitialStats: HeadroomBeforeProviderSendStats,\n): ContextTransformResult {\n\tlet nextStats = initialStats;\n\tlet changed = false;\n\tconst messages = context.messages.map((message) => {\n\t\tif (message.role !== \"toolResult\") return message;\n\t\tconst result = transformToolResult(message, options, nextStats);\n\t\tnextStats = result.stats;\n\t\tchanged = changed || result.changed;\n\t\treturn result.message;\n\t});\n\n\treturn {\n\t\tcontext: changed ? { ...context, messages } : context,\n\t\tstats: nextStats,\n\t\tchanged,\n\t};\n}\n\ninterface ToolResultTransformResult {\n\treadonly message: ToolResultMessage<unknown>;\n\treadonly stats: HeadroomBeforeProviderSendStats;\n\treadonly changed: boolean;\n}\n\nfunction transformToolResult(\n\tmessage: ToolResultMessage<unknown>,\n\toptions: HeadroomBeforeProviderSendOptions,\n\tinitialStats: HeadroomBeforeProviderSendStats,\n): ToolResultTransformResult {\n\tlet nextStats = initialStats;\n\tlet changed = false;\n\tconst content = message.content.map((block, index) => {\n\t\tif (block.type !== \"text\") return block;\n\t\tconst result = transformTextBlock(block, message, index, options, nextStats);\n\t\tnextStats = result.stats;\n\t\tchanged = changed || result.changed;\n\t\treturn result.block;\n\t});\n\n\treturn {\n\t\tmessage: changed ? { ...message, content } : message,\n\t\tstats: nextStats,\n\t\tchanged,\n\t};\n}\n\ninterface TextBlockTransformResult {\n\treadonly block: TextContent;\n\treadonly stats: HeadroomBeforeProviderSendStats;\n\treadonly changed: boolean;\n}\n\nfunction transformTextBlock(\n\tblock: TextContent,\n\tmessage: ToolResultMessage<unknown>,\n\tcontentIndex: number,\n\toptions: HeadroomBeforeProviderSendOptions,\n\tinitialStats: HeadroomBeforeProviderSendStats,\n): TextBlockTransformResult {\n\tconst estimatedTokens = estimateLeanContextTokens(block.text);\n\tlet stats = incrementStats(initialStats, {\n\t\tseenToolResultTextBlocks: 1,\n\t\tinputTokens: estimatedTokens,\n\t});\n\n\tif (isLeanContextStub(block.text)) {\n\t\treturn { block, stats: incrementStats(stats, { skippedLeanContextBlocks: 1 }), changed: false };\n\t}\n\n\tif (containsSecretPattern(block.text)) {\n\t\treturn { block, stats: incrementStats(stats, { skippedSecretBlocks: 1 }), changed: false };\n\t}\n\n\tconst thresholdTokens = getThresholdTokens(options, message);\n\tif (estimatedTokens <= thresholdTokens) {\n\t\treturn { block, stats: incrementStats(stats, { skippedBelowThresholdBlocks: 1 }), changed: false };\n\t}\n\n\tlet compressed: string | undefined;\n\ttry {\n\t\tcompressed = options.compressText({\n\t\t\ttext: block.text,\n\t\t\testimatedTokens,\n\t\t\tthresholdTokens,\n\t\t\ttoolCallId: message.toolCallId,\n\t\t\ttoolName: message.toolName,\n\t\t\tcontentIndex,\n\t\t\tisError: message.isError,\n\t\t\tdetails: message.details,\n\t\t});\n\t} catch {\n\t\treturn { block, stats: incrementStats(stats, { failedOpenBlocks: 1 }), changed: false };\n\t}\n\n\tif (compressed === undefined) {\n\t\treturn { block, stats: incrementStats(stats, { failedOpenBlocks: 1 }), changed: false };\n\t}\n\n\tif (compressed === block.text) {\n\t\treturn { block, stats, changed: false };\n\t}\n\n\tstats = incrementStats(stats, {\n\t\tcompressedBlocks: 1,\n\t\toutputTokens: estimateLeanContextTokens(compressed),\n\t});\n\treturn { block: { ...block, text: compressed }, stats, changed: true };\n}\n\nfunction createEmptyStats(): HeadroomBeforeProviderSendStats {\n\treturn {\n\t\tseenToolResultTextBlocks: 0,\n\t\tcompressedBlocks: 0,\n\t\tskippedBelowThresholdBlocks: 0,\n\t\tskippedSecretBlocks: 0,\n\t\tskippedLeanContextBlocks: 0,\n\t\tfailedOpenBlocks: 0,\n\t\tinputTokens: 0,\n\t\toutputTokens: 0,\n\t};\n}\n\nfunction incrementStats(\n\tstats: HeadroomBeforeProviderSendStats,\n\tdelta: Partial<Record<keyof HeadroomBeforeProviderSendStats, number>>,\n): HeadroomBeforeProviderSendStats {\n\treturn {\n\t\tseenToolResultTextBlocks: stats.seenToolResultTextBlocks + (delta.seenToolResultTextBlocks ?? 0),\n\t\tcompressedBlocks: stats.compressedBlocks + (delta.compressedBlocks ?? 0),\n\t\tskippedBelowThresholdBlocks: stats.skippedBelowThresholdBlocks + (delta.skippedBelowThresholdBlocks ?? 0),\n\t\tskippedSecretBlocks: stats.skippedSecretBlocks + (delta.skippedSecretBlocks ?? 0),\n\t\tskippedLeanContextBlocks: stats.skippedLeanContextBlocks + (delta.skippedLeanContextBlocks ?? 0),\n\t\tfailedOpenBlocks: stats.failedOpenBlocks + (delta.failedOpenBlocks ?? 0),\n\t\tinputTokens: stats.inputTokens + (delta.inputTokens ?? 0),\n\t\toutputTokens: stats.outputTokens + (delta.outputTokens ?? 0),\n\t};\n}\n\nfunction getThresholdTokens(options: HeadroomBeforeProviderSendOptions, message: ToolResultMessage<unknown>): number {\n\tconst threshold = isLogLikeToolResult(message)\n\t\t? (options.logsThresholdTokens ?? options.thresholdTokens)\n\t\t: options.thresholdTokens;\n\tif (threshold === undefined) return DEFAULT_THRESHOLD_TOKENS;\n\tif (!Number.isFinite(threshold) || threshold < 0) return 0;\n\treturn Math.ceil(threshold);\n}\n\nfunction isLogLikeToolResult(message: ToolResultMessage<unknown>): boolean {\n\tif (/\\b(?:bash|exec|shell|log|logs|stderr|stdout)\\b/i.test(message.toolName)) return true;\n\tconst details = asRecord(message.details);\n\tif (!details) return false;\n\treturn [\"path\", \"filePath\", \"command\", \"query\"].some((key) => {\n\t\tconst value = details[key];\n\t\treturn typeof value === \"string\" && /(?:\\.log\\b|\\blogs?\\b|stderr|stdout|trace)/i.test(value);\n\t});\n}\n\nfunction isLeanContextStub(text: string): boolean {\n\treturn text.trimStart().startsWith(LEAN_CONTEXT_STUB_PREFIX);\n}\n\nfunction containsSecretPattern(text: string): boolean {\n\treturn DEFAULT_SECRET_PATTERNS.some((pattern) => regexTestStateless(pattern, text));\n}\n\nfunction regexTestStateless(pattern: RegExp, text: string): boolean {\n\tconst flags = pattern.flags.replace(/[gy]/g, \"\");\n\treturn new RegExp(pattern.source, flags).test(text);\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value)\n\t\t? (value as Record<string, unknown>)\n\t\t: undefined;\n}\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal hook inventory for the loadout runtime.
|
|
3
|
+
*
|
|
4
|
+
* The external harness resolves `scriptPath` to an actual shell script.
|
|
5
|
+
* This module only provides the canonical names and builtin flag so the
|
|
6
|
+
* loadout layer can validate allow/exclude/require selectors.
|
|
7
|
+
*/
|
|
8
|
+
export interface HookDescriptor {
|
|
9
|
+
name: string;
|
|
10
|
+
scriptPath?: string;
|
|
11
|
+
builtin: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface HookInventory {
|
|
14
|
+
hooks: readonly HookDescriptor[];
|
|
15
|
+
}
|
|
16
|
+
export declare const BUILTIN_HOOKS: readonly HookDescriptor[];
|
|
17
|
+
/**
|
|
18
|
+
* Load the hook inventory. Builtin hooks are always present; if an agent
|
|
19
|
+
* directory is provided and its `hooks` subdirectory exists, any shell scripts
|
|
20
|
+
* discovered there are appended as non-builtin descriptors.
|
|
21
|
+
*/
|
|
22
|
+
export declare function loadHookInventory(agentDir?: string): HookInventory;
|
|
23
|
+
//# sourceMappingURL=hook-inventory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-inventory.d.ts","sourceRoot":"","sources":["../../src/core/hook-inventory.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC7B,KAAK,EAAE,SAAS,cAAc,EAAE,CAAC;CACjC;AAED,eAAO,MAAM,aAAa,EAAE,SAAS,cAAc,EASlD,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,aAAa,CAqBlE","sourcesContent":["/**\n * Minimal hook inventory for the loadout runtime.\n *\n * The external harness resolves `scriptPath` to an actual shell script.\n * This module only provides the canonical names and builtin flag so the\n * loadout layer can validate allow/exclude/require selectors.\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\nexport interface HookDescriptor {\n\tname: string;\n\tscriptPath?: string;\n\tbuiltin: boolean;\n}\n\nexport interface HookInventory {\n\thooks: readonly HookDescriptor[];\n}\n\nexport const BUILTIN_HOOKS: readonly HookDescriptor[] = [\n\t{ name: \"pre-shell-guard\", builtin: true },\n\t{ name: \"protect-secrets\", builtin: true },\n\t{ name: \"session-context\", builtin: true },\n\t{ name: \"precompact-checkpoint\", builtin: true },\n\t{ name: \"typecheck-after-edit\", builtin: true },\n\t{ name: \"stop-verify\", builtin: true },\n\t{ name: \"subagent-stop-audit\", builtin: true },\n\t{ name: \"npm-audit-summary\", builtin: true },\n];\n\n/**\n * Load the hook inventory. Builtin hooks are always present; if an agent\n * directory is provided and its `hooks` subdirectory exists, any shell scripts\n * discovered there are appended as non-builtin descriptors.\n */\nexport function loadHookInventory(agentDir?: string): HookInventory {\n\tconst hooks: HookDescriptor[] = [...BUILTIN_HOOKS];\n\tif (agentDir) {\n\t\ttry {\n\t\t\tconst hooksDir = path.join(agentDir, \"hooks\");\n\t\t\tconst entries = fs.readdirSync(hooksDir);\n\t\t\tfor (const entry of entries) {\n\t\t\t\tif (!entry.endsWith(\".sh\")) continue;\n\t\t\t\tconst name = entry.slice(0, -3);\n\t\t\t\tif (hooks.some((h) => h.name === name)) continue;\n\t\t\t\thooks.push({\n\t\t\t\t\tname,\n\t\t\t\t\tscriptPath: path.join(hooksDir, entry),\n\t\t\t\t\tbuiltin: false,\n\t\t\t\t});\n\t\t\t}\n\t\t} catch {\n\t\t\t// Hooks directory may be absent; builtin inventory is sufficient.\n\t\t}\n\t}\n\treturn { hooks };\n}\n"]}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal hook inventory for the loadout runtime.
|
|
3
|
+
*
|
|
4
|
+
* The external harness resolves `scriptPath` to an actual shell script.
|
|
5
|
+
* This module only provides the canonical names and builtin flag so the
|
|
6
|
+
* loadout layer can validate allow/exclude/require selectors.
|
|
7
|
+
*/
|
|
8
|
+
import fs from "node:fs";
|
|
9
|
+
import path from "node:path";
|
|
10
|
+
export const BUILTIN_HOOKS = [
|
|
11
|
+
{ name: "pre-shell-guard", builtin: true },
|
|
12
|
+
{ name: "protect-secrets", builtin: true },
|
|
13
|
+
{ name: "session-context", builtin: true },
|
|
14
|
+
{ name: "precompact-checkpoint", builtin: true },
|
|
15
|
+
{ name: "typecheck-after-edit", builtin: true },
|
|
16
|
+
{ name: "stop-verify", builtin: true },
|
|
17
|
+
{ name: "subagent-stop-audit", builtin: true },
|
|
18
|
+
{ name: "npm-audit-summary", builtin: true },
|
|
19
|
+
];
|
|
20
|
+
/**
|
|
21
|
+
* Load the hook inventory. Builtin hooks are always present; if an agent
|
|
22
|
+
* directory is provided and its `hooks` subdirectory exists, any shell scripts
|
|
23
|
+
* discovered there are appended as non-builtin descriptors.
|
|
24
|
+
*/
|
|
25
|
+
export function loadHookInventory(agentDir) {
|
|
26
|
+
const hooks = [...BUILTIN_HOOKS];
|
|
27
|
+
if (agentDir) {
|
|
28
|
+
try {
|
|
29
|
+
const hooksDir = path.join(agentDir, "hooks");
|
|
30
|
+
const entries = fs.readdirSync(hooksDir);
|
|
31
|
+
for (const entry of entries) {
|
|
32
|
+
if (!entry.endsWith(".sh"))
|
|
33
|
+
continue;
|
|
34
|
+
const name = entry.slice(0, -3);
|
|
35
|
+
if (hooks.some((h) => h.name === name))
|
|
36
|
+
continue;
|
|
37
|
+
hooks.push({
|
|
38
|
+
name,
|
|
39
|
+
scriptPath: path.join(hooksDir, entry),
|
|
40
|
+
builtin: false,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// Hooks directory may be absent; builtin inventory is sufficient.
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return { hooks };
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=hook-inventory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-inventory.js","sourceRoot":"","sources":["../../src/core/hook-inventory.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAY7B,MAAM,CAAC,MAAM,aAAa,GAA8B;IACvD,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,IAAI,EAAE;IAC1C,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,IAAI,EAAE;IAC1C,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,IAAI,EAAE;IAC1C,EAAE,IAAI,EAAE,uBAAuB,EAAE,OAAO,EAAE,IAAI,EAAE;IAChD,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,IAAI,EAAE;IAC/C,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE;IACtC,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,IAAI,EAAE;IAC9C,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,IAAI,EAAE;CAC5C,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAiB,EAAiB;IACnE,MAAM,KAAK,GAAqB,CAAC,GAAG,aAAa,CAAC,CAAC;IACnD,IAAI,QAAQ,EAAE,CAAC;QACd,IAAI,CAAC;YACJ,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC9C,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YACzC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC7B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;oBAAE,SAAS;gBACrC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAChC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC;oBAAE,SAAS;gBACjD,KAAK,CAAC,IAAI,CAAC;oBACV,IAAI;oBACJ,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC;oBACtC,OAAO,EAAE,KAAK;iBACd,CAAC,CAAC;YACJ,CAAC;QACF,CAAC;QAAC,MAAM,CAAC;YACR,kEAAkE;QACnE,CAAC;IACF,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,CAAC;AAAA,CACjB","sourcesContent":["/**\n * Minimal hook inventory for the loadout runtime.\n *\n * The external harness resolves `scriptPath` to an actual shell script.\n * This module only provides the canonical names and builtin flag so the\n * loadout layer can validate allow/exclude/require selectors.\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\nexport interface HookDescriptor {\n\tname: string;\n\tscriptPath?: string;\n\tbuiltin: boolean;\n}\n\nexport interface HookInventory {\n\thooks: readonly HookDescriptor[];\n}\n\nexport const BUILTIN_HOOKS: readonly HookDescriptor[] = [\n\t{ name: \"pre-shell-guard\", builtin: true },\n\t{ name: \"protect-secrets\", builtin: true },\n\t{ name: \"session-context\", builtin: true },\n\t{ name: \"precompact-checkpoint\", builtin: true },\n\t{ name: \"typecheck-after-edit\", builtin: true },\n\t{ name: \"stop-verify\", builtin: true },\n\t{ name: \"subagent-stop-audit\", builtin: true },\n\t{ name: \"npm-audit-summary\", builtin: true },\n];\n\n/**\n * Load the hook inventory. Builtin hooks are always present; if an agent\n * directory is provided and its `hooks` subdirectory exists, any shell scripts\n * discovered there are appended as non-builtin descriptors.\n */\nexport function loadHookInventory(agentDir?: string): HookInventory {\n\tconst hooks: HookDescriptor[] = [...BUILTIN_HOOKS];\n\tif (agentDir) {\n\t\ttry {\n\t\t\tconst hooksDir = path.join(agentDir, \"hooks\");\n\t\t\tconst entries = fs.readdirSync(hooksDir);\n\t\t\tfor (const entry of entries) {\n\t\t\t\tif (!entry.endsWith(\".sh\")) continue;\n\t\t\t\tconst name = entry.slice(0, -3);\n\t\t\t\tif (hooks.some((h) => h.name === name)) continue;\n\t\t\t\thooks.push({\n\t\t\t\t\tname,\n\t\t\t\t\tscriptPath: path.join(hooksDir, entry),\n\t\t\t\t\tbuiltin: false,\n\t\t\t\t});\n\t\t\t}\n\t\t} catch {\n\t\t\t// Hooks directory may be absent; builtin inventory is sufficient.\n\t\t}\n\t}\n\treturn { hooks };\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { BeforeProviderSend } from "@earendil-works/omk-ai";
|
|
2
|
+
import { type LeanContextPolicyOptions, type LeanContextPolicyState } from "./lean-context-policy.ts";
|
|
3
|
+
export interface LeanContextBeforeProviderSendOptions extends LeanContextPolicyOptions {
|
|
4
|
+
readonly enabled?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export interface LeanContextBeforeProviderSend {
|
|
7
|
+
readonly beforeProviderSend: BeforeProviderSend;
|
|
8
|
+
getState(): LeanContextPolicyState;
|
|
9
|
+
reset(): void;
|
|
10
|
+
}
|
|
11
|
+
export declare function createLeanContextBeforeProviderSend(options?: LeanContextBeforeProviderSendOptions): LeanContextBeforeProviderSend;
|
|
12
|
+
//# sourceMappingURL=lean-context-middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lean-context-middleware.d.ts","sourceRoot":"","sources":["../../src/core/lean-context-middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAA2C,MAAM,wBAAwB,CAAC;AAC1G,OAAO,EAGN,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,EAC3B,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,oCAAqC,SAAQ,wBAAwB;IACrF,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,6BAA6B;IAC7C,QAAQ,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;IAChD,QAAQ,IAAI,sBAAsB,CAAC;IACnC,KAAK,IAAI,IAAI,CAAC;CACd;AAED,wBAAgB,mCAAmC,CAClD,OAAO,GAAE,oCAAyC,GAChD,6BAA6B,CAiB/B","sourcesContent":["import type { BeforeProviderSend, Context, TextContent, ToolResultMessage } from \"@earendil-works/omk-ai\";\nimport {\n\tcreateLeanContextPolicyState,\n\tdecideLeanContextEmission,\n\ttype LeanContextPolicyOptions,\n\ttype LeanContextPolicyState,\n} from \"./lean-context-policy.ts\";\n\nexport interface LeanContextBeforeProviderSendOptions extends LeanContextPolicyOptions {\n\treadonly enabled?: boolean;\n}\n\nexport interface LeanContextBeforeProviderSend {\n\treadonly beforeProviderSend: BeforeProviderSend;\n\tgetState(): LeanContextPolicyState;\n\treset(): void;\n}\n\nexport function createLeanContextBeforeProviderSend(\n\toptions: LeanContextBeforeProviderSendOptions = {},\n): LeanContextBeforeProviderSend {\n\tlet state = createLeanContextPolicyState();\n\n\treturn {\n\t\tbeforeProviderSend(input) {\n\t\t\tif (options.enabled === false) return undefined;\n\t\t\tconst result = transformContext(input.context, state, options);\n\t\t\tstate = result.nextState;\n\t\t\treturn result.changed ? result.context : undefined;\n\t\t},\n\t\tgetState() {\n\t\t\treturn state;\n\t\t},\n\t\treset() {\n\t\t\tstate = createLeanContextPolicyState();\n\t\t},\n\t};\n}\n\ninterface ContextTransformResult {\n\treadonly context: Context;\n\treadonly nextState: LeanContextPolicyState;\n\treadonly changed: boolean;\n}\n\nfunction transformContext(\n\tcontext: Context,\n\tinitialState: LeanContextPolicyState,\n\toptions: LeanContextBeforeProviderSendOptions,\n): ContextTransformResult {\n\tlet nextState = initialState;\n\tlet changed = false;\n\tconst messages = context.messages.map((message) => {\n\t\tif (message.role !== \"toolResult\") return message;\n\t\tconst result = transformToolResult(message, nextState, options);\n\t\tnextState = result.nextState;\n\t\tchanged = changed || result.changed;\n\t\treturn result.message;\n\t});\n\n\treturn {\n\t\tcontext: changed ? { ...context, messages } : context,\n\t\tnextState,\n\t\tchanged,\n\t};\n}\n\ninterface ToolResultTransformResult {\n\treadonly message: ToolResultMessage;\n\treadonly nextState: LeanContextPolicyState;\n\treadonly changed: boolean;\n}\n\nfunction transformToolResult(\n\tmessage: ToolResultMessage,\n\tinitialState: LeanContextPolicyState,\n\toptions: LeanContextBeforeProviderSendOptions,\n): ToolResultTransformResult {\n\tlet nextState = initialState;\n\tlet changed = false;\n\tconst content = message.content.map((block, index) => {\n\t\tif (block.type !== \"text\") return block;\n\t\tconst key = extractLeanContextKey(message, index);\n\t\tconst decision = decideLeanContextEmission({\n\t\t\tstate: nextState,\n\t\t\ttool: message.toolName,\n\t\t\tkey,\n\t\t\tpath: key,\n\t\t\tcontent: block.text,\n\t\t\tminStubTokens: options.minStubTokens,\n\t\t\tneverStubFilenames: options.neverStubFilenames,\n\t\t\tsecretPatterns: options.secretPatterns,\n\t\t});\n\t\tnextState = decision.nextState;\n\t\tif (decision.emit !== \"stub\" || decision.stub === undefined) return block;\n\t\tchanged = true;\n\t\treturn { type: \"text\", text: decision.stub } satisfies TextContent;\n\t});\n\n\treturn {\n\t\tmessage: changed ? { ...message, content } : message,\n\t\tnextState,\n\t\tchanged,\n\t};\n}\n\nfunction extractLeanContextKey(message: ToolResultMessage, contentIndex: number): string {\n\tconst details = asRecord(message.details);\n\tconst detailKey = firstStringValue(details, [\"leanContextKey\", \"path\", \"filePath\", \"command\", \"query\"]);\n\treturn detailKey ?? `${message.toolName}:${message.toolCallId}:${contentIndex}`;\n}\n\nfunction firstStringValue(record: Record<string, unknown> | undefined, keys: readonly string[]): string | undefined {\n\tif (!record) return undefined;\n\tfor (const key of keys) {\n\t\tconst value = record[key];\n\t\tif (typeof value === \"string\" && value.trim().length > 0) {\n\t\t\treturn value;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value)\n\t\t? (value as Record<string, unknown>)\n\t\t: undefined;\n}\n"]}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { createLeanContextPolicyState, decideLeanContextEmission, } from "./lean-context-policy.js";
|
|
2
|
+
export function createLeanContextBeforeProviderSend(options = {}) {
|
|
3
|
+
let state = createLeanContextPolicyState();
|
|
4
|
+
return {
|
|
5
|
+
beforeProviderSend(input) {
|
|
6
|
+
if (options.enabled === false)
|
|
7
|
+
return undefined;
|
|
8
|
+
const result = transformContext(input.context, state, options);
|
|
9
|
+
state = result.nextState;
|
|
10
|
+
return result.changed ? result.context : undefined;
|
|
11
|
+
},
|
|
12
|
+
getState() {
|
|
13
|
+
return state;
|
|
14
|
+
},
|
|
15
|
+
reset() {
|
|
16
|
+
state = createLeanContextPolicyState();
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function transformContext(context, initialState, options) {
|
|
21
|
+
let nextState = initialState;
|
|
22
|
+
let changed = false;
|
|
23
|
+
const messages = context.messages.map((message) => {
|
|
24
|
+
if (message.role !== "toolResult")
|
|
25
|
+
return message;
|
|
26
|
+
const result = transformToolResult(message, nextState, options);
|
|
27
|
+
nextState = result.nextState;
|
|
28
|
+
changed = changed || result.changed;
|
|
29
|
+
return result.message;
|
|
30
|
+
});
|
|
31
|
+
return {
|
|
32
|
+
context: changed ? { ...context, messages } : context,
|
|
33
|
+
nextState,
|
|
34
|
+
changed,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function transformToolResult(message, initialState, options) {
|
|
38
|
+
let nextState = initialState;
|
|
39
|
+
let changed = false;
|
|
40
|
+
const content = message.content.map((block, index) => {
|
|
41
|
+
if (block.type !== "text")
|
|
42
|
+
return block;
|
|
43
|
+
const key = extractLeanContextKey(message, index);
|
|
44
|
+
const decision = decideLeanContextEmission({
|
|
45
|
+
state: nextState,
|
|
46
|
+
tool: message.toolName,
|
|
47
|
+
key,
|
|
48
|
+
path: key,
|
|
49
|
+
content: block.text,
|
|
50
|
+
minStubTokens: options.minStubTokens,
|
|
51
|
+
neverStubFilenames: options.neverStubFilenames,
|
|
52
|
+
secretPatterns: options.secretPatterns,
|
|
53
|
+
});
|
|
54
|
+
nextState = decision.nextState;
|
|
55
|
+
if (decision.emit !== "stub" || decision.stub === undefined)
|
|
56
|
+
return block;
|
|
57
|
+
changed = true;
|
|
58
|
+
return { type: "text", text: decision.stub };
|
|
59
|
+
});
|
|
60
|
+
return {
|
|
61
|
+
message: changed ? { ...message, content } : message,
|
|
62
|
+
nextState,
|
|
63
|
+
changed,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function extractLeanContextKey(message, contentIndex) {
|
|
67
|
+
const details = asRecord(message.details);
|
|
68
|
+
const detailKey = firstStringValue(details, ["leanContextKey", "path", "filePath", "command", "query"]);
|
|
69
|
+
return detailKey ?? `${message.toolName}:${message.toolCallId}:${contentIndex}`;
|
|
70
|
+
}
|
|
71
|
+
function firstStringValue(record, keys) {
|
|
72
|
+
if (!record)
|
|
73
|
+
return undefined;
|
|
74
|
+
for (const key of keys) {
|
|
75
|
+
const value = record[key];
|
|
76
|
+
if (typeof value === "string" && value.trim().length > 0) {
|
|
77
|
+
return value;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
function asRecord(value) {
|
|
83
|
+
return typeof value === "object" && value !== null && !Array.isArray(value)
|
|
84
|
+
? value
|
|
85
|
+
: undefined;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=lean-context-middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lean-context-middleware.js","sourceRoot":"","sources":["../../src/core/lean-context-middleware.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BeforeProviderSend, Context, TextContent, ToolResultMessage } from \"@earendil-works/omk-ai\";\nimport {\n\tcreateLeanContextPolicyState,\n\tdecideLeanContextEmission,\n\ttype LeanContextPolicyOptions,\n\ttype LeanContextPolicyState,\n} from \"./lean-context-policy.ts\";\n\nexport interface LeanContextBeforeProviderSendOptions extends LeanContextPolicyOptions {\n\treadonly enabled?: boolean;\n}\n\nexport interface LeanContextBeforeProviderSend {\n\treadonly beforeProviderSend: BeforeProviderSend;\n\tgetState(): LeanContextPolicyState;\n\treset(): void;\n}\n\nexport function createLeanContextBeforeProviderSend(\n\toptions: LeanContextBeforeProviderSendOptions = {},\n): LeanContextBeforeProviderSend {\n\tlet state = createLeanContextPolicyState();\n\n\treturn {\n\t\tbeforeProviderSend(input) {\n\t\t\tif (options.enabled === false) return undefined;\n\t\t\tconst result = transformContext(input.context, state, options);\n\t\t\tstate = result.nextState;\n\t\t\treturn result.changed ? result.context : undefined;\n\t\t},\n\t\tgetState() {\n\t\t\treturn state;\n\t\t},\n\t\treset() {\n\t\t\tstate = createLeanContextPolicyState();\n\t\t},\n\t};\n}\n\ninterface ContextTransformResult {\n\treadonly context: Context;\n\treadonly nextState: LeanContextPolicyState;\n\treadonly changed: boolean;\n}\n\nfunction transformContext(\n\tcontext: Context,\n\tinitialState: LeanContextPolicyState,\n\toptions: LeanContextBeforeProviderSendOptions,\n): ContextTransformResult {\n\tlet nextState = initialState;\n\tlet changed = false;\n\tconst messages = context.messages.map((message) => {\n\t\tif (message.role !== \"toolResult\") return message;\n\t\tconst result = transformToolResult(message, nextState, options);\n\t\tnextState = result.nextState;\n\t\tchanged = changed || result.changed;\n\t\treturn result.message;\n\t});\n\n\treturn {\n\t\tcontext: changed ? { ...context, messages } : context,\n\t\tnextState,\n\t\tchanged,\n\t};\n}\n\ninterface ToolResultTransformResult {\n\treadonly message: ToolResultMessage;\n\treadonly nextState: LeanContextPolicyState;\n\treadonly changed: boolean;\n}\n\nfunction transformToolResult(\n\tmessage: ToolResultMessage,\n\tinitialState: LeanContextPolicyState,\n\toptions: LeanContextBeforeProviderSendOptions,\n): ToolResultTransformResult {\n\tlet nextState = initialState;\n\tlet changed = false;\n\tconst content = message.content.map((block, index) => {\n\t\tif (block.type !== \"text\") return block;\n\t\tconst key = extractLeanContextKey(message, index);\n\t\tconst decision = decideLeanContextEmission({\n\t\t\tstate: nextState,\n\t\t\ttool: message.toolName,\n\t\t\tkey,\n\t\t\tpath: key,\n\t\t\tcontent: block.text,\n\t\t\tminStubTokens: options.minStubTokens,\n\t\t\tneverStubFilenames: options.neverStubFilenames,\n\t\t\tsecretPatterns: options.secretPatterns,\n\t\t});\n\t\tnextState = decision.nextState;\n\t\tif (decision.emit !== \"stub\" || decision.stub === undefined) return block;\n\t\tchanged = true;\n\t\treturn { type: \"text\", text: decision.stub } satisfies TextContent;\n\t});\n\n\treturn {\n\t\tmessage: changed ? { ...message, content } : message,\n\t\tnextState,\n\t\tchanged,\n\t};\n}\n\nfunction extractLeanContextKey(message: ToolResultMessage, contentIndex: number): string {\n\tconst details = asRecord(message.details);\n\tconst detailKey = firstStringValue(details, [\"leanContextKey\", \"path\", \"filePath\", \"command\", \"query\"]);\n\treturn detailKey ?? `${message.toolName}:${message.toolCallId}:${contentIndex}`;\n}\n\nfunction firstStringValue(record: Record<string, unknown> | undefined, keys: readonly string[]): string | undefined {\n\tif (!record) return undefined;\n\tfor (const key of keys) {\n\t\tconst value = record[key];\n\t\tif (typeof value === \"string\" && value.trim().length > 0) {\n\t\t\treturn value;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value)\n\t\t? (value as Record<string, unknown>)\n\t\t: undefined;\n}\n"]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export declare const LEAN_CONTEXT_DEFAULT_MIN_STUB_TOKENS = 256;
|
|
2
|
+
export declare const LEAN_CONTEXT_NEVER_STUB_FILENAMES: readonly ["AGENTS.md", "CLAUDE.md", "SYSTEM.md"];
|
|
3
|
+
export type LeanContextEmission = "full" | "stub";
|
|
4
|
+
export type LeanContextDecisionReason = "first-pass" | "changed" | "unchanged" | "never-stub-parent-instruction" | "secret-pattern" | "below-min-token-threshold";
|
|
5
|
+
export interface LeanContextPolicyState {
|
|
6
|
+
readonly hashesByToolKey: Readonly<Record<string, string>>;
|
|
7
|
+
}
|
|
8
|
+
export interface LeanContextPolicyOptions {
|
|
9
|
+
/** Repeated unchanged outputs below this token estimate stay full. */
|
|
10
|
+
readonly minStubTokens?: number;
|
|
11
|
+
/** Basenames that must never be replaced with an unchanged stub. */
|
|
12
|
+
readonly neverStubFilenames?: readonly string[];
|
|
13
|
+
/** Patterns that force full output when matched. */
|
|
14
|
+
readonly secretPatterns?: readonly RegExp[];
|
|
15
|
+
}
|
|
16
|
+
export interface LeanContextPolicyInput extends LeanContextPolicyOptions {
|
|
17
|
+
readonly state: LeanContextPolicyState;
|
|
18
|
+
readonly tool: string;
|
|
19
|
+
/** Stable caller-defined identity inside the tool, such as path or request key. */
|
|
20
|
+
readonly key: string;
|
|
21
|
+
readonly content: string;
|
|
22
|
+
/** Optional path used for parent-instruction filename checks. Defaults to key. */
|
|
23
|
+
readonly path?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface LeanContextPolicyDecision {
|
|
26
|
+
readonly emit: LeanContextEmission;
|
|
27
|
+
readonly reason: LeanContextDecisionReason;
|
|
28
|
+
readonly contentSha256: string;
|
|
29
|
+
readonly previousSha256?: string;
|
|
30
|
+
readonly estimatedTokens: number;
|
|
31
|
+
readonly nextState: LeanContextPolicyState;
|
|
32
|
+
readonly stub?: string;
|
|
33
|
+
}
|
|
34
|
+
export declare function createLeanContextPolicyState(hashesByToolKey?: Readonly<Record<string, string>>): LeanContextPolicyState;
|
|
35
|
+
export declare function decideLeanContextEmission(input: LeanContextPolicyInput): LeanContextPolicyDecision;
|
|
36
|
+
export declare function getLeanContextTrackingHash(state: LeanContextPolicyState, tool: string, key: string): string | undefined;
|
|
37
|
+
export declare function createLeanContextTrackingKey(tool: string, key: string): string;
|
|
38
|
+
export declare function estimateLeanContextTokens(content: string): number;
|
|
39
|
+
export declare function formatLeanContextUnchangedStub(input: {
|
|
40
|
+
readonly tool: string;
|
|
41
|
+
readonly key: string;
|
|
42
|
+
readonly contentSha256: string;
|
|
43
|
+
readonly estimatedTokens: number;
|
|
44
|
+
}): string;
|
|
45
|
+
//# sourceMappingURL=lean-context-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lean-context-policy.d.ts","sourceRoot":"","sources":["../../src/core/lean-context-policy.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,oCAAoC,MAAM,CAAC;AACxD,eAAO,MAAM,iCAAiC,kDAAmD,CAAC;AASlG,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,MAAM,CAAC;AAElD,MAAM,MAAM,yBAAyB,GAClC,YAAY,GACZ,SAAS,GACT,WAAW,GACX,+BAA+B,GAC/B,gBAAgB,GAChB,2BAA2B,CAAC;AAE/B,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC3D;AAED,MAAM,WAAW,wBAAwB;IACxC,sEAAsE;IACtE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,oEAAoE;IACpE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChD,oDAAoD;IACpD,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5C;AAED,MAAM,WAAW,sBAAuB,SAAQ,wBAAwB;IACvE,QAAQ,CAAC,KAAK,EAAE,sBAAsB,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,mFAAmF;IACnF,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,kFAAkF;IAClF,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,yBAAyB;IACzC,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,yBAAyB,CAAC;IAC3C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,sBAAsB,CAAC;IAC3C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,4BAA4B,CAC3C,eAAe,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM,GACpD,sBAAsB,CAExB;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,sBAAsB,GAAG,yBAAyB,CA6ClG;AAED,wBAAgB,0BAA0B,CACzC,KAAK,EAAE,sBAAsB,EAC7B,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,GACT,MAAM,GAAG,SAAS,CAEpB;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAE9E;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGjE;AAED,wBAAgB,8BAA8B,CAAC,KAAK,EAAE;IACrD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CACjC,GAAG,MAAM,CAET","sourcesContent":["import { createHash } from \"node:crypto\";\n\nconst CHARS_PER_TOKEN_ESTIMATE = 4;\nconst TRACKING_KEY_SEPARATOR = \"\\u0000\";\n\nexport const LEAN_CONTEXT_DEFAULT_MIN_STUB_TOKENS = 256;\nexport const LEAN_CONTEXT_NEVER_STUB_FILENAMES = [\"AGENTS.md\", \"CLAUDE.md\", \"SYSTEM.md\"] as const;\n\nconst DEFAULT_SECRET_PATTERNS: readonly RegExp[] = [\n\t/-----BEGIN [A-Z0-9 ]*PRIVATE KEY-----/i,\n\t/\\b(?:api[_-]?key|access[_-]?token|auth[_-]?token|refresh[_-]?token|client[_-]?secret|password|passwd|pwd)\\b\\s*[:=]\\s*[\"']?[^\\s\"']{8,}/i,\n\t/\\bauthorization\\s*:\\s*bearer\\s+[A-Za-z0-9._~+/=-]{10,}/i,\n\t/\\b(?:gh[pousr]_|sk-|xox[baprs]-)[A-Za-z0-9_=-]{10,}/i,\n];\n\nexport type LeanContextEmission = \"full\" | \"stub\";\n\nexport type LeanContextDecisionReason =\n\t| \"first-pass\"\n\t| \"changed\"\n\t| \"unchanged\"\n\t| \"never-stub-parent-instruction\"\n\t| \"secret-pattern\"\n\t| \"below-min-token-threshold\";\n\nexport interface LeanContextPolicyState {\n\treadonly hashesByToolKey: Readonly<Record<string, string>>;\n}\n\nexport interface LeanContextPolicyOptions {\n\t/** Repeated unchanged outputs below this token estimate stay full. */\n\treadonly minStubTokens?: number;\n\t/** Basenames that must never be replaced with an unchanged stub. */\n\treadonly neverStubFilenames?: readonly string[];\n\t/** Patterns that force full output when matched. */\n\treadonly secretPatterns?: readonly RegExp[];\n}\n\nexport interface LeanContextPolicyInput extends LeanContextPolicyOptions {\n\treadonly state: LeanContextPolicyState;\n\treadonly tool: string;\n\t/** Stable caller-defined identity inside the tool, such as path or request key. */\n\treadonly key: string;\n\treadonly content: string;\n\t/** Optional path used for parent-instruction filename checks. Defaults to key. */\n\treadonly path?: string;\n}\n\nexport interface LeanContextPolicyDecision {\n\treadonly emit: LeanContextEmission;\n\treadonly reason: LeanContextDecisionReason;\n\treadonly contentSha256: string;\n\treadonly previousSha256?: string;\n\treadonly estimatedTokens: number;\n\treadonly nextState: LeanContextPolicyState;\n\treadonly stub?: string;\n}\n\nexport function createLeanContextPolicyState(\n\thashesByToolKey: Readonly<Record<string, string>> = {},\n): LeanContextPolicyState {\n\treturn { hashesByToolKey: { ...hashesByToolKey } };\n}\n\nexport function decideLeanContextEmission(input: LeanContextPolicyInput): LeanContextPolicyDecision {\n\tconst contentSha256 = sha256Text(input.content);\n\tconst trackingKey = createLeanContextTrackingKey(input.tool, input.key);\n\tconst previousSha256 = input.state.hashesByToolKey[trackingKey];\n\tconst estimatedTokens = estimateLeanContextTokens(input.content);\n\tconst nextState = updateTrackedHash(input.state, trackingKey, contentSha256);\n\tconst baseDecision = {\n\t\tcontentSha256,\n\t\tpreviousSha256,\n\t\testimatedTokens,\n\t\tnextState,\n\t};\n\n\tif (previousSha256 === undefined) {\n\t\treturn { ...baseDecision, emit: \"full\", reason: \"first-pass\" };\n\t}\n\n\tif (previousSha256 !== contentSha256) {\n\t\treturn { ...baseDecision, emit: \"full\", reason: \"changed\" };\n\t}\n\n\tif (isNeverStubParentInstruction(input.path ?? input.key, input.neverStubFilenames)) {\n\t\treturn { ...baseDecision, emit: \"full\", reason: \"never-stub-parent-instruction\" };\n\t}\n\n\tif (containsSecretPattern(input.content, input.secretPatterns)) {\n\t\treturn { ...baseDecision, emit: \"full\", reason: \"secret-pattern\" };\n\t}\n\n\tconst minStubTokens = normalizeMinStubTokens(input.minStubTokens);\n\tif (estimatedTokens < minStubTokens) {\n\t\treturn { ...baseDecision, emit: \"full\", reason: \"below-min-token-threshold\" };\n\t}\n\n\treturn {\n\t\t...baseDecision,\n\t\temit: \"stub\",\n\t\treason: \"unchanged\",\n\t\tstub: formatLeanContextUnchangedStub({\n\t\t\ttool: input.tool,\n\t\t\tkey: input.key,\n\t\t\tcontentSha256,\n\t\t\testimatedTokens,\n\t\t}),\n\t};\n}\n\nexport function getLeanContextTrackingHash(\n\tstate: LeanContextPolicyState,\n\ttool: string,\n\tkey: string,\n): string | undefined {\n\treturn state.hashesByToolKey[createLeanContextTrackingKey(tool, key)];\n}\n\nexport function createLeanContextTrackingKey(tool: string, key: string): string {\n\treturn `${tool}${TRACKING_KEY_SEPARATOR}${key}`;\n}\n\nexport function estimateLeanContextTokens(content: string): number {\n\tif (content.length === 0) return 0;\n\treturn Math.ceil(content.length / CHARS_PER_TOKEN_ESTIMATE);\n}\n\nexport function formatLeanContextUnchangedStub(input: {\n\treadonly tool: string;\n\treadonly key: string;\n\treadonly contentSha256: string;\n\treadonly estimatedTokens: number;\n}): string {\n\treturn `[lean-context] ${input.tool} result for ${input.key} unchanged; omitted ${input.estimatedTokens} estimated tokens (sha256:${input.contentSha256.slice(0, 12)}).`;\n}\n\nfunction updateTrackedHash(\n\tstate: LeanContextPolicyState,\n\ttrackingKey: string,\n\tcontentSha256: string,\n): LeanContextPolicyState {\n\tif (state.hashesByToolKey[trackingKey] === contentSha256) {\n\t\treturn state;\n\t}\n\treturn {\n\t\thashesByToolKey: {\n\t\t\t...state.hashesByToolKey,\n\t\t\t[trackingKey]: contentSha256,\n\t\t},\n\t};\n}\n\nfunction sha256Text(content: string): string {\n\treturn createHash(\"sha256\").update(content, \"utf8\").digest(\"hex\");\n}\n\nfunction isNeverStubParentInstruction(pathOrKey: string, filenames?: readonly string[]): boolean {\n\tconst allowedNames = filenames ?? LEAN_CONTEXT_NEVER_STUB_FILENAMES;\n\tconst basename = getBasename(pathOrKey).toUpperCase();\n\treturn allowedNames.some((name) => name.toUpperCase() === basename);\n}\n\nfunction getBasename(pathOrKey: string): string {\n\tconst normalized = pathOrKey.replaceAll(\"\\\\\", \"/\");\n\tconst parts = normalized.split(\"/\");\n\treturn parts.at(-1) ?? normalized;\n}\n\nfunction containsSecretPattern(content: string, patterns?: readonly RegExp[]): boolean {\n\tconst activePatterns = patterns ?? DEFAULT_SECRET_PATTERNS;\n\treturn activePatterns.some((pattern) => regexTestStateless(pattern, content));\n}\n\nfunction regexTestStateless(pattern: RegExp, content: string): boolean {\n\tconst flags = pattern.flags.replace(/[gy]/g, \"\");\n\treturn new RegExp(pattern.source, flags).test(content);\n}\n\nfunction normalizeMinStubTokens(value: number | undefined): number {\n\tif (value === undefined) return LEAN_CONTEXT_DEFAULT_MIN_STUB_TOKENS;\n\tif (!Number.isFinite(value) || value <= 0) return 0;\n\treturn Math.ceil(value);\n}\n"]}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
const CHARS_PER_TOKEN_ESTIMATE = 4;
|
|
3
|
+
const TRACKING_KEY_SEPARATOR = "\u0000";
|
|
4
|
+
export const LEAN_CONTEXT_DEFAULT_MIN_STUB_TOKENS = 256;
|
|
5
|
+
export const LEAN_CONTEXT_NEVER_STUB_FILENAMES = ["AGENTS.md", "CLAUDE.md", "SYSTEM.md"];
|
|
6
|
+
const DEFAULT_SECRET_PATTERNS = [
|
|
7
|
+
/-----BEGIN [A-Z0-9 ]*PRIVATE KEY-----/i,
|
|
8
|
+
/\b(?:api[_-]?key|access[_-]?token|auth[_-]?token|refresh[_-]?token|client[_-]?secret|password|passwd|pwd)\b\s*[:=]\s*["']?[^\s"']{8,}/i,
|
|
9
|
+
/\bauthorization\s*:\s*bearer\s+[A-Za-z0-9._~+/=-]{10,}/i,
|
|
10
|
+
/\b(?:gh[pousr]_|sk-|xox[baprs]-)[A-Za-z0-9_=-]{10,}/i,
|
|
11
|
+
];
|
|
12
|
+
export function createLeanContextPolicyState(hashesByToolKey = {}) {
|
|
13
|
+
return { hashesByToolKey: { ...hashesByToolKey } };
|
|
14
|
+
}
|
|
15
|
+
export function decideLeanContextEmission(input) {
|
|
16
|
+
const contentSha256 = sha256Text(input.content);
|
|
17
|
+
const trackingKey = createLeanContextTrackingKey(input.tool, input.key);
|
|
18
|
+
const previousSha256 = input.state.hashesByToolKey[trackingKey];
|
|
19
|
+
const estimatedTokens = estimateLeanContextTokens(input.content);
|
|
20
|
+
const nextState = updateTrackedHash(input.state, trackingKey, contentSha256);
|
|
21
|
+
const baseDecision = {
|
|
22
|
+
contentSha256,
|
|
23
|
+
previousSha256,
|
|
24
|
+
estimatedTokens,
|
|
25
|
+
nextState,
|
|
26
|
+
};
|
|
27
|
+
if (previousSha256 === undefined) {
|
|
28
|
+
return { ...baseDecision, emit: "full", reason: "first-pass" };
|
|
29
|
+
}
|
|
30
|
+
if (previousSha256 !== contentSha256) {
|
|
31
|
+
return { ...baseDecision, emit: "full", reason: "changed" };
|
|
32
|
+
}
|
|
33
|
+
if (isNeverStubParentInstruction(input.path ?? input.key, input.neverStubFilenames)) {
|
|
34
|
+
return { ...baseDecision, emit: "full", reason: "never-stub-parent-instruction" };
|
|
35
|
+
}
|
|
36
|
+
if (containsSecretPattern(input.content, input.secretPatterns)) {
|
|
37
|
+
return { ...baseDecision, emit: "full", reason: "secret-pattern" };
|
|
38
|
+
}
|
|
39
|
+
const minStubTokens = normalizeMinStubTokens(input.minStubTokens);
|
|
40
|
+
if (estimatedTokens < minStubTokens) {
|
|
41
|
+
return { ...baseDecision, emit: "full", reason: "below-min-token-threshold" };
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
...baseDecision,
|
|
45
|
+
emit: "stub",
|
|
46
|
+
reason: "unchanged",
|
|
47
|
+
stub: formatLeanContextUnchangedStub({
|
|
48
|
+
tool: input.tool,
|
|
49
|
+
key: input.key,
|
|
50
|
+
contentSha256,
|
|
51
|
+
estimatedTokens,
|
|
52
|
+
}),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export function getLeanContextTrackingHash(state, tool, key) {
|
|
56
|
+
return state.hashesByToolKey[createLeanContextTrackingKey(tool, key)];
|
|
57
|
+
}
|
|
58
|
+
export function createLeanContextTrackingKey(tool, key) {
|
|
59
|
+
return `${tool}${TRACKING_KEY_SEPARATOR}${key}`;
|
|
60
|
+
}
|
|
61
|
+
export function estimateLeanContextTokens(content) {
|
|
62
|
+
if (content.length === 0)
|
|
63
|
+
return 0;
|
|
64
|
+
return Math.ceil(content.length / CHARS_PER_TOKEN_ESTIMATE);
|
|
65
|
+
}
|
|
66
|
+
export function formatLeanContextUnchangedStub(input) {
|
|
67
|
+
return `[lean-context] ${input.tool} result for ${input.key} unchanged; omitted ${input.estimatedTokens} estimated tokens (sha256:${input.contentSha256.slice(0, 12)}).`;
|
|
68
|
+
}
|
|
69
|
+
function updateTrackedHash(state, trackingKey, contentSha256) {
|
|
70
|
+
if (state.hashesByToolKey[trackingKey] === contentSha256) {
|
|
71
|
+
return state;
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
hashesByToolKey: {
|
|
75
|
+
...state.hashesByToolKey,
|
|
76
|
+
[trackingKey]: contentSha256,
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function sha256Text(content) {
|
|
81
|
+
return createHash("sha256").update(content, "utf8").digest("hex");
|
|
82
|
+
}
|
|
83
|
+
function isNeverStubParentInstruction(pathOrKey, filenames) {
|
|
84
|
+
const allowedNames = filenames ?? LEAN_CONTEXT_NEVER_STUB_FILENAMES;
|
|
85
|
+
const basename = getBasename(pathOrKey).toUpperCase();
|
|
86
|
+
return allowedNames.some((name) => name.toUpperCase() === basename);
|
|
87
|
+
}
|
|
88
|
+
function getBasename(pathOrKey) {
|
|
89
|
+
const normalized = pathOrKey.replaceAll("\\", "/");
|
|
90
|
+
const parts = normalized.split("/");
|
|
91
|
+
return parts.at(-1) ?? normalized;
|
|
92
|
+
}
|
|
93
|
+
function containsSecretPattern(content, patterns) {
|
|
94
|
+
const activePatterns = patterns ?? DEFAULT_SECRET_PATTERNS;
|
|
95
|
+
return activePatterns.some((pattern) => regexTestStateless(pattern, content));
|
|
96
|
+
}
|
|
97
|
+
function regexTestStateless(pattern, content) {
|
|
98
|
+
const flags = pattern.flags.replace(/[gy]/g, "");
|
|
99
|
+
return new RegExp(pattern.source, flags).test(content);
|
|
100
|
+
}
|
|
101
|
+
function normalizeMinStubTokens(value) {
|
|
102
|
+
if (value === undefined)
|
|
103
|
+
return LEAN_CONTEXT_DEFAULT_MIN_STUB_TOKENS;
|
|
104
|
+
if (!Number.isFinite(value) || value <= 0)
|
|
105
|
+
return 0;
|
|
106
|
+
return Math.ceil(value);
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=lean-context-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lean-context-policy.js","sourceRoot":"","sources":["../../src/core/lean-context-policy.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\n\nconst CHARS_PER_TOKEN_ESTIMATE = 4;\nconst TRACKING_KEY_SEPARATOR = \"\\u0000\";\n\nexport const LEAN_CONTEXT_DEFAULT_MIN_STUB_TOKENS = 256;\nexport const LEAN_CONTEXT_NEVER_STUB_FILENAMES = [\"AGENTS.md\", \"CLAUDE.md\", \"SYSTEM.md\"] as const;\n\nconst DEFAULT_SECRET_PATTERNS: readonly RegExp[] = [\n\t/-----BEGIN [A-Z0-9 ]*PRIVATE KEY-----/i,\n\t/\\b(?:api[_-]?key|access[_-]?token|auth[_-]?token|refresh[_-]?token|client[_-]?secret|password|passwd|pwd)\\b\\s*[:=]\\s*[\"']?[^\\s\"']{8,}/i,\n\t/\\bauthorization\\s*:\\s*bearer\\s+[A-Za-z0-9._~+/=-]{10,}/i,\n\t/\\b(?:gh[pousr]_|sk-|xox[baprs]-)[A-Za-z0-9_=-]{10,}/i,\n];\n\nexport type LeanContextEmission = \"full\" | \"stub\";\n\nexport type LeanContextDecisionReason =\n\t| \"first-pass\"\n\t| \"changed\"\n\t| \"unchanged\"\n\t| \"never-stub-parent-instruction\"\n\t| \"secret-pattern\"\n\t| \"below-min-token-threshold\";\n\nexport interface LeanContextPolicyState {\n\treadonly hashesByToolKey: Readonly<Record<string, string>>;\n}\n\nexport interface LeanContextPolicyOptions {\n\t/** Repeated unchanged outputs below this token estimate stay full. */\n\treadonly minStubTokens?: number;\n\t/** Basenames that must never be replaced with an unchanged stub. */\n\treadonly neverStubFilenames?: readonly string[];\n\t/** Patterns that force full output when matched. */\n\treadonly secretPatterns?: readonly RegExp[];\n}\n\nexport interface LeanContextPolicyInput extends LeanContextPolicyOptions {\n\treadonly state: LeanContextPolicyState;\n\treadonly tool: string;\n\t/** Stable caller-defined identity inside the tool, such as path or request key. */\n\treadonly key: string;\n\treadonly content: string;\n\t/** Optional path used for parent-instruction filename checks. Defaults to key. */\n\treadonly path?: string;\n}\n\nexport interface LeanContextPolicyDecision {\n\treadonly emit: LeanContextEmission;\n\treadonly reason: LeanContextDecisionReason;\n\treadonly contentSha256: string;\n\treadonly previousSha256?: string;\n\treadonly estimatedTokens: number;\n\treadonly nextState: LeanContextPolicyState;\n\treadonly stub?: string;\n}\n\nexport function createLeanContextPolicyState(\n\thashesByToolKey: Readonly<Record<string, string>> = {},\n): LeanContextPolicyState {\n\treturn { hashesByToolKey: { ...hashesByToolKey } };\n}\n\nexport function decideLeanContextEmission(input: LeanContextPolicyInput): LeanContextPolicyDecision {\n\tconst contentSha256 = sha256Text(input.content);\n\tconst trackingKey = createLeanContextTrackingKey(input.tool, input.key);\n\tconst previousSha256 = input.state.hashesByToolKey[trackingKey];\n\tconst estimatedTokens = estimateLeanContextTokens(input.content);\n\tconst nextState = updateTrackedHash(input.state, trackingKey, contentSha256);\n\tconst baseDecision = {\n\t\tcontentSha256,\n\t\tpreviousSha256,\n\t\testimatedTokens,\n\t\tnextState,\n\t};\n\n\tif (previousSha256 === undefined) {\n\t\treturn { ...baseDecision, emit: \"full\", reason: \"first-pass\" };\n\t}\n\n\tif (previousSha256 !== contentSha256) {\n\t\treturn { ...baseDecision, emit: \"full\", reason: \"changed\" };\n\t}\n\n\tif (isNeverStubParentInstruction(input.path ?? input.key, input.neverStubFilenames)) {\n\t\treturn { ...baseDecision, emit: \"full\", reason: \"never-stub-parent-instruction\" };\n\t}\n\n\tif (containsSecretPattern(input.content, input.secretPatterns)) {\n\t\treturn { ...baseDecision, emit: \"full\", reason: \"secret-pattern\" };\n\t}\n\n\tconst minStubTokens = normalizeMinStubTokens(input.minStubTokens);\n\tif (estimatedTokens < minStubTokens) {\n\t\treturn { ...baseDecision, emit: \"full\", reason: \"below-min-token-threshold\" };\n\t}\n\n\treturn {\n\t\t...baseDecision,\n\t\temit: \"stub\",\n\t\treason: \"unchanged\",\n\t\tstub: formatLeanContextUnchangedStub({\n\t\t\ttool: input.tool,\n\t\t\tkey: input.key,\n\t\t\tcontentSha256,\n\t\t\testimatedTokens,\n\t\t}),\n\t};\n}\n\nexport function getLeanContextTrackingHash(\n\tstate: LeanContextPolicyState,\n\ttool: string,\n\tkey: string,\n): string | undefined {\n\treturn state.hashesByToolKey[createLeanContextTrackingKey(tool, key)];\n}\n\nexport function createLeanContextTrackingKey(tool: string, key: string): string {\n\treturn `${tool}${TRACKING_KEY_SEPARATOR}${key}`;\n}\n\nexport function estimateLeanContextTokens(content: string): number {\n\tif (content.length === 0) return 0;\n\treturn Math.ceil(content.length / CHARS_PER_TOKEN_ESTIMATE);\n}\n\nexport function formatLeanContextUnchangedStub(input: {\n\treadonly tool: string;\n\treadonly key: string;\n\treadonly contentSha256: string;\n\treadonly estimatedTokens: number;\n}): string {\n\treturn `[lean-context] ${input.tool} result for ${input.key} unchanged; omitted ${input.estimatedTokens} estimated tokens (sha256:${input.contentSha256.slice(0, 12)}).`;\n}\n\nfunction updateTrackedHash(\n\tstate: LeanContextPolicyState,\n\ttrackingKey: string,\n\tcontentSha256: string,\n): LeanContextPolicyState {\n\tif (state.hashesByToolKey[trackingKey] === contentSha256) {\n\t\treturn state;\n\t}\n\treturn {\n\t\thashesByToolKey: {\n\t\t\t...state.hashesByToolKey,\n\t\t\t[trackingKey]: contentSha256,\n\t\t},\n\t};\n}\n\nfunction sha256Text(content: string): string {\n\treturn createHash(\"sha256\").update(content, \"utf8\").digest(\"hex\");\n}\n\nfunction isNeverStubParentInstruction(pathOrKey: string, filenames?: readonly string[]): boolean {\n\tconst allowedNames = filenames ?? LEAN_CONTEXT_NEVER_STUB_FILENAMES;\n\tconst basename = getBasename(pathOrKey).toUpperCase();\n\treturn allowedNames.some((name) => name.toUpperCase() === basename);\n}\n\nfunction getBasename(pathOrKey: string): string {\n\tconst normalized = pathOrKey.replaceAll(\"\\\\\", \"/\");\n\tconst parts = normalized.split(\"/\");\n\treturn parts.at(-1) ?? normalized;\n}\n\nfunction containsSecretPattern(content: string, patterns?: readonly RegExp[]): boolean {\n\tconst activePatterns = patterns ?? DEFAULT_SECRET_PATTERNS;\n\treturn activePatterns.some((pattern) => regexTestStateless(pattern, content));\n}\n\nfunction regexTestStateless(pattern: RegExp, content: string): boolean {\n\tconst flags = pattern.flags.replace(/[gy]/g, \"\");\n\treturn new RegExp(pattern.source, flags).test(content);\n}\n\nfunction normalizeMinStubTokens(value: number | undefined): number {\n\tif (value === undefined) return LEAN_CONTEXT_DEFAULT_MIN_STUB_TOKENS;\n\tif (!Number.isFinite(value) || value <= 0) return 0;\n\treturn Math.ceil(value);\n}\n"]}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { LoadoutAccessEntry, LoadoutCommands } from "./loadouts.ts";
|
|
2
|
+
export type LoadoutAccessOperation = "read" | "write" | "execute";
|
|
3
|
+
export interface CreateLoadoutAccessPolicyOptions {
|
|
4
|
+
cwd: string;
|
|
5
|
+
activeTools: readonly string[];
|
|
6
|
+
readSet?: readonly LoadoutAccessEntry[];
|
|
7
|
+
writeSet?: readonly LoadoutAccessEntry[];
|
|
8
|
+
blockedPaths?: readonly string[];
|
|
9
|
+
commands?: LoadoutCommands;
|
|
10
|
+
}
|
|
11
|
+
export interface LoadoutAccessPolicy {
|
|
12
|
+
cwd: string;
|
|
13
|
+
activeTools: readonly string[];
|
|
14
|
+
readRoots: readonly string[];
|
|
15
|
+
writeRoots: readonly string[];
|
|
16
|
+
blockedPaths: readonly string[];
|
|
17
|
+
commands: LoadoutCommands;
|
|
18
|
+
}
|
|
19
|
+
export interface LoadoutPathAccessRequest {
|
|
20
|
+
operation: "read" | "write";
|
|
21
|
+
toolName: string;
|
|
22
|
+
path: string;
|
|
23
|
+
}
|
|
24
|
+
export interface LoadoutCommandAccessRequest {
|
|
25
|
+
operation: "execute";
|
|
26
|
+
toolName: string;
|
|
27
|
+
command: string;
|
|
28
|
+
}
|
|
29
|
+
export type LoadoutAccessRequest = LoadoutPathAccessRequest | LoadoutCommandAccessRequest;
|
|
30
|
+
export interface LoadoutAccessDecision {
|
|
31
|
+
allowed: boolean;
|
|
32
|
+
reason: string;
|
|
33
|
+
normalizedPath?: string;
|
|
34
|
+
normalizedCommand?: string;
|
|
35
|
+
}
|
|
36
|
+
export type LoadoutAccessGuard = (request: LoadoutAccessRequest) => LoadoutAccessDecision;
|
|
37
|
+
export declare function assertLoadoutAccess(guard: LoadoutAccessGuard | undefined, request: LoadoutAccessRequest): void;
|
|
38
|
+
export declare function createLoadoutAccessPolicy(options: CreateLoadoutAccessPolicyOptions): LoadoutAccessPolicy;
|
|
39
|
+
export declare function isActiveLoadoutTool(policy: Pick<LoadoutAccessPolicy, "activeTools">, toolName: string): boolean;
|
|
40
|
+
export declare function decideLoadoutAccess(policy: LoadoutAccessPolicy, request: LoadoutAccessRequest): LoadoutAccessDecision;
|
|
41
|
+
//# sourceMappingURL=loadout-access-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadout-access-policy.d.ts","sourceRoot":"","sources":["../../src/core/loadout-access-policy.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEzE,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;AAElE,MAAM,WAAW,gCAAgC;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,OAAO,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACxC,QAAQ,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACzC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,QAAQ,EAAE,eAAe,CAAC;CAC1B;AAED,MAAM,WAAW,wBAAwB;IACxC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,2BAA2B;IAC3C,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,oBAAoB,GAAG,wBAAwB,GAAG,2BAA2B,CAAC;AAE1F,MAAM,WAAW,qBAAqB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,EAAE,oBAAoB,KAAK,qBAAqB,CAAC;AAE1F,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,SAAS,EAAE,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAM9G;AAID,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,gCAAgC,GAAG,mBAAmB,CAYxG;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,mBAAmB,EAAE,aAAa,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE/G;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,EAAE,OAAO,EAAE,oBAAoB,GAAG,qBAAqB,CAMrH","sourcesContent":["import { existsSync, realpathSync } from \"node:fs\";\nimport { basename, dirname, isAbsolute, relative, resolve } from \"node:path\";\nimport type { LoadoutAccessEntry, LoadoutCommands } from \"./loadouts.ts\";\n\nexport type LoadoutAccessOperation = \"read\" | \"write\" | \"execute\";\n\nexport interface CreateLoadoutAccessPolicyOptions {\n\tcwd: string;\n\tactiveTools: readonly string[];\n\treadSet?: readonly LoadoutAccessEntry[];\n\twriteSet?: readonly LoadoutAccessEntry[];\n\tblockedPaths?: readonly string[];\n\tcommands?: LoadoutCommands;\n}\n\nexport interface LoadoutAccessPolicy {\n\tcwd: string;\n\tactiveTools: readonly string[];\n\treadRoots: readonly string[];\n\twriteRoots: readonly string[];\n\tblockedPaths: readonly string[];\n\tcommands: LoadoutCommands;\n}\n\nexport interface LoadoutPathAccessRequest {\n\toperation: \"read\" | \"write\";\n\ttoolName: string;\n\tpath: string;\n}\n\nexport interface LoadoutCommandAccessRequest {\n\toperation: \"execute\";\n\ttoolName: string;\n\tcommand: string;\n}\n\nexport type LoadoutAccessRequest = LoadoutPathAccessRequest | LoadoutCommandAccessRequest;\n\nexport interface LoadoutAccessDecision {\n\tallowed: boolean;\n\treason: string;\n\tnormalizedPath?: string;\n\tnormalizedCommand?: string;\n}\n\nexport type LoadoutAccessGuard = (request: LoadoutAccessRequest) => LoadoutAccessDecision;\n\nexport function assertLoadoutAccess(guard: LoadoutAccessGuard | undefined, request: LoadoutAccessRequest): void {\n\tif (!guard) return;\n\tconst decision = guard(request);\n\tif (!decision.allowed) {\n\t\tthrow new Error(`loadout: ${decision.reason}`);\n\t}\n}\n\nconst DEFAULT_BLOCKED_PATHS = [\"**/.env*\", \"**/*secret*\", \"**/*key*\", \"**/.git\", \"**/.git/*\"] as const;\n\nexport function createLoadoutAccessPolicy(options: CreateLoadoutAccessPolicyOptions): LoadoutAccessPolicy {\n\tconst cwd = normalizeRootPath(options.cwd);\n\treturn {\n\t\tcwd,\n\t\tactiveTools: uniqueSorted(\n\t\t\toptions.activeTools.map((toolName) => toolName.trim()).filter((toolName) => toolName !== \"\"),\n\t\t),\n\t\treadRoots: normalizeAccessSet(cwd, options.readSet),\n\t\twriteRoots: normalizeAccessSet(cwd, options.writeSet),\n\t\tblockedPaths: uniqueSorted(options.blockedPaths ?? DEFAULT_BLOCKED_PATHS),\n\t\tcommands: options.commands ?? { mode: \"none\" },\n\t};\n}\n\nexport function isActiveLoadoutTool(policy: Pick<LoadoutAccessPolicy, \"activeTools\">, toolName: string): boolean {\n\treturn policy.activeTools.includes(toolName.trim());\n}\n\nexport function decideLoadoutAccess(policy: LoadoutAccessPolicy, request: LoadoutAccessRequest): LoadoutAccessDecision {\n\tif (!isActiveLoadoutTool(policy, request.toolName)) {\n\t\treturn deny(`inactive tool: ${request.toolName}`);\n\t}\n\tif (request.operation === \"execute\") return decideCommandAccess(policy, request);\n\treturn decidePathAccess(policy, request);\n}\n\nfunction decidePathAccess(policy: LoadoutAccessPolicy, request: LoadoutPathAccessRequest): LoadoutAccessDecision {\n\tconst normalizedPath = normalizeRequestPath(policy.cwd, request.path);\n\tif (!normalizedPath) return deny(\"invalid path\");\n\tif (isBlockedPath(policy, normalizedPath)) return deny(\"blocked path\", normalizedPath);\n\n\tif (request.operation === \"read\") {\n\t\tconst roots = uniqueSorted([...policy.readRoots, ...policy.writeRoots]);\n\t\tif (roots.length === 0) return deny(\"outside read scope: empty read/write set\", normalizedPath);\n\t\tif (roots.some((root) => containsPath(root, normalizedPath))) return allow(normalizedPath);\n\t\treturn deny(\"outside read scope\", normalizedPath);\n\t}\n\n\tif (policy.writeRoots.length === 0) return deny(\"outside write scope: empty write set\", normalizedPath);\n\tif (policy.writeRoots.some((root) => containsPath(root, normalizedPath))) return allow(normalizedPath);\n\treturn deny(\"outside write scope\", normalizedPath);\n}\n\nfunction decideCommandAccess(policy: LoadoutAccessPolicy, request: LoadoutCommandAccessRequest): LoadoutAccessDecision {\n\tconst normalizedCommand = request.command.trim();\n\tif (normalizedCommand === \"\" || normalizedCommand.includes(\"\\0\")) return denyCommand(\"invalid command\");\n\tif (policy.commands.mode === \"none\") return denyCommand(\"command mode none\");\n\tif (policy.commands.blockPatterns?.some((pattern) => commandMatchesPattern(pattern, normalizedCommand))) {\n\t\treturn denyCommand(\"blocked command pattern\");\n\t}\n\tif (policy.commands.allowPatterns?.some((pattern) => commandMatchesPattern(pattern, normalizedCommand))) {\n\t\treturn { allowed: true, reason: \"allowed\", normalizedCommand };\n\t}\n\treturn denyCommand(`command mode ${policy.commands.mode} requires an explicit allow pattern`);\n}\n\nfunction allow(normalizedPath: string): LoadoutAccessDecision {\n\treturn { allowed: true, reason: \"allowed\", normalizedPath };\n}\n\nfunction deny(reason: string, normalizedPath?: string): LoadoutAccessDecision {\n\treturn { allowed: false, reason, normalizedPath };\n}\n\nfunction denyCommand(reason: string): LoadoutAccessDecision {\n\treturn { allowed: false, reason };\n}\n\nfunction normalizeRootPath(path: string): string {\n\tconst normalized = normalizePathSeparators(path);\n\tif (normalized.trim() === \"\" || normalized.includes(\"\\0\")) {\n\t\tthrow new Error(\"loadout access policy cwd must be a non-empty path\");\n\t}\n\treturn stripTrailingSeparator(canonicalizeExistingPrefix(resolve(normalized)));\n}\n\nfunction normalizeRequestPath(cwd: string, requestedPath: string): string | undefined {\n\tconst normalized = normalizePathSeparators(requestedPath);\n\tif (normalized.trim() === \"\" || normalized.includes(\"\\0\")) return undefined;\n\treturn stripTrailingSeparator(canonicalizeExistingPrefix(resolve(cwd, normalized)));\n}\n\nfunction normalizeAccessSet(cwd: string, accessSet: readonly LoadoutAccessEntry[] | undefined): string[] {\n\tif (!accessSet) return [];\n\tconst roots: string[] = [];\n\tfor (const entry of accessSet) {\n\t\tif (entry.symbols && entry.symbols.length > 0) continue;\n\t\tconst normalized = normalizePathSeparators(entry.path);\n\t\tif (normalized.trim() === \"\" || normalized.includes(\"\\0\")) continue;\n\t\troots.push(stripTrailingSeparator(canonicalizeExistingPrefix(resolve(cwd, normalized))));\n\t}\n\treturn uniqueSorted(roots);\n}\n\nfunction canonicalizeExistingPrefix(path: string): string {\n\ttry {\n\t\treturn realpathSync.native(path);\n\t} catch {\n\t\tif (existsSync(path)) return resolve(path);\n\t\tconst parent = dirname(path);\n\t\tif (parent === path) return resolve(path);\n\t\treturn resolve(canonicalizeExistingPrefix(parent), basename(path));\n\t}\n}\n\nfunction containsPath(root: string, candidate: string): boolean {\n\tif (candidate === root) return true;\n\tconst relativePath = relative(root, candidate);\n\treturn relativePath !== \"\" && !relativePath.startsWith(\"..\") && !isAbsolute(relativePath);\n}\n\nfunction isBlockedPath(policy: LoadoutAccessPolicy, normalizedPath: string): boolean {\n\tconst relativeCandidate = toForwardSlashes(relative(policy.cwd, normalizedPath));\n\tconst candidates = uniqueSorted([toForwardSlashes(normalizedPath), relativeCandidate]);\n\treturn policy.blockedPaths.some((pattern) => candidates.some((candidate) => globMatch(pattern, candidate)));\n}\n\nfunction commandMatchesPattern(pattern: string, command: string): boolean {\n\treturn pattern === command || globMatch(pattern, command);\n}\n\nfunction normalizePathSeparators(path: string): string {\n\treturn path.replaceAll(\"\\\\\", \"/\");\n}\n\nfunction stripTrailingSeparator(path: string): string {\n\tif (path === \"/\") return path;\n\treturn path.endsWith(\"/\") ? path.slice(0, -1) : path;\n}\n\nfunction toForwardSlashes(path: string): string {\n\treturn path.replaceAll(\"\\\\\", \"/\");\n}\n\nfunction globMatch(glob: string, value: string): boolean {\n\treturn globToRegExp(normalizePathSeparators(glob)).test(toForwardSlashes(value));\n}\n\nfunction globToRegExp(glob: string): RegExp {\n\tlet pattern = \"\";\n\tfor (let index = 0; index < glob.length; index++) {\n\t\tconst char = glob[index];\n\t\tif (char === \"*\") {\n\t\t\tif (glob[index + 1] === \"*\") {\n\t\t\t\tif (glob[index + 2] === \"/\") {\n\t\t\t\t\tpattern += \"(?:.*/)?\";\n\t\t\t\t\tindex += 2;\n\t\t\t\t} else {\n\t\t\t\t\tpattern += \".*\";\n\t\t\t\t\tindex++;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tpattern += \"[^/]*\";\n\t\t\t}\n\t\t} else if (char === \"?\") {\n\t\t\tpattern += \"[^/]\";\n\t\t} else {\n\t\t\tpattern += char.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\t\t}\n\t}\n\treturn new RegExp(`^${pattern}$`);\n}\n\nfunction uniqueSorted(values: readonly string[]): string[] {\n\treturn [...new Set(values)].sort((a, b) => {\n\t\tif (a < b) return -1;\n\t\tif (a > b) return 1;\n\t\treturn 0;\n\t});\n}\n"]}
|