open-multi-agent-kit 0.98.3 → 0.98.5
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 +44 -0
- package/README.md +12 -2
- package/dist/cli/args.d.ts +1 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +14 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +3 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/mcp-attach.d.ts +3 -3
- package/dist/cli/mcp-attach.d.ts.map +1 -1
- package/dist/cli/mcp-attach.js +5 -4
- package/dist/cli/mcp-attach.js.map +1 -1
- package/dist/cli/model-contract.d.ts +5 -0
- package/dist/cli/model-contract.d.ts.map +1 -0
- package/dist/cli/model-contract.js +45 -0
- package/dist/cli/model-contract.js.map +1 -0
- package/dist/commands/adaptorch-doctor-cli.d.ts.map +1 -1
- package/dist/commands/adaptorch-doctor-cli.js +32 -10
- package/dist/commands/adaptorch-doctor-cli.js.map +1 -1
- package/dist/commands/init-cli.d.ts +12 -0
- package/dist/commands/init-cli.d.ts.map +1 -0
- package/dist/commands/init-cli.js +76 -0
- package/dist/commands/init-cli.js.map +1 -0
- package/dist/commands/provider-sync-cli.d.ts +27 -0
- package/dist/commands/provider-sync-cli.d.ts.map +1 -0
- package/dist/commands/provider-sync-cli.js +177 -0
- package/dist/commands/provider-sync-cli.js.map +1 -0
- package/dist/commands/run-command.d.ts +9 -0
- package/dist/commands/run-command.d.ts.map +1 -0
- package/dist/commands/run-command.js +34 -0
- package/dist/commands/run-command.js.map +1 -0
- package/dist/commands/verified-run-cli.d.ts +6 -0
- package/dist/commands/verified-run-cli.d.ts.map +1 -0
- package/dist/commands/verified-run-cli.js +190 -0
- package/dist/commands/verified-run-cli.js.map +1 -0
- package/dist/core/active-skill-state.d.ts +7 -0
- package/dist/core/active-skill-state.d.ts.map +1 -0
- package/dist/core/active-skill-state.js +25 -0
- package/dist/core/active-skill-state.js.map +1 -0
- package/dist/core/agent-session-services.d.ts +10 -1
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +43 -0
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +7 -9
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +91 -126
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/codex-chatgpt-web-bridge.d.ts +99 -0
- package/dist/core/codex-chatgpt-web-bridge.d.ts.map +1 -0
- package/dist/core/codex-chatgpt-web-bridge.js +192 -0
- package/dist/core/codex-chatgpt-web-bridge.js.map +1 -0
- package/dist/core/codex-chatgpt-web-sync.d.ts +50 -0
- package/dist/core/codex-chatgpt-web-sync.d.ts.map +1 -0
- package/dist/core/codex-chatgpt-web-sync.js +119 -0
- package/dist/core/codex-chatgpt-web-sync.js.map +1 -0
- package/dist/core/compaction/compaction-headroom.d.ts +30 -0
- package/dist/core/compaction/compaction-headroom.d.ts.map +1 -0
- package/dist/core/compaction/compaction-headroom.js +48 -0
- package/dist/core/compaction/compaction-headroom.js.map +1 -0
- package/dist/core/compaction/compaction.d.ts +2 -29
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +19 -47
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/compaction/overflow-retry-guard.d.ts +20 -0
- package/dist/core/compaction/overflow-retry-guard.d.ts.map +1 -0
- package/dist/core/compaction/overflow-retry-guard.js +38 -0
- package/dist/core/compaction/overflow-retry-guard.js.map +1 -0
- package/dist/core/context-budget-headroom-types.d.ts.map +1 -1
- package/dist/core/context-budget-headroom-types.js +1 -1
- package/dist/core/context-budget-headroom-types.js.map +1 -1
- package/dist/core/context-budget-token-counter-types.d.ts +27 -0
- package/dist/core/context-budget-token-counter-types.d.ts.map +1 -0
- package/dist/core/context-budget-token-counter-types.js +2 -0
- package/dist/core/context-budget-token-counter-types.js.map +1 -0
- package/dist/core/context-budget-token-counter.d.ts +2 -26
- package/dist/core/context-budget-token-counter.d.ts.map +1 -1
- package/dist/core/context-budget-token-counter.js +2 -0
- package/dist/core/context-budget-token-counter.js.map +1 -1
- package/dist/core/context-budget-v2-scoring.d.ts.map +1 -1
- package/dist/core/context-budget-v2-scoring.js +14 -10
- package/dist/core/context-budget-v2-scoring.js.map +1 -1
- package/dist/core/domain-router.d.ts.map +1 -1
- package/dist/core/domain-router.js +1 -1
- package/dist/core/domain-router.js.map +1 -1
- package/dist/core/grok-harness-dispatch.d.ts +4 -0
- package/dist/core/grok-harness-dispatch.d.ts.map +1 -1
- package/dist/core/grok-harness-dispatch.js +20 -3
- package/dist/core/grok-harness-dispatch.js.map +1 -1
- package/dist/core/grok-harness.d.ts +15 -9
- package/dist/core/grok-harness.d.ts.map +1 -1
- package/dist/core/grok-harness.js +34 -8
- package/dist/core/grok-harness.js.map +1 -1
- package/dist/core/mcp/tools.d.ts +2 -2
- package/dist/core/mcp/tools.d.ts.map +1 -1
- package/dist/core/mcp/tools.js +29 -3
- package/dist/core/mcp/tools.js.map +1 -1
- package/dist/core/model-registry-schema.d.ts +1081 -0
- package/dist/core/model-registry-schema.d.ts.map +1 -0
- package/dist/core/model-registry-schema.js +148 -0
- package/dist/core/model-registry-schema.js.map +1 -0
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +1 -146
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts +2 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +2 -1
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/prompt-preset.d.ts +1 -1
- package/dist/core/prompt-preset.d.ts.map +1 -1
- package/dist/core/prompt-preset.js +16 -1
- package/dist/core/prompt-preset.js.map +1 -1
- package/dist/core/prompt-settlement.d.ts +4 -3
- package/dist/core/prompt-settlement.d.ts.map +1 -1
- package/dist/core/prompt-settlement.js.map +1 -1
- package/dist/core/provider-display-names.d.ts.map +1 -1
- package/dist/core/provider-display-names.js +1 -0
- package/dist/core/provider-display-names.js.map +1 -1
- package/dist/core/provider-resilience.d.ts +8 -0
- package/dist/core/provider-resilience.d.ts.map +1 -1
- package/dist/core/provider-resilience.js +20 -3
- package/dist/core/provider-resilience.js.map +1 -1
- package/dist/core/provider-usage-types.d.ts +42 -0
- package/dist/core/provider-usage-types.d.ts.map +1 -0
- package/dist/core/provider-usage-types.js +2 -0
- package/dist/core/provider-usage-types.js.map +1 -0
- package/dist/core/provider-usage.d.ts +2 -31
- package/dist/core/provider-usage.d.ts.map +1 -1
- package/dist/core/provider-usage.js +4 -0
- package/dist/core/provider-usage.js.map +1 -1
- package/dist/core/redaction.d.ts.map +1 -1
- package/dist/core/redaction.js +18 -2
- package/dist/core/redaction.js.map +1 -1
- package/dist/core/run-budget-policy.d.ts +18 -0
- package/dist/core/run-budget-policy.d.ts.map +1 -0
- package/dist/core/run-budget-policy.js +52 -0
- package/dist/core/run-budget-policy.js.map +1 -0
- package/dist/core/run-budget.d.ts +33 -0
- package/dist/core/run-budget.d.ts.map +1 -0
- package/dist/core/run-budget.js +89 -0
- package/dist/core/run-budget.js.map +1 -0
- package/dist/core/run-execution-api.d.ts +15 -0
- package/dist/core/run-execution-api.d.ts.map +1 -0
- package/dist/core/run-execution-api.js +7 -0
- package/dist/core/run-execution-api.js.map +1 -0
- package/dist/core/run-journal.d.ts.map +1 -1
- package/dist/core/run-journal.js +30 -208
- package/dist/core/run-journal.js.map +1 -1
- package/dist/core/sandbox/policy-merge.d.ts +6 -0
- package/dist/core/sandbox/policy-merge.d.ts.map +1 -0
- package/dist/core/sandbox/policy-merge.js +74 -0
- package/dist/core/sandbox/policy-merge.js.map +1 -0
- package/dist/core/sandbox/policy-paths.d.ts +4 -0
- package/dist/core/sandbox/policy-paths.d.ts.map +1 -0
- package/dist/core/sandbox/policy-paths.js +21 -0
- package/dist/core/sandbox/policy-paths.js.map +1 -0
- package/dist/core/sandbox/policy-types.d.ts +75 -0
- package/dist/core/sandbox/policy-types.d.ts.map +1 -0
- package/dist/core/sandbox/policy-types.js +2 -0
- package/dist/core/sandbox/policy-types.js.map +1 -0
- package/dist/core/sandbox/policy.d.ts +3 -77
- package/dist/core/sandbox/policy.d.ts.map +1 -1
- package/dist/core/sandbox/policy.js +3 -98
- package/dist/core/sandbox/policy.js.map +1 -1
- package/dist/core/sdk-provider-stream.d.ts +14 -0
- package/dist/core/sdk-provider-stream.d.ts.map +1 -0
- package/dist/core/sdk-provider-stream.js +38 -0
- package/dist/core/sdk-provider-stream.js.map +1 -0
- package/dist/core/sdk.d.ts +5 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +17 -33
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-bash-service.d.ts +2 -2
- package/dist/core/session-bash-service.d.ts.map +1 -1
- package/dist/core/session-bash-service.js +21 -9
- package/dist/core/session-bash-service.js.map +1 -1
- package/dist/core/session-failure-cause.d.ts.map +1 -1
- package/dist/core/session-failure-cause.js +15 -3
- package/dist/core/session-failure-cause.js.map +1 -1
- package/dist/core/session-prompt-lifecycle.d.ts +25 -0
- package/dist/core/session-prompt-lifecycle.d.ts.map +1 -0
- package/dist/core/session-prompt-lifecycle.js +87 -0
- package/dist/core/session-prompt-lifecycle.js.map +1 -0
- package/dist/core/session-run-budget.d.ts +28 -0
- package/dist/core/session-run-budget.d.ts.map +1 -0
- package/dist/core/session-run-budget.js +127 -0
- package/dist/core/session-run-budget.js.map +1 -0
- package/dist/core/session-run-termination.d.ts +18 -0
- package/dist/core/session-run-termination.d.ts.map +1 -0
- package/dist/core/session-run-termination.js +72 -0
- package/dist/core/session-run-termination.js.map +1 -0
- package/dist/core/session-termination-types.d.ts +97 -0
- package/dist/core/session-termination-types.d.ts.map +1 -0
- package/dist/core/session-termination-types.js +26 -0
- package/dist/core/session-termination-types.js.map +1 -0
- package/dist/core/session-termination.d.ts +3 -97
- package/dist/core/session-termination.d.ts.map +1 -1
- package/dist/core/session-termination.js +25 -29
- package/dist/core/session-termination.js.map +1 -1
- package/dist/core/skill-selector.d.ts +40 -0
- package/dist/core/skill-selector.d.ts.map +1 -0
- package/dist/core/skill-selector.js +102 -0
- package/dist/core/skill-selector.js.map +1 -0
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +1 -0
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/subagent-lane-launcher.d.ts +3 -2
- package/dist/core/subagent-lane-launcher.d.ts.map +1 -1
- package/dist/core/subagent-lane-launcher.js +24 -13
- package/dist/core/subagent-lane-launcher.js.map +1 -1
- package/dist/core/tools/render-utils.d.ts.map +1 -1
- package/dist/core/tools/render-utils.js +2 -4
- package/dist/core/tools/render-utils.js.map +1 -1
- package/dist/core/turn-metrics-record.d.ts +55 -0
- package/dist/core/turn-metrics-record.d.ts.map +1 -0
- package/dist/core/turn-metrics-record.js +149 -0
- package/dist/core/turn-metrics-record.js.map +1 -0
- package/dist/core/turn-metrics.d.ts +4 -56
- package/dist/core/turn-metrics.d.ts.map +1 -1
- package/dist/core/turn-metrics.js +12 -60
- package/dist/core/turn-metrics.js.map +1 -1
- package/dist/core/verified-run/broker.d.ts +26 -0
- package/dist/core/verified-run/broker.d.ts.map +1 -0
- package/dist/core/verified-run/broker.js +210 -0
- package/dist/core/verified-run/broker.js.map +1 -0
- package/dist/core/verified-run/candidate.d.ts +24 -0
- package/dist/core/verified-run/candidate.d.ts.map +1 -0
- package/dist/core/verified-run/candidate.js +167 -0
- package/dist/core/verified-run/candidate.js.map +1 -0
- package/dist/core/verified-run/check-receipt.d.ts +18 -0
- package/dist/core/verified-run/check-receipt.d.ts.map +1 -0
- package/dist/core/verified-run/check-receipt.js +92 -0
- package/dist/core/verified-run/check-receipt.js.map +1 -0
- package/dist/core/verified-run/coordinator.d.ts +39 -0
- package/dist/core/verified-run/coordinator.d.ts.map +1 -0
- package/dist/core/verified-run/coordinator.js +190 -0
- package/dist/core/verified-run/coordinator.js.map +1 -0
- package/dist/core/verified-run/dag-candidates.d.ts +8 -0
- package/dist/core/verified-run/dag-candidates.d.ts.map +1 -0
- package/dist/core/verified-run/dag-candidates.js +65 -0
- package/dist/core/verified-run/dag-candidates.js.map +1 -0
- package/dist/core/verified-run/dag-phase.d.ts +7 -0
- package/dist/core/verified-run/dag-phase.d.ts.map +1 -0
- package/dist/core/verified-run/dag-phase.js +92 -0
- package/dist/core/verified-run/dag-phase.js.map +1 -0
- package/dist/core/verified-run/dag-projection.d.ts +7 -0
- package/dist/core/verified-run/dag-projection.d.ts.map +1 -0
- package/dist/core/verified-run/dag-projection.js +90 -0
- package/dist/core/verified-run/dag-projection.js.map +1 -0
- package/dist/core/verified-run/dag-recovery.d.ts +13 -0
- package/dist/core/verified-run/dag-recovery.d.ts.map +1 -0
- package/dist/core/verified-run/dag-recovery.js +98 -0
- package/dist/core/verified-run/dag-recovery.js.map +1 -0
- package/dist/core/verified-run/dag-retry-projection.d.ts +9 -0
- package/dist/core/verified-run/dag-retry-projection.d.ts.map +1 -0
- package/dist/core/verified-run/dag-retry-projection.js +43 -0
- package/dist/core/verified-run/dag-retry-projection.js.map +1 -0
- package/dist/core/verified-run/dag-types.d.ts +47 -0
- package/dist/core/verified-run/dag-types.d.ts.map +1 -0
- package/dist/core/verified-run/dag-types.js +2 -0
- package/dist/core/verified-run/dag-types.js.map +1 -0
- package/dist/core/verified-run/event-parser.d.ts +3 -0
- package/dist/core/verified-run/event-parser.d.ts.map +1 -0
- package/dist/core/verified-run/event-parser.js +153 -0
- package/dist/core/verified-run/event-parser.js.map +1 -0
- package/dist/core/verified-run/events.d.ts +4 -0
- package/dist/core/verified-run/events.d.ts.map +1 -0
- package/dist/core/verified-run/events.js +3 -0
- package/dist/core/verified-run/events.js.map +1 -0
- package/dist/core/verified-run/evidence-binding.d.ts +18 -0
- package/dist/core/verified-run/evidence-binding.d.ts.map +1 -0
- package/dist/core/verified-run/evidence-binding.js +81 -0
- package/dist/core/verified-run/evidence-binding.js.map +1 -0
- package/dist/core/verified-run/evidence.d.ts +27 -0
- package/dist/core/verified-run/evidence.d.ts.map +1 -0
- package/dist/core/verified-run/evidence.js +100 -0
- package/dist/core/verified-run/evidence.js.map +1 -0
- package/dist/core/verified-run/journal.d.ts +32 -0
- package/dist/core/verified-run/journal.d.ts.map +1 -0
- package/dist/core/verified-run/journal.js +103 -0
- package/dist/core/verified-run/journal.js.map +1 -0
- package/dist/core/verified-run/namespace-identity.d.ts +11 -0
- package/dist/core/verified-run/namespace-identity.d.ts.map +1 -0
- package/dist/core/verified-run/namespace-identity.js +77 -0
- package/dist/core/verified-run/namespace-identity.js.map +1 -0
- package/dist/core/verified-run/owned-execution.d.ts +21 -0
- package/dist/core/verified-run/owned-execution.d.ts.map +1 -0
- package/dist/core/verified-run/owned-execution.js +43 -0
- package/dist/core/verified-run/owned-execution.js.map +1 -0
- package/dist/core/verified-run/phase-context.d.ts +9 -0
- package/dist/core/verified-run/phase-context.d.ts.map +1 -0
- package/dist/core/verified-run/phase-context.js +2 -0
- package/dist/core/verified-run/phase-context.js.map +1 -0
- package/dist/core/verified-run/process-gate.d.ts +5 -0
- package/dist/core/verified-run/process-gate.d.ts.map +1 -0
- package/dist/core/verified-run/process-gate.js +31 -0
- package/dist/core/verified-run/process-gate.js.map +1 -0
- package/dist/core/verified-run/projection.d.ts +4 -0
- package/dist/core/verified-run/projection.d.ts.map +1 -0
- package/dist/core/verified-run/projection.js +219 -0
- package/dist/core/verified-run/projection.js.map +1 -0
- package/dist/core/verified-run/recovery-clock.d.ts +19 -0
- package/dist/core/verified-run/recovery-clock.d.ts.map +1 -0
- package/dist/core/verified-run/recovery-clock.js +69 -0
- package/dist/core/verified-run/recovery-clock.js.map +1 -0
- package/dist/core/verified-run/recovery-command.d.ts +11 -0
- package/dist/core/verified-run/recovery-command.d.ts.map +1 -0
- package/dist/core/verified-run/recovery-command.js +73 -0
- package/dist/core/verified-run/recovery-command.js.map +1 -0
- package/dist/core/verified-run/recovery-projection.d.ts +12 -0
- package/dist/core/verified-run/recovery-projection.d.ts.map +1 -0
- package/dist/core/verified-run/recovery-projection.js +88 -0
- package/dist/core/verified-run/recovery-projection.js.map +1 -0
- package/dist/core/verified-run/recovery.d.ts +12 -0
- package/dist/core/verified-run/recovery.d.ts.map +1 -0
- package/dist/core/verified-run/recovery.js +115 -0
- package/dist/core/verified-run/recovery.js.map +1 -0
- package/dist/core/verified-run/run-types.d.ts +103 -0
- package/dist/core/verified-run/run-types.d.ts.map +1 -0
- package/dist/core/verified-run/run-types.js +2 -0
- package/dist/core/verified-run/run-types.js.map +1 -0
- package/dist/core/verified-run/scripted-writer.d.ts +15 -0
- package/dist/core/verified-run/scripted-writer.d.ts.map +1 -0
- package/dist/core/verified-run/scripted-writer.js +94 -0
- package/dist/core/verified-run/scripted-writer.js.map +1 -0
- package/dist/core/verified-run/session-port.d.ts +27 -0
- package/dist/core/verified-run/session-port.d.ts.map +1 -0
- package/dist/core/verified-run/session-port.js +2 -0
- package/dist/core/verified-run/session-port.js.map +1 -0
- package/dist/core/verified-run/storage.d.ts +15 -0
- package/dist/core/verified-run/storage.d.ts.map +1 -0
- package/dist/core/verified-run/storage.js +96 -0
- package/dist/core/verified-run/storage.js.map +1 -0
- package/dist/core/verified-run/verification-phase.d.ts +5 -0
- package/dist/core/verified-run/verification-phase.d.ts.map +1 -0
- package/dist/core/verified-run/verification-phase.js +56 -0
- package/dist/core/verified-run/verification-phase.js.map +1 -0
- package/dist/core/verified-run/work-recovery.d.ts +8 -0
- package/dist/core/verified-run/work-recovery.d.ts.map +1 -0
- package/dist/core/verified-run/work-recovery.js +44 -0
- package/dist/core/verified-run/work-recovery.js.map +1 -0
- package/dist/core/verified-run/writer-completion.d.ts +4 -0
- package/dist/core/verified-run/writer-completion.d.ts.map +1 -0
- package/dist/core/verified-run/writer-completion.js +27 -0
- package/dist/core/verified-run/writer-completion.js.map +1 -0
- package/dist/core/verified-run/writer-phase.d.ts +8 -0
- package/dist/core/verified-run/writer-phase.d.ts.map +1 -0
- package/dist/core/verified-run/writer-phase.js +76 -0
- package/dist/core/verified-run/writer-phase.js.map +1 -0
- package/dist/core/verified-run/writer-projection.d.ts +11 -0
- package/dist/core/verified-run/writer-projection.d.ts.map +1 -0
- package/dist/core/verified-run/writer-projection.js +70 -0
- package/dist/core/verified-run/writer-projection.js.map +1 -0
- package/dist/core/verified-run/writer-recovery.d.ts +16 -0
- package/dist/core/verified-run/writer-recovery.d.ts.map +1 -0
- package/dist/core/verified-run/writer-recovery.js +107 -0
- package/dist/core/verified-run/writer-recovery.js.map +1 -0
- package/dist/core/workload-permit-pool.d.ts +1 -3
- package/dist/core/workload-permit-pool.d.ts.map +1 -1
- package/dist/core/workload-permit-pool.js +11 -11
- package/dist/core/workload-permit-pool.js.map +1 -1
- package/dist/guardrails/evidence-system.d.ts +1 -1
- package/dist/guardrails/evidence-system.d.ts.map +1 -1
- package/dist/guardrails/evidence-system.js +18 -29
- package/dist/guardrails/evidence-system.js.map +1 -1
- package/dist/guardrails/merge-gate-result.d.ts +4 -0
- package/dist/guardrails/merge-gate-result.d.ts.map +1 -0
- package/dist/guardrails/merge-gate-result.js +32 -0
- package/dist/guardrails/merge-gate-result.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +17 -23
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/session-failure.d.ts +13 -0
- package/dist/modes/interactive/components/session-failure.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-failure.js +81 -0
- package/dist/modes/interactive/components/session-failure.js.map +1 -0
- package/dist/modes/interactive/interactive-login-options.d.ts +27 -0
- package/dist/modes/interactive/interactive-login-options.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-login-options.js +54 -0
- package/dist/modes/interactive/interactive-login-options.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +8 -4
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +183 -171
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/interactive-resume-command.d.ts +3 -0
- package/dist/modes/interactive/interactive-resume-command.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-resume-command.js +24 -0
- package/dist/modes/interactive/interactive-resume-command.js.map +1 -0
- package/dist/modes/interactive/interactive-tool-result.d.ts +32 -0
- package/dist/modes/interactive/interactive-tool-result.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-tool-result.js +59 -0
- package/dist/modes/interactive/interactive-tool-result.js.map +1 -0
- package/dist/modes/interactive/tui-diagnostics.d.ts +36 -0
- package/dist/modes/interactive/tui-diagnostics.d.ts.map +1 -0
- package/dist/modes/interactive/tui-diagnostics.js +105 -0
- package/dist/modes/interactive/tui-diagnostics.js.map +1 -0
- package/dist/modes/interactive/tui-runtime-info.d.ts +20 -0
- package/dist/modes/interactive/tui-runtime-info.d.ts.map +1 -0
- package/dist/modes/interactive/tui-runtime-info.js +76 -0
- package/dist/modes/interactive/tui-runtime-info.js.map +1 -0
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +22 -0
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/utils/clipboard-image.d.ts.map +1 -1
- package/dist/utils/clipboard-image.js +10 -60
- package/dist/utils/clipboard-image.js.map +1 -1
- package/dist/utils/terminal-links.d.ts +13 -0
- package/dist/utils/terminal-links.d.ts.map +1 -0
- package/dist/utils/terminal-links.js +68 -0
- package/dist/utils/terminal-links.js.map +1 -0
- package/dist/utils/windows-clipboard-image.d.ts +16 -0
- package/dist/utils/windows-clipboard-image.d.ts.map +1 -0
- package/dist/utils/windows-clipboard-image.js +87 -0
- package/dist/utils/windows-clipboard-image.js.map +1 -0
- package/docs/adaptorch-onboarding.md +80 -0
- package/docs/containerization.md +12 -0
- package/docs/context-files.md +97 -0
- package/docs/correctness-wall.md +8 -0
- package/docs/custom-provider.md +35 -0
- package/docs/development.md +28 -3
- package/docs/environment-variables.md +2 -0
- package/docs/grok-harness.md +4 -0
- package/docs/harness-boundaries.md +154 -0
- package/docs/harness-improvements.md +90 -0
- package/docs/json.md +19 -0
- package/docs/keybindings.md +2 -2
- package/docs/mcp.md +22 -2
- package/docs/metrics.md +66 -16
- package/docs/model-catalog-refresh.md +190 -0
- package/docs/model-contract.md +168 -0
- package/docs/models.md +21 -4
- package/docs/provider-resilience.md +5 -3
- package/docs/providers.md +68 -1
- package/docs/quickstart.md +4 -0
- package/docs/release-audit-0.98.4.md +112 -0
- package/docs/release-audit-0.98.5.md +84 -0
- package/docs/review-bundle-followup.md +195 -0
- package/docs/run-protocol.md +33 -1
- package/docs/runtime-algorithms.md +45 -0
- package/docs/sdk.md +204 -2
- package/docs/sessions.md +1 -1
- package/docs/settings.md +17 -1
- package/docs/skills.md +2 -0
- package/docs/tb21-audit.md +131 -0
- package/docs/terminal-setup.md +20 -0
- package/docs/usage.md +77 -1
- package/docs/verified-run-testing.md +417 -0
- package/docs/verified-run.md +388 -0
- package/docs/windows.md +48 -0
- package/examples/README.md +4 -0
- package/examples/context/AGENTS.md +64 -0
- package/examples/context/CLAUDE.md +17 -0
- package/examples/context/INTERNET.md +42 -0
- 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/package.json +1 -1
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/npm-shrinkwrap.json +18 -18
- package/package.json +6 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-budget-token-counter.js","sourceRoot":"","sources":["../../src/core/context-budget-token-counter.ts"],"names":[],"mappings":"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","sourcesContent":["import { createRequire } from \"node:module\";\n\nexport type ContextBudgetTokenCountMethod = \"exact\" | \"estimated\";\nexport type ContextBudgetTokenConfidence = \"high\" | \"medium\" | \"low\";\nexport type ContextBudgetTokenizerMode = \"auto\" | \"fallback\" | \"openai-js\" | \"openai-wasm\";\n\nexport interface TokenCountResult {\n\treadonly tokens: number;\n\treadonly method: ContextBudgetTokenCountMethod;\n\treadonly confidence: ContextBudgetTokenConfidence;\n\treadonly adapterId: string;\n\treadonly modelId: string;\n\treadonly notes: readonly string[];\n}\n\nexport interface TokenCounterAdapter {\n\treadonly id: string;\n\treadonly priority: number;\n\tisAvailable(): boolean;\n\tsupports(modelId: string): boolean;\n\tcountText(input: string, modelId: string): TokenCountResult;\n}\n\nexport interface OptionalModuleLoader {\n\tresolve(specifier: string): string | undefined;\n\tload(specifier: string): unknown;\n}\n\nexport interface TokenCounterRegistryOptions {\n\treadonly adapters?: readonly TokenCounterAdapter[];\n\treadonly fallback?: TokenCounterAdapter;\n}\n\ninterface EncodeCapable {\n\tencode(input: string): readonly unknown[];\n}\n\ninterface JsTiktokenModule {\n\tencodingForModel?: (modelId: string) => EncodeCapable;\n\tgetEncoding?: (encoding: string) => EncodeCapable;\n}\n\ninterface GenericEncodeModule {\n\tencode?: (input: string) => readonly unknown[];\n}\n\nconst requireModule = createRequire(import.meta.url);\n\nexport function createNodeOptionalModuleLoader(): OptionalModuleLoader {\n\treturn {\n\t\tresolve(specifier) {\n\t\t\ttry {\n\t\t\t\treturn requireModule.resolve(specifier);\n\t\t\t} catch {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t},\n\t\tload(specifier) {\n\t\t\treturn requireModule(specifier) as unknown;\n\t\t},\n\t};\n}\n\nexport function createFallbackTokenCounter(): TokenCounterAdapter {\n\treturn {\n\t\tid: \"fallback-estimator\",\n\t\tpriority: 0,\n\t\tisAvailable: () => true,\n\t\tsupports: () => true,\n\t\tcountText(input, modelId) {\n\t\t\treturn estimateTextTokens(input, modelId);\n\t\t},\n\t};\n}\n\nexport function estimateTextTokens(input: string, modelId = \"unknown\"): TokenCountResult {\n\tif (input.length === 0) {\n\t\treturn createTokenResult(0, \"estimated\", \"medium\", \"fallback-estimator\", modelId, [\"empty-input\"]);\n\t}\n\n\tlet asciiWord = 0;\n\tlet whitespace = 0;\n\tlet cjk = 0;\n\tlet hangul = 0;\n\tlet kana = 0;\n\tlet emojiOrWide = 0;\n\tlet punctuation = 0;\n\tlet other = 0;\n\n\tfor (const char of input) {\n\t\tconst codePoint = char.codePointAt(0) ?? 0;\n\t\tif (/\\s/u.test(char)) {\n\t\t\twhitespace += 1;\n\t\t} else if (isHangul(codePoint)) {\n\t\t\thangul += 1;\n\t\t} else if (isHiraganaOrKatakana(codePoint)) {\n\t\t\tkana += 1;\n\t\t} else if (isCjkIdeograph(codePoint)) {\n\t\t\tcjk += 1;\n\t\t} else if (isAsciiAlphaNumeric(codePoint) || char === \"_\") {\n\t\t\tasciiWord += 1;\n\t\t} else if (isEmojiOrWideSymbol(codePoint)) {\n\t\t\temojiOrWide += 1;\n\t\t} else if (isAsciiPunctuation(codePoint)) {\n\t\t\tpunctuation += 1;\n\t\t} else {\n\t\t\tother += 1;\n\t\t}\n\t}\n\n\tconst codeLike = looksCodeLike(input, punctuation, whitespace);\n\tconst jsonLike = looksJsonLike(input);\n\tconst nonAsciiRatio = (hangul + cjk + kana + emojiOrWide + other) / Math.max(1, input.length);\n\tconst base =\n\t\tasciiWord / (codeLike ? 3.2 : 4) +\n\t\twhitespace / 12 +\n\t\tpunctuation / 2.1 +\n\t\thangul / 0.95 +\n\t\tkana / 1.0 +\n\t\tcjk / 1.2 +\n\t\temojiOrWide * 1.8 +\n\t\tother / 2;\n\tconst adjusted = base * (jsonLike ? 1.12 : 1) * (codeLike ? 1.08 : 1);\n\tconst tokens = Math.max(1, Math.ceil(adjusted));\n\tconst compositionParts: string[] = [];\n\tif (hangul > 0) compositionParts.push(`hangul:${hangul}`);\n\tif (kana > 0) compositionParts.push(`kana:${kana}`);\n\tif (cjk > 0) compositionParts.push(`cjk:${cjk}`);\n\tif (asciiWord > 0) compositionParts.push(`ascii:${asciiWord}`);\n\tif (emojiOrWide > 0) compositionParts.push(`emoji:${emojiOrWide}`);\n\tconst notes = [\n\t\tcodeLike ? \"code-like\" : \"prose-like\",\n\t\tjsonLike ? \"json-like\" : \"not-json-like\",\n\t\tnonAsciiRatio > 0 ? `non-ascii:${(nonAsciiRatio * 100).toFixed(0)}%` : \"latin-only\",\n\t\t`composition(${compositionParts.join(\",\")})`,\n\t];\n\tconst confidence: ContextBudgetTokenConfidence =\n\t\tnonAsciiRatio > 0.4 ? \"low\" : nonAsciiRatio > 0.15 ? \"medium\" : \"high\";\n\treturn createTokenResult(tokens, \"estimated\", confidence, \"fallback-estimator\", modelId, notes);\n}\n\nexport function createOpenAiJsTokenCounter(\n\tloader: OptionalModuleLoader = createNodeOptionalModuleLoader(),\n): TokenCounterAdapter {\n\tconst packageNames = [\"js-tiktoken\", \"gpt-tokenizer\", \"tiktoken\"] as const;\n\treturn {\n\t\tid: \"openai-bpe-js\",\n\t\tpriority: 80,\n\t\tisAvailable() {\n\t\t\treturn packageNames.some((specifier) => loader.resolve(specifier) !== undefined);\n\t\t},\n\t\tsupports(modelId) {\n\t\t\treturn isOpenAiStyleModel(modelId);\n\t\t},\n\t\tcountText(input, modelId) {\n\t\t\tfor (const specifier of packageNames) {\n\t\t\t\tif (loader.resolve(specifier) === undefined) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst result = countWithOptionalTokenizerModule(loader.load(specifier), specifier, input, modelId);\n\t\t\t\tif (result !== undefined) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow new Error(\"no supported OpenAI JS tokenizer module shape found\");\n\t\t},\n\t};\n}\n\nexport function createOpenAiWasmTokenCounter(\n\tloader: OptionalModuleLoader = createNodeOptionalModuleLoader(),\n): TokenCounterAdapter {\n\tconst packageNames = [\"@dqbd/tiktoken\", \"tiktoken\"] as const;\n\treturn {\n\t\tid: \"openai-bpe-wasm\",\n\t\tpriority: 90,\n\t\tisAvailable() {\n\t\t\treturn packageNames.some((specifier) => loader.resolve(specifier) !== undefined);\n\t\t},\n\t\tsupports(modelId) {\n\t\t\treturn isOpenAiStyleModel(modelId);\n\t\t},\n\t\tcountText(input, modelId) {\n\t\t\tfor (const specifier of packageNames) {\n\t\t\t\tif (loader.resolve(specifier) === undefined) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst result = countWithOptionalTokenizerModule(loader.load(specifier), specifier, input, modelId);\n\t\t\t\tif (result !== undefined) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow new Error(\"no supported OpenAI WASM tokenizer module shape found\");\n\t\t},\n\t};\n}\n\nexport function createTokenCounterForMode(\n\tmode: ContextBudgetTokenizerMode,\n\tloader: OptionalModuleLoader = createNodeOptionalModuleLoader(),\n): TokenCounterAdapter {\n\tconst fallback = createFallbackTokenCounter();\n\tif (mode === \"fallback\") {\n\t\treturn fallback;\n\t}\n\tconst adapters =\n\t\tmode === \"openai-wasm\" ? [createOpenAiWasmTokenCounter(loader)] : [createOpenAiJsTokenCounter(loader)];\n\tif (mode === \"auto\") {\n\t\tadapters.push(createOpenAiWasmTokenCounter(loader));\n\t}\n\treturn createTokenCounterRegistry({ adapters, fallback });\n}\n\nexport function createTokenCounterRegistry(options: TokenCounterRegistryOptions = {}): TokenCounterAdapter {\n\tconst fallback = options.fallback ?? createFallbackTokenCounter();\n\tconst adapters = [...(options.adapters ?? [])].sort((a, b) => b.priority - a.priority || a.id.localeCompare(b.id));\n\treturn {\n\t\tid: \"token-counter-registry\",\n\t\tpriority: 100,\n\t\tisAvailable: () => true,\n\t\tsupports: () => true,\n\t\tcountText(input, modelId) {\n\t\t\tconst notes: string[] = [];\n\t\t\tfor (const adapter of adapters) {\n\t\t\t\tif (!adapter.supports(modelId)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tif (!adapter.isAvailable()) {\n\t\t\t\t\t\tnotes.push(`${adapter.id}:unavailable`);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\treturn adapter.countText(input, modelId);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconst message = error instanceof Error ? error.message : \"unknown adapter failure\";\n\t\t\t\t\tnotes.push(`${adapter.id}:failed:${message}`);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst result = fallback.countText(input, modelId);\n\t\t\treturn { ...result, notes: [...notes, ...result.notes] };\n\t\t},\n\t};\n}\n\nfunction countWithOptionalTokenizerModule(\n\tmoduleValue: unknown,\n\tspecifier: string,\n\tinput: string,\n\tmodelId: string,\n): TokenCountResult | undefined {\n\tconst moduleObject = unwrapDefaultModule(moduleValue);\n\tconst jsTiktoken = moduleObject as JsTiktokenModule;\n\tif (typeof jsTiktoken.encodingForModel === \"function\") {\n\t\tconst encoding = jsTiktoken.encodingForModel(modelId);\n\t\treturn countWithEncoding(encoding, specifier, input, modelId, \"model-encoding\");\n\t}\n\tif (typeof jsTiktoken.getEncoding === \"function\") {\n\t\tconst encoding = jsTiktoken.getEncoding(selectOpenAiEncoding(modelId));\n\t\treturn countWithEncoding(encoding, specifier, input, modelId, \"fallback-encoding\");\n\t}\n\tconst generic = moduleObject as GenericEncodeModule;\n\tif (typeof generic.encode === \"function\") {\n\t\treturn createTokenResult(generic.encode(input).length, \"exact\", \"medium\", specifier, modelId, [\"generic-encode\"]);\n\t}\n\treturn undefined;\n}\n\nfunction countWithEncoding(\n\tencoding: EncodeCapable,\n\tadapterId: string,\n\tinput: string,\n\tmodelId: string,\n\tnote: string,\n): TokenCountResult {\n\treturn createTokenResult(encoding.encode(input).length, \"exact\", \"high\", adapterId, modelId, [note]);\n}\n\nfunction unwrapDefaultModule(moduleValue: unknown): unknown {\n\tif (moduleValue && typeof moduleValue === \"object\" && \"default\" in moduleValue) {\n\t\treturn (moduleValue as { readonly default: unknown }).default;\n\t}\n\treturn moduleValue;\n}\n\nfunction createTokenResult(\n\ttokens: number,\n\tmethod: ContextBudgetTokenCountMethod,\n\tconfidence: ContextBudgetTokenConfidence,\n\tadapterId: string,\n\tmodelId: string,\n\tnotes: readonly string[],\n): TokenCountResult {\n\treturn {\n\t\ttokens: Math.max(0, Math.ceil(tokens)),\n\t\tmethod,\n\t\tconfidence,\n\t\tadapterId,\n\t\tmodelId,\n\t\tnotes,\n\t};\n}\n\nfunction isOpenAiStyleModel(modelId: string): boolean {\n\tconst normalized = modelId.toLowerCase();\n\treturn (\n\t\tnormalized.includes(\"openai\") ||\n\t\tnormalized.startsWith(\"gpt-\") ||\n\t\tnormalized.startsWith(\"o1\") ||\n\t\tnormalized.startsWith(\"o3\") ||\n\t\tnormalized.startsWith(\"o4\") ||\n\t\tnormalized.includes(\"chatgpt\")\n\t);\n}\n\nfunction selectOpenAiEncoding(modelId: string): string {\n\tconst normalized = modelId.toLowerCase();\n\tif (normalized.includes(\"gpt-4o\") || normalized.includes(\"gpt-5\") || normalized.startsWith(\"o\")) {\n\t\treturn \"o200k_base\";\n\t}\n\treturn \"cl100k_base\";\n}\n\nfunction isAsciiAlphaNumeric(codePoint: number): boolean {\n\treturn (\n\t\t(codePoint >= 48 && codePoint <= 57) ||\n\t\t(codePoint >= 65 && codePoint <= 90) ||\n\t\t(codePoint >= 97 && codePoint <= 122)\n\t);\n}\n\nfunction isAsciiPunctuation(codePoint: number): boolean {\n\treturn codePoint >= 33 && codePoint <= 126;\n}\n\nfunction isHangul(codePoint: number): boolean {\n\t// Composed syllables (가-힣)\n\tif (codePoint >= 0xac00 && codePoint <= 0xd7af) return true;\n\t// Jamo: initial (ㄱ-ㅎ), medial (ㅏ-ㅣ)\n\tif (codePoint >= 0x1100 && codePoint <= 0x11ff) return true;\n\t// Compatibility jamo (ㄱ-ㅎ, ㅏ-ㅣ) and Hangul letters\n\tif (codePoint >= 0x3130 && codePoint <= 0x318f) return true;\n\t// Extended jamo\n\tif (codePoint >= 0xa960 && codePoint <= 0xa97c) return true;\n\treturn false;\n}\n\nfunction isHiraganaOrKatakana(codePoint: number): boolean {\n\t// Hiragana (ぁ-より)\n\tif (codePoint >= 0x3040 && codePoint <= 0x309f) return true;\n\t// Katakana (ァ-ヿ) + halfwidth katakana\n\tif (codePoint >= 0x30a0 && codePoint <= 0x30ff) return true;\n\tif (codePoint >= 0xff65 && codePoint <= 0xff9f) return true;\n\treturn false;\n}\n\nfunction isCjkIdeograph(codePoint: number): boolean {\n\t// CJK Unified Ideographs (main block: 中, 国, etc.)\n\tif (codePoint >= 0x4e00 && codePoint <= 0x9fff) return true;\n\t// CJK Extension A (rare)\n\tif (codePoint >= 0x3400 && codePoint <= 0x4dbf) return true;\n\t// CJK compatibility ideographs\n\tif (codePoint >= 0xf900 && codePoint <= 0xfaff) return true;\n\treturn false;\n}\n\nfunction isEmojiOrWideSymbol(codePoint: number): boolean {\n\t// Main emoji blocks\n\tif (codePoint >= 0x1f000) return true;\n\t// Misc symbols, dingbats\n\tif (codePoint >= 0x2600 && codePoint <= 0x27bf) return true;\n\t// CJK fullwidth/special forms that occupy double width\n\tif (codePoint >= 0xff01 && codePoint <= 0xff60) return true;\n\tif (codePoint >= 0xffe0 && codePoint <= 0xffe6) return true;\n\treturn false;\n}\n\nfunction looksJsonLike(input: string): boolean {\n\tconst trimmed = input.trim();\n\treturn (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) || (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\"));\n}\n\nfunction looksCodeLike(input: string, punctuation: number, whitespace: number): boolean {\n\tif (/\\b(function|const|let|class|interface|import|export|return|async|await)\\b/.test(input)) {\n\t\treturn true;\n\t}\n\treturn punctuation > input.length / 8 && whitespace > input.length / 20;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"context-budget-token-counter.js","sourceRoot":"","sources":["../../src/core/context-budget-token-counter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AA2B5C,MAAM,aAAa,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;AAErD,MAAM,UAAU,8BAA8B,GAAyB;IACtE,OAAO;QACN,OAAO,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC;gBACJ,OAAO,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACzC,CAAC;YAAC,MAAM,CAAC;gBACR,OAAO,SAAS,CAAC;YAClB,CAAC;QAAA,CACD;QACD,IAAI,CAAC,SAAS,EAAE;YACf,OAAO,aAAa,CAAC,SAAS,CAAY,CAAC;QAAA,CAC3C;KACD,CAAC;AAAA,CACF;AAED,MAAM,UAAU,0BAA0B,GAAwB;IACjE,OAAO;QACN,EAAE,EAAE,oBAAoB;QACxB,QAAQ,EAAE,CAAC;QACX,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI;QACvB,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI;QACpB,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE;YACzB,OAAO,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAAA,CAC1C;KACD,CAAC;AAAA,CACF;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAa,EAAE,OAAO,GAAG,SAAS,EAAoB;IACxF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,iBAAiB,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,oBAAoB,EAAE,OAAO,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IACpG,CAAC;IAED,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,UAAU,IAAI,CAAC,CAAC;QACjB,CAAC;aAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,CAAC,CAAC;QACb,CAAC;aAAM,IAAI,oBAAoB,CAAC,SAAS,CAAC,EAAE,CAAC;YAC5C,IAAI,IAAI,CAAC,CAAC;QACX,CAAC;aAAM,IAAI,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC;YACtC,GAAG,IAAI,CAAC,CAAC;QACV,CAAC;aAAM,IAAI,mBAAmB,CAAC,SAAS,CAAC,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YAC3D,SAAS,IAAI,CAAC,CAAC;QAChB,CAAC;aAAM,IAAI,mBAAmB,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3C,WAAW,IAAI,CAAC,CAAC;QAClB,CAAC;aAAM,IAAI,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1C,WAAW,IAAI,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACP,KAAK,IAAI,CAAC,CAAC;QACZ,CAAC;IACF,CAAC;IAED,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,aAAa,GAAG,CAAC,MAAM,GAAG,GAAG,GAAG,IAAI,GAAG,WAAW,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC9F,MAAM,IAAI,GACT,SAAS,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,UAAU,GAAG,EAAE;QACf,WAAW,GAAG,GAAG;QACjB,MAAM,GAAG,IAAI;QACb,IAAI,GAAG,GAAG;QACV,GAAG,GAAG,GAAG;QACT,WAAW,GAAG,GAAG;QACjB,KAAK,GAAG,CAAC,CAAC;IACX,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAChD,MAAM,gBAAgB,GAAa,EAAE,CAAC;IACtC,IAAI,MAAM,GAAG,CAAC;QAAE,gBAAgB,CAAC,IAAI,CAAC,UAAU,MAAM,EAAE,CAAC,CAAC;IAC1D,IAAI,IAAI,GAAG,CAAC;QAAE,gBAAgB,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IACpD,IAAI,GAAG,GAAG,CAAC;QAAE,gBAAgB,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACjD,IAAI,SAAS,GAAG,CAAC;QAAE,gBAAgB,CAAC,IAAI,CAAC,SAAS,SAAS,EAAE,CAAC,CAAC;IAC/D,IAAI,WAAW,GAAG,CAAC;QAAE,gBAAgB,CAAC,IAAI,CAAC,SAAS,WAAW,EAAE,CAAC,CAAC;IACnE,MAAM,KAAK,GAAG;QACb,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY;QACrC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,eAAe;QACxC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,aAAa,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY;QACnF,eAAe,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG;KAC5C,CAAC;IACF,MAAM,UAAU,GACf,aAAa,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;IACxE,OAAO,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,oBAAoB,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AAAA,CAChG;AAED,MAAM,UAAU,0BAA0B,CACzC,MAAM,GAAyB,8BAA8B,EAAE,EACzC;IACtB,MAAM,YAAY,GAAG,CAAC,aAAa,EAAE,eAAe,EAAE,UAAU,CAAU,CAAC;IAC3E,OAAO;QACN,EAAE,EAAE,eAAe;QACnB,QAAQ,EAAE,EAAE;QACZ,WAAW,GAAG;YACb,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,SAAS,CAAC,CAAC;QAAA,CACjF;QACD,QAAQ,CAAC,OAAO,EAAE;YACjB,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAAA,CACnC;QACD,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE;YACzB,KAAK,MAAM,SAAS,IAAI,YAAY,EAAE,CAAC;gBACtC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,SAAS,EAAE,CAAC;oBAC7C,SAAS;gBACV,CAAC;gBACD,MAAM,MAAM,GAAG,gCAAgC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;gBACnG,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBAC1B,OAAO,MAAM,CAAC;gBACf,CAAC;YACF,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QAAA,CACvE;KACD,CAAC;AAAA,CACF;AAED,MAAM,UAAU,4BAA4B,CAC3C,MAAM,GAAyB,8BAA8B,EAAE,EACzC;IACtB,MAAM,YAAY,GAAG,CAAC,gBAAgB,EAAE,UAAU,CAAU,CAAC;IAC7D,OAAO;QACN,EAAE,EAAE,iBAAiB;QACrB,QAAQ,EAAE,EAAE;QACZ,WAAW,GAAG;YACb,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,SAAS,CAAC,CAAC;QAAA,CACjF;QACD,QAAQ,CAAC,OAAO,EAAE;YACjB,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAAA,CACnC;QACD,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE;YACzB,KAAK,MAAM,SAAS,IAAI,YAAY,EAAE,CAAC;gBACtC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,SAAS,EAAE,CAAC;oBAC7C,SAAS;gBACV,CAAC;gBACD,MAAM,MAAM,GAAG,gCAAgC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;gBACnG,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBAC1B,OAAO,MAAM,CAAC;gBACf,CAAC;YACF,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAAA,CACzE;KACD,CAAC;AAAA,CACF;AAED,MAAM,UAAU,yBAAyB,CACxC,IAAgC,EAChC,MAAM,GAAyB,8BAA8B,EAAE,EACzC;IACtB,MAAM,QAAQ,GAAG,0BAA0B,EAAE,CAAC;IAC9C,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACzB,OAAO,QAAQ,CAAC;IACjB,CAAC;IACD,MAAM,QAAQ,GACb,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,CAAC,4BAA4B,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC,CAAC;IACxG,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACrB,QAAQ,CAAC,IAAI,CAAC,4BAA4B,CAAC,MAAM,CAAC,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,0BAA0B,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;AAAA,CAC1D;AAED,MAAM,UAAU,0BAA0B,CAAC,OAAO,GAAgC,EAAE,EAAuB;IAC1G,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,0BAA0B,EAAE,CAAC;IAClE,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnH,OAAO;QACN,EAAE,EAAE,wBAAwB;QAC5B,QAAQ,EAAE,GAAG;QACb,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI;QACvB,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI;QACpB,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE;YACzB,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAChC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBAChC,SAAS;gBACV,CAAC;gBACD,IAAI,CAAC;oBACJ,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;wBAC5B,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC;wBACxC,SAAS;oBACV,CAAC;oBACD,OAAO,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;gBAC1C,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBAChB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC;oBACnF,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,EAAE,WAAW,OAAO,EAAE,CAAC,CAAC;gBAC/C,CAAC;YACF,CAAC;YACD,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAClD,OAAO,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAAA,CACzD;KACD,CAAC;AAAA,CACF;AAED,SAAS,gCAAgC,CACxC,WAAoB,EACpB,SAAiB,EACjB,KAAa,EACb,OAAe,EACgB;IAC/B,MAAM,YAAY,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;IACtD,MAAM,UAAU,GAAG,YAAgC,CAAC;IACpD,IAAI,OAAO,UAAU,CAAC,gBAAgB,KAAK,UAAU,EAAE,CAAC;QACvD,MAAM,QAAQ,GAAG,UAAU,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACtD,OAAO,iBAAiB,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAC;IACjF,CAAC;IACD,IAAI,OAAO,UAAU,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;QAClD,MAAM,QAAQ,GAAG,UAAU,CAAC,WAAW,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC;QACvE,OAAO,iBAAiB,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC;IACpF,CAAC;IACD,MAAM,OAAO,GAAG,YAAmC,CAAC;IACpD,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QAC1C,OAAO,iBAAiB,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACnH,CAAC;IACD,OAAO,SAAS,CAAC;AAAA,CACjB;AAED,SAAS,iBAAiB,CACzB,QAAuB,EACvB,SAAiB,EACjB,KAAa,EACb,OAAe,EACf,IAAY,EACO;IACnB,OAAO,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;AAAA,CACrG;AAED,SAAS,mBAAmB,CAAC,WAAoB,EAAW;IAC3D,IAAI,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,SAAS,IAAI,WAAW,EAAE,CAAC;QAChF,OAAQ,WAA6C,CAAC,OAAO,CAAC;IAC/D,CAAC;IACD,OAAO,WAAW,CAAC;AAAA,CACnB;AAED,SAAS,iBAAiB,CACzB,MAAc,EACd,MAAqC,EACrC,UAAwC,EACxC,SAAiB,EACjB,OAAe,EACf,KAAwB,EACL;IACnB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,6CAA6C,CAAC,CAAC;IACjG,OAAO;QACN,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM;QACN,UAAU;QACV,SAAS;QACT,OAAO;QACP,KAAK;KACL,CAAC;AAAA,CACF;AAED,SAAS,kBAAkB,CAAC,OAAe,EAAW;IACrD,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACzC,OAAO,CACN,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC7B,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC;QAC7B,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC;QAC3B,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC;QAC3B,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC;QAC3B,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,CAC9B,CAAC;AAAA,CACF;AAED,SAAS,oBAAoB,CAAC,OAAe,EAAU;IACtD,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACzC,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACjG,OAAO,YAAY,CAAC;IACrB,CAAC;IACD,OAAO,aAAa,CAAC;AAAA,CACrB;AAED,SAAS,mBAAmB,CAAC,SAAiB,EAAW;IACxD,OAAO,CACN,CAAC,SAAS,IAAI,EAAE,IAAI,SAAS,IAAI,EAAE,CAAC;QACpC,CAAC,SAAS,IAAI,EAAE,IAAI,SAAS,IAAI,EAAE,CAAC;QACpC,CAAC,SAAS,IAAI,EAAE,IAAI,SAAS,IAAI,GAAG,CAAC,CACrC,CAAC;AAAA,CACF;AAED,SAAS,kBAAkB,CAAC,SAAiB,EAAW;IACvD,OAAO,SAAS,IAAI,EAAE,IAAI,SAAS,IAAI,GAAG,CAAC;AAAA,CAC3C;AAED,SAAS,QAAQ,CAAC,SAAiB,EAAW;IAC7C,+BAA2B;IAC3B,IAAI,SAAS,IAAI,MAAM,IAAI,SAAS,IAAI,MAAM;QAAE,OAAO,IAAI,CAAC;IAC5D,4CAAoC;IACpC,IAAI,SAAS,IAAI,MAAM,IAAI,SAAS,IAAI,MAAM;QAAE,OAAO,IAAI,CAAC;IAC5D,2DAAmD;IACnD,IAAI,SAAS,IAAI,MAAM,IAAI,SAAS,IAAI,MAAM;QAAE,OAAO,IAAI,CAAC;IAC5D,gBAAgB;IAChB,IAAI,SAAS,IAAI,MAAM,IAAI,SAAS,IAAI,MAAM;QAAE,OAAO,IAAI,CAAC;IAC5D,OAAO,KAAK,CAAC;AAAA,CACb;AAED,SAAS,oBAAoB,CAAC,SAAiB,EAAW;IACzD,wBAAkB;IAClB,IAAI,SAAS,IAAI,MAAM,IAAI,SAAS,IAAI,MAAM;QAAE,OAAO,IAAI,CAAC;IAC5D,0CAAsC;IACtC,IAAI,SAAS,IAAI,MAAM,IAAI,SAAS,IAAI,MAAM;QAAE,OAAO,IAAI,CAAC;IAC5D,IAAI,SAAS,IAAI,MAAM,IAAI,SAAS,IAAI,MAAM;QAAE,OAAO,IAAI,CAAC;IAC5D,OAAO,KAAK,CAAC;AAAA,CACb;AAED,SAAS,cAAc,CAAC,SAAiB,EAAW;IACnD,sDAAkD;IAClD,IAAI,SAAS,IAAI,MAAM,IAAI,SAAS,IAAI,MAAM;QAAE,OAAO,IAAI,CAAC;IAC5D,yBAAyB;IACzB,IAAI,SAAS,IAAI,MAAM,IAAI,SAAS,IAAI,MAAM;QAAE,OAAO,IAAI,CAAC;IAC5D,+BAA+B;IAC/B,IAAI,SAAS,IAAI,MAAM,IAAI,SAAS,IAAI,MAAM;QAAE,OAAO,IAAI,CAAC;IAC5D,OAAO,KAAK,CAAC;AAAA,CACb;AAED,SAAS,mBAAmB,CAAC,SAAiB,EAAW;IACxD,oBAAoB;IACpB,IAAI,SAAS,IAAI,OAAO;QAAE,OAAO,IAAI,CAAC;IACtC,yBAAyB;IACzB,IAAI,SAAS,IAAI,MAAM,IAAI,SAAS,IAAI,MAAM;QAAE,OAAO,IAAI,CAAC;IAC5D,uDAAuD;IACvD,IAAI,SAAS,IAAI,MAAM,IAAI,SAAS,IAAI,MAAM;QAAE,OAAO,IAAI,CAAC;IAC5D,IAAI,SAAS,IAAI,MAAM,IAAI,SAAS,IAAI,MAAM;QAAE,OAAO,IAAI,CAAC;IAC5D,OAAO,KAAK,CAAC;AAAA,CACb;AAED,SAAS,aAAa,CAAC,KAAa,EAAW;IAC9C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AAAA,CAChH;AAED,SAAS,aAAa,CAAC,KAAa,EAAE,WAAmB,EAAE,UAAkB,EAAW;IACvF,IAAI,2EAA2E,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7F,OAAO,IAAI,CAAC;IACb,CAAC;IACD,OAAO,WAAW,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,GAAG,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC;AAAA,CACxE","sourcesContent":["import { createRequire } from \"node:module\";\n\nimport type {\n\tContextBudgetTokenConfidence,\n\tContextBudgetTokenCountMethod,\n\tContextBudgetTokenizerMode,\n\tOptionalModuleLoader,\n\tTokenCounterAdapter,\n\tTokenCounterRegistryOptions,\n\tTokenCountResult,\n} from \"./context-budget-token-counter-types.ts\";\n\nexport type * from \"./context-budget-token-counter-types.ts\";\n\ninterface EncodeCapable {\n\tencode(input: string): readonly unknown[];\n}\n\ninterface JsTiktokenModule {\n\tencodingForModel?: (modelId: string) => EncodeCapable;\n\tgetEncoding?: (encoding: string) => EncodeCapable;\n}\n\ninterface GenericEncodeModule {\n\tencode?: (input: string) => readonly unknown[];\n}\n\nconst requireModule = createRequire(import.meta.url);\n\nexport function createNodeOptionalModuleLoader(): OptionalModuleLoader {\n\treturn {\n\t\tresolve(specifier) {\n\t\t\ttry {\n\t\t\t\treturn requireModule.resolve(specifier);\n\t\t\t} catch {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t},\n\t\tload(specifier) {\n\t\t\treturn requireModule(specifier) as unknown;\n\t\t},\n\t};\n}\n\nexport function createFallbackTokenCounter(): TokenCounterAdapter {\n\treturn {\n\t\tid: \"fallback-estimator\",\n\t\tpriority: 0,\n\t\tisAvailable: () => true,\n\t\tsupports: () => true,\n\t\tcountText(input, modelId) {\n\t\t\treturn estimateTextTokens(input, modelId);\n\t\t},\n\t};\n}\n\nexport function estimateTextTokens(input: string, modelId = \"unknown\"): TokenCountResult {\n\tif (input.length === 0) {\n\t\treturn createTokenResult(0, \"estimated\", \"medium\", \"fallback-estimator\", modelId, [\"empty-input\"]);\n\t}\n\n\tlet asciiWord = 0;\n\tlet whitespace = 0;\n\tlet cjk = 0;\n\tlet hangul = 0;\n\tlet kana = 0;\n\tlet emojiOrWide = 0;\n\tlet punctuation = 0;\n\tlet other = 0;\n\n\tfor (const char of input) {\n\t\tconst codePoint = char.codePointAt(0) ?? 0;\n\t\tif (/\\s/u.test(char)) {\n\t\t\twhitespace += 1;\n\t\t} else if (isHangul(codePoint)) {\n\t\t\thangul += 1;\n\t\t} else if (isHiraganaOrKatakana(codePoint)) {\n\t\t\tkana += 1;\n\t\t} else if (isCjkIdeograph(codePoint)) {\n\t\t\tcjk += 1;\n\t\t} else if (isAsciiAlphaNumeric(codePoint) || char === \"_\") {\n\t\t\tasciiWord += 1;\n\t\t} else if (isEmojiOrWideSymbol(codePoint)) {\n\t\t\temojiOrWide += 1;\n\t\t} else if (isAsciiPunctuation(codePoint)) {\n\t\t\tpunctuation += 1;\n\t\t} else {\n\t\t\tother += 1;\n\t\t}\n\t}\n\n\tconst codeLike = looksCodeLike(input, punctuation, whitespace);\n\tconst jsonLike = looksJsonLike(input);\n\tconst nonAsciiRatio = (hangul + cjk + kana + emojiOrWide + other) / Math.max(1, input.length);\n\tconst base =\n\t\tasciiWord / (codeLike ? 3.2 : 4) +\n\t\twhitespace / 12 +\n\t\tpunctuation / 2.1 +\n\t\thangul / 0.95 +\n\t\tkana / 1.0 +\n\t\tcjk / 1.2 +\n\t\temojiOrWide * 1.8 +\n\t\tother / 2;\n\tconst adjusted = base * (jsonLike ? 1.12 : 1) * (codeLike ? 1.08 : 1);\n\tconst tokens = Math.max(1, Math.ceil(adjusted));\n\tconst compositionParts: string[] = [];\n\tif (hangul > 0) compositionParts.push(`hangul:${hangul}`);\n\tif (kana > 0) compositionParts.push(`kana:${kana}`);\n\tif (cjk > 0) compositionParts.push(`cjk:${cjk}`);\n\tif (asciiWord > 0) compositionParts.push(`ascii:${asciiWord}`);\n\tif (emojiOrWide > 0) compositionParts.push(`emoji:${emojiOrWide}`);\n\tconst notes = [\n\t\tcodeLike ? \"code-like\" : \"prose-like\",\n\t\tjsonLike ? \"json-like\" : \"not-json-like\",\n\t\tnonAsciiRatio > 0 ? `non-ascii:${(nonAsciiRatio * 100).toFixed(0)}%` : \"latin-only\",\n\t\t`composition(${compositionParts.join(\",\")})`,\n\t];\n\tconst confidence: ContextBudgetTokenConfidence =\n\t\tnonAsciiRatio > 0.4 ? \"low\" : nonAsciiRatio > 0.15 ? \"medium\" : \"high\";\n\treturn createTokenResult(tokens, \"estimated\", confidence, \"fallback-estimator\", modelId, notes);\n}\n\nexport function createOpenAiJsTokenCounter(\n\tloader: OptionalModuleLoader = createNodeOptionalModuleLoader(),\n): TokenCounterAdapter {\n\tconst packageNames = [\"js-tiktoken\", \"gpt-tokenizer\", \"tiktoken\"] as const;\n\treturn {\n\t\tid: \"openai-bpe-js\",\n\t\tpriority: 80,\n\t\tisAvailable() {\n\t\t\treturn packageNames.some((specifier) => loader.resolve(specifier) !== undefined);\n\t\t},\n\t\tsupports(modelId) {\n\t\t\treturn isOpenAiStyleModel(modelId);\n\t\t},\n\t\tcountText(input, modelId) {\n\t\t\tfor (const specifier of packageNames) {\n\t\t\t\tif (loader.resolve(specifier) === undefined) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst result = countWithOptionalTokenizerModule(loader.load(specifier), specifier, input, modelId);\n\t\t\t\tif (result !== undefined) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow new Error(\"no supported OpenAI JS tokenizer module shape found\");\n\t\t},\n\t};\n}\n\nexport function createOpenAiWasmTokenCounter(\n\tloader: OptionalModuleLoader = createNodeOptionalModuleLoader(),\n): TokenCounterAdapter {\n\tconst packageNames = [\"@dqbd/tiktoken\", \"tiktoken\"] as const;\n\treturn {\n\t\tid: \"openai-bpe-wasm\",\n\t\tpriority: 90,\n\t\tisAvailable() {\n\t\t\treturn packageNames.some((specifier) => loader.resolve(specifier) !== undefined);\n\t\t},\n\t\tsupports(modelId) {\n\t\t\treturn isOpenAiStyleModel(modelId);\n\t\t},\n\t\tcountText(input, modelId) {\n\t\t\tfor (const specifier of packageNames) {\n\t\t\t\tif (loader.resolve(specifier) === undefined) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst result = countWithOptionalTokenizerModule(loader.load(specifier), specifier, input, modelId);\n\t\t\t\tif (result !== undefined) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow new Error(\"no supported OpenAI WASM tokenizer module shape found\");\n\t\t},\n\t};\n}\n\nexport function createTokenCounterForMode(\n\tmode: ContextBudgetTokenizerMode,\n\tloader: OptionalModuleLoader = createNodeOptionalModuleLoader(),\n): TokenCounterAdapter {\n\tconst fallback = createFallbackTokenCounter();\n\tif (mode === \"fallback\") {\n\t\treturn fallback;\n\t}\n\tconst adapters =\n\t\tmode === \"openai-wasm\" ? [createOpenAiWasmTokenCounter(loader)] : [createOpenAiJsTokenCounter(loader)];\n\tif (mode === \"auto\") {\n\t\tadapters.push(createOpenAiWasmTokenCounter(loader));\n\t}\n\treturn createTokenCounterRegistry({ adapters, fallback });\n}\n\nexport function createTokenCounterRegistry(options: TokenCounterRegistryOptions = {}): TokenCounterAdapter {\n\tconst fallback = options.fallback ?? createFallbackTokenCounter();\n\tconst adapters = [...(options.adapters ?? [])].sort((a, b) => b.priority - a.priority || a.id.localeCompare(b.id));\n\treturn {\n\t\tid: \"token-counter-registry\",\n\t\tpriority: 100,\n\t\tisAvailable: () => true,\n\t\tsupports: () => true,\n\t\tcountText(input, modelId) {\n\t\t\tconst notes: string[] = [];\n\t\t\tfor (const adapter of adapters) {\n\t\t\t\tif (!adapter.supports(modelId)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tif (!adapter.isAvailable()) {\n\t\t\t\t\t\tnotes.push(`${adapter.id}:unavailable`);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\treturn adapter.countText(input, modelId);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconst message = error instanceof Error ? error.message : \"unknown adapter failure\";\n\t\t\t\t\tnotes.push(`${adapter.id}:failed:${message}`);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst result = fallback.countText(input, modelId);\n\t\t\treturn { ...result, notes: [...notes, ...result.notes] };\n\t\t},\n\t};\n}\n\nfunction countWithOptionalTokenizerModule(\n\tmoduleValue: unknown,\n\tspecifier: string,\n\tinput: string,\n\tmodelId: string,\n): TokenCountResult | undefined {\n\tconst moduleObject = unwrapDefaultModule(moduleValue);\n\tconst jsTiktoken = moduleObject as JsTiktokenModule;\n\tif (typeof jsTiktoken.encodingForModel === \"function\") {\n\t\tconst encoding = jsTiktoken.encodingForModel(modelId);\n\t\treturn countWithEncoding(encoding, specifier, input, modelId, \"model-encoding\");\n\t}\n\tif (typeof jsTiktoken.getEncoding === \"function\") {\n\t\tconst encoding = jsTiktoken.getEncoding(selectOpenAiEncoding(modelId));\n\t\treturn countWithEncoding(encoding, specifier, input, modelId, \"fallback-encoding\");\n\t}\n\tconst generic = moduleObject as GenericEncodeModule;\n\tif (typeof generic.encode === \"function\") {\n\t\treturn createTokenResult(generic.encode(input).length, \"exact\", \"medium\", specifier, modelId, [\"generic-encode\"]);\n\t}\n\treturn undefined;\n}\n\nfunction countWithEncoding(\n\tencoding: EncodeCapable,\n\tadapterId: string,\n\tinput: string,\n\tmodelId: string,\n\tnote: string,\n): TokenCountResult {\n\treturn createTokenResult(encoding.encode(input).length, \"exact\", \"high\", adapterId, modelId, [note]);\n}\n\nfunction unwrapDefaultModule(moduleValue: unknown): unknown {\n\tif (moduleValue && typeof moduleValue === \"object\" && \"default\" in moduleValue) {\n\t\treturn (moduleValue as { readonly default: unknown }).default;\n\t}\n\treturn moduleValue;\n}\n\nfunction createTokenResult(\n\ttokens: number,\n\tmethod: ContextBudgetTokenCountMethod,\n\tconfidence: ContextBudgetTokenConfidence,\n\tadapterId: string,\n\tmodelId: string,\n\tnotes: readonly string[],\n): TokenCountResult {\n\tif (!Number.isFinite(tokens)) throw new TypeError(\"Tokenizer returned a non-finite token count\");\n\treturn {\n\t\ttokens: Math.max(0, Math.ceil(tokens)),\n\t\tmethod,\n\t\tconfidence,\n\t\tadapterId,\n\t\tmodelId,\n\t\tnotes,\n\t};\n}\n\nfunction isOpenAiStyleModel(modelId: string): boolean {\n\tconst normalized = modelId.toLowerCase();\n\treturn (\n\t\tnormalized.includes(\"openai\") ||\n\t\tnormalized.startsWith(\"gpt-\") ||\n\t\tnormalized.startsWith(\"o1\") ||\n\t\tnormalized.startsWith(\"o3\") ||\n\t\tnormalized.startsWith(\"o4\") ||\n\t\tnormalized.includes(\"chatgpt\")\n\t);\n}\n\nfunction selectOpenAiEncoding(modelId: string): string {\n\tconst normalized = modelId.toLowerCase();\n\tif (normalized.includes(\"gpt-4o\") || normalized.includes(\"gpt-5\") || normalized.startsWith(\"o\")) {\n\t\treturn \"o200k_base\";\n\t}\n\treturn \"cl100k_base\";\n}\n\nfunction isAsciiAlphaNumeric(codePoint: number): boolean {\n\treturn (\n\t\t(codePoint >= 48 && codePoint <= 57) ||\n\t\t(codePoint >= 65 && codePoint <= 90) ||\n\t\t(codePoint >= 97 && codePoint <= 122)\n\t);\n}\n\nfunction isAsciiPunctuation(codePoint: number): boolean {\n\treturn codePoint >= 33 && codePoint <= 126;\n}\n\nfunction isHangul(codePoint: number): boolean {\n\t// Composed syllables (가-힣)\n\tif (codePoint >= 0xac00 && codePoint <= 0xd7af) return true;\n\t// Jamo: initial (ㄱ-ㅎ), medial (ㅏ-ㅣ)\n\tif (codePoint >= 0x1100 && codePoint <= 0x11ff) return true;\n\t// Compatibility jamo (ㄱ-ㅎ, ㅏ-ㅣ) and Hangul letters\n\tif (codePoint >= 0x3130 && codePoint <= 0x318f) return true;\n\t// Extended jamo\n\tif (codePoint >= 0xa960 && codePoint <= 0xa97c) return true;\n\treturn false;\n}\n\nfunction isHiraganaOrKatakana(codePoint: number): boolean {\n\t// Hiragana (ぁ-より)\n\tif (codePoint >= 0x3040 && codePoint <= 0x309f) return true;\n\t// Katakana (ァ-ヿ) + halfwidth katakana\n\tif (codePoint >= 0x30a0 && codePoint <= 0x30ff) return true;\n\tif (codePoint >= 0xff65 && codePoint <= 0xff9f) return true;\n\treturn false;\n}\n\nfunction isCjkIdeograph(codePoint: number): boolean {\n\t// CJK Unified Ideographs (main block: 中, 国, etc.)\n\tif (codePoint >= 0x4e00 && codePoint <= 0x9fff) return true;\n\t// CJK Extension A (rare)\n\tif (codePoint >= 0x3400 && codePoint <= 0x4dbf) return true;\n\t// CJK compatibility ideographs\n\tif (codePoint >= 0xf900 && codePoint <= 0xfaff) return true;\n\treturn false;\n}\n\nfunction isEmojiOrWideSymbol(codePoint: number): boolean {\n\t// Main emoji blocks\n\tif (codePoint >= 0x1f000) return true;\n\t// Misc symbols, dingbats\n\tif (codePoint >= 0x2600 && codePoint <= 0x27bf) return true;\n\t// CJK fullwidth/special forms that occupy double width\n\tif (codePoint >= 0xff01 && codePoint <= 0xff60) return true;\n\tif (codePoint >= 0xffe0 && codePoint <= 0xffe6) return true;\n\treturn false;\n}\n\nfunction looksJsonLike(input: string): boolean {\n\tconst trimmed = input.trim();\n\treturn (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) || (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\"));\n}\n\nfunction looksCodeLike(input: string, punctuation: number, whitespace: number): boolean {\n\tif (/\\b(function|const|let|class|interface|import|export|return|async|await)\\b/.test(input)) {\n\t\treturn true;\n\t}\n\treturn punctuation > input.length / 8 && whitespace > input.length / 20;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-budget-v2-scoring.d.ts","sourceRoot":"","sources":["../../src/core/context-budget-v2-scoring.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAgD,MAAM,8BAA8B,CAAC;AAEtH,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CACzB;
|
|
1
|
+
{"version":3,"file":"context-budget-v2-scoring.d.ts","sourceRoot":"","sources":["../../src/core/context-budget-v2-scoring.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAgD,MAAM,8BAA8B,CAAC;AAEtH,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CACzB;AAsBD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,CAUnG;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CA8B7F;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,2BAA2B,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,GAAG,MAAM,CAiBtF","sourcesContent":["import type { ContextBudgetItemV2, ContextBudgetPriorityV2, ContextBudgetTierV2 } from \"./context-budget-headroom.ts\";\n\nexport interface PlannedItemV2 {\n\treadonly item: ContextBudgetItemV2;\n\treadonly fullTokens: number;\n\t/**\n\t * Cheapest non-omit representation cost, i.e. the true marginal cost of\n\t * admitting this item at all. Equals `fullTokens` when the item has no\n\t * cheaper pointer/summary/headroom representation.\n\t */\n\treadonly admissibleTokens: number;\n\treadonly contentHash: string;\n\treadonly baseScore: number;\n\tredundancyPenalty: number;\n\teffectiveScore: number;\n\treadonly isHard: boolean;\n}\n\nconst PRIORITY_WEIGHT_V2: Record<ContextBudgetPriorityV2, number> = {\n\thard: 1_000_000,\n\thigh: 120,\n\tmedium: 60,\n\tlow: 15,\n};\n\n/** E-folding time in turns: at this age the factor is exp(-1), not one half. */\nconst RECENCY_TIME_CONSTANT_BY_TIER: Readonly<Record<ContextBudgetTierV2, number>> = {\n\tsystem: 999,\n\t\"active-goal\": 12,\n\t\"current-files\": 8,\n\ttools: 4,\n\tskills: 6,\n\tmcp: 6,\n\thistory: 3,\n\tevidence: 8,\n\tscratch: 2,\n};\n\nexport function scoreContextBudgetItemV2(item: ContextBudgetItemV2, estimatedTokens: number): number {\n\tif (item.priority === \"hard\") {\n\t\treturn Number.POSITIVE_INFINITY;\n\t}\n\tconst priority = PRIORITY_WEIGHT_V2[item.priority];\n\tconst relevance = clamp01(item.relevance) * 25;\n\tconst recency = deriveRecency(item) * 15;\n\tconst evidence = clamp01(item.evidenceValue) * 25;\n\tconst cost = Math.sqrt(Math.max(0, estimatedTokens)) * 0.55;\n\treturn priority + relevance + recency + evidence - cost;\n}\n\nexport function applyRedundancyPenalties(items: readonly PlannedItemV2[]): Map<string, number> {\n\tconst penalties = new Map<string, number>();\n\tconst groups = new Map<string, PlannedItemV2[]>();\n\tfor (const planned of items) {\n\t\tif (!planned.item.redundancyKey) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst group = groups.get(planned.item.redundancyKey);\n\t\tif (group) {\n\t\t\tgroup.push(planned);\n\t\t} else {\n\t\t\tgroups.set(planned.item.redundancyKey, [planned]);\n\t\t}\n\t}\n\tfor (const group of groups.values()) {\n\t\tif (group.length <= 1) {\n\t\t\tcontinue;\n\t\t}\n\t\tgroup.sort((a, b) => {\n\t\t\tif (b.baseScore !== a.baseScore) {\n\t\t\t\treturn b.baseScore - a.baseScore;\n\t\t\t}\n\t\t\treturn a.item.id.localeCompare(b.item.id);\n\t\t});\n\t\tfor (let index = 1; index < group.length; index++) {\n\t\t\tconst duplicate = group[index];\n\t\t\tpenalties.set(duplicate.item.id, redundancyPenalty(duplicate.fullTokens) * index);\n\t\t}\n\t}\n\treturn penalties;\n}\n\n/**\n * Order optional items for the budgeted 0/1 knapsack the planner greedily fills.\n *\n * Value density (effective score per token) is the primary key. Ordering by\n * priority class first would let a single expensive `high` item evict an\n * arbitrary number of far denser `medium` items, which makes the greedy\n * unbounded-bad against the optimal packing. Priority still shapes the outcome\n * through `PRIORITY_WEIGHT_V2` in the score numerator, and non-negotiable\n * context uses `hard`/`required`, which the planner pins before this ordering\n * is consulted. Remaining keys break ties into a deterministic total order.\n */\nexport function compareOptionalForSelection(a: PlannedItemV2, b: PlannedItemV2): number {\n\tconst aDensity = density(a);\n\tconst bDensity = density(b);\n\tif (bDensity !== aDensity) {\n\t\treturn bDensity - aDensity;\n\t}\n\tconst aScore = Number.isNaN(a.effectiveScore) ? Number.NEGATIVE_INFINITY : a.effectiveScore;\n\tconst bScore = Number.isNaN(b.effectiveScore) ? Number.NEGATIVE_INFINITY : b.effectiveScore;\n\tif (bScore !== aScore) return bScore - aScore;\n\tconst priorityDelta = priorityRank(b.item.priority) - priorityRank(a.item.priority);\n\tif (priorityDelta !== 0) {\n\t\treturn priorityDelta;\n\t}\n\tconst aTokens = Number.isNaN(a.fullTokens) ? Number.POSITIVE_INFINITY : a.fullTokens;\n\tconst bTokens = Number.isNaN(b.fullTokens) ? Number.POSITIVE_INFINITY : b.fullTokens;\n\tif (aTokens !== bTokens) return aTokens - bTokens;\n\treturn a.item.id.localeCompare(b.item.id);\n}\n\nfunction priorityRank(priority: ContextBudgetPriorityV2): number {\n\tswitch (priority) {\n\t\tcase \"hard\":\n\t\t\treturn 4;\n\t\tcase \"high\":\n\t\t\treturn 3;\n\t\tcase \"medium\":\n\t\t\treturn 2;\n\t\tcase \"low\":\n\t\t\treturn 1;\n\t}\n}\n\nfunction clamp01(value: number | undefined): number {\n\tif (value === undefined || !Number.isFinite(value)) {\n\t\treturn 0;\n\t}\n\treturn Math.max(0, Math.min(1, value));\n}\n\nfunction deriveRecency(item: ContextBudgetItemV2): number {\n\tif (item.recency !== undefined) {\n\t\treturn clamp01(item.recency);\n\t}\n\tconst age = item.ageTurns ?? 0;\n\tconst timeConstant = RECENCY_TIME_CONSTANT_BY_TIER[item.tier] ?? 6;\n\treturn clamp01(Math.exp(-age / timeConstant));\n}\n\nfunction redundancyPenalty(tokens: number): number {\n\treturn Math.max(10, Math.sqrt(Math.max(0, tokens)) * 0.8);\n}\n\n/**\n * Value per token of the CHEAPEST admissible representation. Dividing by\n * `fullTokens` would systematically penalize retrievable or summarizable items,\n * which are exactly the items the planner admits cheaply when the budget is\n * tight — the regime where this ordering decides anything at all.\n */\nfunction density(planned: PlannedItemV2): number {\n\tif (!Number.isFinite(planned.effectiveScore) || planned.effectiveScore <= 0) {\n\t\treturn planned.effectiveScore > 0 ? planned.effectiveScore : 0;\n\t}\n\tconst value = planned.effectiveScore / Math.max(planned.admissibleTokens, 1);\n\treturn Number.isNaN(value) ? 0 : value;\n}\n"]}
|
|
@@ -4,7 +4,8 @@ const PRIORITY_WEIGHT_V2 = {
|
|
|
4
4
|
medium: 60,
|
|
5
5
|
low: 15,
|
|
6
6
|
};
|
|
7
|
-
|
|
7
|
+
/** E-folding time in turns: at this age the factor is exp(-1), not one half. */
|
|
8
|
+
const RECENCY_TIME_CONSTANT_BY_TIER = {
|
|
8
9
|
system: 999,
|
|
9
10
|
"active-goal": 12,
|
|
10
11
|
"current-files": 8,
|
|
@@ -75,16 +76,18 @@ export function compareOptionalForSelection(a, b) {
|
|
|
75
76
|
if (bDensity !== aDensity) {
|
|
76
77
|
return bDensity - aDensity;
|
|
77
78
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
79
|
+
const aScore = Number.isNaN(a.effectiveScore) ? Number.NEGATIVE_INFINITY : a.effectiveScore;
|
|
80
|
+
const bScore = Number.isNaN(b.effectiveScore) ? Number.NEGATIVE_INFINITY : b.effectiveScore;
|
|
81
|
+
if (bScore !== aScore)
|
|
82
|
+
return bScore - aScore;
|
|
81
83
|
const priorityDelta = priorityRank(b.item.priority) - priorityRank(a.item.priority);
|
|
82
84
|
if (priorityDelta !== 0) {
|
|
83
85
|
return priorityDelta;
|
|
84
86
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
87
|
+
const aTokens = Number.isNaN(a.fullTokens) ? Number.POSITIVE_INFINITY : a.fullTokens;
|
|
88
|
+
const bTokens = Number.isNaN(b.fullTokens) ? Number.POSITIVE_INFINITY : b.fullTokens;
|
|
89
|
+
if (aTokens !== bTokens)
|
|
90
|
+
return aTokens - bTokens;
|
|
88
91
|
return a.item.id.localeCompare(b.item.id);
|
|
89
92
|
}
|
|
90
93
|
function priorityRank(priority) {
|
|
@@ -110,8 +113,8 @@ function deriveRecency(item) {
|
|
|
110
113
|
return clamp01(item.recency);
|
|
111
114
|
}
|
|
112
115
|
const age = item.ageTurns ?? 0;
|
|
113
|
-
const
|
|
114
|
-
return clamp01(Math.exp(-age /
|
|
116
|
+
const timeConstant = RECENCY_TIME_CONSTANT_BY_TIER[item.tier] ?? 6;
|
|
117
|
+
return clamp01(Math.exp(-age / timeConstant));
|
|
115
118
|
}
|
|
116
119
|
function redundancyPenalty(tokens) {
|
|
117
120
|
return Math.max(10, Math.sqrt(Math.max(0, tokens)) * 0.8);
|
|
@@ -126,6 +129,7 @@ function density(planned) {
|
|
|
126
129
|
if (!Number.isFinite(planned.effectiveScore) || planned.effectiveScore <= 0) {
|
|
127
130
|
return planned.effectiveScore > 0 ? planned.effectiveScore : 0;
|
|
128
131
|
}
|
|
129
|
-
|
|
132
|
+
const value = planned.effectiveScore / Math.max(planned.admissibleTokens, 1);
|
|
133
|
+
return Number.isNaN(value) ? 0 : value;
|
|
130
134
|
}
|
|
131
135
|
//# sourceMappingURL=context-budget-v2-scoring.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-budget-v2-scoring.js","sourceRoot":"","sources":["../../src/core/context-budget-v2-scoring.ts"],"names":[],"mappings":"AAkBA,MAAM,kBAAkB,GAA4C;IACnE,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,GAAG;IACT,MAAM,EAAE,EAAE;IACV,GAAG,EAAE,EAAE;CACP,CAAC;AAEF,MAAM,yBAAyB,GAAkD;IAChF,MAAM,EAAE,GAAG;IACX,aAAa,EAAE,EAAE;IACjB,eAAe,EAAE,CAAC;IAClB,KAAK,EAAE,CAAC;IACR,MAAM,EAAE,CAAC;IACT,GAAG,EAAE,CAAC;IACN,OAAO,EAAE,CAAC;IACV,QAAQ,EAAE,CAAC;IACX,OAAO,EAAE,CAAC;CACV,CAAC;AAEF,MAAM,UAAU,wBAAwB,CAAC,IAAyB,EAAE,eAAuB,EAAU;IACpG,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,iBAAiB,CAAC;IACjC,CAAC;IACD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;IAC/C,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;IACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC;IAClD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,GAAG,IAAI,CAAC;IAC5D,OAAO,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,IAAI,CAAC;AAAA,CACxD;AAED,MAAM,UAAU,wBAAwB,CAAC,KAA+B,EAAuB;IAC9F,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,GAAG,EAA2B,CAAC;IAClD,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACjC,SAAS;QACV,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACrD,IAAI,KAAK,EAAE,CAAC;YACX,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrB,CAAC;aAAM,CAAC;YACP,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;QACnD,CAAC;IACF,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QACrC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACvB,SAAS;QACV,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACpB,IAAI,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS,EAAE,CAAC;gBACjC,OAAO,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC;YAClC,CAAC;YACD,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAAA,CAC1C,CAAC,CAAC;QACH,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;YACnD,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;YAC/B,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,iBAAiB,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,CAAC;QACnF,CAAC;IACF,CAAC;IACD,OAAO,SAAS,CAAC;AAAA,CACjB;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,2BAA2B,CAAC,CAAgB,EAAE,CAAgB,EAAU;IACvF,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC3B,OAAO,QAAQ,GAAG,QAAQ,CAAC;IAC5B,CAAC;IACD,IAAI,CAAC,CAAC,cAAc,KAAK,CAAC,CAAC,cAAc,EAAE,CAAC;QAC3C,OAAO,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,cAAc,CAAC;IAC5C,CAAC;IACD,MAAM,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACpF,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,aAAa,CAAC;IACtB,CAAC;IACD,IAAI,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU,EAAE,CAAC;QACnC,OAAO,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;IACpC,CAAC;IACD,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAAA,CAC1C;AAED,SAAS,YAAY,CAAC,QAAiC,EAAU;IAChE,QAAQ,QAAQ,EAAE,CAAC;QAClB,KAAK,MAAM;YACV,OAAO,CAAC,CAAC;QACV,KAAK,MAAM;YACV,OAAO,CAAC,CAAC;QACV,KAAK,QAAQ;YACZ,OAAO,CAAC,CAAC;QACV,KAAK,KAAK;YACT,OAAO,CAAC,CAAC;IACX,CAAC;AAAA,CACD;AAED,SAAS,OAAO,CAAC,KAAyB,EAAU;IACnD,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACpD,OAAO,CAAC,CAAC;IACV,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;AAAA,CACvC;AAED,SAAS,aAAa,CAAC,IAAyB,EAAU;IACzD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAG,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3D,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC;AAAA,CAC1C;AAED,SAAS,iBAAiB,CAAC,MAAc,EAAU;IAClD,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;AAAA,CAC1D;AAED;;;;;GAKG;AACH,SAAS,OAAO,CAAC,OAAsB,EAAU;IAChD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,OAAO,CAAC,cAAc,IAAI,CAAC,EAAE,CAAC;QAC7E,OAAO,OAAO,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;AAAA,CACtE","sourcesContent":["import type { ContextBudgetItemV2, ContextBudgetPriorityV2, ContextBudgetTierV2 } from \"./context-budget-headroom.ts\";\n\nexport interface PlannedItemV2 {\n\treadonly item: ContextBudgetItemV2;\n\treadonly fullTokens: number;\n\t/**\n\t * Cheapest non-omit representation cost, i.e. the true marginal cost of\n\t * admitting this item at all. Equals `fullTokens` when the item has no\n\t * cheaper pointer/summary/headroom representation.\n\t */\n\treadonly admissibleTokens: number;\n\treadonly contentHash: string;\n\treadonly baseScore: number;\n\tredundancyPenalty: number;\n\teffectiveScore: number;\n\treadonly isHard: boolean;\n}\n\nconst PRIORITY_WEIGHT_V2: Record<ContextBudgetPriorityV2, number> = {\n\thard: 1_000_000,\n\thigh: 120,\n\tmedium: 60,\n\tlow: 15,\n};\n\nconst RECENCY_HALF_LIFE_BY_TIER: Readonly<Record<ContextBudgetTierV2, number>> = {\n\tsystem: 999,\n\t\"active-goal\": 12,\n\t\"current-files\": 8,\n\ttools: 4,\n\tskills: 6,\n\tmcp: 6,\n\thistory: 3,\n\tevidence: 8,\n\tscratch: 2,\n};\n\nexport function scoreContextBudgetItemV2(item: ContextBudgetItemV2, estimatedTokens: number): number {\n\tif (item.priority === \"hard\") {\n\t\treturn Number.POSITIVE_INFINITY;\n\t}\n\tconst priority = PRIORITY_WEIGHT_V2[item.priority];\n\tconst relevance = clamp01(item.relevance) * 25;\n\tconst recency = deriveRecency(item) * 15;\n\tconst evidence = clamp01(item.evidenceValue) * 25;\n\tconst cost = Math.sqrt(Math.max(0, estimatedTokens)) * 0.55;\n\treturn priority + relevance + recency + evidence - cost;\n}\n\nexport function applyRedundancyPenalties(items: readonly PlannedItemV2[]): Map<string, number> {\n\tconst penalties = new Map<string, number>();\n\tconst groups = new Map<string, PlannedItemV2[]>();\n\tfor (const planned of items) {\n\t\tif (!planned.item.redundancyKey) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst group = groups.get(planned.item.redundancyKey);\n\t\tif (group) {\n\t\t\tgroup.push(planned);\n\t\t} else {\n\t\t\tgroups.set(planned.item.redundancyKey, [planned]);\n\t\t}\n\t}\n\tfor (const group of groups.values()) {\n\t\tif (group.length <= 1) {\n\t\t\tcontinue;\n\t\t}\n\t\tgroup.sort((a, b) => {\n\t\t\tif (b.baseScore !== a.baseScore) {\n\t\t\t\treturn b.baseScore - a.baseScore;\n\t\t\t}\n\t\t\treturn a.item.id.localeCompare(b.item.id);\n\t\t});\n\t\tfor (let index = 1; index < group.length; index++) {\n\t\t\tconst duplicate = group[index];\n\t\t\tpenalties.set(duplicate.item.id, redundancyPenalty(duplicate.fullTokens) * index);\n\t\t}\n\t}\n\treturn penalties;\n}\n\n/**\n * Order optional items for the budgeted 0/1 knapsack the planner greedily fills.\n *\n * Value density (effective score per token) is the primary key. Ordering by\n * priority class first would let a single expensive `high` item evict an\n * arbitrary number of far denser `medium` items, which makes the greedy\n * unbounded-bad against the optimal packing. Priority still shapes the outcome\n * through `PRIORITY_WEIGHT_V2` in the score numerator, and non-negotiable\n * context uses `hard`/`required`, which the planner pins before this ordering\n * is consulted. Remaining keys break ties into a deterministic total order.\n */\nexport function compareOptionalForSelection(a: PlannedItemV2, b: PlannedItemV2): number {\n\tconst aDensity = density(a);\n\tconst bDensity = density(b);\n\tif (bDensity !== aDensity) {\n\t\treturn bDensity - aDensity;\n\t}\n\tif (b.effectiveScore !== a.effectiveScore) {\n\t\treturn b.effectiveScore - a.effectiveScore;\n\t}\n\tconst priorityDelta = priorityRank(b.item.priority) - priorityRank(a.item.priority);\n\tif (priorityDelta !== 0) {\n\t\treturn priorityDelta;\n\t}\n\tif (a.fullTokens !== b.fullTokens) {\n\t\treturn a.fullTokens - b.fullTokens;\n\t}\n\treturn a.item.id.localeCompare(b.item.id);\n}\n\nfunction priorityRank(priority: ContextBudgetPriorityV2): number {\n\tswitch (priority) {\n\t\tcase \"hard\":\n\t\t\treturn 4;\n\t\tcase \"high\":\n\t\t\treturn 3;\n\t\tcase \"medium\":\n\t\t\treturn 2;\n\t\tcase \"low\":\n\t\t\treturn 1;\n\t}\n}\n\nfunction clamp01(value: number | undefined): number {\n\tif (value === undefined || !Number.isFinite(value)) {\n\t\treturn 0;\n\t}\n\treturn Math.max(0, Math.min(1, value));\n}\n\nfunction deriveRecency(item: ContextBudgetItemV2): number {\n\tif (item.recency !== undefined) {\n\t\treturn clamp01(item.recency);\n\t}\n\tconst age = item.ageTurns ?? 0;\n\tconst halfLife = RECENCY_HALF_LIFE_BY_TIER[item.tier] ?? 6;\n\treturn clamp01(Math.exp(-age / halfLife));\n}\n\nfunction redundancyPenalty(tokens: number): number {\n\treturn Math.max(10, Math.sqrt(Math.max(0, tokens)) * 0.8);\n}\n\n/**\n * Value per token of the CHEAPEST admissible representation. Dividing by\n * `fullTokens` would systematically penalize retrievable or summarizable items,\n * which are exactly the items the planner admits cheaply when the budget is\n * tight — the regime where this ordering decides anything at all.\n */\nfunction density(planned: PlannedItemV2): number {\n\tif (!Number.isFinite(planned.effectiveScore) || planned.effectiveScore <= 0) {\n\t\treturn planned.effectiveScore > 0 ? planned.effectiveScore : 0;\n\t}\n\treturn planned.effectiveScore / Math.max(planned.admissibleTokens, 1);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"context-budget-v2-scoring.js","sourceRoot":"","sources":["../../src/core/context-budget-v2-scoring.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ContextBudgetItemV2, ContextBudgetPriorityV2, ContextBudgetTierV2 } from \"./context-budget-headroom.ts\";\n\nexport interface PlannedItemV2 {\n\treadonly item: ContextBudgetItemV2;\n\treadonly fullTokens: number;\n\t/**\n\t * Cheapest non-omit representation cost, i.e. the true marginal cost of\n\t * admitting this item at all. Equals `fullTokens` when the item has no\n\t * cheaper pointer/summary/headroom representation.\n\t */\n\treadonly admissibleTokens: number;\n\treadonly contentHash: string;\n\treadonly baseScore: number;\n\tredundancyPenalty: number;\n\teffectiveScore: number;\n\treadonly isHard: boolean;\n}\n\nconst PRIORITY_WEIGHT_V2: Record<ContextBudgetPriorityV2, number> = {\n\thard: 1_000_000,\n\thigh: 120,\n\tmedium: 60,\n\tlow: 15,\n};\n\n/** E-folding time in turns: at this age the factor is exp(-1), not one half. */\nconst RECENCY_TIME_CONSTANT_BY_TIER: Readonly<Record<ContextBudgetTierV2, number>> = {\n\tsystem: 999,\n\t\"active-goal\": 12,\n\t\"current-files\": 8,\n\ttools: 4,\n\tskills: 6,\n\tmcp: 6,\n\thistory: 3,\n\tevidence: 8,\n\tscratch: 2,\n};\n\nexport function scoreContextBudgetItemV2(item: ContextBudgetItemV2, estimatedTokens: number): number {\n\tif (item.priority === \"hard\") {\n\t\treturn Number.POSITIVE_INFINITY;\n\t}\n\tconst priority = PRIORITY_WEIGHT_V2[item.priority];\n\tconst relevance = clamp01(item.relevance) * 25;\n\tconst recency = deriveRecency(item) * 15;\n\tconst evidence = clamp01(item.evidenceValue) * 25;\n\tconst cost = Math.sqrt(Math.max(0, estimatedTokens)) * 0.55;\n\treturn priority + relevance + recency + evidence - cost;\n}\n\nexport function applyRedundancyPenalties(items: readonly PlannedItemV2[]): Map<string, number> {\n\tconst penalties = new Map<string, number>();\n\tconst groups = new Map<string, PlannedItemV2[]>();\n\tfor (const planned of items) {\n\t\tif (!planned.item.redundancyKey) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst group = groups.get(planned.item.redundancyKey);\n\t\tif (group) {\n\t\t\tgroup.push(planned);\n\t\t} else {\n\t\t\tgroups.set(planned.item.redundancyKey, [planned]);\n\t\t}\n\t}\n\tfor (const group of groups.values()) {\n\t\tif (group.length <= 1) {\n\t\t\tcontinue;\n\t\t}\n\t\tgroup.sort((a, b) => {\n\t\t\tif (b.baseScore !== a.baseScore) {\n\t\t\t\treturn b.baseScore - a.baseScore;\n\t\t\t}\n\t\t\treturn a.item.id.localeCompare(b.item.id);\n\t\t});\n\t\tfor (let index = 1; index < group.length; index++) {\n\t\t\tconst duplicate = group[index];\n\t\t\tpenalties.set(duplicate.item.id, redundancyPenalty(duplicate.fullTokens) * index);\n\t\t}\n\t}\n\treturn penalties;\n}\n\n/**\n * Order optional items for the budgeted 0/1 knapsack the planner greedily fills.\n *\n * Value density (effective score per token) is the primary key. Ordering by\n * priority class first would let a single expensive `high` item evict an\n * arbitrary number of far denser `medium` items, which makes the greedy\n * unbounded-bad against the optimal packing. Priority still shapes the outcome\n * through `PRIORITY_WEIGHT_V2` in the score numerator, and non-negotiable\n * context uses `hard`/`required`, which the planner pins before this ordering\n * is consulted. Remaining keys break ties into a deterministic total order.\n */\nexport function compareOptionalForSelection(a: PlannedItemV2, b: PlannedItemV2): number {\n\tconst aDensity = density(a);\n\tconst bDensity = density(b);\n\tif (bDensity !== aDensity) {\n\t\treturn bDensity - aDensity;\n\t}\n\tconst aScore = Number.isNaN(a.effectiveScore) ? Number.NEGATIVE_INFINITY : a.effectiveScore;\n\tconst bScore = Number.isNaN(b.effectiveScore) ? Number.NEGATIVE_INFINITY : b.effectiveScore;\n\tif (bScore !== aScore) return bScore - aScore;\n\tconst priorityDelta = priorityRank(b.item.priority) - priorityRank(a.item.priority);\n\tif (priorityDelta !== 0) {\n\t\treturn priorityDelta;\n\t}\n\tconst aTokens = Number.isNaN(a.fullTokens) ? Number.POSITIVE_INFINITY : a.fullTokens;\n\tconst bTokens = Number.isNaN(b.fullTokens) ? Number.POSITIVE_INFINITY : b.fullTokens;\n\tif (aTokens !== bTokens) return aTokens - bTokens;\n\treturn a.item.id.localeCompare(b.item.id);\n}\n\nfunction priorityRank(priority: ContextBudgetPriorityV2): number {\n\tswitch (priority) {\n\t\tcase \"hard\":\n\t\t\treturn 4;\n\t\tcase \"high\":\n\t\t\treturn 3;\n\t\tcase \"medium\":\n\t\t\treturn 2;\n\t\tcase \"low\":\n\t\t\treturn 1;\n\t}\n}\n\nfunction clamp01(value: number | undefined): number {\n\tif (value === undefined || !Number.isFinite(value)) {\n\t\treturn 0;\n\t}\n\treturn Math.max(0, Math.min(1, value));\n}\n\nfunction deriveRecency(item: ContextBudgetItemV2): number {\n\tif (item.recency !== undefined) {\n\t\treturn clamp01(item.recency);\n\t}\n\tconst age = item.ageTurns ?? 0;\n\tconst timeConstant = RECENCY_TIME_CONSTANT_BY_TIER[item.tier] ?? 6;\n\treturn clamp01(Math.exp(-age / timeConstant));\n}\n\nfunction redundancyPenalty(tokens: number): number {\n\treturn Math.max(10, Math.sqrt(Math.max(0, tokens)) * 0.8);\n}\n\n/**\n * Value per token of the CHEAPEST admissible representation. Dividing by\n * `fullTokens` would systematically penalize retrievable or summarizable items,\n * which are exactly the items the planner admits cheaply when the budget is\n * tight — the regime where this ordering decides anything at all.\n */\nfunction density(planned: PlannedItemV2): number {\n\tif (!Number.isFinite(planned.effectiveScore) || planned.effectiveScore <= 0) {\n\t\treturn planned.effectiveScore > 0 ? planned.effectiveScore : 0;\n\t}\n\tconst value = planned.effectiveScore / Math.max(planned.admissibleTokens, 1);\n\treturn Number.isNaN(value) ? 0 : value;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"domain-router.d.ts","sourceRoot":"","sources":["../../src/core/domain-router.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEjE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC5F,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE5G;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,CAO1D;AAED,oEAAoE;AACpE,wBAAgB,eAAe,IAAI,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,EAAE,CAEjF","sourcesContent":["import { selectRoute } from \"./domain-confidence.ts\";\nimport { DOMAIN_PROFILES, FALLBACK_DOMAIN_ID } from \"./domain-loadouts.ts\";\nimport { COMPILED_DOMAIN_REGISTRY, inspectDomainRegistry } from \"./domain-registry.ts\";\nimport { scoreDomains } from \"./domain-score.ts\";\nimport type { RouteInput, RouteResult } from \"./domain-types.ts\";\n\nexport { AMBIGUITY_MARGIN, STRONG_THRESHOLD, WEAK_THRESHOLD } from \"./domain-confidence.ts\";\nexport type { DomainScore, RouteConfidence, RouteInput, RouteResult, TriggerKind } from \"./domain-types.ts\";\n\n/**\n * Classify a task into a domain.\n *\n * @example\n * routeDomain({ task: \"build a login form with tailwind\" }).primary.id === \"frontend-ui\"\n */\nexport function routeDomain(input: RouteInput): RouteResult {\n\tconst task = input.task ?? \"\";\n\tconst tags = input.tags ?? [];\n\tconst paths = input.paths ?? [];\n\tconst text = [...tags, task].join(\" \").toLowerCase();\n\tconst scores = scoreDomains(COMPILED_DOMAIN_REGISTRY, text, paths);\n\treturn selectRoute(scores, DOMAIN_PROFILES, FALLBACK_DOMAIN_ID);\n}\n\n/** Return the compiled trigger inventory for inspection/testing. */\nexport function inspectRegistry(): readonly { id: string; triggerCount: number }[] {\n\treturn inspectDomainRegistry();\n}\n"]}
|
|
1
|
+
{"version":3,"file":"domain-router.d.ts","sourceRoot":"","sources":["../../src/core/domain-router.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEjE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC5F,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE5G;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,CAO1D;AAED,oEAAoE;AACpE,wBAAgB,eAAe,IAAI,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,EAAE,CAEjF","sourcesContent":["import { selectRoute } from \"./domain-confidence.ts\";\nimport { DOMAIN_PROFILES, FALLBACK_DOMAIN_ID } from \"./domain-loadouts.ts\";\nimport { COMPILED_DOMAIN_REGISTRY, inspectDomainRegistry } from \"./domain-registry.ts\";\nimport { scoreDomains } from \"./domain-score.ts\";\nimport type { RouteInput, RouteResult } from \"./domain-types.ts\";\n\nexport { AMBIGUITY_MARGIN, STRONG_THRESHOLD, WEAK_THRESHOLD } from \"./domain-confidence.ts\";\nexport type { DomainScore, RouteConfidence, RouteInput, RouteResult, TriggerKind } from \"./domain-types.ts\";\n\n/**\n * Classify a task into a domain.\n *\n * @example\n * routeDomain({ task: \"build a login form with tailwind\" }).primary.id === \"frontend-ui\"\n */\nexport function routeDomain(input: RouteInput): RouteResult {\n\tconst task = input.task ?? \"\";\n\tconst tags = input.tags ?? [];\n\tconst paths = input.paths ?? [];\n\tconst text = [...tags, task].join(\" \").replace(/\\s+/gu, \" \").trim().toLowerCase();\n\tconst scores = scoreDomains(COMPILED_DOMAIN_REGISTRY, text, paths);\n\treturn selectRoute(scores, DOMAIN_PROFILES, FALLBACK_DOMAIN_ID);\n}\n\n/** Return the compiled trigger inventory for inspection/testing. */\nexport function inspectRegistry(): readonly { id: string; triggerCount: number }[] {\n\treturn inspectDomainRegistry();\n}\n"]}
|
|
@@ -13,7 +13,7 @@ export function routeDomain(input) {
|
|
|
13
13
|
const task = input.task ?? "";
|
|
14
14
|
const tags = input.tags ?? [];
|
|
15
15
|
const paths = input.paths ?? [];
|
|
16
|
-
const text = [...tags, task].join(" ").toLowerCase();
|
|
16
|
+
const text = [...tags, task].join(" ").replace(/\s+/gu, " ").trim().toLowerCase();
|
|
17
17
|
const scores = scoreDomains(COMPILED_DOMAIN_REGISTRY, text, paths);
|
|
18
18
|
return selectRoute(scores, DOMAIN_PROFILES, FALLBACK_DOMAIN_ID);
|
|
19
19
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"domain-router.js","sourceRoot":"","sources":["../../src/core/domain-router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AACvF,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGjD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAG5F;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,KAAiB,EAAe;IAC3D,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;IAChC,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"domain-router.js","sourceRoot":"","sources":["../../src/core/domain-router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AACvF,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGjD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAG5F;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,KAAiB,EAAe;IAC3D,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;IAChC,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAClF,MAAM,MAAM,GAAG,YAAY,CAAC,wBAAwB,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACnE,OAAO,WAAW,CAAC,MAAM,EAAE,eAAe,EAAE,kBAAkB,CAAC,CAAC;AAAA,CAChE;AAED,oEAAoE;AACpE,MAAM,UAAU,eAAe,GAAoD;IAClF,OAAO,qBAAqB,EAAE,CAAC;AAAA,CAC/B","sourcesContent":["import { selectRoute } from \"./domain-confidence.ts\";\nimport { DOMAIN_PROFILES, FALLBACK_DOMAIN_ID } from \"./domain-loadouts.ts\";\nimport { COMPILED_DOMAIN_REGISTRY, inspectDomainRegistry } from \"./domain-registry.ts\";\nimport { scoreDomains } from \"./domain-score.ts\";\nimport type { RouteInput, RouteResult } from \"./domain-types.ts\";\n\nexport { AMBIGUITY_MARGIN, STRONG_THRESHOLD, WEAK_THRESHOLD } from \"./domain-confidence.ts\";\nexport type { DomainScore, RouteConfidence, RouteInput, RouteResult, TriggerKind } from \"./domain-types.ts\";\n\n/**\n * Classify a task into a domain.\n *\n * @example\n * routeDomain({ task: \"build a login form with tailwind\" }).primary.id === \"frontend-ui\"\n */\nexport function routeDomain(input: RouteInput): RouteResult {\n\tconst task = input.task ?? \"\";\n\tconst tags = input.tags ?? [];\n\tconst paths = input.paths ?? [];\n\tconst text = [...tags, task].join(\" \").replace(/\\s+/gu, \" \").trim().toLowerCase();\n\tconst scores = scoreDomains(COMPILED_DOMAIN_REGISTRY, text, paths);\n\treturn selectRoute(scores, DOMAIN_PROFILES, FALLBACK_DOMAIN_ID);\n}\n\n/** Return the compiled trigger inventory for inspection/testing. */\nexport function inspectRegistry(): readonly { id: string; triggerCount: number }[] {\n\treturn inspectDomainRegistry();\n}\n"]}
|
|
@@ -12,6 +12,10 @@ export interface GrokHarnessDispatchInput {
|
|
|
12
12
|
readonly cwd: string;
|
|
13
13
|
readonly agentDir?: string;
|
|
14
14
|
readonly env?: NodeJS.ProcessEnv | Readonly<Record<string, string | undefined>>;
|
|
15
|
+
/** When set, narrow the grok-harness skill grant to the documented 2–3 subset. */
|
|
16
|
+
readonly task?: string;
|
|
17
|
+
/** Optional path hints scored with the task text. */
|
|
18
|
+
readonly paths?: readonly string[];
|
|
15
19
|
}
|
|
16
20
|
export interface GrokHarnessDispatchResult {
|
|
17
21
|
readonly loadoutAccessPolicy: LoadoutAccessPolicy | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grok-harness-dispatch.d.ts","sourceRoot":"","sources":["../../src/core/grok-harness-dispatch.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"grok-harness-dispatch.d.ts","sourceRoot":"","sources":["../../src/core/grok-harness-dispatch.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAGtE,OAAO,EAAyB,KAAK,qBAAqB,EAAE,KAAK,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEnH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC;IACxC,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IACxC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAChF,oFAAkF;IAClF,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,qDAAqD;IACrD,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,yBAAyB;IACzC,QAAQ,CAAC,mBAAmB,EAAE,mBAAmB,GAAG,SAAS,CAAC;IAC9D,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,YAAY,EAAE,mBAAmB,GAAG,SAAS,CAAC;CACvD;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,wBAAwB,GAAG,yBAAyB,CAoCjG","sourcesContent":["/**\n * Apply the `grok-harness` domain loadout when the active provider is Grok OAuth.\n * Does not require `OMK_DOMAIN_ROUTING=1`.\n */\n\nimport { getAgentDir } from \"../config.ts\";\nimport {\n\tGROK_HARNESS_DOMAIN_ID,\n\tgrokHarnessAutoApplyEnabled,\n\tisGrokOAuthProvider,\n\tselectGrokHarnessSkills,\n} from \"./grok-harness.ts\";\nimport type { LoadoutAccessPolicy } from \"./loadout-access-policy.ts\";\nimport { type ComposedLoadout, composeLoadout } from \"./loadout-compose.ts\";\nimport { createLoadoutPolicyFromRuntimeState } from \"./loadout-policy-bridge.ts\";\nimport { applyLoadoutToRuntime, type LoadoutRuntimeSession, type LoadoutRuntimeState } from \"./loadout-runtime.ts\";\nimport { uniqueSorted } from \"./loadout-safety.ts\";\nimport type { ResourceLoader } from \"./resource-loader.ts\";\n\nexport interface GrokHarnessDispatchInput {\n\treadonly provider: string | undefined;\n\treadonly session: LoadoutRuntimeSession;\n\treadonly resourceLoader: ResourceLoader;\n\treadonly cwd: string;\n\treadonly agentDir?: string;\n\treadonly env?: NodeJS.ProcessEnv | Readonly<Record<string, string | undefined>>;\n\t/** When set, narrow the grok-harness skill grant to the documented 2–3 subset. */\n\treadonly task?: string;\n\t/** Optional path hints scored with the task text. */\n\treadonly paths?: readonly string[];\n}\n\nexport interface GrokHarnessDispatchResult {\n\treadonly loadoutAccessPolicy: LoadoutAccessPolicy | undefined;\n\treadonly warnings: readonly string[];\n\treadonly runtimeState: LoadoutRuntimeState | undefined;\n}\n\nexport function tryGrokHarnessDispatch(input: GrokHarnessDispatchInput): GrokHarnessDispatchResult {\n\tconst env = input.env ?? process.env;\n\tif (!grokHarnessAutoApplyEnabled(env) || !isGrokOAuthProvider(input.provider)) {\n\t\treturn { loadoutAccessPolicy: undefined, warnings: [], runtimeState: undefined };\n\t}\n\n\tconst agentDir = input.agentDir ?? getAgentDir();\n\ttry {\n\t\tconst profile = composeGrokHarnessProfile(input);\n\t\tconst state = applyLoadoutToRuntime(input.session, input.resourceLoader, input.cwd, agentDir, {\n\t\t\tprofile,\n\t\t\trole: \"coder\",\n\t\t});\n\t\tif (state.blockers.length > 0) {\n\t\t\treturn {\n\t\t\t\tloadoutAccessPolicy: undefined,\n\t\t\t\twarnings: state.blockers,\n\t\t\t\truntimeState: state,\n\t\t\t};\n\t\t}\n\t\tconst policy = createLoadoutPolicyFromRuntimeState(state, {\n\t\t\tcwd: input.cwd,\n\t\t\tcommands: profile.commands,\n\t\t});\n\t\treturn {\n\t\t\tloadoutAccessPolicy: policy,\n\t\t\twarnings: uniqueSorted([\n\t\t\t\t...state.warnings,\n\t\t\t\t...(input.task?.trim() && state.activeSkills.length === 0 ? [\"no grok-harness skill signals\"] : []),\n\t\t\t]),\n\t\t\truntimeState: state,\n\t\t};\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\treturn { loadoutAccessPolicy: undefined, warnings: [message], runtimeState: undefined };\n\t}\n}\n\nfunction composeGrokHarnessProfile(input: GrokHarnessDispatchInput): ComposedLoadout {\n\tconst profile = composeLoadout(\"coder\", GROK_HARNESS_DOMAIN_ID);\n\tconst task = input.task?.trim();\n\tif (!task) {\n\t\treturn { ...profile, skills: { allow: [{ kind: \"skill\", names: [] }] } };\n\t}\n\n\tconst inventory = input.resourceLoader.getSkills().skills;\n\tconst selected = selectGrokHarnessSkills(task, inventory, { paths: input.paths });\n\treturn {\n\t\t...profile,\n\t\tskills: { allow: [{ kind: \"skill\", names: [...selected] }] },\n\t};\n}\n"]}
|
|
@@ -3,10 +3,11 @@
|
|
|
3
3
|
* Does not require `OMK_DOMAIN_ROUTING=1`.
|
|
4
4
|
*/
|
|
5
5
|
import { getAgentDir } from "../config.js";
|
|
6
|
-
import { GROK_HARNESS_DOMAIN_ID, grokHarnessAutoApplyEnabled, isGrokOAuthProvider } from "./grok-harness.js";
|
|
6
|
+
import { GROK_HARNESS_DOMAIN_ID, grokHarnessAutoApplyEnabled, isGrokOAuthProvider, selectGrokHarnessSkills, } from "./grok-harness.js";
|
|
7
7
|
import { composeLoadout } from "./loadout-compose.js";
|
|
8
8
|
import { createLoadoutPolicyFromRuntimeState } from "./loadout-policy-bridge.js";
|
|
9
9
|
import { applyLoadoutToRuntime } from "./loadout-runtime.js";
|
|
10
|
+
import { uniqueSorted } from "./loadout-safety.js";
|
|
10
11
|
export function tryGrokHarnessDispatch(input) {
|
|
11
12
|
const env = input.env ?? process.env;
|
|
12
13
|
if (!grokHarnessAutoApplyEnabled(env) || !isGrokOAuthProvider(input.provider)) {
|
|
@@ -14,7 +15,7 @@ export function tryGrokHarnessDispatch(input) {
|
|
|
14
15
|
}
|
|
15
16
|
const agentDir = input.agentDir ?? getAgentDir();
|
|
16
17
|
try {
|
|
17
|
-
const profile =
|
|
18
|
+
const profile = composeGrokHarnessProfile(input);
|
|
18
19
|
const state = applyLoadoutToRuntime(input.session, input.resourceLoader, input.cwd, agentDir, {
|
|
19
20
|
profile,
|
|
20
21
|
role: "coder",
|
|
@@ -32,7 +33,10 @@ export function tryGrokHarnessDispatch(input) {
|
|
|
32
33
|
});
|
|
33
34
|
return {
|
|
34
35
|
loadoutAccessPolicy: policy,
|
|
35
|
-
warnings:
|
|
36
|
+
warnings: uniqueSorted([
|
|
37
|
+
...state.warnings,
|
|
38
|
+
...(input.task?.trim() && state.activeSkills.length === 0 ? ["no grok-harness skill signals"] : []),
|
|
39
|
+
]),
|
|
36
40
|
runtimeState: state,
|
|
37
41
|
};
|
|
38
42
|
}
|
|
@@ -41,4 +45,17 @@ export function tryGrokHarnessDispatch(input) {
|
|
|
41
45
|
return { loadoutAccessPolicy: undefined, warnings: [message], runtimeState: undefined };
|
|
42
46
|
}
|
|
43
47
|
}
|
|
48
|
+
function composeGrokHarnessProfile(input) {
|
|
49
|
+
const profile = composeLoadout("coder", GROK_HARNESS_DOMAIN_ID);
|
|
50
|
+
const task = input.task?.trim();
|
|
51
|
+
if (!task) {
|
|
52
|
+
return { ...profile, skills: { allow: [{ kind: "skill", names: [] }] } };
|
|
53
|
+
}
|
|
54
|
+
const inventory = input.resourceLoader.getSkills().skills;
|
|
55
|
+
const selected = selectGrokHarnessSkills(task, inventory, { paths: input.paths });
|
|
56
|
+
return {
|
|
57
|
+
...profile,
|
|
58
|
+
skills: { allow: [{ kind: "skill", names: [...selected] }] },
|
|
59
|
+
};
|
|
60
|
+
}
|
|
44
61
|
//# sourceMappingURL=grok-harness-dispatch.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grok-harness-dispatch.js","sourceRoot":"","sources":["../../src/core/grok-harness-dispatch.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,
|
|
1
|
+
{"version":3,"file":"grok-harness-dispatch.js","sourceRoot":"","sources":["../../src/core/grok-harness-dispatch.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Apply the `grok-harness` domain loadout when the active provider is Grok OAuth.\n * Does not require `OMK_DOMAIN_ROUTING=1`.\n */\n\nimport { getAgentDir } from \"../config.ts\";\nimport {\n\tGROK_HARNESS_DOMAIN_ID,\n\tgrokHarnessAutoApplyEnabled,\n\tisGrokOAuthProvider,\n\tselectGrokHarnessSkills,\n} from \"./grok-harness.ts\";\nimport type { LoadoutAccessPolicy } from \"./loadout-access-policy.ts\";\nimport { type ComposedLoadout, composeLoadout } from \"./loadout-compose.ts\";\nimport { createLoadoutPolicyFromRuntimeState } from \"./loadout-policy-bridge.ts\";\nimport { applyLoadoutToRuntime, type LoadoutRuntimeSession, type LoadoutRuntimeState } from \"./loadout-runtime.ts\";\nimport { uniqueSorted } from \"./loadout-safety.ts\";\nimport type { ResourceLoader } from \"./resource-loader.ts\";\n\nexport interface GrokHarnessDispatchInput {\n\treadonly provider: string | undefined;\n\treadonly session: LoadoutRuntimeSession;\n\treadonly resourceLoader: ResourceLoader;\n\treadonly cwd: string;\n\treadonly agentDir?: string;\n\treadonly env?: NodeJS.ProcessEnv | Readonly<Record<string, string | undefined>>;\n\t/** When set, narrow the grok-harness skill grant to the documented 2–3 subset. */\n\treadonly task?: string;\n\t/** Optional path hints scored with the task text. */\n\treadonly paths?: readonly string[];\n}\n\nexport interface GrokHarnessDispatchResult {\n\treadonly loadoutAccessPolicy: LoadoutAccessPolicy | undefined;\n\treadonly warnings: readonly string[];\n\treadonly runtimeState: LoadoutRuntimeState | undefined;\n}\n\nexport function tryGrokHarnessDispatch(input: GrokHarnessDispatchInput): GrokHarnessDispatchResult {\n\tconst env = input.env ?? process.env;\n\tif (!grokHarnessAutoApplyEnabled(env) || !isGrokOAuthProvider(input.provider)) {\n\t\treturn { loadoutAccessPolicy: undefined, warnings: [], runtimeState: undefined };\n\t}\n\n\tconst agentDir = input.agentDir ?? getAgentDir();\n\ttry {\n\t\tconst profile = composeGrokHarnessProfile(input);\n\t\tconst state = applyLoadoutToRuntime(input.session, input.resourceLoader, input.cwd, agentDir, {\n\t\t\tprofile,\n\t\t\trole: \"coder\",\n\t\t});\n\t\tif (state.blockers.length > 0) {\n\t\t\treturn {\n\t\t\t\tloadoutAccessPolicy: undefined,\n\t\t\t\twarnings: state.blockers,\n\t\t\t\truntimeState: state,\n\t\t\t};\n\t\t}\n\t\tconst policy = createLoadoutPolicyFromRuntimeState(state, {\n\t\t\tcwd: input.cwd,\n\t\t\tcommands: profile.commands,\n\t\t});\n\t\treturn {\n\t\t\tloadoutAccessPolicy: policy,\n\t\t\twarnings: uniqueSorted([\n\t\t\t\t...state.warnings,\n\t\t\t\t...(input.task?.trim() && state.activeSkills.length === 0 ? [\"no grok-harness skill signals\"] : []),\n\t\t\t]),\n\t\t\truntimeState: state,\n\t\t};\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\treturn { loadoutAccessPolicy: undefined, warnings: [message], runtimeState: undefined };\n\t}\n}\n\nfunction composeGrokHarnessProfile(input: GrokHarnessDispatchInput): ComposedLoadout {\n\tconst profile = composeLoadout(\"coder\", GROK_HARNESS_DOMAIN_ID);\n\tconst task = input.task?.trim();\n\tif (!task) {\n\t\treturn { ...profile, skills: { allow: [{ kind: \"skill\", names: [] }] } };\n\t}\n\n\tconst inventory = input.resourceLoader.getSkills().skills;\n\tconst selected = selectGrokHarnessSkills(task, inventory, { paths: input.paths });\n\treturn {\n\t\t...profile,\n\t\tskills: { allow: [{ kind: \"skill\", names: [...selected] }] },\n\t};\n}\n"]}
|
|
@@ -1,25 +1,31 @@
|
|
|
1
|
+
import { type SkillCandidate } from "./skill-selector.ts";
|
|
1
2
|
/** Domain loadout id applied automatically when Grok OAuth provider is active. */
|
|
2
3
|
export declare const GROK_HARNESS_DOMAIN_ID = "grok-harness";
|
|
3
|
-
export declare const GROK_HARNESS_AUTO_APPLY_ENV = "OMK_GROK_HARNESS";
|
|
4
4
|
export declare const GROK_IMAGINE_MODEL_PREFIX = "grok-imagine-";
|
|
5
5
|
export type GrokModelRoute = "text-chat" | "imagine-tool-only";
|
|
6
6
|
export type GrokHarnessIntent = "code" | "debug" | "plan" | "image" | "media";
|
|
7
|
-
export declare class GrokImagineModelCompletionError extends Error {
|
|
8
|
-
readonly name = "GrokImagineModelCompletionError";
|
|
9
|
-
readonly modelId: string;
|
|
10
|
-
readonly provider: string;
|
|
11
|
-
constructor(modelId: string, provider: string);
|
|
12
|
-
}
|
|
13
7
|
export declare function isGrokImagineModelId(id: string): boolean;
|
|
14
8
|
export declare function classifyGrokModelRoute(modelId: string): GrokModelRoute;
|
|
15
9
|
export declare function assertTextChatModelForCompletion(modelId: string, provider?: string): void;
|
|
16
10
|
export declare function recommendedSkillTierForIntent(intent: GrokHarnessIntent): readonly string[];
|
|
11
|
+
export interface GrokHarnessSkillCandidate extends SkillCandidate {
|
|
12
|
+
readonly disableModelInvocation?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface GrokHarnessSkillSelectionOptions {
|
|
15
|
+
readonly paths?: readonly string[];
|
|
16
|
+
readonly contextPressure?: boolean;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Smallest grok-harness skill grant from the live inventory. The domain
|
|
20
|
+
* profile owns the allowlist; explicit-only skills are excluded. `headroom`
|
|
21
|
+
* requires lexical or measured pressure, and the result never exceeds
|
|
22
|
+
* {@link MAX_SELECTED_SKILLS} names.
|
|
23
|
+
*/
|
|
24
|
+
export declare function selectGrokHarnessSkills(task: string, inventory: readonly GrokHarnessSkillCandidate[], options?: GrokHarnessSkillSelectionOptions): readonly string[];
|
|
17
25
|
export declare function isGrokOAuthProvider(provider: string | undefined): boolean;
|
|
18
26
|
/**
|
|
19
27
|
* When true (default), selecting native `xai` applies the `grok-harness` domain loadout
|
|
20
28
|
* (skills/MCP/hooks/tool gate). Set `OMK_GROK_HARNESS=0` to disable.
|
|
21
29
|
*/
|
|
22
30
|
export declare function grokHarnessAutoApplyEnabled(env?: NodeJS.ProcessEnv | Readonly<Record<string, string | undefined>>): boolean;
|
|
23
|
-
/** Routing prompt from the grok-harness domain profile (system prompt append). */
|
|
24
|
-
export declare function getGrokHarnessRoutingPromptAppend(): string | undefined;
|
|
25
31
|
//# sourceMappingURL=grok-harness.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grok-harness.d.ts","sourceRoot":"","sources":["../../src/core/grok-harness.ts"],"names":[],"mappings":"AAGA,
|
|
1
|
+
{"version":3,"file":"grok-harness.d.ts","sourceRoot":"","sources":["../../src/core/grok-harness.ts"],"names":[],"mappings":"AAGA,OAAO,EAAuB,KAAK,cAAc,EAAgB,MAAM,qBAAqB,CAAC;AAE7F,kFAAkF;AAClF,eAAO,MAAM,sBAAsB,iBAAiB,CAAC;AAIrD,eAAO,MAAM,yBAAyB,kBAAkB,CAAC;AAEzD,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,mBAAmB,CAAC;AAC/D,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAwB9E,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAExD;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CAKtE;AAED,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAIzF;AAED,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,iBAAiB,GAAG,SAAS,MAAM,EAAE,CAE1F;AAED,MAAM,WAAW,yBAA0B,SAAQ,cAAc;IAChE,QAAQ,CAAC,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAC1C;AAED,MAAM,WAAW,gCAAgC;IAChD,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;CACnC;AAOD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACtC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,SAAS,yBAAyB,EAAE,EAC/C,OAAO,GAAE,gCAAqC,GAC5C,SAAS,MAAM,EAAE,CAiBnB;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEzE;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAC1C,GAAG,GAAE,MAAM,CAAC,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAe,GACjF,OAAO,CAMT","sourcesContent":["import { getDomainProfile } from \"./domain-loadouts.ts\";\nimport { GROK_OAUTH_PROVIDER } from \"./grok-playbook.ts\";\nimport { capabilityGateNames } from \"./loadout-safety.ts\";\nimport { MAX_SELECTED_SKILLS, type SkillCandidate, selectSkills } from \"./skill-selector.ts\";\n\n/** Domain loadout id applied automatically when Grok OAuth provider is active. */\nexport const GROK_HARNESS_DOMAIN_ID = \"grok-harness\";\n\nconst GROK_HARNESS_AUTO_APPLY_ENV = \"OMK_GROK_HARNESS\";\n\nexport const GROK_IMAGINE_MODEL_PREFIX = \"grok-imagine-\";\n\nexport type GrokModelRoute = \"text-chat\" | \"imagine-tool-only\";\nexport type GrokHarnessIntent = \"code\" | \"debug\" | \"plan\" | \"image\" | \"media\";\n\nconst SKILLS_BY_INTENT = {\n\tcode: [\"packages\", \"programming\"],\n\tdebug: [\"packages\", \"debugging\", \"programming\"],\n\tplan: [\"packages\", \"adaptorch-route\"],\n\timage: [\"image-prompt\"],\n\tmedia: [\"image-prompt\", \"adaptorch-route\"],\n} as const satisfies Record<GrokHarnessIntent, readonly string[]>;\n\nclass GrokImagineModelCompletionError extends Error {\n\treadonly name = \"GrokImagineModelCompletionError\";\n\treadonly modelId: string;\n\treadonly provider: string;\n\n\tconstructor(modelId: string, provider: string) {\n\t\tsuper(\n\t\t\t`Grok Imagine model \"${modelId}\" is tool-only on ${provider}; select a text-chat Grok model for completions.`,\n\t\t);\n\t\tthis.modelId = modelId;\n\t\tthis.provider = provider;\n\t}\n}\n\nexport function isGrokImagineModelId(id: string): boolean {\n\treturn id.startsWith(GROK_IMAGINE_MODEL_PREFIX);\n}\n\nexport function classifyGrokModelRoute(modelId: string): GrokModelRoute {\n\tif (isGrokImagineModelId(modelId)) {\n\t\treturn \"imagine-tool-only\";\n\t}\n\treturn \"text-chat\";\n}\n\nexport function assertTextChatModelForCompletion(modelId: string, provider?: string): void {\n\tif (provider === GROK_OAUTH_PROVIDER && isGrokImagineModelId(modelId)) {\n\t\tthrow new GrokImagineModelCompletionError(modelId, provider);\n\t}\n}\n\nexport function recommendedSkillTierForIntent(intent: GrokHarnessIntent): readonly string[] {\n\treturn SKILLS_BY_INTENT[intent];\n}\n\nexport interface GrokHarnessSkillCandidate extends SkillCandidate {\n\treadonly disableModelInvocation?: boolean;\n}\n\nexport interface GrokHarnessSkillSelectionOptions {\n\treadonly paths?: readonly string[];\n\treadonly contextPressure?: boolean;\n}\n\nconst GROK_HARNESS_ALLOWED_SKILLS: ReadonlySet<string> = new Set(\n\tcapabilityGateNames(getDomainProfile(GROK_HARNESS_DOMAIN_ID).skills),\n);\nconst HEADROOM_PRESSURE_RE = /headroom|oversized|context window|context pressure|token budget|\\bcompress\\b/i;\n\n/**\n * Smallest grok-harness skill grant from the live inventory. The domain\n * profile owns the allowlist; explicit-only skills are excluded. `headroom`\n * requires lexical or measured pressure, and the result never exceeds\n * {@link MAX_SELECTED_SKILLS} names.\n */\nexport function selectGrokHarnessSkills(\n\ttask: string,\n\tinventory: readonly GrokHarnessSkillCandidate[],\n\toptions: GrokHarnessSkillSelectionOptions = {},\n): readonly string[] {\n\tconst pressure = options.contextPressure === true || HEADROOM_PRESSURE_RE.test(task);\n\tconst skills = inventory.filter((skill) => {\n\t\tif (!GROK_HARNESS_ALLOWED_SKILLS.has(skill.name)) return false;\n\t\tif (skill.disableModelInvocation) return false;\n\t\tif (skill.name === \"headroom\" && !pressure) return false;\n\t\treturn true;\n\t});\n\tconst selected = selectSkills({\n\t\ttask,\n\t\tskills,\n\t\tpaths: options.paths,\n\t\tmax: MAX_SELECTED_SKILLS,\n\t}).selected.map((skill) => skill.name);\n\tconst headroom = pressure ? skills.find((skill) => skill.name === \"headroom\") : undefined;\n\tif (!headroom || selected.includes(headroom.name)) return selected;\n\treturn [...selected.slice(0, MAX_SELECTED_SKILLS - 1), headroom.name];\n}\n\nexport function isGrokOAuthProvider(provider: string | undefined): boolean {\n\treturn provider === GROK_OAUTH_PROVIDER;\n}\n\n/**\n * When true (default), selecting native `xai` applies the `grok-harness` domain loadout\n * (skills/MCP/hooks/tool gate). Set `OMK_GROK_HARNESS=0` to disable.\n */\nexport function grokHarnessAutoApplyEnabled(\n\tenv: NodeJS.ProcessEnv | Readonly<Record<string, string | undefined>> = process.env,\n): boolean {\n\tconst raw = env[GROK_HARNESS_AUTO_APPLY_ENV]?.trim().toLowerCase();\n\tif (raw === \"0\" || raw === \"false\" || raw === \"off\" || raw === \"no\") {\n\t\treturn false;\n\t}\n\treturn true;\n}\n"]}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { getDomainProfile } from "./domain-loadouts.js";
|
|
2
2
|
import { GROK_OAUTH_PROVIDER } from "./grok-playbook.js";
|
|
3
|
+
import { capabilityGateNames } from "./loadout-safety.js";
|
|
4
|
+
import { MAX_SELECTED_SKILLS, selectSkills } from "./skill-selector.js";
|
|
3
5
|
/** Domain loadout id applied automatically when Grok OAuth provider is active. */
|
|
4
6
|
export const GROK_HARNESS_DOMAIN_ID = "grok-harness";
|
|
5
|
-
|
|
7
|
+
const GROK_HARNESS_AUTO_APPLY_ENV = "OMK_GROK_HARNESS";
|
|
6
8
|
export const GROK_IMAGINE_MODEL_PREFIX = "grok-imagine-";
|
|
7
9
|
const SKILLS_BY_INTENT = {
|
|
8
10
|
code: ["packages", "programming"],
|
|
@@ -11,7 +13,7 @@ const SKILLS_BY_INTENT = {
|
|
|
11
13
|
image: ["image-prompt"],
|
|
12
14
|
media: ["image-prompt", "adaptorch-route"],
|
|
13
15
|
};
|
|
14
|
-
|
|
16
|
+
class GrokImagineModelCompletionError extends Error {
|
|
15
17
|
name = "GrokImagineModelCompletionError";
|
|
16
18
|
modelId;
|
|
17
19
|
provider;
|
|
@@ -38,6 +40,36 @@ export function assertTextChatModelForCompletion(modelId, provider) {
|
|
|
38
40
|
export function recommendedSkillTierForIntent(intent) {
|
|
39
41
|
return SKILLS_BY_INTENT[intent];
|
|
40
42
|
}
|
|
43
|
+
const GROK_HARNESS_ALLOWED_SKILLS = new Set(capabilityGateNames(getDomainProfile(GROK_HARNESS_DOMAIN_ID).skills));
|
|
44
|
+
const HEADROOM_PRESSURE_RE = /headroom|oversized|context window|context pressure|token budget|\bcompress\b/i;
|
|
45
|
+
/**
|
|
46
|
+
* Smallest grok-harness skill grant from the live inventory. The domain
|
|
47
|
+
* profile owns the allowlist; explicit-only skills are excluded. `headroom`
|
|
48
|
+
* requires lexical or measured pressure, and the result never exceeds
|
|
49
|
+
* {@link MAX_SELECTED_SKILLS} names.
|
|
50
|
+
*/
|
|
51
|
+
export function selectGrokHarnessSkills(task, inventory, options = {}) {
|
|
52
|
+
const pressure = options.contextPressure === true || HEADROOM_PRESSURE_RE.test(task);
|
|
53
|
+
const skills = inventory.filter((skill) => {
|
|
54
|
+
if (!GROK_HARNESS_ALLOWED_SKILLS.has(skill.name))
|
|
55
|
+
return false;
|
|
56
|
+
if (skill.disableModelInvocation)
|
|
57
|
+
return false;
|
|
58
|
+
if (skill.name === "headroom" && !pressure)
|
|
59
|
+
return false;
|
|
60
|
+
return true;
|
|
61
|
+
});
|
|
62
|
+
const selected = selectSkills({
|
|
63
|
+
task,
|
|
64
|
+
skills,
|
|
65
|
+
paths: options.paths,
|
|
66
|
+
max: MAX_SELECTED_SKILLS,
|
|
67
|
+
}).selected.map((skill) => skill.name);
|
|
68
|
+
const headroom = pressure ? skills.find((skill) => skill.name === "headroom") : undefined;
|
|
69
|
+
if (!headroom || selected.includes(headroom.name))
|
|
70
|
+
return selected;
|
|
71
|
+
return [...selected.slice(0, MAX_SELECTED_SKILLS - 1), headroom.name];
|
|
72
|
+
}
|
|
41
73
|
export function isGrokOAuthProvider(provider) {
|
|
42
74
|
return provider === GROK_OAUTH_PROVIDER;
|
|
43
75
|
}
|
|
@@ -52,10 +84,4 @@ export function grokHarnessAutoApplyEnabled(env = process.env) {
|
|
|
52
84
|
}
|
|
53
85
|
return true;
|
|
54
86
|
}
|
|
55
|
-
/** Routing prompt from the grok-harness domain profile (system prompt append). */
|
|
56
|
-
export function getGrokHarnessRoutingPromptAppend() {
|
|
57
|
-
const profile = getDomainProfile(GROK_HARNESS_DOMAIN_ID);
|
|
58
|
-
const text = profile.routingPrompt?.trim();
|
|
59
|
-
return text && text.length > 0 ? text : undefined;
|
|
60
|
-
}
|
|
61
87
|
//# sourceMappingURL=grok-harness.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grok-harness.js","sourceRoot":"","sources":["../../src/core/grok-harness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"grok-harness.js","sourceRoot":"","sources":["../../src/core/grok-harness.ts"],"names":[],"mappings":"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","sourcesContent":["import { getDomainProfile } from \"./domain-loadouts.ts\";\nimport { GROK_OAUTH_PROVIDER } from \"./grok-playbook.ts\";\nimport { capabilityGateNames } from \"./loadout-safety.ts\";\nimport { MAX_SELECTED_SKILLS, type SkillCandidate, selectSkills } from \"./skill-selector.ts\";\n\n/** Domain loadout id applied automatically when Grok OAuth provider is active. */\nexport const GROK_HARNESS_DOMAIN_ID = \"grok-harness\";\n\nconst GROK_HARNESS_AUTO_APPLY_ENV = \"OMK_GROK_HARNESS\";\n\nexport const GROK_IMAGINE_MODEL_PREFIX = \"grok-imagine-\";\n\nexport type GrokModelRoute = \"text-chat\" | \"imagine-tool-only\";\nexport type GrokHarnessIntent = \"code\" | \"debug\" | \"plan\" | \"image\" | \"media\";\n\nconst SKILLS_BY_INTENT = {\n\tcode: [\"packages\", \"programming\"],\n\tdebug: [\"packages\", \"debugging\", \"programming\"],\n\tplan: [\"packages\", \"adaptorch-route\"],\n\timage: [\"image-prompt\"],\n\tmedia: [\"image-prompt\", \"adaptorch-route\"],\n} as const satisfies Record<GrokHarnessIntent, readonly string[]>;\n\nclass GrokImagineModelCompletionError extends Error {\n\treadonly name = \"GrokImagineModelCompletionError\";\n\treadonly modelId: string;\n\treadonly provider: string;\n\n\tconstructor(modelId: string, provider: string) {\n\t\tsuper(\n\t\t\t`Grok Imagine model \"${modelId}\" is tool-only on ${provider}; select a text-chat Grok model for completions.`,\n\t\t);\n\t\tthis.modelId = modelId;\n\t\tthis.provider = provider;\n\t}\n}\n\nexport function isGrokImagineModelId(id: string): boolean {\n\treturn id.startsWith(GROK_IMAGINE_MODEL_PREFIX);\n}\n\nexport function classifyGrokModelRoute(modelId: string): GrokModelRoute {\n\tif (isGrokImagineModelId(modelId)) {\n\t\treturn \"imagine-tool-only\";\n\t}\n\treturn \"text-chat\";\n}\n\nexport function assertTextChatModelForCompletion(modelId: string, provider?: string): void {\n\tif (provider === GROK_OAUTH_PROVIDER && isGrokImagineModelId(modelId)) {\n\t\tthrow new GrokImagineModelCompletionError(modelId, provider);\n\t}\n}\n\nexport function recommendedSkillTierForIntent(intent: GrokHarnessIntent): readonly string[] {\n\treturn SKILLS_BY_INTENT[intent];\n}\n\nexport interface GrokHarnessSkillCandidate extends SkillCandidate {\n\treadonly disableModelInvocation?: boolean;\n}\n\nexport interface GrokHarnessSkillSelectionOptions {\n\treadonly paths?: readonly string[];\n\treadonly contextPressure?: boolean;\n}\n\nconst GROK_HARNESS_ALLOWED_SKILLS: ReadonlySet<string> = new Set(\n\tcapabilityGateNames(getDomainProfile(GROK_HARNESS_DOMAIN_ID).skills),\n);\nconst HEADROOM_PRESSURE_RE = /headroom|oversized|context window|context pressure|token budget|\\bcompress\\b/i;\n\n/**\n * Smallest grok-harness skill grant from the live inventory. The domain\n * profile owns the allowlist; explicit-only skills are excluded. `headroom`\n * requires lexical or measured pressure, and the result never exceeds\n * {@link MAX_SELECTED_SKILLS} names.\n */\nexport function selectGrokHarnessSkills(\n\ttask: string,\n\tinventory: readonly GrokHarnessSkillCandidate[],\n\toptions: GrokHarnessSkillSelectionOptions = {},\n): readonly string[] {\n\tconst pressure = options.contextPressure === true || HEADROOM_PRESSURE_RE.test(task);\n\tconst skills = inventory.filter((skill) => {\n\t\tif (!GROK_HARNESS_ALLOWED_SKILLS.has(skill.name)) return false;\n\t\tif (skill.disableModelInvocation) return false;\n\t\tif (skill.name === \"headroom\" && !pressure) return false;\n\t\treturn true;\n\t});\n\tconst selected = selectSkills({\n\t\ttask,\n\t\tskills,\n\t\tpaths: options.paths,\n\t\tmax: MAX_SELECTED_SKILLS,\n\t}).selected.map((skill) => skill.name);\n\tconst headroom = pressure ? skills.find((skill) => skill.name === \"headroom\") : undefined;\n\tif (!headroom || selected.includes(headroom.name)) return selected;\n\treturn [...selected.slice(0, MAX_SELECTED_SKILLS - 1), headroom.name];\n}\n\nexport function isGrokOAuthProvider(provider: string | undefined): boolean {\n\treturn provider === GROK_OAUTH_PROVIDER;\n}\n\n/**\n * When true (default), selecting native `xai` applies the `grok-harness` domain loadout\n * (skills/MCP/hooks/tool gate). Set `OMK_GROK_HARNESS=0` to disable.\n */\nexport function grokHarnessAutoApplyEnabled(\n\tenv: NodeJS.ProcessEnv | Readonly<Record<string, string | undefined>> = process.env,\n): boolean {\n\tconst raw = env[GROK_HARNESS_AUTO_APPLY_ENV]?.trim().toLowerCase();\n\tif (raw === \"0\" || raw === \"false\" || raw === \"off\" || raw === \"no\") {\n\t\treturn false;\n\t}\n\treturn true;\n}\n"]}
|
package/dist/core/mcp/tools.d.ts
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Two things make this small:
|
|
5
5
|
* - `validateToolArguments` already accepts a plain JSON Schema, so an MCP
|
|
6
|
-
* `inputSchema` is passed
|
|
7
|
-
* TypeBox.
|
|
6
|
+
* `inputSchema` is passed through with only its root coerced instead of being
|
|
7
|
+
* re-modelled in TypeBox.
|
|
8
8
|
* - MCP content blocks are already text/image, which is exactly what the
|
|
9
9
|
* harness renders.
|
|
10
10
|
*
|