open-multi-agent-kit 0.99.0 → 1.2.0
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 +30 -1
- package/README.md +3 -3
- package/dist/bun/cli.d.ts.map +1 -1
- package/dist/bun/cli.js +1 -0
- package/dist/bun/cli.js.map +1 -1
- package/dist/bun/register-bundled-coding-agent.d.ts +10 -0
- package/dist/bun/register-bundled-coding-agent.d.ts.map +1 -0
- package/dist/bun/register-bundled-coding-agent.js +12 -0
- package/dist/bun/register-bundled-coding-agent.js.map +1 -0
- package/dist/cli/args.d.ts +1 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +1 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +2 -1
- package/dist/cli/help.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +14 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/neo-cli.d.ts +9 -0
- package/dist/commands/neo-cli.d.ts.map +1 -0
- package/dist/commands/neo-cli.js +61 -0
- package/dist/commands/neo-cli.js.map +1 -0
- package/dist/coordination/awareness.d.ts +32 -0
- package/dist/coordination/awareness.d.ts.map +1 -0
- package/dist/coordination/awareness.js +55 -0
- package/dist/coordination/awareness.js.map +1 -0
- package/dist/coordination/broker.d.ts +79 -0
- package/dist/coordination/broker.d.ts.map +1 -0
- package/dist/coordination/broker.js +195 -0
- package/dist/coordination/broker.js.map +1 -0
- package/dist/coordination/index.d.ts +16 -0
- package/dist/coordination/index.d.ts.map +1 -0
- package/dist/coordination/index.js +16 -0
- package/dist/coordination/index.js.map +1 -0
- package/dist/coordination/integration.d.ts +59 -0
- package/dist/coordination/integration.d.ts.map +1 -0
- package/dist/coordination/integration.js +126 -0
- package/dist/coordination/integration.js.map +1 -0
- package/dist/coordination/operation.d.ts +106 -0
- package/dist/coordination/operation.d.ts.map +1 -0
- package/dist/coordination/operation.js +179 -0
- package/dist/coordination/operation.js.map +1 -0
- package/dist/coordination/resource.d.ts +33 -0
- package/dist/coordination/resource.d.ts.map +1 -0
- package/dist/coordination/resource.js +89 -0
- package/dist/coordination/resource.js.map +1 -0
- package/dist/coordination/session.d.ts +74 -0
- package/dist/coordination/session.d.ts.map +1 -0
- package/dist/coordination/session.js +143 -0
- package/dist/coordination/session.js.map +1 -0
- package/dist/coordination/types.d.ts +68 -0
- package/dist/coordination/types.d.ts.map +1 -0
- package/dist/coordination/types.js +26 -0
- package/dist/coordination/types.js.map +1 -0
- package/dist/core/agent-session.d.ts +29 -2
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +135 -37
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/bundled-skills.d.ts +4 -0
- package/dist/core/bundled-skills.d.ts.map +1 -0
- package/dist/core/bundled-skills.js +32 -0
- package/dist/core/bundled-skills.js.map +1 -0
- package/dist/core/cli-diagnostics.d.ts +6 -0
- package/dist/core/cli-diagnostics.d.ts.map +1 -0
- package/dist/core/cli-diagnostics.js +20 -0
- package/dist/core/cli-diagnostics.js.map +1 -0
- package/dist/core/compaction/control-state.d.ts +41 -0
- package/dist/core/compaction/control-state.d.ts.map +1 -0
- package/dist/core/compaction/control-state.js +85 -0
- package/dist/core/compaction/control-state.js.map +1 -0
- package/dist/core/compaction/fallback.d.ts +60 -0
- package/dist/core/compaction/fallback.d.ts.map +1 -0
- package/dist/core/compaction/fallback.js +117 -0
- package/dist/core/compaction/fallback.js.map +1 -0
- package/dist/core/compaction/index.d.ts +2 -0
- package/dist/core/compaction/index.d.ts.map +1 -1
- package/dist/core/compaction/index.js +2 -0
- package/dist/core/compaction/index.js.map +1 -1
- package/dist/core/context-budget-headroom-candidates.d.ts +16 -1
- package/dist/core/context-budget-headroom-candidates.d.ts.map +1 -1
- package/dist/core/context-budget-headroom-candidates.js +31 -13
- package/dist/core/context-budget-headroom-candidates.js.map +1 -1
- package/dist/core/context-budget-headroom-types.d.ts +7 -1
- package/dist/core/context-budget-headroom-types.d.ts.map +1 -1
- package/dist/core/context-budget-headroom-types.js +0 -1
- package/dist/core/context-budget-headroom-types.js.map +1 -1
- package/dist/core/context-budget-headroom.d.ts +22 -0
- package/dist/core/context-budget-headroom.d.ts.map +1 -1
- package/dist/core/context-budget-headroom.js +46 -2
- package/dist/core/context-budget-headroom.js.map +1 -1
- package/dist/core/context-budget-v2-global-pass.d.ts +21 -0
- package/dist/core/context-budget-v2-global-pass.d.ts.map +1 -0
- package/dist/core/context-budget-v2-global-pass.js +203 -0
- package/dist/core/context-budget-v2-global-pass.js.map +1 -0
- package/dist/core/context-budget-v2-input-validation.d.ts +4 -0
- package/dist/core/context-budget-v2-input-validation.d.ts.map +1 -0
- package/dist/core/context-budget-v2-input-validation.js +79 -0
- package/dist/core/context-budget-v2-input-validation.js.map +1 -0
- package/dist/core/context-budget-v2-observability.d.ts +15 -0
- package/dist/core/context-budget-v2-observability.d.ts.map +1 -0
- package/dist/core/context-budget-v2-observability.js +35 -0
- package/dist/core/context-budget-v2-observability.js.map +1 -0
- package/dist/core/context-budget-v2-planned-items.d.ts +17 -0
- package/dist/core/context-budget-v2-planned-items.d.ts.map +1 -0
- package/dist/core/context-budget-v2-planned-items.js +59 -0
- package/dist/core/context-budget-v2-planned-items.js.map +1 -0
- package/dist/core/context-budget-v2-planner.d.ts.map +1 -1
- package/dist/core/context-budget-v2-planner.js +69 -51
- package/dist/core/context-budget-v2-planner.js.map +1 -1
- package/dist/core/context-budget-v2-scoring.d.ts +7 -1
- package/dist/core/context-budget-v2-scoring.d.ts.map +1 -1
- package/dist/core/context-budget-v2-scoring.js.map +1 -1
- package/dist/core/context-budget-v2-selection.d.ts +22 -3
- package/dist/core/context-budget-v2-selection.d.ts.map +1 -1
- package/dist/core/context-budget-v2-selection.js +41 -59
- package/dist/core/context-budget-v2-selection.js.map +1 -1
- package/dist/core/context-budget-v2-tiers.d.ts.map +1 -1
- package/dist/core/context-budget-v2-tiers.js +9 -42
- package/dist/core/context-budget-v2-tiers.js.map +1 -1
- package/dist/core/context-budget-v2-types.d.ts +14 -2
- package/dist/core/context-budget-v2-types.d.ts.map +1 -1
- package/dist/core/context-budget-v2-types.js +6 -1
- package/dist/core/context-budget-v2-types.js.map +1 -1
- package/dist/core/extensions/bundled-virtual-modules.d.ts +15 -0
- package/dist/core/extensions/bundled-virtual-modules.d.ts.map +1 -0
- package/dist/core/extensions/bundled-virtual-modules.js +63 -0
- package/dist/core/extensions/bundled-virtual-modules.js.map +1 -0
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +2 -42
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +1 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +6 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +10 -0
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/index.d.ts +2 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/loadout-runtime.d.ts +2 -8
- package/dist/core/loadout-runtime.d.ts.map +1 -1
- package/dist/core/loadout-runtime.js.map +1 -1
- package/dist/core/mcp/client.d.ts +27 -6
- package/dist/core/mcp/client.d.ts.map +1 -1
- package/dist/core/mcp/client.js +80 -20
- package/dist/core/mcp/client.js.map +1 -1
- package/dist/core/mcp/manager.d.ts +10 -1
- package/dist/core/mcp/manager.d.ts.map +1 -1
- package/dist/core/mcp/manager.js +68 -9
- package/dist/core/mcp/manager.js.map +1 -1
- package/dist/core/mcp/protocol.d.ts +9 -3
- package/dist/core/mcp/protocol.d.ts.map +1 -1
- package/dist/core/mcp/protocol.js +61 -15
- package/dist/core/mcp/protocol.js.map +1 -1
- package/dist/core/mcp/stdio-transport.d.ts +12 -1
- package/dist/core/mcp/stdio-transport.d.ts.map +1 -1
- package/dist/core/mcp/stdio-transport.js +30 -2
- package/dist/core/mcp/stdio-transport.js.map +1 -1
- package/dist/core/mcp-descriptor-injection.d.ts +26 -0
- package/dist/core/mcp-descriptor-injection.d.ts.map +1 -0
- package/dist/core/mcp-descriptor-injection.js +25 -0
- package/dist/core/mcp-descriptor-injection.js.map +1 -0
- package/dist/core/mcp-public-presets.d.ts +1 -3
- package/dist/core/mcp-public-presets.d.ts.map +1 -1
- package/dist/core/mcp-public-presets.js +3 -15
- package/dist/core/mcp-public-presets.js.map +1 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +24 -3
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/neo/catalog.d.ts +20 -0
- package/dist/core/neo/catalog.d.ts.map +1 -0
- package/dist/core/neo/catalog.js +50 -0
- package/dist/core/neo/catalog.js.map +1 -0
- package/dist/core/neo/setup.d.ts +3 -0
- package/dist/core/neo/setup.d.ts.map +1 -0
- package/dist/core/neo/setup.js +47 -0
- package/dist/core/neo/setup.js.map +1 -0
- package/dist/core/provider-default-models.d.ts +2 -0
- package/dist/core/provider-default-models.d.ts.map +1 -1
- package/dist/core/provider-default-models.js +2 -0
- package/dist/core/provider-default-models.js.map +1 -1
- package/dist/core/provider-display-names.d.ts.map +1 -1
- package/dist/core/provider-display-names.js +2 -0
- package/dist/core/provider-display-names.js.map +1 -1
- package/dist/core/provider-error-classification.d.ts +57 -0
- package/dist/core/provider-error-classification.d.ts.map +1 -0
- package/dist/core/provider-error-classification.js +103 -0
- package/dist/core/provider-error-classification.js.map +1 -0
- package/dist/core/provider-resilience.d.ts +10 -0
- package/dist/core/provider-resilience.d.ts.map +1 -1
- package/dist/core/provider-resilience.js +36 -3
- package/dist/core/provider-resilience.js.map +1 -1
- package/dist/core/provider-usage-commandcode.d.ts +9 -0
- package/dist/core/provider-usage-commandcode.d.ts.map +1 -0
- package/dist/core/provider-usage-commandcode.js +198 -0
- package/dist/core/provider-usage-commandcode.js.map +1 -0
- package/dist/core/provider-usage-devin.d.ts +5 -3
- package/dist/core/provider-usage-devin.d.ts.map +1 -1
- package/dist/core/provider-usage-devin.js +15 -5
- package/dist/core/provider-usage-devin.js.map +1 -1
- package/dist/core/provider-usage-types.d.ts +1 -1
- package/dist/core/provider-usage-types.d.ts.map +1 -1
- package/dist/core/provider-usage-types.js.map +1 -1
- package/dist/core/provider-usage.d.ts.map +1 -1
- package/dist/core/provider-usage.js +6 -0
- package/dist/core/provider-usage.js.map +1 -1
- package/dist/core/reasoning-router-resolver.d.ts +7 -0
- package/dist/core/reasoning-router-resolver.d.ts.map +1 -1
- package/dist/core/reasoning-router-resolver.js +21 -3
- package/dist/core/reasoning-router-resolver.js.map +1 -1
- package/dist/core/reasoning-router-v4.d.ts +8 -5
- package/dist/core/reasoning-router-v4.d.ts.map +1 -1
- package/dist/core/reasoning-router-v4.js +8 -5
- package/dist/core/reasoning-router-v4.js.map +1 -1
- package/dist/core/resource-admission.d.ts +36 -0
- package/dist/core/resource-admission.d.ts.map +1 -1
- package/dist/core/resource-admission.js +59 -0
- package/dist/core/resource-admission.js.map +1 -1
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +2 -2
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/run-usage-ledger.d.ts +47 -0
- package/dist/core/run-usage-ledger.d.ts.map +1 -0
- package/dist/core/run-usage-ledger.js +162 -0
- package/dist/core/run-usage-ledger.js.map +1 -0
- package/dist/core/run-usage-operation.d.ts +8 -0
- package/dist/core/run-usage-operation.d.ts.map +1 -0
- package/dist/core/run-usage-operation.js +12 -0
- package/dist/core/run-usage-operation.js.map +1 -0
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +5 -6
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-compaction-service.d.ts +15 -0
- package/dist/core/session-compaction-service.d.ts.map +1 -1
- package/dist/core/session-compaction-service.js +17 -4
- package/dist/core/session-compaction-service.js.map +1 -1
- package/dist/core/session-failure-cause.d.ts.map +1 -1
- package/dist/core/session-failure-cause.js +14 -5
- package/dist/core/session-failure-cause.js.map +1 -1
- package/dist/core/session-prompt-lifecycle.d.ts +6 -0
- package/dist/core/session-prompt-lifecycle.d.ts.map +1 -1
- package/dist/core/session-prompt-lifecycle.js +47 -2
- package/dist/core/session-prompt-lifecycle.js.map +1 -1
- package/dist/core/session-termination.d.ts.map +1 -1
- package/dist/core/session-termination.js +4 -2
- package/dist/core/session-termination.js.map +1 -1
- package/dist/core/subagent-lane-authority.d.ts +28 -0
- package/dist/core/subagent-lane-authority.d.ts.map +1 -0
- package/dist/core/subagent-lane-authority.js +119 -0
- package/dist/core/subagent-lane-authority.js.map +1 -0
- package/dist/core/subagent-lane-contract.d.ts +114 -0
- package/dist/core/subagent-lane-contract.d.ts.map +1 -0
- package/dist/core/subagent-lane-contract.js +18 -0
- package/dist/core/subagent-lane-contract.js.map +1 -0
- package/dist/core/subagent-lane-launcher.d.ts +3 -6
- package/dist/core/subagent-lane-launcher.d.ts.map +1 -1
- package/dist/core/subagent-lane-launcher.js +53 -12
- package/dist/core/subagent-lane-launcher.js.map +1 -1
- package/dist/core/subagent-orchestration.d.ts +4 -17
- package/dist/core/subagent-orchestration.d.ts.map +1 -1
- package/dist/core/subagent-orchestration.js.map +1 -1
- package/dist/core/todo-runtime-state.d.ts +12 -0
- package/dist/core/todo-runtime-state.d.ts.map +1 -1
- package/dist/core/todo-runtime-state.js +23 -0
- package/dist/core/todo-runtime-state.js.map +1 -1
- package/dist/core/verified-run/broker.d.ts.map +1 -1
- package/dist/core/verified-run/broker.js +4 -1
- package/dist/core/verified-run/broker.js.map +1 -1
- package/dist/core/workload-permit-pool.d.ts +1 -1
- package/dist/core/workload-permit-pool.d.ts.map +1 -1
- package/dist/core/workload-permit-pool.js +3 -0
- package/dist/core/workload-permit-pool.js.map +1 -1
- package/dist/guardrails/strict-evidence-approval-adapter.d.ts +34 -0
- package/dist/guardrails/strict-evidence-approval-adapter.d.ts.map +1 -0
- package/dist/guardrails/strict-evidence-approval-adapter.js +70 -0
- package/dist/guardrails/strict-evidence-approval-adapter.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +11 -18
- package/dist/main.js.map +1 -1
- package/dist/metacognition/calibration-selective.d.ts +78 -0
- package/dist/metacognition/calibration-selective.d.ts.map +1 -0
- package/dist/metacognition/calibration-selective.js +161 -0
- package/dist/metacognition/calibration-selective.js.map +1 -0
- package/dist/metacognition/calibration.d.ts +62 -0
- package/dist/metacognition/calibration.d.ts.map +1 -0
- package/dist/metacognition/calibration.js +122 -0
- package/dist/metacognition/calibration.js.map +1 -0
- package/dist/metacognition/checkpoint.d.ts +60 -0
- package/dist/metacognition/checkpoint.d.ts.map +1 -0
- package/dist/metacognition/checkpoint.js +57 -0
- package/dist/metacognition/checkpoint.js.map +1 -0
- package/dist/metacognition/context7.d.ts +48 -0
- package/dist/metacognition/context7.d.ts.map +1 -0
- package/dist/metacognition/context7.js +154 -0
- package/dist/metacognition/context7.js.map +1 -0
- package/dist/metacognition/decision.d.ts +44 -0
- package/dist/metacognition/decision.d.ts.map +1 -0
- package/dist/metacognition/decision.js +111 -0
- package/dist/metacognition/decision.js.map +1 -0
- package/dist/metacognition/evaluation.d.ts +73 -0
- package/dist/metacognition/evaluation.d.ts.map +1 -0
- package/dist/metacognition/evaluation.js +97 -0
- package/dist/metacognition/evaluation.js.map +1 -0
- package/dist/metacognition/index.d.ts +31 -0
- package/dist/metacognition/index.d.ts.map +1 -0
- package/dist/metacognition/index.js +31 -0
- package/dist/metacognition/index.js.map +1 -0
- package/dist/metacognition/knowledge-action.d.ts +43 -0
- package/dist/metacognition/knowledge-action.d.ts.map +1 -0
- package/dist/metacognition/knowledge-action.js +60 -0
- package/dist/metacognition/knowledge-action.js.map +1 -0
- package/dist/metacognition/knowledge.d.ts +84 -0
- package/dist/metacognition/knowledge.d.ts.map +1 -0
- package/dist/metacognition/knowledge.js +165 -0
- package/dist/metacognition/knowledge.js.map +1 -0
- package/dist/metacognition/obligations.d.ts +82 -0
- package/dist/metacognition/obligations.d.ts.map +1 -0
- package/dist/metacognition/obligations.js +139 -0
- package/dist/metacognition/obligations.js.map +1 -0
- package/dist/metacognition/observation-validity.d.ts +83 -0
- package/dist/metacognition/observation-validity.d.ts.map +1 -0
- package/dist/metacognition/observation-validity.js +118 -0
- package/dist/metacognition/observation-validity.js.map +1 -0
- package/dist/metacognition/observe.d.ts +45 -0
- package/dist/metacognition/observe.d.ts.map +1 -0
- package/dist/metacognition/observe.js +59 -0
- package/dist/metacognition/observe.js.map +1 -0
- package/dist/metacognition/policy.d.ts +53 -0
- package/dist/metacognition/policy.d.ts.map +1 -0
- package/dist/metacognition/policy.js +155 -0
- package/dist/metacognition/policy.js.map +1 -0
- package/dist/metacognition/predictions.d.ts +78 -0
- package/dist/metacognition/predictions.d.ts.map +1 -0
- package/dist/metacognition/predictions.js +181 -0
- package/dist/metacognition/predictions.js.map +1 -0
- package/dist/metacognition/retrieval.d.ts +53 -0
- package/dist/metacognition/retrieval.d.ts.map +1 -0
- package/dist/metacognition/retrieval.js +170 -0
- package/dist/metacognition/retrieval.js.map +1 -0
- package/dist/metacognition/risk.d.ts +48 -0
- package/dist/metacognition/risk.d.ts.map +1 -0
- package/dist/metacognition/risk.js +165 -0
- package/dist/metacognition/risk.js.map +1 -0
- package/dist/metacognition/route-economics.d.ts +95 -0
- package/dist/metacognition/route-economics.d.ts.map +1 -0
- package/dist/metacognition/route-economics.js +110 -0
- package/dist/metacognition/route-economics.js.map +1 -0
- package/dist/metacognition/runtime-bridge.d.ts +54 -0
- package/dist/metacognition/runtime-bridge.d.ts.map +1 -0
- package/dist/metacognition/runtime-bridge.js +140 -0
- package/dist/metacognition/runtime-bridge.js.map +1 -0
- package/dist/metacognition/skills.d.ts +42 -0
- package/dist/metacognition/skills.d.ts.map +1 -0
- package/dist/metacognition/skills.js +220 -0
- package/dist/metacognition/skills.js.map +1 -0
- package/dist/metacognition/state.d.ts +110 -0
- package/dist/metacognition/state.d.ts.map +1 -0
- package/dist/metacognition/state.js +52 -0
- package/dist/metacognition/state.js.map +1 -0
- package/dist/metacognition/validation.d.ts +19 -0
- package/dist/metacognition/validation.d.ts.map +1 -0
- package/dist/metacognition/validation.js +58 -0
- package/dist/metacognition/validation.js.map +1 -0
- package/dist/metacognition/verification.d.ts +93 -0
- package/dist/metacognition/verification.d.ts.map +1 -0
- package/dist/metacognition/verification.js +132 -0
- package/dist/metacognition/verification.js.map +1 -0
- package/dist/metacognition/verifier.d.ts +49 -0
- package/dist/metacognition/verifier.d.ts.map +1 -0
- package/dist/metacognition/verifier.js +88 -0
- package/dist/metacognition/verifier.js.map +1 -0
- package/dist/modes/acp/acp-agent.d.ts +24 -0
- package/dist/modes/acp/acp-agent.d.ts.map +1 -0
- package/dist/modes/acp/acp-agent.js +133 -0
- package/dist/modes/acp/acp-agent.js.map +1 -0
- package/dist/modes/acp/acp-mode.d.ts +4 -0
- package/dist/modes/acp/acp-mode.d.ts.map +1 -0
- package/dist/modes/acp/acp-mode.js +34 -0
- package/dist/modes/acp/acp-mode.js.map +1 -0
- package/dist/modes/acp/acp-session.d.ts +4 -0
- package/dist/modes/acp/acp-session.d.ts.map +1 -0
- package/dist/modes/acp/acp-session.js +76 -0
- package/dist/modes/acp/acp-session.js.map +1 -0
- package/dist/modes/acp/acp-transport.d.ts +5 -0
- package/dist/modes/acp/acp-transport.d.ts.map +1 -0
- package/dist/modes/acp/acp-transport.js +90 -0
- package/dist/modes/acp/acp-transport.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +1 -0
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/observation/identity.d.ts +14 -0
- package/dist/observation/identity.d.ts.map +1 -0
- package/dist/observation/identity.js +29 -0
- package/dist/observation/identity.js.map +1 -0
- package/dist/observation/index.d.ts +13 -0
- package/dist/observation/index.d.ts.map +1 -0
- package/dist/observation/index.js +13 -0
- package/dist/observation/index.js.map +1 -0
- package/dist/observation/observe-mode.d.ts +46 -0
- package/dist/observation/observe-mode.d.ts.map +1 -0
- package/dist/observation/observe-mode.js +83 -0
- package/dist/observation/observe-mode.js.map +1 -0
- package/dist/observation/store.d.ts +53 -0
- package/dist/observation/store.d.ts.map +1 -0
- package/dist/observation/store.js +126 -0
- package/dist/observation/store.js.map +1 -0
- package/dist/observation/types.d.ts +72 -0
- package/dist/observation/types.d.ts.map +1 -0
- package/dist/observation/types.js +9 -0
- package/dist/observation/types.js.map +1 -0
- package/dist/observation/view.d.ts +39 -0
- package/dist/observation/view.d.ts.map +1 -0
- package/dist/observation/view.js +173 -0
- package/dist/observation/view.js.map +1 -0
- package/docs/audit-revalidation-2026-09-17.md +77 -0
- package/docs/devin-harness.md +33 -4
- package/docs/ecraf-normalization.md +83 -0
- package/docs/metacognition.md +51 -0
- package/docs/model-catalog-refresh.md +110 -1
- package/docs/models.md +1 -1
- package/docs/neo.md +134 -0
- package/docs/providers.md +125 -6
- package/docs/run-usage-ledger.md +56 -0
- package/docs/runtime-algorithms.md +151 -3
- package/docs/skills.md +1 -1
- package/docs/usage.md +2 -1
- 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/subagent/adaptive-agent-runtime.ts +14 -1
- package/examples/extensions/subagent/graph-result.ts +48 -0
- package/examples/extensions/subagent/index.ts +246 -111
- package/examples/extensions/subagent/managed-process-tree.ts +42 -0
- package/examples/extensions/subagent/managed-process.test.ts +24 -0
- package/examples/extensions/subagent/managed-process.ts +93 -112
- package/examples/extensions/subagent/subagent-runtime-types.ts +17 -1
- package/examples/extensions/subagent/subagent-stream.ts +161 -0
- package/examples/extensions/terminal-browser/README.md +54 -0
- package/examples/extensions/terminal-browser/bridge-protocol.ts +29 -0
- package/examples/extensions/terminal-browser/bridge.ts +219 -0
- package/examples/extensions/terminal-browser/browser-surface.ts +288 -0
- package/examples/extensions/terminal-browser/index.ts +215 -0
- package/examples/extensions/terminal-browser/placeholders.ts +49 -0
- 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 +8 -7
- package/resources/neo/skills/omk-browser/SKILL.md +32 -0
- package/resources/neo/skills/omk-code-review/SKILL.md +24 -0
- package/resources/neo/skills/omk-computeruse/SKILL.md +34 -0
- package/resources/neo/skills/omk-mcp-setup/SKILL.md +48 -0
- package/resources/neo/skills/omk-research/SKILL.md +24 -0
- package/resources/neo/skills/omk-site/SKILL.md +28 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimum expected loss over a finite set of terminal decisions.
|
|
3
|
+
* losses[d][h] is the loss of decision d when hypothesis h is true.
|
|
4
|
+
*/
|
|
5
|
+
export declare function bayesRisk(prior: readonly number[], losses: readonly (readonly number[])[]): number;
|
|
6
|
+
export interface ExperimentBranch {
|
|
7
|
+
readonly outcome: number;
|
|
8
|
+
readonly probability: number;
|
|
9
|
+
readonly posterior: readonly number[];
|
|
10
|
+
readonly risk: number;
|
|
11
|
+
}
|
|
12
|
+
export interface ExperimentValue {
|
|
13
|
+
readonly before: number;
|
|
14
|
+
readonly expectedAfter: number;
|
|
15
|
+
readonly grossValue: number;
|
|
16
|
+
readonly cost: number;
|
|
17
|
+
readonly netValue: number;
|
|
18
|
+
readonly branches: readonly ExperimentBranch[];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* One-step value of information: Bayes risk before minus expected Bayes risk
|
|
22
|
+
* after observing the experiment outcome, minus the experiment cost.
|
|
23
|
+
* likelihoodByHypothesis[h][o] = P(outcome o | hypothesis h).
|
|
24
|
+
* Zero-probability outcomes are skipped; the caller must treat an actually
|
|
25
|
+
* observed impossible outcome as a model mismatch, never renormalize it away.
|
|
26
|
+
*/
|
|
27
|
+
export declare function experimentValue(prior: readonly number[], losses: readonly (readonly number[])[], likelihoodByHypothesis: readonly (readonly number[])[], cost: number): ExperimentValue;
|
|
28
|
+
/** Brier score for one binary event. */
|
|
29
|
+
export declare function brier(predicted: number, outcome: 0 | 1): number;
|
|
30
|
+
/** Negative log-likelihood surprise for one binary event (epsilon-clamped). */
|
|
31
|
+
export declare function surprise(predicted: number, outcome: 0 | 1, epsilon?: number): number;
|
|
32
|
+
/**
|
|
33
|
+
* Beta posterior mean for an independent binary task outcome under a fixed
|
|
34
|
+
* policy in a homogeneous condition bucket. The prior (alpha, beta) must be
|
|
35
|
+
* declared by the host; this is not a learned-calibration claim.
|
|
36
|
+
*/
|
|
37
|
+
export declare function betaPosteriorMean(alpha: number, beta: number, successes: number, failures: number): number;
|
|
38
|
+
/**
|
|
39
|
+
* CUSUM-style drift accumulator over per-observation losses in one condition
|
|
40
|
+
* bucket. Returns the new accumulator value; the caller compares it against
|
|
41
|
+
* a host-declared threshold h_g. Not a guaranteed false-alarm rate.
|
|
42
|
+
*/
|
|
43
|
+
export declare function driftStatistic(previous: number, loss: number, referenceMean: number, slack: number): number;
|
|
44
|
+
//# sourceMappingURL=decision.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decision.d.ts","sourceRoot":"","sources":["../../src/metacognition/decision.ts"],"names":[],"mappings":"AAaA;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,GAAG,MAAM,CAclG;AAED,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB;AACD,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,SAAS,gBAAgB,EAAE,CAAC;CAC/C;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC9B,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,MAAM,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,EACtC,sBAAsB,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,EACtD,IAAI,EAAE,MAAM,GACV,eAAe,CA8BjB;AAED,wCAAwC;AACxC,wBAAgB,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,MAAM,CAI/D;AAED,+EAA+E;AAC/E,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,SAAQ,GAAG,MAAM,CAMnF;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAO1G;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAM3G","sourcesContent":["/**\n * Finite decision-model arithmetic for metacognitive control.\n *\n * TypeScript port of docs/OMK_meta_algorithm_checks_2026-09-19.zip\n * (check_examples.py) — the numerical checks referenced by\n * OMK_metacognitive_control_algorithms_2026-09-19.md §5.3, §6.2.\n *\n * These are illustrative finite-model computations, NOT measured OMK risk\n * estimates. Callers must supply real, defensible probabilities; this module\n * only guarantees the arithmetic is correct and rejects malformed inputs.\n */\nimport { ensure, finite, probability, probabilityVector } from \"./validation.ts\";\n\n/**\n * Minimum expected loss over a finite set of terminal decisions.\n * losses[d][h] is the loss of decision d when hypothesis h is true.\n */\nexport function bayesRisk(prior: readonly number[], losses: readonly (readonly number[])[]): number {\n\tprobabilityVector(prior, \"prior\");\n\tensure(losses.length > 0, \"at least one terminal decision is required\");\n\tlet best = Number.POSITIVE_INFINITY;\n\tfor (const row of losses) {\n\t\tensure(row.length === prior.length, \"loss row must match hypotheses\");\n\t\tlet risk = 0;\n\t\tfor (let h = 0; h < prior.length; h++) {\n\t\t\tfinite(row[h]!, \"loss\");\n\t\t\trisk += prior[h]! * row[h]!;\n\t\t}\n\t\tif (risk < best) best = risk;\n\t}\n\treturn best;\n}\n\nexport interface ExperimentBranch {\n\treadonly outcome: number;\n\treadonly probability: number;\n\treadonly posterior: readonly number[];\n\treadonly risk: number;\n}\nexport interface ExperimentValue {\n\treadonly before: number;\n\treadonly expectedAfter: number;\n\treadonly grossValue: number;\n\treadonly cost: number;\n\treadonly netValue: number;\n\treadonly branches: readonly ExperimentBranch[];\n}\n\n/**\n * One-step value of information: Bayes risk before minus expected Bayes risk\n * after observing the experiment outcome, minus the experiment cost.\n * likelihoodByHypothesis[h][o] = P(outcome o | hypothesis h).\n * Zero-probability outcomes are skipped; the caller must treat an actually\n * observed impossible outcome as a model mismatch, never renormalize it away.\n */\nexport function experimentValue(\n\tprior: readonly number[],\n\tlosses: readonly (readonly number[])[],\n\tlikelihoodByHypothesis: readonly (readonly number[])[],\n\tcost: number,\n): ExperimentValue {\n\tprobabilityVector(prior, \"prior\");\n\tfinite(cost, \"cost\");\n\tconst rows = likelihoodByHypothesis.map((row) => {\n\t\tprobabilityVector(row, \"likelihood\");\n\t\treturn row;\n\t});\n\tensure(rows.length === prior.length, \"likelihood matrix must match hypotheses\");\n\tensure(new Set(rows.map((r) => r.length)).size === 1, \"likelihood matrix shape mismatch\");\n\tconst outcomeCount = rows[0]!.length;\n\tconst before = bayesRisk(prior, losses);\n\tconst branches: ExperimentBranch[] = [];\n\tlet expectedAfter = 0;\n\tfor (let outcome = 0; outcome < outcomeCount; outcome++) {\n\t\tconst masses = prior.map((p, h) => p * rows[h]![outcome]!);\n\t\tconst marginal = masses.reduce((a, b) => a + b, 0);\n\t\tif (marginal === 0) continue;\n\t\tconst posterior = masses.map((m) => m / marginal);\n\t\tconst after = bayesRisk(posterior, losses);\n\t\texpectedAfter += marginal * after;\n\t\tbranches.push({ outcome, probability: marginal, posterior, risk: after });\n\t}\n\treturn {\n\t\tbefore,\n\t\texpectedAfter,\n\t\tgrossValue: before - expectedAfter,\n\t\tcost,\n\t\tnetValue: before - expectedAfter - cost,\n\t\tbranches,\n\t};\n}\n\n/** Brier score for one binary event. */\nexport function brier(predicted: number, outcome: 0 | 1): number {\n\tprobability(predicted, \"predicted\");\n\tconst p = outcome === 1 ? predicted : 1 - predicted;\n\treturn (1 - p) ** 2;\n}\n\n/** Negative log-likelihood surprise for one binary event (epsilon-clamped). */\nexport function surprise(predicted: number, outcome: 0 | 1, epsilon = 1e-12): number {\n\tprobability(predicted, \"predicted\");\n\tfinite(epsilon, \"epsilon\", 1);\n\tensure(epsilon > 0, \"epsilon must be positive\");\n\tconst p = outcome === 1 ? predicted : 1 - predicted;\n\treturn -Math.log(Math.max(epsilon, p));\n}\n\n/**\n * Beta posterior mean for an independent binary task outcome under a fixed\n * policy in a homogeneous condition bucket. The prior (alpha, beta) must be\n * declared by the host; this is not a learned-calibration claim.\n */\nexport function betaPosteriorMean(alpha: number, beta: number, successes: number, failures: number): number {\n\tfinite(alpha, \"alpha\", 1e9);\n\tfinite(beta, \"beta\", 1e9);\n\tensure(alpha > 0 && beta > 0, \"beta prior parameters must be positive\");\n\tfinite(successes, \"successes\", 1e12);\n\tfinite(failures, \"failures\", 1e12);\n\treturn (alpha + successes) / (alpha + beta + successes + failures);\n}\n\n/**\n * CUSUM-style drift accumulator over per-observation losses in one condition\n * bucket. Returns the new accumulator value; the caller compares it against\n * a host-declared threshold h_g. Not a guaranteed false-alarm rate.\n */\nexport function driftStatistic(previous: number, loss: number, referenceMean: number, slack: number): number {\n\tfinite(previous, \"previous\");\n\tfinite(loss, \"loss\");\n\tfinite(referenceMean, \"referenceMean\");\n\tfinite(slack, \"slack\");\n\treturn Math.max(0, previous + loss - referenceMean - slack);\n}\n"]}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Finite decision-model arithmetic for metacognitive control.
|
|
3
|
+
*
|
|
4
|
+
* TypeScript port of docs/OMK_meta_algorithm_checks_2026-09-19.zip
|
|
5
|
+
* (check_examples.py) — the numerical checks referenced by
|
|
6
|
+
* OMK_metacognitive_control_algorithms_2026-09-19.md §5.3, §6.2.
|
|
7
|
+
*
|
|
8
|
+
* These are illustrative finite-model computations, NOT measured OMK risk
|
|
9
|
+
* estimates. Callers must supply real, defensible probabilities; this module
|
|
10
|
+
* only guarantees the arithmetic is correct and rejects malformed inputs.
|
|
11
|
+
*/
|
|
12
|
+
import { ensure, finite, probability, probabilityVector } from "./validation.js";
|
|
13
|
+
/**
|
|
14
|
+
* Minimum expected loss over a finite set of terminal decisions.
|
|
15
|
+
* losses[d][h] is the loss of decision d when hypothesis h is true.
|
|
16
|
+
*/
|
|
17
|
+
export function bayesRisk(prior, losses) {
|
|
18
|
+
probabilityVector(prior, "prior");
|
|
19
|
+
ensure(losses.length > 0, "at least one terminal decision is required");
|
|
20
|
+
let best = Number.POSITIVE_INFINITY;
|
|
21
|
+
for (const row of losses) {
|
|
22
|
+
ensure(row.length === prior.length, "loss row must match hypotheses");
|
|
23
|
+
let risk = 0;
|
|
24
|
+
for (let h = 0; h < prior.length; h++) {
|
|
25
|
+
finite(row[h], "loss");
|
|
26
|
+
risk += prior[h] * row[h];
|
|
27
|
+
}
|
|
28
|
+
if (risk < best)
|
|
29
|
+
best = risk;
|
|
30
|
+
}
|
|
31
|
+
return best;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* One-step value of information: Bayes risk before minus expected Bayes risk
|
|
35
|
+
* after observing the experiment outcome, minus the experiment cost.
|
|
36
|
+
* likelihoodByHypothesis[h][o] = P(outcome o | hypothesis h).
|
|
37
|
+
* Zero-probability outcomes are skipped; the caller must treat an actually
|
|
38
|
+
* observed impossible outcome as a model mismatch, never renormalize it away.
|
|
39
|
+
*/
|
|
40
|
+
export function experimentValue(prior, losses, likelihoodByHypothesis, cost) {
|
|
41
|
+
probabilityVector(prior, "prior");
|
|
42
|
+
finite(cost, "cost");
|
|
43
|
+
const rows = likelihoodByHypothesis.map((row) => {
|
|
44
|
+
probabilityVector(row, "likelihood");
|
|
45
|
+
return row;
|
|
46
|
+
});
|
|
47
|
+
ensure(rows.length === prior.length, "likelihood matrix must match hypotheses");
|
|
48
|
+
ensure(new Set(rows.map((r) => r.length)).size === 1, "likelihood matrix shape mismatch");
|
|
49
|
+
const outcomeCount = rows[0].length;
|
|
50
|
+
const before = bayesRisk(prior, losses);
|
|
51
|
+
const branches = [];
|
|
52
|
+
let expectedAfter = 0;
|
|
53
|
+
for (let outcome = 0; outcome < outcomeCount; outcome++) {
|
|
54
|
+
const masses = prior.map((p, h) => p * rows[h][outcome]);
|
|
55
|
+
const marginal = masses.reduce((a, b) => a + b, 0);
|
|
56
|
+
if (marginal === 0)
|
|
57
|
+
continue;
|
|
58
|
+
const posterior = masses.map((m) => m / marginal);
|
|
59
|
+
const after = bayesRisk(posterior, losses);
|
|
60
|
+
expectedAfter += marginal * after;
|
|
61
|
+
branches.push({ outcome, probability: marginal, posterior, risk: after });
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
before,
|
|
65
|
+
expectedAfter,
|
|
66
|
+
grossValue: before - expectedAfter,
|
|
67
|
+
cost,
|
|
68
|
+
netValue: before - expectedAfter - cost,
|
|
69
|
+
branches,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/** Brier score for one binary event. */
|
|
73
|
+
export function brier(predicted, outcome) {
|
|
74
|
+
probability(predicted, "predicted");
|
|
75
|
+
const p = outcome === 1 ? predicted : 1 - predicted;
|
|
76
|
+
return (1 - p) ** 2;
|
|
77
|
+
}
|
|
78
|
+
/** Negative log-likelihood surprise for one binary event (epsilon-clamped). */
|
|
79
|
+
export function surprise(predicted, outcome, epsilon = 1e-12) {
|
|
80
|
+
probability(predicted, "predicted");
|
|
81
|
+
finite(epsilon, "epsilon", 1);
|
|
82
|
+
ensure(epsilon > 0, "epsilon must be positive");
|
|
83
|
+
const p = outcome === 1 ? predicted : 1 - predicted;
|
|
84
|
+
return -Math.log(Math.max(epsilon, p));
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Beta posterior mean for an independent binary task outcome under a fixed
|
|
88
|
+
* policy in a homogeneous condition bucket. The prior (alpha, beta) must be
|
|
89
|
+
* declared by the host; this is not a learned-calibration claim.
|
|
90
|
+
*/
|
|
91
|
+
export function betaPosteriorMean(alpha, beta, successes, failures) {
|
|
92
|
+
finite(alpha, "alpha", 1e9);
|
|
93
|
+
finite(beta, "beta", 1e9);
|
|
94
|
+
ensure(alpha > 0 && beta > 0, "beta prior parameters must be positive");
|
|
95
|
+
finite(successes, "successes", 1e12);
|
|
96
|
+
finite(failures, "failures", 1e12);
|
|
97
|
+
return (alpha + successes) / (alpha + beta + successes + failures);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* CUSUM-style drift accumulator over per-observation losses in one condition
|
|
101
|
+
* bucket. Returns the new accumulator value; the caller compares it against
|
|
102
|
+
* a host-declared threshold h_g. Not a guaranteed false-alarm rate.
|
|
103
|
+
*/
|
|
104
|
+
export function driftStatistic(previous, loss, referenceMean, slack) {
|
|
105
|
+
finite(previous, "previous");
|
|
106
|
+
finite(loss, "loss");
|
|
107
|
+
finite(referenceMean, "referenceMean");
|
|
108
|
+
finite(slack, "slack");
|
|
109
|
+
return Math.max(0, previous + loss - referenceMean - slack);
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=decision.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decision.js","sourceRoot":"","sources":["../../src/metacognition/decision.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Finite decision-model arithmetic for metacognitive control.\n *\n * TypeScript port of docs/OMK_meta_algorithm_checks_2026-09-19.zip\n * (check_examples.py) — the numerical checks referenced by\n * OMK_metacognitive_control_algorithms_2026-09-19.md §5.3, §6.2.\n *\n * These are illustrative finite-model computations, NOT measured OMK risk\n * estimates. Callers must supply real, defensible probabilities; this module\n * only guarantees the arithmetic is correct and rejects malformed inputs.\n */\nimport { ensure, finite, probability, probabilityVector } from \"./validation.ts\";\n\n/**\n * Minimum expected loss over a finite set of terminal decisions.\n * losses[d][h] is the loss of decision d when hypothesis h is true.\n */\nexport function bayesRisk(prior: readonly number[], losses: readonly (readonly number[])[]): number {\n\tprobabilityVector(prior, \"prior\");\n\tensure(losses.length > 0, \"at least one terminal decision is required\");\n\tlet best = Number.POSITIVE_INFINITY;\n\tfor (const row of losses) {\n\t\tensure(row.length === prior.length, \"loss row must match hypotheses\");\n\t\tlet risk = 0;\n\t\tfor (let h = 0; h < prior.length; h++) {\n\t\t\tfinite(row[h]!, \"loss\");\n\t\t\trisk += prior[h]! * row[h]!;\n\t\t}\n\t\tif (risk < best) best = risk;\n\t}\n\treturn best;\n}\n\nexport interface ExperimentBranch {\n\treadonly outcome: number;\n\treadonly probability: number;\n\treadonly posterior: readonly number[];\n\treadonly risk: number;\n}\nexport interface ExperimentValue {\n\treadonly before: number;\n\treadonly expectedAfter: number;\n\treadonly grossValue: number;\n\treadonly cost: number;\n\treadonly netValue: number;\n\treadonly branches: readonly ExperimentBranch[];\n}\n\n/**\n * One-step value of information: Bayes risk before minus expected Bayes risk\n * after observing the experiment outcome, minus the experiment cost.\n * likelihoodByHypothesis[h][o] = P(outcome o | hypothesis h).\n * Zero-probability outcomes are skipped; the caller must treat an actually\n * observed impossible outcome as a model mismatch, never renormalize it away.\n */\nexport function experimentValue(\n\tprior: readonly number[],\n\tlosses: readonly (readonly number[])[],\n\tlikelihoodByHypothesis: readonly (readonly number[])[],\n\tcost: number,\n): ExperimentValue {\n\tprobabilityVector(prior, \"prior\");\n\tfinite(cost, \"cost\");\n\tconst rows = likelihoodByHypothesis.map((row) => {\n\t\tprobabilityVector(row, \"likelihood\");\n\t\treturn row;\n\t});\n\tensure(rows.length === prior.length, \"likelihood matrix must match hypotheses\");\n\tensure(new Set(rows.map((r) => r.length)).size === 1, \"likelihood matrix shape mismatch\");\n\tconst outcomeCount = rows[0]!.length;\n\tconst before = bayesRisk(prior, losses);\n\tconst branches: ExperimentBranch[] = [];\n\tlet expectedAfter = 0;\n\tfor (let outcome = 0; outcome < outcomeCount; outcome++) {\n\t\tconst masses = prior.map((p, h) => p * rows[h]![outcome]!);\n\t\tconst marginal = masses.reduce((a, b) => a + b, 0);\n\t\tif (marginal === 0) continue;\n\t\tconst posterior = masses.map((m) => m / marginal);\n\t\tconst after = bayesRisk(posterior, losses);\n\t\texpectedAfter += marginal * after;\n\t\tbranches.push({ outcome, probability: marginal, posterior, risk: after });\n\t}\n\treturn {\n\t\tbefore,\n\t\texpectedAfter,\n\t\tgrossValue: before - expectedAfter,\n\t\tcost,\n\t\tnetValue: before - expectedAfter - cost,\n\t\tbranches,\n\t};\n}\n\n/** Brier score for one binary event. */\nexport function brier(predicted: number, outcome: 0 | 1): number {\n\tprobability(predicted, \"predicted\");\n\tconst p = outcome === 1 ? predicted : 1 - predicted;\n\treturn (1 - p) ** 2;\n}\n\n/** Negative log-likelihood surprise for one binary event (epsilon-clamped). */\nexport function surprise(predicted: number, outcome: 0 | 1, epsilon = 1e-12): number {\n\tprobability(predicted, \"predicted\");\n\tfinite(epsilon, \"epsilon\", 1);\n\tensure(epsilon > 0, \"epsilon must be positive\");\n\tconst p = outcome === 1 ? predicted : 1 - predicted;\n\treturn -Math.log(Math.max(epsilon, p));\n}\n\n/**\n * Beta posterior mean for an independent binary task outcome under a fixed\n * policy in a homogeneous condition bucket. The prior (alpha, beta) must be\n * declared by the host; this is not a learned-calibration claim.\n */\nexport function betaPosteriorMean(alpha: number, beta: number, successes: number, failures: number): number {\n\tfinite(alpha, \"alpha\", 1e9);\n\tfinite(beta, \"beta\", 1e9);\n\tensure(alpha > 0 && beta > 0, \"beta prior parameters must be positive\");\n\tfinite(successes, \"successes\", 1e12);\n\tfinite(failures, \"failures\", 1e12);\n\treturn (alpha + successes) / (alpha + beta + successes + failures);\n}\n\n/**\n * CUSUM-style drift accumulator over per-observation losses in one condition\n * bucket. Returns the new accumulator value; the caller compares it against\n * a host-declared threshold h_g. Not a guaranteed false-alarm rate.\n */\nexport function driftStatistic(previous: number, loss: number, referenceMean: number, slack: number): number {\n\tfinite(previous, \"previous\");\n\tfinite(loss, \"loss\");\n\tfinite(referenceMean, \"referenceMean\");\n\tfinite(slack, \"slack\");\n\treturn Math.max(0, previous + loss - referenceMean - slack);\n}\n"]}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/** One logged decision for DR evaluation. Single checkpoint, not a trajectory. */
|
|
2
|
+
export interface LoggedDecision {
|
|
3
|
+
readonly contextHash: string;
|
|
4
|
+
readonly action: string;
|
|
5
|
+
readonly reward: number;
|
|
6
|
+
/** Logged selection probability under the recording policy. Required, never imputed. */
|
|
7
|
+
readonly propensity: number;
|
|
8
|
+
}
|
|
9
|
+
export interface DRInput {
|
|
10
|
+
readonly decisions: readonly LoggedDecision[];
|
|
11
|
+
/** π(a|x): the evaluated policy's action for each logged context. */
|
|
12
|
+
readonly evaluatedActions: readonly string[];
|
|
13
|
+
/** r̂(x,a): reward model per context-action pair. */
|
|
14
|
+
readonly rewardModel: readonly (readonly number[])[];
|
|
15
|
+
}
|
|
16
|
+
export interface DREstimate {
|
|
17
|
+
readonly value: number;
|
|
18
|
+
readonly n: number;
|
|
19
|
+
readonly clipped: number;
|
|
20
|
+
/** Contexts where the evaluated action had zero logged support — excluded, never imputed. */
|
|
21
|
+
readonly unsupported: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Single-decision Doubly Robust estimate:
|
|
25
|
+
* V̂_DR(π) = 1/n Σ [ Σ_a π(a|x_i)r̂(x_i,a) + (π(a_i|x_i)/μ(a_i|x_i))(r_i - r̂(x_i,a_i)) ].
|
|
26
|
+
* Deterministic logging policies that never tried an action cannot evaluate
|
|
27
|
+
* that action post-hoc — those rows are excluded and counted.
|
|
28
|
+
*/
|
|
29
|
+
export declare function doublyRobustEstimate(input: DRInput, maxWeight?: number): DREstimate;
|
|
30
|
+
/** §11.3 experience memory — failure mechanism and discrimination, not essays. */
|
|
31
|
+
export interface ExperienceRecord {
|
|
32
|
+
readonly recordId: string;
|
|
33
|
+
readonly conditions: {
|
|
34
|
+
readonly modelRevision: string;
|
|
35
|
+
readonly toolchain: string;
|
|
36
|
+
readonly environmentHash: string;
|
|
37
|
+
readonly taskBand: string;
|
|
38
|
+
};
|
|
39
|
+
readonly failureMechanism: string;
|
|
40
|
+
readonly firstWrongExpectation: string;
|
|
41
|
+
readonly discriminatingObservation: string;
|
|
42
|
+
readonly appliedFixOrStrategy: string;
|
|
43
|
+
readonly checksBefore: readonly string[];
|
|
44
|
+
readonly checksAfter: readonly string[];
|
|
45
|
+
readonly knownCounterexamples: readonly string[];
|
|
46
|
+
readonly applicabilityConditions: readonly string[];
|
|
47
|
+
readonly evidenceRefs: readonly string[];
|
|
48
|
+
readonly policyVersion: string;
|
|
49
|
+
readonly skillHashes: readonly string[];
|
|
50
|
+
}
|
|
51
|
+
export declare function validateExperienceRecord(r: ExperienceRecord): void;
|
|
52
|
+
/** §15.3 completion metrics. Zero denominators are `undefined`, never 0 or 1. */
|
|
53
|
+
export interface OutcomeCounts {
|
|
54
|
+
readonly declaredComplete: number;
|
|
55
|
+
readonly independentFailAmongDeclared: number;
|
|
56
|
+
readonly allTasks: number;
|
|
57
|
+
readonly succeeded: number;
|
|
58
|
+
readonly abstained: number;
|
|
59
|
+
readonly totalCost: number;
|
|
60
|
+
}
|
|
61
|
+
export declare function completionMetrics(c: OutcomeCounts): {
|
|
62
|
+
readonly falseCompletionDeclared?: number;
|
|
63
|
+
readonly falseCompletionAll?: number;
|
|
64
|
+
readonly successRate?: number;
|
|
65
|
+
readonly abstainRate?: number;
|
|
66
|
+
readonly meanCost?: number;
|
|
67
|
+
};
|
|
68
|
+
/** §15.3 hidden-obligation detection with false alarms, for held-out requirements. */
|
|
69
|
+
export declare function hiddenObligationMetrics(detected: number, totalHidden: number, falseAlarms: number): {
|
|
70
|
+
readonly detectionRate?: number;
|
|
71
|
+
readonly falseAlarms: number;
|
|
72
|
+
};
|
|
73
|
+
//# sourceMappingURL=evaluation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluation.d.ts","sourceRoot":"","sources":["../../src/metacognition/evaluation.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * §11 causal strategy evaluation + §15 outcome metrics.\n *\n * Doubly Robust estimation is a second-stage offline tool over logged\n * single-checkpoint decisions: it needs real logged propensities, action\n * support, and rewards — never probabilities invented after the fact.\n * Completion metrics report false-completion alongside success/abstain rates,\n * because a policy that never completes can trivially zero false completions.\n */\nimport { ensure, finite, integer, probability, text } from \"./validation.ts\";\n\n/** One logged decision for DR evaluation. Single checkpoint, not a trajectory. */\nexport interface LoggedDecision {\n\treadonly contextHash: string;\n\treadonly action: string;\n\treadonly reward: number;\n\t/** Logged selection probability under the recording policy. Required, never imputed. */\n\treadonly propensity: number;\n}\nexport interface DRInput {\n\treadonly decisions: readonly LoggedDecision[];\n\t/** π(a|x): the evaluated policy's action for each logged context. */\n\treadonly evaluatedActions: readonly string[];\n\t/** r̂(x,a): reward model per context-action pair. */\n\treadonly rewardModel: readonly (readonly number[])[];\n}\nexport interface DREstimate {\n\treadonly value: number;\n\treadonly n: number;\n\treadonly clipped: number;\n\t/** Contexts where the evaluated action had zero logged support — excluded, never imputed. */\n\treadonly unsupported: number;\n}\n\n/**\n * Single-decision Doubly Robust estimate:\n * V̂_DR(π) = 1/n Σ [ Σ_a π(a|x_i)r̂(x_i,a) + (π(a_i|x_i)/μ(a_i|x_i))(r_i - r̂(x_i,a_i)) ].\n * Deterministic logging policies that never tried an action cannot evaluate\n * that action post-hoc — those rows are excluded and counted.\n */\nexport function doublyRobustEstimate(input: DRInput, maxWeight = 50): DREstimate {\n\tconst { decisions, evaluatedActions, rewardModel } = input;\n\tinteger(decisions.length, \"decisions\", 1_000_000);\n\tensure(decisions.length > 0, \"no logged decisions\");\n\tensure(evaluatedActions.length === decisions.length, \"evaluated action count mismatch\");\n\tensure(rewardModel.length === decisions.length, \"reward model row mismatch\");\n\tfinite(maxWeight, \"maxWeight\", 1e9);\n\tlet sum = 0,\n\t\tclipped = 0,\n\t\tunsupported = 0,\n\t\tusable = 0;\n\tfor (let i = 0; i < decisions.length; i++) {\n\t\tconst d = decisions[i]!;\n\t\ttext(d.contextHash, \"contextHash\", 256);\n\t\ttext(d.action, \"action\", 128);\n\t\tfinite(d.reward, \"reward\");\n\t\tprobability(d.propensity, \"propensity\");\n\t\ttext(evaluatedActions[i]!, \"evaluated action\", 128);\n\t\tconst rewards = rewardModel[i]!;\n\t\tensure(rewards.length > 0, \"reward model row empty\");\n\t\tfor (const r of rewards) finite(r, \"reward model value\");\n\t\t// Contexts may carry several logged actions; μ is per recorded decision.\n\t\tconst modelMean = rewards.reduce((a, b) => a + b, 0) / rewards.length;\n\t\tif (d.propensity === 0 && d.action === evaluatedActions[i]) {\n\t\t\tunsupported++;\n\t\t\tcontinue;\n\t\t}\n\t\tusable++;\n\t\tconst weight = d.action === evaluatedActions[i] ? Math.min(maxWeight, 1 / d.propensity) : 0;\n\t\tif (weight === maxWeight) clipped++;\n\t\tsum += modelMean + weight * (d.reward - modelMean);\n\t}\n\tensure(usable > 0, \"no decisions with logged support for the evaluated policy\");\n\treturn { value: sum / usable, n: usable, clipped, unsupported };\n}\n\n/** §11.3 experience memory — failure mechanism and discrimination, not essays. */\nexport interface ExperienceRecord {\n\treadonly recordId: string;\n\treadonly conditions: {\n\t\treadonly modelRevision: string;\n\t\treadonly toolchain: string;\n\t\treadonly environmentHash: string;\n\t\treadonly taskBand: string;\n\t};\n\treadonly failureMechanism: string;\n\treadonly firstWrongExpectation: string;\n\treadonly discriminatingObservation: string;\n\treadonly appliedFixOrStrategy: string;\n\treadonly checksBefore: readonly string[];\n\treadonly checksAfter: readonly string[];\n\treadonly knownCounterexamples: readonly string[];\n\treadonly applicabilityConditions: readonly string[];\n\treadonly evidenceRefs: readonly string[];\n\treadonly policyVersion: string;\n\treadonly skillHashes: readonly string[];\n}\nexport function validateExperienceRecord(r: ExperienceRecord): void {\n\ttext(r.recordId, \"recordId\", 128);\n\ttext(r.failureMechanism, \"failureMechanism\", 2048);\n\ttext(r.firstWrongExpectation, \"firstWrongExpectation\", 2048);\n\ttext(r.discriminatingObservation, \"discriminatingObservation\", 2048);\n\ttext(r.appliedFixOrStrategy, \"appliedFixOrStrategy\", 2048);\n\ttext(r.policyVersion, \"policyVersion\", 64);\n\tfor (const list of [\n\t\tr.checksBefore,\n\t\tr.checksAfter,\n\t\tr.knownCounterexamples,\n\t\tr.applicabilityConditions,\n\t\tr.evidenceRefs,\n\t\tr.skillHashes,\n\t]) {\n\t\tensure(Array.isArray(list) && list.length <= 128, \"experience record list bound\");\n\t}\n}\n\n/** §15.3 completion metrics. Zero denominators are `undefined`, never 0 or 1. */\nexport interface OutcomeCounts {\n\treadonly declaredComplete: number;\n\treadonly independentFailAmongDeclared: number;\n\treadonly allTasks: number;\n\treadonly succeeded: number;\n\treadonly abstained: number;\n\treadonly totalCost: number;\n}\nexport function completionMetrics(c: OutcomeCounts): {\n\treadonly falseCompletionDeclared?: number;\n\treadonly falseCompletionAll?: number;\n\treadonly successRate?: number;\n\treadonly abstainRate?: number;\n\treadonly meanCost?: number;\n} {\n\tinteger(c.declaredComplete, \"declaredComplete\");\n\tinteger(c.independentFailAmongDeclared, \"independentFail\");\n\tinteger(c.allTasks, \"allTasks\");\n\tinteger(c.succeeded, \"succeeded\");\n\tinteger(c.abstained, \"abstained\");\n\tfinite(c.totalCost, \"totalCost\");\n\tensure(c.independentFailAmongDeclared <= c.declaredComplete, \"fail count exceeds declared\");\n\tensure(\n\t\tc.declaredComplete <= c.allTasks && c.succeeded <= c.allTasks && c.abstained <= c.allTasks,\n\t\t\"counts exceed task total\",\n\t);\n\treturn {\n\t\tfalseCompletionDeclared: c.declaredComplete > 0 ? c.independentFailAmongDeclared / c.declaredComplete : undefined,\n\t\tfalseCompletionAll: c.allTasks > 0 ? c.independentFailAmongDeclared / c.allTasks : undefined,\n\t\tsuccessRate: c.allTasks > 0 ? c.succeeded / c.allTasks : undefined,\n\t\tabstainRate: c.allTasks > 0 ? c.abstained / c.allTasks : undefined,\n\t\tmeanCost: c.allTasks > 0 ? c.totalCost / c.allTasks : undefined,\n\t};\n}\n\n/** §15.3 hidden-obligation detection with false alarms, for held-out requirements. */\nexport function hiddenObligationMetrics(\n\tdetected: number,\n\ttotalHidden: number,\n\tfalseAlarms: number,\n): {\n\treadonly detectionRate?: number;\n\treadonly falseAlarms: number;\n} {\n\tinteger(detected, \"detected\");\n\tinteger(totalHidden, \"totalHidden\");\n\tinteger(falseAlarms, \"falseAlarms\");\n\tensure(detected <= totalHidden, \"detected exceeds hidden total\");\n\treturn {\n\t\tdetectionRate: totalHidden > 0 ? detected / totalHidden : undefined,\n\t\tfalseAlarms,\n\t};\n}\n"]}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* §11 causal strategy evaluation + §15 outcome metrics.
|
|
3
|
+
*
|
|
4
|
+
* Doubly Robust estimation is a second-stage offline tool over logged
|
|
5
|
+
* single-checkpoint decisions: it needs real logged propensities, action
|
|
6
|
+
* support, and rewards — never probabilities invented after the fact.
|
|
7
|
+
* Completion metrics report false-completion alongside success/abstain rates,
|
|
8
|
+
* because a policy that never completes can trivially zero false completions.
|
|
9
|
+
*/
|
|
10
|
+
import { ensure, finite, integer, probability, text } from "./validation.js";
|
|
11
|
+
/**
|
|
12
|
+
* Single-decision Doubly Robust estimate:
|
|
13
|
+
* V̂_DR(π) = 1/n Σ [ Σ_a π(a|x_i)r̂(x_i,a) + (π(a_i|x_i)/μ(a_i|x_i))(r_i - r̂(x_i,a_i)) ].
|
|
14
|
+
* Deterministic logging policies that never tried an action cannot evaluate
|
|
15
|
+
* that action post-hoc — those rows are excluded and counted.
|
|
16
|
+
*/
|
|
17
|
+
export function doublyRobustEstimate(input, maxWeight = 50) {
|
|
18
|
+
const { decisions, evaluatedActions, rewardModel } = input;
|
|
19
|
+
integer(decisions.length, "decisions", 1_000_000);
|
|
20
|
+
ensure(decisions.length > 0, "no logged decisions");
|
|
21
|
+
ensure(evaluatedActions.length === decisions.length, "evaluated action count mismatch");
|
|
22
|
+
ensure(rewardModel.length === decisions.length, "reward model row mismatch");
|
|
23
|
+
finite(maxWeight, "maxWeight", 1e9);
|
|
24
|
+
let sum = 0, clipped = 0, unsupported = 0, usable = 0;
|
|
25
|
+
for (let i = 0; i < decisions.length; i++) {
|
|
26
|
+
const d = decisions[i];
|
|
27
|
+
text(d.contextHash, "contextHash", 256);
|
|
28
|
+
text(d.action, "action", 128);
|
|
29
|
+
finite(d.reward, "reward");
|
|
30
|
+
probability(d.propensity, "propensity");
|
|
31
|
+
text(evaluatedActions[i], "evaluated action", 128);
|
|
32
|
+
const rewards = rewardModel[i];
|
|
33
|
+
ensure(rewards.length > 0, "reward model row empty");
|
|
34
|
+
for (const r of rewards)
|
|
35
|
+
finite(r, "reward model value");
|
|
36
|
+
// Contexts may carry several logged actions; μ is per recorded decision.
|
|
37
|
+
const modelMean = rewards.reduce((a, b) => a + b, 0) / rewards.length;
|
|
38
|
+
if (d.propensity === 0 && d.action === evaluatedActions[i]) {
|
|
39
|
+
unsupported++;
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
usable++;
|
|
43
|
+
const weight = d.action === evaluatedActions[i] ? Math.min(maxWeight, 1 / d.propensity) : 0;
|
|
44
|
+
if (weight === maxWeight)
|
|
45
|
+
clipped++;
|
|
46
|
+
sum += modelMean + weight * (d.reward - modelMean);
|
|
47
|
+
}
|
|
48
|
+
ensure(usable > 0, "no decisions with logged support for the evaluated policy");
|
|
49
|
+
return { value: sum / usable, n: usable, clipped, unsupported };
|
|
50
|
+
}
|
|
51
|
+
export function validateExperienceRecord(r) {
|
|
52
|
+
text(r.recordId, "recordId", 128);
|
|
53
|
+
text(r.failureMechanism, "failureMechanism", 2048);
|
|
54
|
+
text(r.firstWrongExpectation, "firstWrongExpectation", 2048);
|
|
55
|
+
text(r.discriminatingObservation, "discriminatingObservation", 2048);
|
|
56
|
+
text(r.appliedFixOrStrategy, "appliedFixOrStrategy", 2048);
|
|
57
|
+
text(r.policyVersion, "policyVersion", 64);
|
|
58
|
+
for (const list of [
|
|
59
|
+
r.checksBefore,
|
|
60
|
+
r.checksAfter,
|
|
61
|
+
r.knownCounterexamples,
|
|
62
|
+
r.applicabilityConditions,
|
|
63
|
+
r.evidenceRefs,
|
|
64
|
+
r.skillHashes,
|
|
65
|
+
]) {
|
|
66
|
+
ensure(Array.isArray(list) && list.length <= 128, "experience record list bound");
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
export function completionMetrics(c) {
|
|
70
|
+
integer(c.declaredComplete, "declaredComplete");
|
|
71
|
+
integer(c.independentFailAmongDeclared, "independentFail");
|
|
72
|
+
integer(c.allTasks, "allTasks");
|
|
73
|
+
integer(c.succeeded, "succeeded");
|
|
74
|
+
integer(c.abstained, "abstained");
|
|
75
|
+
finite(c.totalCost, "totalCost");
|
|
76
|
+
ensure(c.independentFailAmongDeclared <= c.declaredComplete, "fail count exceeds declared");
|
|
77
|
+
ensure(c.declaredComplete <= c.allTasks && c.succeeded <= c.allTasks && c.abstained <= c.allTasks, "counts exceed task total");
|
|
78
|
+
return {
|
|
79
|
+
falseCompletionDeclared: c.declaredComplete > 0 ? c.independentFailAmongDeclared / c.declaredComplete : undefined,
|
|
80
|
+
falseCompletionAll: c.allTasks > 0 ? c.independentFailAmongDeclared / c.allTasks : undefined,
|
|
81
|
+
successRate: c.allTasks > 0 ? c.succeeded / c.allTasks : undefined,
|
|
82
|
+
abstainRate: c.allTasks > 0 ? c.abstained / c.allTasks : undefined,
|
|
83
|
+
meanCost: c.allTasks > 0 ? c.totalCost / c.allTasks : undefined,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/** §15.3 hidden-obligation detection with false alarms, for held-out requirements. */
|
|
87
|
+
export function hiddenObligationMetrics(detected, totalHidden, falseAlarms) {
|
|
88
|
+
integer(detected, "detected");
|
|
89
|
+
integer(totalHidden, "totalHidden");
|
|
90
|
+
integer(falseAlarms, "falseAlarms");
|
|
91
|
+
ensure(detected <= totalHidden, "detected exceeds hidden total");
|
|
92
|
+
return {
|
|
93
|
+
detectionRate: totalHidden > 0 ? detected / totalHidden : undefined,
|
|
94
|
+
falseAlarms,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=evaluation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluation.js","sourceRoot":"","sources":["../../src/metacognition/evaluation.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * §11 causal strategy evaluation + §15 outcome metrics.\n *\n * Doubly Robust estimation is a second-stage offline tool over logged\n * single-checkpoint decisions: it needs real logged propensities, action\n * support, and rewards — never probabilities invented after the fact.\n * Completion metrics report false-completion alongside success/abstain rates,\n * because a policy that never completes can trivially zero false completions.\n */\nimport { ensure, finite, integer, probability, text } from \"./validation.ts\";\n\n/** One logged decision for DR evaluation. Single checkpoint, not a trajectory. */\nexport interface LoggedDecision {\n\treadonly contextHash: string;\n\treadonly action: string;\n\treadonly reward: number;\n\t/** Logged selection probability under the recording policy. Required, never imputed. */\n\treadonly propensity: number;\n}\nexport interface DRInput {\n\treadonly decisions: readonly LoggedDecision[];\n\t/** π(a|x): the evaluated policy's action for each logged context. */\n\treadonly evaluatedActions: readonly string[];\n\t/** r̂(x,a): reward model per context-action pair. */\n\treadonly rewardModel: readonly (readonly number[])[];\n}\nexport interface DREstimate {\n\treadonly value: number;\n\treadonly n: number;\n\treadonly clipped: number;\n\t/** Contexts where the evaluated action had zero logged support — excluded, never imputed. */\n\treadonly unsupported: number;\n}\n\n/**\n * Single-decision Doubly Robust estimate:\n * V̂_DR(π) = 1/n Σ [ Σ_a π(a|x_i)r̂(x_i,a) + (π(a_i|x_i)/μ(a_i|x_i))(r_i - r̂(x_i,a_i)) ].\n * Deterministic logging policies that never tried an action cannot evaluate\n * that action post-hoc — those rows are excluded and counted.\n */\nexport function doublyRobustEstimate(input: DRInput, maxWeight = 50): DREstimate {\n\tconst { decisions, evaluatedActions, rewardModel } = input;\n\tinteger(decisions.length, \"decisions\", 1_000_000);\n\tensure(decisions.length > 0, \"no logged decisions\");\n\tensure(evaluatedActions.length === decisions.length, \"evaluated action count mismatch\");\n\tensure(rewardModel.length === decisions.length, \"reward model row mismatch\");\n\tfinite(maxWeight, \"maxWeight\", 1e9);\n\tlet sum = 0,\n\t\tclipped = 0,\n\t\tunsupported = 0,\n\t\tusable = 0;\n\tfor (let i = 0; i < decisions.length; i++) {\n\t\tconst d = decisions[i]!;\n\t\ttext(d.contextHash, \"contextHash\", 256);\n\t\ttext(d.action, \"action\", 128);\n\t\tfinite(d.reward, \"reward\");\n\t\tprobability(d.propensity, \"propensity\");\n\t\ttext(evaluatedActions[i]!, \"evaluated action\", 128);\n\t\tconst rewards = rewardModel[i]!;\n\t\tensure(rewards.length > 0, \"reward model row empty\");\n\t\tfor (const r of rewards) finite(r, \"reward model value\");\n\t\t// Contexts may carry several logged actions; μ is per recorded decision.\n\t\tconst modelMean = rewards.reduce((a, b) => a + b, 0) / rewards.length;\n\t\tif (d.propensity === 0 && d.action === evaluatedActions[i]) {\n\t\t\tunsupported++;\n\t\t\tcontinue;\n\t\t}\n\t\tusable++;\n\t\tconst weight = d.action === evaluatedActions[i] ? Math.min(maxWeight, 1 / d.propensity) : 0;\n\t\tif (weight === maxWeight) clipped++;\n\t\tsum += modelMean + weight * (d.reward - modelMean);\n\t}\n\tensure(usable > 0, \"no decisions with logged support for the evaluated policy\");\n\treturn { value: sum / usable, n: usable, clipped, unsupported };\n}\n\n/** §11.3 experience memory — failure mechanism and discrimination, not essays. */\nexport interface ExperienceRecord {\n\treadonly recordId: string;\n\treadonly conditions: {\n\t\treadonly modelRevision: string;\n\t\treadonly toolchain: string;\n\t\treadonly environmentHash: string;\n\t\treadonly taskBand: string;\n\t};\n\treadonly failureMechanism: string;\n\treadonly firstWrongExpectation: string;\n\treadonly discriminatingObservation: string;\n\treadonly appliedFixOrStrategy: string;\n\treadonly checksBefore: readonly string[];\n\treadonly checksAfter: readonly string[];\n\treadonly knownCounterexamples: readonly string[];\n\treadonly applicabilityConditions: readonly string[];\n\treadonly evidenceRefs: readonly string[];\n\treadonly policyVersion: string;\n\treadonly skillHashes: readonly string[];\n}\nexport function validateExperienceRecord(r: ExperienceRecord): void {\n\ttext(r.recordId, \"recordId\", 128);\n\ttext(r.failureMechanism, \"failureMechanism\", 2048);\n\ttext(r.firstWrongExpectation, \"firstWrongExpectation\", 2048);\n\ttext(r.discriminatingObservation, \"discriminatingObservation\", 2048);\n\ttext(r.appliedFixOrStrategy, \"appliedFixOrStrategy\", 2048);\n\ttext(r.policyVersion, \"policyVersion\", 64);\n\tfor (const list of [\n\t\tr.checksBefore,\n\t\tr.checksAfter,\n\t\tr.knownCounterexamples,\n\t\tr.applicabilityConditions,\n\t\tr.evidenceRefs,\n\t\tr.skillHashes,\n\t]) {\n\t\tensure(Array.isArray(list) && list.length <= 128, \"experience record list bound\");\n\t}\n}\n\n/** §15.3 completion metrics. Zero denominators are `undefined`, never 0 or 1. */\nexport interface OutcomeCounts {\n\treadonly declaredComplete: number;\n\treadonly independentFailAmongDeclared: number;\n\treadonly allTasks: number;\n\treadonly succeeded: number;\n\treadonly abstained: number;\n\treadonly totalCost: number;\n}\nexport function completionMetrics(c: OutcomeCounts): {\n\treadonly falseCompletionDeclared?: number;\n\treadonly falseCompletionAll?: number;\n\treadonly successRate?: number;\n\treadonly abstainRate?: number;\n\treadonly meanCost?: number;\n} {\n\tinteger(c.declaredComplete, \"declaredComplete\");\n\tinteger(c.independentFailAmongDeclared, \"independentFail\");\n\tinteger(c.allTasks, \"allTasks\");\n\tinteger(c.succeeded, \"succeeded\");\n\tinteger(c.abstained, \"abstained\");\n\tfinite(c.totalCost, \"totalCost\");\n\tensure(c.independentFailAmongDeclared <= c.declaredComplete, \"fail count exceeds declared\");\n\tensure(\n\t\tc.declaredComplete <= c.allTasks && c.succeeded <= c.allTasks && c.abstained <= c.allTasks,\n\t\t\"counts exceed task total\",\n\t);\n\treturn {\n\t\tfalseCompletionDeclared: c.declaredComplete > 0 ? c.independentFailAmongDeclared / c.declaredComplete : undefined,\n\t\tfalseCompletionAll: c.allTasks > 0 ? c.independentFailAmongDeclared / c.allTasks : undefined,\n\t\tsuccessRate: c.allTasks > 0 ? c.succeeded / c.allTasks : undefined,\n\t\tabstainRate: c.allTasks > 0 ? c.abstained / c.allTasks : undefined,\n\t\tmeanCost: c.allTasks > 0 ? c.totalCost / c.allTasks : undefined,\n\t};\n}\n\n/** §15.3 hidden-obligation detection with false alarms, for held-out requirements. */\nexport function hiddenObligationMetrics(\n\tdetected: number,\n\ttotalHidden: number,\n\tfalseAlarms: number,\n): {\n\treadonly detectionRate?: number;\n\treadonly falseAlarms: number;\n} {\n\tinteger(detected, \"detected\");\n\tinteger(totalHidden, \"totalHidden\");\n\tinteger(falseAlarms, \"falseAlarms\");\n\tensure(detected <= totalHidden, \"detected exceeds hidden total\");\n\treturn {\n\t\tdetectionRate: totalHidden > 0 ? detected / totalHidden : undefined,\n\t\tfalseAlarms,\n\t};\n}\n"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metacognitive control kernel for OMK.
|
|
3
|
+
*
|
|
4
|
+
* Pure, deterministic, bounded modules implementing the observation /
|
|
5
|
+
* control / evaluation loop of OMK_metacognitive_control_algorithms_2026-09-19.
|
|
6
|
+
* Host-owned state only; no model output is ever treated as runner truth,
|
|
7
|
+
* and learned scores never relax a required approval or check.
|
|
8
|
+
*/
|
|
9
|
+
export * from "./calibration.ts";
|
|
10
|
+
export * from "./calibration-selective.ts";
|
|
11
|
+
export * from "./checkpoint.ts";
|
|
12
|
+
export * from "./context7.ts";
|
|
13
|
+
export * from "./decision.ts";
|
|
14
|
+
export * from "./evaluation.ts";
|
|
15
|
+
export * from "./knowledge.ts";
|
|
16
|
+
export * from "./knowledge-action.ts";
|
|
17
|
+
export * from "./obligations.ts";
|
|
18
|
+
export * from "./observation-validity.ts";
|
|
19
|
+
export * from "./observe.ts";
|
|
20
|
+
export * from "./policy.ts";
|
|
21
|
+
export * from "./predictions.ts";
|
|
22
|
+
export * from "./retrieval.ts";
|
|
23
|
+
export * from "./risk.ts";
|
|
24
|
+
export * from "./route-economics.ts";
|
|
25
|
+
export * from "./runtime-bridge.ts";
|
|
26
|
+
export * from "./skills.ts";
|
|
27
|
+
export * from "./state.ts";
|
|
28
|
+
export * from "./validation.ts";
|
|
29
|
+
export * from "./verification.ts";
|
|
30
|
+
export * from "./verifier.ts";
|
|
31
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/metacognition/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC","sourcesContent":["/**\n * Metacognitive control kernel for OMK.\n *\n * Pure, deterministic, bounded modules implementing the observation /\n * control / evaluation loop of OMK_metacognitive_control_algorithms_2026-09-19.\n * Host-owned state only; no model output is ever treated as runner truth,\n * and learned scores never relax a required approval or check.\n */\n\nexport * from \"./calibration.ts\";\nexport * from \"./calibration-selective.ts\";\nexport * from \"./checkpoint.ts\";\nexport * from \"./context7.ts\";\nexport * from \"./decision.ts\";\nexport * from \"./evaluation.ts\";\nexport * from \"./knowledge.ts\";\nexport * from \"./knowledge-action.ts\";\nexport * from \"./obligations.ts\";\nexport * from \"./observation-validity.ts\";\nexport * from \"./observe.ts\";\nexport * from \"./policy.ts\";\nexport * from \"./predictions.ts\";\nexport * from \"./retrieval.ts\";\nexport * from \"./risk.ts\";\nexport * from \"./route-economics.ts\";\nexport * from \"./runtime-bridge.ts\";\nexport * from \"./skills.ts\";\nexport * from \"./state.ts\";\nexport * from \"./validation.ts\";\nexport * from \"./verification.ts\";\nexport * from \"./verifier.ts\";\n"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metacognitive control kernel for OMK.
|
|
3
|
+
*
|
|
4
|
+
* Pure, deterministic, bounded modules implementing the observation /
|
|
5
|
+
* control / evaluation loop of OMK_metacognitive_control_algorithms_2026-09-19.
|
|
6
|
+
* Host-owned state only; no model output is ever treated as runner truth,
|
|
7
|
+
* and learned scores never relax a required approval or check.
|
|
8
|
+
*/
|
|
9
|
+
export * from "./calibration.js";
|
|
10
|
+
export * from "./calibration-selective.js";
|
|
11
|
+
export * from "./checkpoint.js";
|
|
12
|
+
export * from "./context7.js";
|
|
13
|
+
export * from "./decision.js";
|
|
14
|
+
export * from "./evaluation.js";
|
|
15
|
+
export * from "./knowledge.js";
|
|
16
|
+
export * from "./knowledge-action.js";
|
|
17
|
+
export * from "./obligations.js";
|
|
18
|
+
export * from "./observation-validity.js";
|
|
19
|
+
export * from "./observe.js";
|
|
20
|
+
export * from "./policy.js";
|
|
21
|
+
export * from "./predictions.js";
|
|
22
|
+
export * from "./retrieval.js";
|
|
23
|
+
export * from "./risk.js";
|
|
24
|
+
export * from "./route-economics.js";
|
|
25
|
+
export * from "./runtime-bridge.js";
|
|
26
|
+
export * from "./skills.js";
|
|
27
|
+
export * from "./state.js";
|
|
28
|
+
export * from "./validation.js";
|
|
29
|
+
export * from "./verification.js";
|
|
30
|
+
export * from "./verifier.js";
|
|
31
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/metacognition/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC","sourcesContent":["/**\n * Metacognitive control kernel for OMK.\n *\n * Pure, deterministic, bounded modules implementing the observation /\n * control / evaluation loop of OMK_metacognitive_control_algorithms_2026-09-19.\n * Host-owned state only; no model output is ever treated as runner truth,\n * and learned scores never relax a required approval or check.\n */\n\nexport * from \"./calibration.ts\";\nexport * from \"./calibration-selective.ts\";\nexport * from \"./checkpoint.ts\";\nexport * from \"./context7.ts\";\nexport * from \"./decision.ts\";\nexport * from \"./evaluation.ts\";\nexport * from \"./knowledge.ts\";\nexport * from \"./knowledge-action.ts\";\nexport * from \"./obligations.ts\";\nexport * from \"./observation-validity.ts\";\nexport * from \"./observe.ts\";\nexport * from \"./policy.ts\";\nexport * from \"./predictions.ts\";\nexport * from \"./retrieval.ts\";\nexport * from \"./risk.ts\";\nexport * from \"./route-economics.ts\";\nexport * from \"./runtime-bridge.ts\";\nexport * from \"./skills.ts\";\nexport * from \"./state.ts\";\nexport * from \"./validation.ts\";\nexport * from \"./verification.ts\";\nexport * from \"./verifier.ts\";\n"]}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bounded next-action selector for knowledge gaps.
|
|
3
|
+
*
|
|
4
|
+
* Split from knowledge.ts to keep each module under the repository's
|
|
5
|
+
* 250-line module-size ratchet. Same behavior as the reference port.
|
|
6
|
+
*/
|
|
7
|
+
import type { Claim, KnowledgeReport } from "./knowledge.ts";
|
|
8
|
+
export type SearchChannel = "local" | "official" | "web";
|
|
9
|
+
export interface SearchAttempt {
|
|
10
|
+
readonly claimId: string;
|
|
11
|
+
readonly binding: string;
|
|
12
|
+
readonly channel: SearchChannel;
|
|
13
|
+
readonly result: "empty" | "failed" | "candidates" | "in-flight";
|
|
14
|
+
}
|
|
15
|
+
export interface ActionPolicy {
|
|
16
|
+
readonly availableChannels: readonly SearchChannel[];
|
|
17
|
+
readonly remoteQueryApprovedClaimIds: readonly string[];
|
|
18
|
+
readonly remainingRequests: number;
|
|
19
|
+
readonly remainingMs: number;
|
|
20
|
+
}
|
|
21
|
+
export type KnowledgeAction = {
|
|
22
|
+
readonly kind: "proceed";
|
|
23
|
+
readonly meaning: "evidence-predicates-satisfied-not-general-correctness";
|
|
24
|
+
} | {
|
|
25
|
+
readonly kind: "search";
|
|
26
|
+
readonly claimId: string;
|
|
27
|
+
readonly channel: SearchChannel;
|
|
28
|
+
readonly query: string;
|
|
29
|
+
} | {
|
|
30
|
+
readonly kind: "run-check";
|
|
31
|
+
readonly claimId: string;
|
|
32
|
+
readonly checkId: string;
|
|
33
|
+
} | {
|
|
34
|
+
readonly kind: "inspect-local" | "repair" | "review-candidates" | "await-owned-work" | "ask-user" | "form-obligations";
|
|
35
|
+
readonly claimId: string;
|
|
36
|
+
} | {
|
|
37
|
+
readonly kind: "blocked";
|
|
38
|
+
readonly claimId: string;
|
|
39
|
+
readonly reason: string;
|
|
40
|
+
};
|
|
41
|
+
/** One bounded next action, not an autonomous recursion that can spend unbounded API calls. */
|
|
42
|
+
export declare function nextKnowledgeAction(report: KnowledgeReport, claims: readonly Claim[], attempts: readonly SearchAttempt[], policy: ActionPolicy): KnowledgeAction;
|
|
43
|
+
//# sourceMappingURL=knowledge-action.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge-action.d.ts","sourceRoot":"","sources":["../../src/metacognition/knowledge-action.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAG7D,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,UAAU,GAAG,KAAK,CAAC;AACzD,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,QAAQ,GAAG,YAAY,GAAG,WAAW,CAAC;CACjE;AACD,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,iBAAiB,EAAE,SAAS,aAAa,EAAE,CAAC;IACrD,QAAQ,CAAC,2BAA2B,EAAE,SAAS,MAAM,EAAE,CAAC;IACxD,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC7B;AACD,MAAM,MAAM,eAAe,GACxB;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,uDAAuD,CAAA;CAAE,GACvG;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC9G;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAClF;IACA,QAAQ,CAAC,IAAI,EACV,eAAe,GACf,QAAQ,GACR,mBAAmB,GACnB,kBAAkB,GAClB,UAAU,GACV,kBAAkB,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CACxB,GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnF,+FAA+F;AAC/F,wBAAgB,mBAAmB,CAClC,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,SAAS,KAAK,EAAE,EACxB,QAAQ,EAAE,SAAS,aAAa,EAAE,EAClC,MAAM,EAAE,YAAY,GAClB,eAAe,CAwCjB","sourcesContent":["/**\n * Bounded next-action selector for knowledge gaps.\n *\n * Split from knowledge.ts to keep each module under the repository's\n * 250-line module-size ratchet. Same behavior as the reference port.\n */\n\nimport type { Claim, KnowledgeReport } from \"./knowledge.ts\";\nimport { ensure, integer, member, text, unique } from \"./validation.ts\";\n\nexport type SearchChannel = \"local\" | \"official\" | \"web\";\nexport interface SearchAttempt {\n\treadonly claimId: string;\n\treadonly binding: string;\n\treadonly channel: SearchChannel;\n\treadonly result: \"empty\" | \"failed\" | \"candidates\" | \"in-flight\";\n}\nexport interface ActionPolicy {\n\treadonly availableChannels: readonly SearchChannel[];\n\treadonly remoteQueryApprovedClaimIds: readonly string[];\n\treadonly remainingRequests: number;\n\treadonly remainingMs: number;\n}\nexport type KnowledgeAction =\n\t| { readonly kind: \"proceed\"; readonly meaning: \"evidence-predicates-satisfied-not-general-correctness\" }\n\t| { readonly kind: \"search\"; readonly claimId: string; readonly channel: SearchChannel; readonly query: string }\n\t| { readonly kind: \"run-check\"; readonly claimId: string; readonly checkId: string }\n\t| {\n\t\t\treadonly kind:\n\t\t\t\t| \"inspect-local\"\n\t\t\t\t| \"repair\"\n\t\t\t\t| \"review-candidates\"\n\t\t\t\t| \"await-owned-work\"\n\t\t\t\t| \"ask-user\"\n\t\t\t\t| \"form-obligations\";\n\t\t\treadonly claimId: string;\n\t }\n\t| { readonly kind: \"blocked\"; readonly claimId: string; readonly reason: string };\n\n/** One bounded next action, not an autonomous recursion that can spend unbounded API calls. */\nexport function nextKnowledgeAction(\n\treport: KnowledgeReport,\n\tclaims: readonly Claim[],\n\tattempts: readonly SearchAttempt[],\n\tpolicy: ActionPolicy,\n): KnowledgeAction {\n\tinteger(policy.remainingRequests, \"remainingRequests\");\n\tinteger(policy.remainingMs, \"remainingMs\");\n\tunique(policy.availableChannels, \"availableChannels\", 3);\n\tfor (const channel of policy.availableChannels) member(channel, [\"local\", \"official\", \"web\"], \"search channel\");\n\tunique(policy.remoteQueryApprovedClaimIds, \"remote approvals\", 128);\n\tensure(attempts.length <= 4096, \"too many search attempts\");\n\tfor (const attempt of attempts) {\n\t\ttext(attempt.claimId, \"attempt claim\");\n\t\ttext(attempt.binding, \"attempt binding\");\n\t\tmember(attempt.channel, [\"local\", \"official\", \"web\"], \"attempt channel\");\n\t\tmember(attempt.result, [\"empty\", \"failed\", \"candidates\", \"in-flight\"], \"attempt result\");\n\t}\n\tconst gap = report.gaps.find((g) => g.required);\n\tif (!gap) return { kind: \"proceed\", meaning: \"evidence-predicates-satisfied-not-general-correctness\" };\n\tconst claimId = gap.claimId;\n\tif (gap.reason === \"unassessed-step\") return { kind: \"form-obligations\", claimId };\n\tif (gap.reason === \"missing-user-decision\") return { kind: \"ask-user\", claimId };\n\tif (gap.reason === \"unknown-version\") return { kind: \"inspect-local\", claimId };\n\tif (gap.reason === \"failed-check\") return { kind: \"repair\", claimId };\n\tif (gap.reason === \"pending-check\") return { kind: \"await-owned-work\", claimId };\n\tif (gap.reason === \"missing-check\") {\n\t\tensure(gap.checkId !== null, \"missing checkId\");\n\t\treturn { kind: \"run-check\", claimId, checkId: gap.checkId };\n\t}\n\tconst claim = claims.find((c) => c.id === claimId && c.binding === gap.binding);\n\tensure(claim !== undefined, \"report has stale or unknown claim\");\n\tconst history = attempts.filter((a) => a.claimId === claimId && a.binding === gap.binding);\n\tif (history.some((a) => a.result === \"in-flight\")) return { kind: \"await-owned-work\", claimId };\n\tif (history.some((a) => a.result === \"candidates\")) return { kind: \"review-candidates\", claimId };\n\tif (policy.remainingRequests === 0 || policy.remainingMs === 0) {\n\t\treturn { kind: \"blocked\", claimId, reason: \"acquisition-budget-exhausted\" };\n\t}\n\tfor (const channel of [\"local\", \"official\", \"web\"] as const) {\n\t\tif (!policy.availableChannels.includes(channel) || history.some((a) => a.channel === channel)) continue;\n\t\tif (channel !== \"local\" && (!policy.remoteQueryApprovedClaimIds.includes(claimId) || claim.publicQuery === null))\n\t\t\tcontinue;\n\t\treturn { kind: \"search\", claimId, channel, query: channel === \"local\" ? claim.statement : claim.publicQuery! };\n\t}\n\treturn { kind: \"blocked\", claimId, reason: \"no-approved-untried-source\" };\n}\n"]}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bounded next-action selector for knowledge gaps.
|
|
3
|
+
*
|
|
4
|
+
* Split from knowledge.ts to keep each module under the repository's
|
|
5
|
+
* 250-line module-size ratchet. Same behavior as the reference port.
|
|
6
|
+
*/
|
|
7
|
+
import { ensure, integer, member, text, unique } from "./validation.js";
|
|
8
|
+
/** One bounded next action, not an autonomous recursion that can spend unbounded API calls. */
|
|
9
|
+
export function nextKnowledgeAction(report, claims, attempts, policy) {
|
|
10
|
+
integer(policy.remainingRequests, "remainingRequests");
|
|
11
|
+
integer(policy.remainingMs, "remainingMs");
|
|
12
|
+
unique(policy.availableChannels, "availableChannels", 3);
|
|
13
|
+
for (const channel of policy.availableChannels)
|
|
14
|
+
member(channel, ["local", "official", "web"], "search channel");
|
|
15
|
+
unique(policy.remoteQueryApprovedClaimIds, "remote approvals", 128);
|
|
16
|
+
ensure(attempts.length <= 4096, "too many search attempts");
|
|
17
|
+
for (const attempt of attempts) {
|
|
18
|
+
text(attempt.claimId, "attempt claim");
|
|
19
|
+
text(attempt.binding, "attempt binding");
|
|
20
|
+
member(attempt.channel, ["local", "official", "web"], "attempt channel");
|
|
21
|
+
member(attempt.result, ["empty", "failed", "candidates", "in-flight"], "attempt result");
|
|
22
|
+
}
|
|
23
|
+
const gap = report.gaps.find((g) => g.required);
|
|
24
|
+
if (!gap)
|
|
25
|
+
return { kind: "proceed", meaning: "evidence-predicates-satisfied-not-general-correctness" };
|
|
26
|
+
const claimId = gap.claimId;
|
|
27
|
+
if (gap.reason === "unassessed-step")
|
|
28
|
+
return { kind: "form-obligations", claimId };
|
|
29
|
+
if (gap.reason === "missing-user-decision")
|
|
30
|
+
return { kind: "ask-user", claimId };
|
|
31
|
+
if (gap.reason === "unknown-version")
|
|
32
|
+
return { kind: "inspect-local", claimId };
|
|
33
|
+
if (gap.reason === "failed-check")
|
|
34
|
+
return { kind: "repair", claimId };
|
|
35
|
+
if (gap.reason === "pending-check")
|
|
36
|
+
return { kind: "await-owned-work", claimId };
|
|
37
|
+
if (gap.reason === "missing-check") {
|
|
38
|
+
ensure(gap.checkId !== null, "missing checkId");
|
|
39
|
+
return { kind: "run-check", claimId, checkId: gap.checkId };
|
|
40
|
+
}
|
|
41
|
+
const claim = claims.find((c) => c.id === claimId && c.binding === gap.binding);
|
|
42
|
+
ensure(claim !== undefined, "report has stale or unknown claim");
|
|
43
|
+
const history = attempts.filter((a) => a.claimId === claimId && a.binding === gap.binding);
|
|
44
|
+
if (history.some((a) => a.result === "in-flight"))
|
|
45
|
+
return { kind: "await-owned-work", claimId };
|
|
46
|
+
if (history.some((a) => a.result === "candidates"))
|
|
47
|
+
return { kind: "review-candidates", claimId };
|
|
48
|
+
if (policy.remainingRequests === 0 || policy.remainingMs === 0) {
|
|
49
|
+
return { kind: "blocked", claimId, reason: "acquisition-budget-exhausted" };
|
|
50
|
+
}
|
|
51
|
+
for (const channel of ["local", "official", "web"]) {
|
|
52
|
+
if (!policy.availableChannels.includes(channel) || history.some((a) => a.channel === channel))
|
|
53
|
+
continue;
|
|
54
|
+
if (channel !== "local" && (!policy.remoteQueryApprovedClaimIds.includes(claimId) || claim.publicQuery === null))
|
|
55
|
+
continue;
|
|
56
|
+
return { kind: "search", claimId, channel, query: channel === "local" ? claim.statement : claim.publicQuery };
|
|
57
|
+
}
|
|
58
|
+
return { kind: "blocked", claimId, reason: "no-approved-untried-source" };
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=knowledge-action.js.map
|