@namzu/sdk 34.2.0 → 36.0.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 +171 -0
- package/README.md +2 -6
- package/dist/agents/PipelineAgent.d.ts.map +1 -1
- package/dist/agents/PipelineAgent.js +118 -100
- package/dist/agents/PipelineAgent.js.map +1 -1
- package/dist/agents/ReactiveAgent.d.ts.map +1 -1
- package/dist/agents/ReactiveAgent.js +2 -0
- package/dist/agents/ReactiveAgent.js.map +1 -1
- package/dist/agents/RouterAgent.d.ts.map +1 -1
- package/dist/agents/RouterAgent.js +105 -61
- package/dist/agents/RouterAgent.js.map +1 -1
- package/dist/agents/SupervisorAgent.d.ts.map +1 -1
- package/dist/agents/SupervisorAgent.js +8 -4
- package/dist/agents/SupervisorAgent.js.map +1 -1
- package/dist/agents/budget.d.ts +6 -0
- package/dist/agents/budget.d.ts.map +1 -0
- package/dist/agents/budget.js +33 -0
- package/dist/agents/budget.js.map +1 -0
- package/dist/agents/explore.d.ts +20 -0
- package/dist/agents/explore.d.ts.map +1 -0
- package/dist/agents/explore.js +26 -0
- package/dist/agents/explore.js.map +1 -0
- package/dist/agents/file-definitions.d.ts +80 -0
- package/dist/agents/file-definitions.d.ts.map +1 -0
- package/dist/agents/file-definitions.js +179 -0
- package/dist/agents/file-definitions.js.map +1 -0
- package/dist/agents/index.d.ts +3 -0
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +2 -0
- package/dist/agents/index.js.map +1 -1
- package/dist/bridge/a2a/mapper.d.ts.map +1 -1
- package/dist/bridge/a2a/mapper.js +6 -0
- package/dist/bridge/a2a/mapper.js.map +1 -1
- package/dist/bridge/sse/mapper.d.ts.map +1 -1
- package/dist/bridge/sse/mapper.js +22 -0
- package/dist/bridge/sse/mapper.js.map +1 -1
- package/dist/bus/lock.d.ts.map +1 -1
- package/dist/bus/lock.js +1 -10
- package/dist/bus/lock.js.map +1 -1
- package/dist/compaction/consolidation.d.ts +31 -0
- package/dist/compaction/consolidation.d.ts.map +1 -0
- package/dist/compaction/consolidation.js +63 -0
- package/dist/compaction/consolidation.js.map +1 -0
- package/dist/compaction/factory.d.ts.map +1 -1
- package/dist/compaction/factory.js +3 -0
- package/dist/compaction/factory.js.map +1 -1
- package/dist/compaction/index.d.ts +6 -1
- package/dist/compaction/index.d.ts.map +1 -1
- package/dist/compaction/index.js +6 -0
- package/dist/compaction/index.js.map +1 -1
- package/dist/compaction/manager.d.ts +7 -0
- package/dist/compaction/manager.d.ts.map +1 -1
- package/dist/compaction/manager.js +31 -0
- package/dist/compaction/manager.js.map +1 -1
- package/dist/compaction/plan.d.ts +23 -0
- package/dist/compaction/plan.d.ts.map +1 -1
- package/dist/compaction/plan.js +41 -24
- package/dist/compaction/plan.js.map +1 -1
- package/dist/compaction/salience/bm25.d.ts +26 -0
- package/dist/compaction/salience/bm25.d.ts.map +1 -0
- package/dist/compaction/salience/bm25.js +56 -0
- package/dist/compaction/salience/bm25.js.map +1 -0
- package/dist/compaction/salience/goal.d.ts +21 -0
- package/dist/compaction/salience/goal.d.ts.map +1 -0
- package/dist/compaction/salience/goal.js +32 -0
- package/dist/compaction/salience/goal.js.map +1 -0
- package/dist/compaction/salience/index.d.ts +4 -0
- package/dist/compaction/salience/index.d.ts.map +1 -0
- package/dist/compaction/salience/index.js +4 -0
- package/dist/compaction/salience/index.js.map +1 -0
- package/dist/compaction/salience/minhash.d.ts +17 -0
- package/dist/compaction/salience/minhash.d.ts.map +1 -0
- package/dist/compaction/salience/minhash.js +54 -0
- package/dist/compaction/salience/minhash.js.map +1 -0
- package/dist/compaction/salience/score.d.ts +64 -0
- package/dist/compaction/salience/score.d.ts.map +1 -0
- package/dist/compaction/salience/score.js +256 -0
- package/dist/compaction/salience/score.js.map +1 -0
- package/dist/compaction/salience/tokenize.d.ts +20 -0
- package/dist/compaction/salience/tokenize.d.ts.map +1 -0
- package/dist/compaction/salience/tokenize.js +92 -0
- package/dist/compaction/salience/tokenize.js.map +1 -0
- package/dist/compaction/salience/working-set.d.ts +59 -0
- package/dist/compaction/salience/working-set.d.ts.map +1 -0
- package/dist/compaction/salience/working-set.js +137 -0
- package/dist/compaction/salience/working-set.js.map +1 -0
- package/dist/compaction/serializer.d.ts +2 -0
- package/dist/compaction/serializer.d.ts.map +1 -1
- package/dist/compaction/serializer.js +15 -0
- package/dist/compaction/serializer.js.map +1 -1
- package/dist/compaction/token-estimate.d.ts +13 -0
- package/dist/compaction/token-estimate.d.ts.map +1 -0
- package/dist/compaction/token-estimate.js +58 -0
- package/dist/compaction/token-estimate.js.map +1 -0
- package/dist/compaction/tool-result-editing.d.ts +10 -2
- package/dist/compaction/tool-result-editing.d.ts.map +1 -1
- package/dist/compaction/tool-result-editing.js +22 -24
- package/dist/compaction/tool-result-editing.js.map +1 -1
- package/dist/compaction/types.d.ts +22 -1
- package/dist/compaction/types.d.ts.map +1 -1
- package/dist/compaction/wire.d.ts +3 -1
- package/dist/compaction/wire.d.ts.map +1 -1
- package/dist/compaction/wire.js +2 -0
- package/dist/compaction/wire.js.map +1 -1
- package/dist/config/runtime.d.ts +58 -28
- package/dist/config/runtime.d.ts.map +1 -1
- package/dist/config/runtime.js +13 -1
- package/dist/config/runtime.js.map +1 -1
- package/dist/connector/builtins/http.d.ts.map +1 -1
- package/dist/connector/builtins/http.js +2 -8
- package/dist/connector/builtins/http.js.map +1 -1
- package/dist/connector/builtins/webhook.js +2 -2
- package/dist/connector/builtins/webhook.js.map +1 -1
- package/dist/connector/mcp/adapter.d.ts +2 -0
- package/dist/connector/mcp/adapter.d.ts.map +1 -1
- package/dist/connector/mcp/adapter.js +30 -0
- package/dist/connector/mcp/adapter.js.map +1 -1
- package/dist/connector/tools/adapter.js +2 -2
- package/dist/connector/tools/adapter.js.map +1 -1
- package/dist/connector/tools/definitions.js +2 -2
- package/dist/connector/tools/definitions.js.map +1 -1
- package/dist/constants/compaction/index.d.ts +1 -0
- package/dist/constants/compaction/index.d.ts.map +1 -1
- package/dist/constants/compaction/index.js +1 -0
- package/dist/constants/compaction/index.js.map +1 -1
- package/dist/constants/telemetry/index.d.ts +0 -1
- package/dist/constants/telemetry/index.d.ts.map +1 -1
- package/dist/constants/telemetry/index.js +0 -1
- package/dist/constants/telemetry/index.js.map +1 -1
- package/dist/contracts/a2a.d.ts +5 -5
- package/dist/contracts/api.d.ts +4 -2
- package/dist/contracts/api.d.ts.map +1 -1
- package/dist/contracts/schemas.d.ts +1 -15
- package/dist/contracts/schemas.d.ts.map +1 -1
- package/dist/contracts/schemas.js +5 -20
- package/dist/contracts/schemas.js.map +1 -1
- package/dist/invariants/index.d.ts +1 -1
- package/dist/manager/agent/lifecycle.d.ts +2 -18
- package/dist/manager/agent/lifecycle.d.ts.map +1 -1
- package/dist/manager/agent/lifecycle.js +373 -340
- package/dist/manager/agent/lifecycle.js.map +1 -1
- package/dist/manager/run/persistence.d.ts +3 -0
- package/dist/manager/run/persistence.d.ts.map +1 -1
- package/dist/manager/run/persistence.js +35 -5
- package/dist/manager/run/persistence.js.map +1 -1
- package/dist/plugin/index.d.ts +2 -0
- package/dist/plugin/index.d.ts.map +1 -1
- package/dist/plugin/index.js +1 -0
- package/dist/plugin/index.js.map +1 -1
- package/dist/plugin/shell-hook.d.ts +128 -0
- package/dist/plugin/shell-hook.d.ts.map +1 -0
- package/dist/plugin/shell-hook.js +299 -0
- package/dist/plugin/shell-hook.js.map +1 -0
- package/dist/prompt/coding-agent-doctrine.d.ts +63 -0
- package/dist/prompt/coding-agent-doctrine.d.ts.map +1 -0
- package/dist/prompt/coding-agent-doctrine.js +100 -0
- package/dist/prompt/coding-agent-doctrine.js.map +1 -0
- package/dist/prompt/index.d.ts +2 -0
- package/dist/prompt/index.d.ts.map +1 -1
- package/dist/prompt/index.js +1 -0
- package/dist/prompt/index.js.map +1 -1
- package/dist/provider/errors.d.ts +1 -1
- package/dist/provider/errors.js +1 -1
- package/dist/provider/fallback.d.ts +2 -0
- package/dist/provider/fallback.d.ts.map +1 -1
- package/dist/provider/fallback.js +3 -1
- package/dist/provider/fallback.js.map +1 -1
- package/dist/provider/retry.d.ts +2 -0
- package/dist/provider/retry.d.ts.map +1 -1
- package/dist/provider/retry.js +3 -1
- package/dist/provider/retry.js.map +1 -1
- package/dist/provider/token-budget.d.ts +13 -0
- package/dist/provider/token-budget.d.ts.map +1 -0
- package/dist/provider/token-budget.js +150 -0
- package/dist/provider/token-budget.js.map +1 -0
- package/dist/public-runtime.d.ts +14 -14
- package/dist/public-runtime.d.ts.map +1 -1
- package/dist/public-runtime.js +15 -10
- package/dist/public-runtime.js.map +1 -1
- package/dist/public-tools.d.ts +2 -0
- package/dist/public-tools.d.ts.map +1 -1
- package/dist/public-tools.js +2 -0
- package/dist/public-tools.js.map +1 -1
- package/dist/public-types.d.ts +12 -2
- package/dist/public-types.d.ts.map +1 -1
- package/dist/registry/command/kernel-commands.d.ts.map +1 -1
- package/dist/registry/command/kernel-commands.js +18 -6
- package/dist/registry/command/kernel-commands.js.map +1 -1
- package/dist/registry/tool/execute.d.ts.map +1 -1
- package/dist/registry/tool/execute.js +4 -1
- package/dist/registry/tool/execute.js.map +1 -1
- package/dist/run/LimitChecker.js +1 -1
- package/dist/run/LimitChecker.js.map +1 -1
- package/dist/run/drain.js +1 -1
- package/dist/run/reporter.d.ts.map +1 -1
- package/dist/run/reporter.js +15 -0
- package/dist/run/reporter.js.map +1 -1
- package/dist/run/token-budget.d.ts +108 -0
- package/dist/run/token-budget.d.ts.map +1 -0
- package/dist/run/token-budget.js +591 -0
- package/dist/run/token-budget.js.map +1 -0
- package/dist/runtime/jobs/registry.d.ts +29 -0
- package/dist/runtime/jobs/registry.d.ts.map +1 -1
- package/dist/runtime/jobs/registry.js +98 -18
- package/dist/runtime/jobs/registry.js.map +1 -1
- package/dist/runtime/query/checkpoint.d.ts.map +1 -1
- package/dist/runtime/query/checkpoint.js +10 -3
- package/dist/runtime/query/checkpoint.js.map +1 -1
- package/dist/runtime/query/context.d.ts +2 -26
- package/dist/runtime/query/context.d.ts.map +1 -1
- package/dist/runtime/query/context.js +1 -29
- package/dist/runtime/query/context.js.map +1 -1
- package/dist/runtime/query/executor.d.ts +13 -9
- package/dist/runtime/query/executor.d.ts.map +1 -1
- package/dist/runtime/query/executor.js +144 -55
- package/dist/runtime/query/executor.js.map +1 -1
- package/dist/runtime/query/guard.d.ts.map +1 -1
- package/dist/runtime/query/guard.js +8 -0
- package/dist/runtime/query/guard.js.map +1 -1
- package/dist/runtime/query/index.d.ts +42 -4
- package/dist/runtime/query/index.d.ts.map +1 -1
- package/dist/runtime/query/index.js +153 -52
- package/dist/runtime/query/index.js.map +1 -1
- package/dist/runtime/query/iteration/index.d.ts +3 -3
- package/dist/runtime/query/iteration/index.d.ts.map +1 -1
- package/dist/runtime/query/iteration/index.js +47 -11
- package/dist/runtime/query/iteration/index.js.map +1 -1
- package/dist/runtime/query/iteration/phases/compaction.d.ts.map +1 -1
- package/dist/runtime/query/iteration/phases/compaction.js +98 -30
- package/dist/runtime/query/iteration/phases/compaction.js.map +1 -1
- package/dist/runtime/query/iteration/phases/context.d.ts +4 -0
- package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
- package/dist/runtime/query/iteration/phases/context.js.map +1 -1
- package/dist/runtime/query/iteration/phases/tool-review.d.ts.map +1 -1
- package/dist/runtime/query/iteration/phases/tool-review.js +29 -7
- package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
- package/dist/runtime/query/iteration/phases/working-memory.d.ts.map +1 -1
- package/dist/runtime/query/iteration/phases/working-memory.js +25 -15
- package/dist/runtime/query/iteration/phases/working-memory.js.map +1 -1
- package/dist/runtime/query/iteration/stream-turn.d.ts.map +1 -1
- package/dist/runtime/query/iteration/stream-turn.js +10 -5
- package/dist/runtime/query/iteration/stream-turn.js.map +1 -1
- package/dist/runtime/query/plugin-hooks.d.ts +1 -1
- package/dist/runtime/query/plugin-hooks.d.ts.map +1 -1
- package/dist/runtime/query/plugin-hooks.js +20 -1
- package/dist/runtime/query/plugin-hooks.js.map +1 -1
- package/dist/runtime/query/prompt.d.ts.map +1 -1
- package/dist/runtime/query/prompt.js +14 -4
- package/dist/runtime/query/prompt.js.map +1 -1
- package/dist/runtime/query/repeat-call.d.ts +20 -2
- package/dist/runtime/query/repeat-call.d.ts.map +1 -1
- package/dist/runtime/query/repeat-call.js +35 -7
- package/dist/runtime/query/repeat-call.js.map +1 -1
- package/dist/runtime/query/result.d.ts.map +1 -1
- package/dist/runtime/query/result.js +9 -0
- package/dist/runtime/query/result.js.map +1 -1
- package/dist/runtime/query/review-policy.d.ts +142 -0
- package/dist/runtime/query/review-policy.d.ts.map +1 -0
- package/dist/runtime/query/review-policy.js +144 -0
- package/dist/runtime/query/review-policy.js.map +1 -0
- package/dist/runtime/query/run-state.d.ts.map +1 -1
- package/dist/runtime/query/run-state.js +4 -0
- package/dist/runtime/query/run-state.js.map +1 -1
- package/dist/runtime/query/steering.d.ts +4 -0
- package/dist/runtime/query/steering.d.ts.map +1 -1
- package/dist/runtime/query/steering.js +29 -0
- package/dist/runtime/query/steering.js.map +1 -1
- package/dist/runtime/query/token-budget.d.ts +7 -0
- package/dist/runtime/query/token-budget.d.ts.map +1 -0
- package/dist/runtime/query/token-budget.js +101 -0
- package/dist/runtime/query/token-budget.js.map +1 -0
- package/dist/runtime/query/tool-output-budget.d.ts +2 -0
- package/dist/runtime/query/tool-output-budget.d.ts.map +1 -1
- package/dist/runtime/query/tool-output-budget.js +29 -11
- package/dist/runtime/query/tool-output-budget.js.map +1 -1
- package/dist/runtime/query/tool-pause.d.ts.map +1 -1
- package/dist/runtime/query/tool-pause.js +4 -2
- package/dist/runtime/query/tool-pause.js.map +1 -1
- package/dist/runtime/query/tooling.d.ts +4 -0
- package/dist/runtime/query/tooling.d.ts.map +1 -1
- package/dist/runtime/query/tooling.js +4 -0
- package/dist/runtime/query/tooling.js.map +1 -1
- package/dist/sandbox/file-walk-program.d.ts +3 -0
- package/dist/sandbox/file-walk-program.d.ts.map +1 -0
- package/dist/sandbox/file-walk-program.js +94 -0
- package/dist/sandbox/file-walk-program.js.map +1 -0
- package/dist/sandbox/file-walk.d.ts +12 -0
- package/dist/sandbox/file-walk.d.ts.map +1 -0
- package/dist/sandbox/file-walk.js +429 -0
- package/dist/sandbox/file-walk.js.map +1 -0
- package/dist/sandbox/index.d.ts +2 -0
- package/dist/sandbox/index.d.ts.map +1 -1
- package/dist/sandbox/index.js +1 -0
- package/dist/sandbox/index.js.map +1 -1
- package/dist/sandbox/provider/local.d.ts +3 -1
- package/dist/sandbox/provider/local.d.ts.map +1 -1
- package/dist/sandbox/provider/local.js +121 -12
- package/dist/sandbox/provider/local.js.map +1 -1
- package/dist/scheduler/completion-inbox.d.ts +3 -2
- package/dist/scheduler/completion-inbox.d.ts.map +1 -1
- package/dist/scheduler/completion-inbox.js +29 -15
- package/dist/scheduler/completion-inbox.js.map +1 -1
- package/dist/scheduler/delegating.d.ts +1 -0
- package/dist/scheduler/delegating.d.ts.map +1 -1
- package/dist/scheduler/delegating.js +29 -12
- package/dist/scheduler/delegating.js.map +1 -1
- package/dist/scheduler/local.d.ts +1 -0
- package/dist/scheduler/local.d.ts.map +1 -1
- package/dist/scheduler/local.js +4 -7
- package/dist/scheduler/local.js.map +1 -1
- package/dist/session/index.d.ts +0 -1
- package/dist/session/index.d.ts.map +1 -1
- package/dist/session/index.js +0 -1
- package/dist/session/index.js.map +1 -1
- package/dist/session/workspace/path-builder.d.ts.map +1 -1
- package/dist/session/workspace/path-builder.js +5 -4
- package/dist/session/workspace/path-builder.js.map +1 -1
- package/dist/store/feedback/disk.d.ts.map +1 -1
- package/dist/store/feedback/disk.js +4 -6
- package/dist/store/feedback/disk.js.map +1 -1
- package/dist/store/index.d.ts +2 -0
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +1 -0
- package/dist/store/index.js.map +1 -1
- package/dist/store/memory/disk.d.ts.map +1 -1
- package/dist/store/memory/disk.js +3 -12
- package/dist/store/memory/disk.js.map +1 -1
- package/dist/store/run/checkpoint-disk.d.ts +3 -3
- package/dist/store/run/checkpoint-disk.d.ts.map +1 -1
- package/dist/store/run/checkpoint-disk.js +14 -26
- package/dist/store/run/checkpoint-disk.js.map +1 -1
- package/dist/store/run/claim-disk.js +1 -1
- package/dist/store/run/conformance.d.ts +1 -1
- package/dist/store/run/conformance.d.ts.map +1 -1
- package/dist/store/run/conformance.js +41 -33
- package/dist/store/run/conformance.js.map +1 -1
- package/dist/store/run/disk.d.ts.map +1 -1
- package/dist/store/run/disk.js +20 -4
- package/dist/store/run/disk.js.map +1 -1
- package/dist/store/run/token-budget-disk.d.ts +37 -0
- package/dist/store/run/token-budget-disk.d.ts.map +1 -0
- package/dist/store/run/token-budget-disk.js +208 -0
- package/dist/store/run/token-budget-disk.js.map +1 -0
- package/dist/store/session/disk.d.ts +4 -13
- package/dist/store/session/disk.d.ts.map +1 -1
- package/dist/store/session/disk.js +34 -31
- package/dist/store/session/disk.js.map +1 -1
- package/dist/store/session/memory.d.ts +2 -0
- package/dist/store/session/memory.d.ts.map +1 -1
- package/dist/store/session/memory.js +41 -2
- package/dist/store/session/memory.js.map +1 -1
- package/dist/store/task/disk.d.ts.map +1 -1
- package/dist/store/task/disk.js +7 -8
- package/dist/store/task/disk.js.map +1 -1
- package/dist/store/topic/memory.d.ts +2 -0
- package/dist/store/topic/memory.d.ts.map +1 -1
- package/dist/store/topic/memory.js +13 -1
- package/dist/store/topic/memory.js.map +1 -1
- package/dist/test-support/ids.d.ts +4 -19
- package/dist/test-support/ids.d.ts.map +1 -1
- package/dist/test-support/ids.js +51 -59
- package/dist/test-support/ids.js.map +1 -1
- package/dist/tools/advisory/index.d.ts.map +1 -1
- package/dist/tools/advisory/index.js +3 -1
- package/dist/tools/advisory/index.js.map +1 -1
- package/dist/tools/builtins/bash.d.ts +2 -0
- package/dist/tools/builtins/bash.d.ts.map +1 -1
- package/dist/tools/builtins/bash.js +224 -70
- package/dist/tools/builtins/bash.js.map +1 -1
- package/dist/tools/builtins/computer-use.d.ts +2 -2
- package/dist/tools/builtins/computer-use.d.ts.map +1 -1
- package/dist/tools/builtins/computer-use.js +4 -2
- package/dist/tools/builtins/computer-use.js.map +1 -1
- package/dist/tools/builtins/edit.js +2 -2
- package/dist/tools/builtins/edit.js.map +1 -1
- package/dist/tools/builtins/glob.d.ts +2 -1
- package/dist/tools/builtins/glob.d.ts.map +1 -1
- package/dist/tools/builtins/glob.js +95 -103
- package/dist/tools/builtins/glob.js.map +1 -1
- package/dist/tools/builtins/grep.d.ts.map +1 -1
- package/dist/tools/builtins/grep.js +155 -111
- package/dist/tools/builtins/grep.js.map +1 -1
- package/dist/tools/builtins/ls.js +4 -4
- package/dist/tools/builtins/ls.js.map +1 -1
- package/dist/tools/builtins/lsp.js +2 -2
- package/dist/tools/builtins/lsp.js.map +1 -1
- package/dist/tools/builtins/read-file.js +2 -2
- package/dist/tools/builtins/read-file.js.map +1 -1
- package/dist/tools/builtins/write-file.js +2 -2
- package/dist/tools/builtins/write-file.js.map +1 -1
- package/dist/tools/coordinator/ask-user-question.d.ts +33 -0
- package/dist/tools/coordinator/ask-user-question.d.ts.map +1 -0
- package/dist/tools/coordinator/ask-user-question.js +237 -0
- package/dist/tools/coordinator/ask-user-question.js.map +1 -0
- package/dist/tools/coordinator/index.d.ts +1 -2
- package/dist/tools/coordinator/index.d.ts.map +1 -1
- package/dist/tools/coordinator/index.js +4 -220
- package/dist/tools/coordinator/index.js.map +1 -1
- package/dist/tools/memory/read.d.ts.map +1 -1
- package/dist/tools/memory/read.js +2 -4
- package/dist/tools/memory/read.js.map +1 -1
- package/dist/tools/paths.d.ts +13 -0
- package/dist/tools/paths.d.ts.map +1 -1
- package/dist/tools/paths.js +53 -0
- package/dist/tools/paths.js.map +1 -1
- package/dist/tools/roster.d.ts +27 -0
- package/dist/tools/roster.d.ts.map +1 -0
- package/dist/tools/roster.js +42 -0
- package/dist/tools/roster.js.map +1 -0
- package/dist/types/agent/base.d.ts +5 -0
- package/dist/types/agent/base.d.ts.map +1 -1
- package/dist/types/agent/pipeline.d.ts +3 -0
- package/dist/types/agent/pipeline.d.ts.map +1 -1
- package/dist/types/agent/router.d.ts +2 -3
- package/dist/types/agent/router.d.ts.map +1 -1
- package/dist/types/agent/scheduler.d.ts +3 -0
- package/dist/types/agent/scheduler.d.ts.map +1 -1
- package/dist/types/agent/task.d.ts +5 -16
- package/dist/types/agent/task.d.ts.map +1 -1
- package/dist/types/agent/task.js.map +1 -1
- package/dist/types/common/index.d.ts.map +1 -1
- package/dist/types/common/index.js +3 -0
- package/dist/types/common/index.js.map +1 -1
- package/dist/types/computer-use/index.d.ts +8 -0
- package/dist/types/computer-use/index.d.ts.map +1 -1
- package/dist/types/computer-use/index.js.map +1 -1
- package/dist/types/hitl/index.d.ts +5 -0
- package/dist/types/hitl/index.d.ts.map +1 -1
- package/dist/types/hitl/index.js.map +1 -1
- package/dist/types/ids/brand.d.ts +5 -47
- package/dist/types/ids/brand.d.ts.map +1 -1
- package/dist/types/ids/brand.js +2 -39
- package/dist/types/ids/brand.js.map +1 -1
- package/dist/types/ids/index.d.ts +59 -69
- package/dist/types/ids/index.d.ts.map +1 -1
- package/dist/types/ids/index.js +12 -10
- package/dist/types/ids/index.js.map +1 -1
- package/dist/types/permission/index.d.ts +9 -0
- package/dist/types/permission/index.d.ts.map +1 -1
- package/dist/types/permission/index.js +9 -1
- package/dist/types/permission/index.js.map +1 -1
- package/dist/types/plugin/index.d.ts +45 -4
- package/dist/types/plugin/index.d.ts.map +1 -1
- package/dist/types/plugin/index.js +7 -0
- package/dist/types/plugin/index.js.map +1 -1
- package/dist/types/run/config.d.ts +3 -0
- package/dist/types/run/config.d.ts.map +1 -1
- package/dist/types/run/emergency.d.ts +5 -0
- package/dist/types/run/emergency.d.ts.map +1 -1
- package/dist/types/run/emergency.js.map +1 -1
- package/dist/types/run/entity.d.ts +6 -2
- package/dist/types/run/entity.d.ts.map +1 -1
- package/dist/types/run/events.d.ts +35 -0
- package/dist/types/run/events.d.ts.map +1 -1
- package/dist/types/run/events.js.map +1 -1
- package/dist/types/run/index.d.ts +1 -0
- package/dist/types/run/index.d.ts.map +1 -1
- package/dist/types/run/index.js +1 -0
- package/dist/types/run/index.js.map +1 -1
- package/dist/types/run/state.d.ts +16 -15
- package/dist/types/run/state.d.ts.map +1 -1
- package/dist/types/run/state.js +41 -22
- package/dist/types/run/state.js.map +1 -1
- package/dist/types/run/stop-reason.d.ts +3 -14
- package/dist/types/run/stop-reason.d.ts.map +1 -1
- package/dist/types/run/token-budget-store.d.ts +29 -0
- package/dist/types/run/token-budget-store.d.ts.map +1 -0
- package/dist/types/run/token-budget-store.js +25 -0
- package/dist/types/run/token-budget-store.js.map +1 -0
- package/dist/types/sandbox/index.d.ts +47 -2
- package/dist/types/sandbox/index.d.ts.map +1 -1
- package/dist/types/sandbox/index.js.map +1 -1
- package/dist/types/session/store.d.ts +8 -0
- package/dist/types/session/store.d.ts.map +1 -1
- package/dist/types/tool/index.d.ts +15 -0
- package/dist/types/tool/index.d.ts.map +1 -1
- package/dist/types/tool/index.js.map +1 -1
- package/dist/utils/frontmatter.d.ts +1 -1
- package/dist/utils/frontmatter.js +1 -1
- package/dist/utils/id-format.d.ts +3 -0
- package/dist/utils/id-format.d.ts.map +1 -0
- package/dist/utils/id-format.js +9 -0
- package/dist/utils/id-format.js.map +1 -0
- package/dist/utils/id.d.ts +65 -32
- package/dist/utils/id.d.ts.map +1 -1
- package/dist/utils/id.js +168 -148
- package/dist/utils/id.js.map +1 -1
- package/dist/utils/log/exception.js +1 -1
- package/dist/utils/log/exception.js.map +1 -1
- package/dist/utils/log/index.d.ts.map +1 -1
- package/dist/utils/log/index.js +1 -2
- package/dist/utils/log/index.js.map +1 -1
- package/dist/utils/log/templates.d.ts.map +1 -1
- package/dist/utils/log/templates.js +0 -1
- package/dist/utils/log/templates.js.map +1 -1
- package/package.json +6 -1
- package/src/agents/AGENTS.md +1 -1
- package/src/agents/PipelineAgent.ts +129 -109
- package/src/agents/ReactiveAgent.ts +2 -0
- package/src/agents/RouterAgent.ts +120 -73
- package/src/agents/SupervisorAgent.ts +12 -4
- package/src/agents/budget.ts +42 -0
- package/src/agents/explore.ts +29 -0
- package/src/agents/file-definitions.ts +237 -0
- package/src/agents/index.ts +15 -0
- package/src/bridge/a2a/mapper.ts +6 -0
- package/src/bridge/sse/mapper.ts +22 -0
- package/src/bus/lock.ts +1 -10
- package/src/compaction/consolidation.ts +79 -0
- package/src/compaction/factory.ts +3 -0
- package/src/compaction/index.ts +34 -4
- package/src/compaction/manager.ts +39 -1
- package/src/compaction/plan.ts +52 -21
- package/src/compaction/salience/bm25.ts +72 -0
- package/src/compaction/salience/goal.ts +44 -0
- package/src/compaction/salience/index.ts +19 -0
- package/src/compaction/salience/minhash.ts +53 -0
- package/src/compaction/salience/score.ts +305 -0
- package/src/compaction/salience/tokenize.ts +89 -0
- package/src/compaction/salience/working-set.ts +187 -0
- package/src/compaction/serializer.ts +16 -0
- package/src/compaction/token-estimate.ts +57 -0
- package/src/compaction/tool-result-editing.ts +28 -26
- package/src/compaction/types.ts +24 -1
- package/src/compaction/wire.ts +5 -1
- package/src/config/runtime.ts +13 -1
- package/src/connector/builtins/http.ts +2 -8
- package/src/connector/builtins/webhook.ts +2 -2
- package/src/connector/mcp/adapter.ts +32 -0
- package/src/connector/tools/adapter.ts +2 -2
- package/src/connector/tools/definitions.ts +2 -2
- package/src/constants/compaction/index.ts +1 -0
- package/src/constants/telemetry/index.ts +0 -1
- package/src/contracts/api.ts +5 -1
- package/src/contracts/schemas.ts +6 -20
- package/src/invariants/index.ts +1 -1
- package/src/manager/agent/lifecycle.ts +380 -352
- package/src/manager/run/persistence.ts +35 -5
- package/src/plugin/index.ts +19 -0
- package/src/plugin/shell-hook.ts +403 -0
- package/src/prompt/coding-agent-doctrine.ts +118 -0
- package/src/prompt/index.ts +8 -0
- package/src/provider/errors.ts +1 -1
- package/src/provider/fallback.ts +4 -1
- package/src/provider/retry.ts +4 -1
- package/src/provider/token-budget.ts +158 -0
- package/src/public-runtime.ts +56 -28
- package/src/public-tools.ts +5 -0
- package/src/public-types.ts +65 -0
- package/src/registry/command/kernel-commands.ts +16 -6
- package/src/registry/tool/execute.ts +4 -1
- package/src/run/LimitChecker.ts +1 -1
- package/src/run/drain.ts +1 -1
- package/src/run/reporter.ts +15 -0
- package/src/run/token-budget.ts +692 -0
- package/src/runtime/jobs/registry.ts +123 -17
- package/src/runtime/query/checkpoint.ts +10 -3
- package/src/runtime/query/context.ts +3 -57
- package/src/runtime/query/executor.ts +181 -71
- package/src/runtime/query/guard.ts +8 -0
- package/src/runtime/query/index.ts +209 -62
- package/src/runtime/query/iteration/index.ts +53 -15
- package/src/runtime/query/iteration/phases/compaction.ts +130 -31
- package/src/runtime/query/iteration/phases/context.ts +4 -0
- package/src/runtime/query/iteration/phases/tool-review.ts +39 -7
- package/src/runtime/query/iteration/phases/working-memory.ts +23 -14
- package/src/runtime/query/iteration/stream-turn.ts +9 -5
- package/src/runtime/query/plugin-hooks.ts +24 -2
- package/src/runtime/query/prompt.ts +21 -4
- package/src/runtime/query/repeat-call.ts +42 -7
- package/src/runtime/query/result.ts +9 -0
- package/src/runtime/query/review-policy.ts +231 -0
- package/src/runtime/query/run-state.ts +4 -0
- package/src/runtime/query/steering.ts +32 -0
- package/src/runtime/query/token-budget.ts +127 -0
- package/src/runtime/query/tool-output-budget.ts +33 -10
- package/src/runtime/query/tool-pause.ts +4 -2
- package/src/runtime/query/tooling.ts +8 -0
- package/src/sandbox/file-walk-program.ts +93 -0
- package/src/sandbox/file-walk.ts +463 -0
- package/src/sandbox/index.ts +2 -0
- package/src/sandbox/provider/local.ts +136 -13
- package/src/scheduler/completion-inbox.ts +29 -19
- package/src/scheduler/delegating.ts +35 -13
- package/src/scheduler/local.ts +5 -7
- package/src/session/index.ts +0 -1
- package/src/session/workspace/path-builder.ts +5 -4
- package/src/store/feedback/disk.ts +4 -6
- package/src/store/index.ts +2 -0
- package/src/store/memory/disk.ts +3 -11
- package/src/store/run/checkpoint-disk.ts +14 -27
- package/src/store/run/claim-disk.ts +1 -1
- package/src/store/run/conformance.ts +55 -39
- package/src/store/run/disk.ts +19 -4
- package/src/store/run/token-budget-disk.ts +247 -0
- package/src/store/session/disk.ts +36 -29
- package/src/store/session/memory.ts +38 -1
- package/src/store/task/disk.ts +7 -8
- package/src/store/topic/memory.ts +13 -1
- package/src/test-support/ids.ts +62 -59
- package/src/tools/advisory/index.ts +3 -1
- package/src/tools/builtins/bash.ts +241 -70
- package/src/tools/builtins/computer-use.ts +6 -2
- package/src/tools/builtins/edit.ts +2 -2
- package/src/tools/builtins/glob.ts +104 -122
- package/src/tools/builtins/grep.ts +166 -132
- package/src/tools/builtins/ls.ts +4 -4
- package/src/tools/builtins/lsp.ts +2 -2
- package/src/tools/builtins/read-file.ts +2 -2
- package/src/tools/builtins/write-file.ts +2 -2
- package/src/tools/coordinator/ask-user-question.ts +284 -0
- package/src/tools/coordinator/index.ts +5 -248
- package/src/tools/memory/read.ts +2 -4
- package/src/tools/paths.ts +64 -0
- package/src/tools/roster.ts +46 -0
- package/src/types/agent/base.ts +6 -0
- package/src/types/agent/pipeline.ts +3 -0
- package/src/types/agent/router.ts +2 -3
- package/src/types/agent/scheduler.ts +4 -0
- package/src/types/agent/task.ts +5 -18
- package/src/types/common/index.ts +3 -0
- package/src/types/computer-use/index.ts +8 -0
- package/src/types/hitl/index.ts +5 -0
- package/src/types/ids/brand.ts +5 -48
- package/src/types/ids/index.ts +66 -75
- package/src/types/permission/index.ts +11 -0
- package/src/types/plugin/index.ts +49 -1
- package/src/types/run/config.ts +3 -0
- package/src/types/run/emergency.ts +5 -0
- package/src/types/run/entity.ts +6 -2
- package/src/types/run/events.ts +37 -0
- package/src/types/run/index.ts +1 -0
- package/src/types/run/state.ts +58 -30
- package/src/types/run/stop-reason.ts +3 -14
- package/src/types/run/token-budget-store.ts +54 -0
- package/src/types/sandbox/index.ts +53 -0
- package/src/types/session/store.ts +8 -0
- package/src/types/tool/index.ts +15 -0
- package/src/utils/frontmatter.ts +1 -1
- package/src/utils/id-format.ts +9 -0
- package/src/utils/id.ts +222 -181
- package/src/utils/log/exception.ts +1 -1
- package/src/utils/log/index.ts +1 -2
- package/src/utils/log/templates.ts +0 -1
- package/dist/session/migration/errors.d.ts +0 -26
- package/dist/session/migration/errors.d.ts.map +0 -1
- package/dist/session/migration/errors.js +0 -22
- package/dist/session/migration/errors.js.map +0 -1
- package/dist/session/migration/filesystem.d.ts +0 -122
- package/dist/session/migration/filesystem.d.ts.map +0 -1
- package/dist/session/migration/filesystem.js +0 -379
- package/dist/session/migration/filesystem.js.map +0 -1
- package/dist/session/migration/id-prefix.d.ts +0 -113
- package/dist/session/migration/id-prefix.d.ts.map +0 -1
- package/dist/session/migration/id-prefix.js +0 -132
- package/dist/session/migration/id-prefix.js.map +0 -1
- package/dist/session/migration/index.d.ts +0 -12
- package/dist/session/migration/index.d.ts.map +0 -1
- package/dist/session/migration/index.js +0 -12
- package/dist/session/migration/index.js.map +0 -1
- package/dist/session/migration/marker.d.ts +0 -57
- package/dist/session/migration/marker.d.ts.map +0 -1
- package/dist/session/migration/marker.js +0 -123
- package/dist/session/migration/marker.js.map +0 -1
- package/src/session/migration/errors.ts +0 -23
- package/src/session/migration/filesystem.ts +0 -468
- package/src/session/migration/id-prefix.ts +0 -166
- package/src/session/migration/index.ts +0 -41
- package/src/session/migration/marker.ts +0 -142
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BM25 over the run's own messages.
|
|
3
|
+
*
|
|
4
|
+
* The corpus is small — a few hundred documents at most — so the index
|
|
5
|
+
* is rebuilt from term frequencies each pass rather than maintained
|
|
6
|
+
* incrementally; the arithmetic is the cost of a few string splits. The
|
|
7
|
+
* constants are the textbook ones (k1 = 1.2, b = 0.75). What matters
|
|
8
|
+
* here is not ranking quality against a web corpus but that a message
|
|
9
|
+
* mentioning the goal's identifiers outscores one that does not, and
|
|
10
|
+
* that a term every message contains (the run's own file name, say)
|
|
11
|
+
* stops counting.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { termFrequencies, tokenize } from './tokenize.js'
|
|
15
|
+
|
|
16
|
+
export interface Bm25Document {
|
|
17
|
+
readonly tf: ReadonlyMap<string, number>
|
|
18
|
+
readonly length: number
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface Bm25Index {
|
|
22
|
+
readonly documents: readonly Bm25Document[]
|
|
23
|
+
readonly documentFrequency: ReadonlyMap<string, number>
|
|
24
|
+
readonly averageLength: number
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const K1 = 1.2
|
|
28
|
+
const B = 0.75
|
|
29
|
+
|
|
30
|
+
export function indexDocument(text: string): Bm25Document {
|
|
31
|
+
const tokens = tokenize(text)
|
|
32
|
+
return { tf: termFrequencies(tokens), length: tokens.length }
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function buildIndex(documents: readonly Bm25Document[]): Bm25Index {
|
|
36
|
+
const documentFrequency = new Map<string, number>()
|
|
37
|
+
let total = 0
|
|
38
|
+
for (const doc of documents) {
|
|
39
|
+
total += doc.length
|
|
40
|
+
for (const term of doc.tf.keys()) {
|
|
41
|
+
documentFrequency.set(term, (documentFrequency.get(term) ?? 0) + 1)
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
documents,
|
|
46
|
+
documentFrequency,
|
|
47
|
+
averageLength: documents.length === 0 ? 0 : total / documents.length,
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** BM25 score of one document for a query given as tokens. */
|
|
52
|
+
export function bm25Score(
|
|
53
|
+
index: Bm25Index,
|
|
54
|
+
doc: Bm25Document,
|
|
55
|
+
queryTokens: readonly string[],
|
|
56
|
+
): number {
|
|
57
|
+
if (doc.length === 0 || index.documents.length === 0) return 0
|
|
58
|
+
const n = index.documents.length
|
|
59
|
+
let score = 0
|
|
60
|
+
const seen = new Set<string>()
|
|
61
|
+
for (const term of queryTokens) {
|
|
62
|
+
if (seen.has(term)) continue
|
|
63
|
+
seen.add(term)
|
|
64
|
+
const tf = doc.tf.get(term)
|
|
65
|
+
if (!tf) continue
|
|
66
|
+
const df = index.documentFrequency.get(term) ?? 0
|
|
67
|
+
const idf = Math.log(1 + (n - df + 0.5) / (df + 0.5))
|
|
68
|
+
const norm = tf + K1 * (1 - B + (B * doc.length) / Math.max(1, index.averageLength))
|
|
69
|
+
score += idf * ((tf * (K1 + 1)) / norm)
|
|
70
|
+
}
|
|
71
|
+
return score
|
|
72
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The goal vector: what "relevant" is measured against.
|
|
3
|
+
*
|
|
4
|
+
* Not the whole history — that would make every message relevant to
|
|
5
|
+
* itself — but the four things that say what the run is for right now:
|
|
6
|
+
* the first user message (the task), the most recent user turns (the
|
|
7
|
+
* requirements as they were refined), the open items of the task list
|
|
8
|
+
* when the run keeps one, and the latest assistant text (its stated
|
|
9
|
+
* intent). Weighted by repetition rather than a coefficient: the task
|
|
10
|
+
* statement is included twice so a run that has drifted into detail is
|
|
11
|
+
* still scored against what it was asked to do.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import type { Message } from '../../types/message/index.js'
|
|
15
|
+
|
|
16
|
+
export interface GoalSources {
|
|
17
|
+
/** Titles of task-list items not yet completed, when the host keeps a task store. */
|
|
18
|
+
readonly openTasks?: readonly string[]
|
|
19
|
+
/** How many of the latest user turns count as live requirements. */
|
|
20
|
+
readonly recentUserTurns?: number
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function buildGoal(messages: readonly Message[], sources: GoalSources = {}): string {
|
|
24
|
+
const users = messages.filter(
|
|
25
|
+
(m): m is Extract<Message, { role: 'user' }> =>
|
|
26
|
+
m.role === 'user' && typeof m.content === 'string',
|
|
27
|
+
)
|
|
28
|
+
const first = users[0]?.content ?? ''
|
|
29
|
+
const recent = users
|
|
30
|
+
.slice(-(sources.recentUserTurns ?? 3))
|
|
31
|
+
.map((m) => m.content)
|
|
32
|
+
.filter((text) => text !== first)
|
|
33
|
+
let latestIntent = ''
|
|
34
|
+
for (let i = messages.length - 1; i >= 0; i -= 1) {
|
|
35
|
+
const m = messages[i] as Message
|
|
36
|
+
if (m.role === 'assistant' && typeof m.content === 'string' && m.content.trim().length > 0) {
|
|
37
|
+
latestIntent = m.content
|
|
38
|
+
break
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return [first, first, ...recent, ...(sources.openTasks ?? []), latestIntent]
|
|
42
|
+
.filter((part) => part.length > 0)
|
|
43
|
+
.join('\n')
|
|
44
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export { buildGoal, type GoalSources } from './goal.js'
|
|
2
|
+
export {
|
|
3
|
+
DEFAULT_SALIENCE_CONFIG,
|
|
4
|
+
DEFAULT_SALIENCE_WEIGHTS,
|
|
5
|
+
type ProtectedReason,
|
|
6
|
+
type SalienceConfig,
|
|
7
|
+
type SalienceWeights,
|
|
8
|
+
type ScoreOptions,
|
|
9
|
+
type ScoredMessage,
|
|
10
|
+
messageText,
|
|
11
|
+
scoreMessages,
|
|
12
|
+
} from './score.js'
|
|
13
|
+
export {
|
|
14
|
+
type WorkingSetAction,
|
|
15
|
+
type WorkingSetOptions,
|
|
16
|
+
type WorkingSetPlan,
|
|
17
|
+
isStubbedNarration,
|
|
18
|
+
planWorkingSet,
|
|
19
|
+
} from './working-set.js'
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Near-duplicate detection with MinHash over word shingles.
|
|
3
|
+
*
|
|
4
|
+
* Two tool results are rarely byte-identical — a timestamp, a duration,
|
|
5
|
+
* a line number moves — and still the same output. Three-word shingles
|
|
6
|
+
* hashed 64 ways give a Jaccard estimate that is stable against those
|
|
7
|
+
* edits and cheap enough to compare every message against every other
|
|
8
|
+
* once per pass at the sizes a run reaches. Hashing is FNV-1a with a
|
|
9
|
+
* per-slot seed; nothing here needs to be cryptographic, only consistent
|
|
10
|
+
* within a process.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
const HASHES = 64
|
|
14
|
+
const SHINGLE = 3
|
|
15
|
+
|
|
16
|
+
function fnv1a(text: string, seed: number): number {
|
|
17
|
+
let hash = (0x811c9dc5 ^ seed) >>> 0
|
|
18
|
+
for (let i = 0; i < text.length; i += 1) {
|
|
19
|
+
hash ^= text.charCodeAt(i)
|
|
20
|
+
hash = Math.imul(hash, 0x01000193) >>> 0
|
|
21
|
+
}
|
|
22
|
+
return hash
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** The signature of `tokens`; an empty signature for fewer than one shingle. */
|
|
26
|
+
export function minhash(tokens: readonly string[]): Uint32Array {
|
|
27
|
+
const signature = new Uint32Array(HASHES).fill(0xffffffff)
|
|
28
|
+
if (tokens.length < SHINGLE) {
|
|
29
|
+
if (tokens.length === 0) return signature
|
|
30
|
+
const single = tokens.join(' ')
|
|
31
|
+
for (let slot = 0; slot < HASHES; slot += 1) signature[slot] = fnv1a(single, slot)
|
|
32
|
+
return signature
|
|
33
|
+
}
|
|
34
|
+
for (let i = 0; i + SHINGLE <= tokens.length; i += 1) {
|
|
35
|
+
const shingle = `${tokens[i]} ${tokens[i + 1]} ${tokens[i + 2]}`
|
|
36
|
+
for (let slot = 0; slot < HASHES; slot += 1) {
|
|
37
|
+
const h = fnv1a(shingle, slot)
|
|
38
|
+
if (h < (signature[slot] as number)) signature[slot] = h
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return signature
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** Estimated Jaccard similarity of two signatures, 0..1. */
|
|
45
|
+
export function similarity(a: Uint32Array, b: Uint32Array): number {
|
|
46
|
+
let same = 0
|
|
47
|
+
for (let slot = 0; slot < HASHES; slot += 1) if (a[slot] === b[slot]) same += 1
|
|
48
|
+
return same / HASHES
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function isEmptySignature(signature: Uint32Array): boolean {
|
|
52
|
+
return signature.every((h) => h === 0xffffffff)
|
|
53
|
+
}
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Salience: how much the next step depends on each message.
|
|
3
|
+
*
|
|
4
|
+
* The compaction pass chose what to keep by position — the floor, the
|
|
5
|
+
* last few turns, the last few tool results — and a fact stated in the
|
|
6
|
+
* middle of a long run aged out at the same rate as chatter. This gives
|
|
7
|
+
* every message a number instead, from four things the kernel can
|
|
8
|
+
* observe without a model:
|
|
9
|
+
*
|
|
10
|
+
* recency how many messages ago, decayed with a half-life;
|
|
11
|
+
* relevance BM25 against the goal — the task, the requirements, the
|
|
12
|
+
* open plan items, the latest intent;
|
|
13
|
+
* utility whether it was USED: a tool result whose paths and
|
|
14
|
+
* identifiers reappear in a later tool input or assistant
|
|
15
|
+
* turn; an instruction from the user;
|
|
16
|
+
* redundancy whether a later message says the same thing — a repeated
|
|
17
|
+
* read, the same error twice — so the older copy yields.
|
|
18
|
+
*
|
|
19
|
+
* What no score may cross is stated as `protected`: the leading system
|
|
20
|
+
* run, `retain` markers with the turn they pull in, the most recent
|
|
21
|
+
* turns, and the other half of a tool-call pair. Pure, like `plan.ts`:
|
|
22
|
+
* no run, no logger, no provider, so it can be asked without one.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
import type { AssistantMessage, Message, ToolMessage } from '../../types/message/index.js'
|
|
26
|
+
import { findRetainedIndices } from '../retention.js'
|
|
27
|
+
import { estimateMessageTokens } from '../token-estimate.js'
|
|
28
|
+
import { type Bm25Document, bm25Score, buildIndex, indexDocument } from './bm25.js'
|
|
29
|
+
import { isEmptySignature, minhash, similarity } from './minhash.js'
|
|
30
|
+
import { tokenize } from './tokenize.js'
|
|
31
|
+
|
|
32
|
+
export interface SalienceWeights {
|
|
33
|
+
readonly recency: number
|
|
34
|
+
readonly relevance: number
|
|
35
|
+
readonly utility: number
|
|
36
|
+
readonly redundancy: number
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export const DEFAULT_SALIENCE_WEIGHTS: SalienceWeights = {
|
|
40
|
+
recency: 1,
|
|
41
|
+
relevance: 1,
|
|
42
|
+
utility: 1,
|
|
43
|
+
redundancy: 1,
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface SalienceConfig {
|
|
47
|
+
/** Messages after which recency has halved. */
|
|
48
|
+
readonly halfLifeMessages: number
|
|
49
|
+
/** Estimated Jaccard at or above which two messages are the same thing. */
|
|
50
|
+
readonly duplicateThreshold: number
|
|
51
|
+
readonly weights: SalienceWeights
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export const DEFAULT_SALIENCE_CONFIG: SalienceConfig = {
|
|
55
|
+
halfLifeMessages: 12,
|
|
56
|
+
duplicateThreshold: 0.8,
|
|
57
|
+
weights: DEFAULT_SALIENCE_WEIGHTS,
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export type ProtectedReason = 'system-floor' | 'retain' | 'recent' | 'pair'
|
|
61
|
+
|
|
62
|
+
export interface ScoredMessage {
|
|
63
|
+
readonly index: number
|
|
64
|
+
readonly role: Message['role']
|
|
65
|
+
/** Estimated tokens of the message, including rich content and tool inputs. */
|
|
66
|
+
readonly tokens: number
|
|
67
|
+
readonly recency: number
|
|
68
|
+
readonly relevance: number
|
|
69
|
+
readonly utility: number
|
|
70
|
+
readonly redundancy: number
|
|
71
|
+
/** The weighted sum; meaningful only relative to the other messages of the same pass. */
|
|
72
|
+
readonly salience: number
|
|
73
|
+
readonly protected: ProtectedReason | null
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export interface ScoreOptions {
|
|
77
|
+
/** The goal vector as text: task statement, requirements, open plan items, latest intent. */
|
|
78
|
+
readonly goal: string
|
|
79
|
+
/** How many trailing messages are protected as recent. */
|
|
80
|
+
readonly keepRecentMessages: number
|
|
81
|
+
readonly config?: Partial<SalienceConfig>
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** The model-visible text of a message, with an assistant's tool inputs. */
|
|
85
|
+
export function messageText(message: Message): string {
|
|
86
|
+
if (message.role === 'tool') {
|
|
87
|
+
return typeof message.content === 'string'
|
|
88
|
+
? message.content
|
|
89
|
+
: message.content.flatMap((block) => (block.type === 'text' ? [block.text] : [])).join('\n')
|
|
90
|
+
}
|
|
91
|
+
const parts: string[] = []
|
|
92
|
+
if (typeof message.content === 'string') parts.push(message.content)
|
|
93
|
+
if (message.role === 'assistant') {
|
|
94
|
+
for (const call of (message as AssistantMessage).toolCalls ?? []) {
|
|
95
|
+
parts.push(call.function.name, call.function.arguments)
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return parts.join('\n')
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function hasRichContent(message: Message): boolean {
|
|
102
|
+
return (
|
|
103
|
+
(message.role === 'user' && (message.attachments?.length ?? 0) > 0) ||
|
|
104
|
+
(message.role === 'tool' &&
|
|
105
|
+
typeof message.content !== 'string' &&
|
|
106
|
+
message.content.some((block) => block.type !== 'text'))
|
|
107
|
+
)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const isAssistantWithCalls = (m: Message): m is AssistantMessage =>
|
|
111
|
+
m.role === 'assistant' && Array.isArray((m as AssistantMessage).toolCalls)
|
|
112
|
+
|
|
113
|
+
/** Tokens that look like something a later turn could cite: paths, identifiers, dotted keys. */
|
|
114
|
+
function citable(tokens: readonly string[]): Set<string> {
|
|
115
|
+
const out = new Set<string>()
|
|
116
|
+
for (const token of tokens) {
|
|
117
|
+
if (token.length >= 5 || token.includes('/') || token.includes('.')) out.add(token)
|
|
118
|
+
}
|
|
119
|
+
return out
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export function scoreMessages(
|
|
123
|
+
messages: readonly Message[],
|
|
124
|
+
options: ScoreOptions,
|
|
125
|
+
): ScoredMessage[] {
|
|
126
|
+
const config: SalienceConfig = {
|
|
127
|
+
...DEFAULT_SALIENCE_CONFIG,
|
|
128
|
+
...options.config,
|
|
129
|
+
weights: { ...DEFAULT_SALIENCE_WEIGHTS, ...options.config?.weights },
|
|
130
|
+
}
|
|
131
|
+
const n = messages.length
|
|
132
|
+
const texts = messages.map(messageText)
|
|
133
|
+
const richContent = messages.map(hasRichContent)
|
|
134
|
+
const tokenLists = texts.map(tokenize)
|
|
135
|
+
const documents: Bm25Document[] = texts.map(indexDocument)
|
|
136
|
+
const index = buildIndex(documents)
|
|
137
|
+
const goalTokens = tokenize(options.goal)
|
|
138
|
+
|
|
139
|
+
// Relevance, normalised to the best message of the pass so weights mean
|
|
140
|
+
// the same thing in a short run and a long one.
|
|
141
|
+
// Normalised to the best message the pass could evict, not to the user
|
|
142
|
+
// turn that stated the goal: that turn matches the goal by definition,
|
|
143
|
+
// and measured against it every result reads as barely relevant.
|
|
144
|
+
const rawRelevance = documents.map((doc) => bm25Score(index, doc, goalTokens))
|
|
145
|
+
// Nor to an assistant turn that only issued a call: its arguments echo
|
|
146
|
+
// the goal's path in a dozen tokens, which BM25 scores above the
|
|
147
|
+
// four-thousand-token result that actually holds the file.
|
|
148
|
+
const maxRelevance = Math.max(
|
|
149
|
+
0,
|
|
150
|
+
...rawRelevance.filter((_, i) => {
|
|
151
|
+
const m = messages[i] as Message
|
|
152
|
+
return m.role === 'tool' || (m.role === 'assistant' && !isAssistantWithCalls(m))
|
|
153
|
+
}),
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
// Citation index: everything a LATER assistant turn or tool input names.
|
|
157
|
+
// Built once, suffix-wise, so each message asks "does anything after me
|
|
158
|
+
// cite my identifiers" in one lookup.
|
|
159
|
+
const citedAfter: Set<string>[] = new Array(n)
|
|
160
|
+
let running = new Set<string>()
|
|
161
|
+
for (let i = n - 1; i >= 0; i -= 1) {
|
|
162
|
+
citedAfter[i] = running
|
|
163
|
+
const message = messages[i] as Message
|
|
164
|
+
if (message.role === 'assistant' || message.role === 'user') {
|
|
165
|
+
running = new Set([...running, ...citable(tokenLists[i] as string[])])
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Redundancy: the highest similarity to any later message of the same
|
|
170
|
+
// role, and a full demotion when a later assistant turn repeats this
|
|
171
|
+
// message's tool call exactly.
|
|
172
|
+
const signatures = tokenLists.map(minhash)
|
|
173
|
+
const callKeys = messages.map((m) =>
|
|
174
|
+
isAssistantWithCalls(m)
|
|
175
|
+
? (m.toolCalls ?? []).map((c) => `${c.function.name}:${c.function.arguments}`)
|
|
176
|
+
: [],
|
|
177
|
+
)
|
|
178
|
+
const laterCallKeys: Set<string>[] = new Array(n)
|
|
179
|
+
let calls = new Set<string>()
|
|
180
|
+
for (let i = n - 1; i >= 0; i -= 1) {
|
|
181
|
+
laterCallKeys[i] = calls
|
|
182
|
+
if ((callKeys[i] as string[]).length > 0)
|
|
183
|
+
calls = new Set([...calls, ...(callKeys[i] as string[])])
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// Protection.
|
|
187
|
+
const protectedBy: (ProtectedReason | null)[] = new Array(n).fill(null)
|
|
188
|
+
let floorEnd = 0
|
|
189
|
+
while (floorEnd < n && messages[floorEnd]?.role === 'system') {
|
|
190
|
+
protectedBy[floorEnd] = 'system-floor'
|
|
191
|
+
floorEnd += 1
|
|
192
|
+
}
|
|
193
|
+
for (const i of findRetainedIndices(messages))
|
|
194
|
+
if (protectedBy[i] === null) protectedBy[i] = 'retain'
|
|
195
|
+
for (let i = Math.max(floorEnd, n - options.keepRecentMessages); i < n; i += 1) {
|
|
196
|
+
if (protectedBy[i] === null) protectedBy[i] = 'recent'
|
|
197
|
+
}
|
|
198
|
+
// A protected half of a pair protects the other half.
|
|
199
|
+
for (let i = 0; i < n; i += 1) {
|
|
200
|
+
const message = messages[i] as Message
|
|
201
|
+
if (!isAssistantWithCalls(message) || protectedBy[i] === null) continue
|
|
202
|
+
const ids = new Set((message.toolCalls ?? []).map((c) => c.id))
|
|
203
|
+
for (let j = i + 1; j < n && ids.size > 0; j += 1) {
|
|
204
|
+
const candidate = messages[j] as Message
|
|
205
|
+
if (candidate.role !== 'tool') {
|
|
206
|
+
if (candidate.role === 'assistant') break
|
|
207
|
+
continue
|
|
208
|
+
}
|
|
209
|
+
if (ids.has((candidate as ToolMessage).toolCallId)) {
|
|
210
|
+
ids.delete((candidate as ToolMessage).toolCallId)
|
|
211
|
+
if (protectedBy[j] === null) protectedBy[j] = 'pair'
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
for (let j = n - 1; j >= 0; j -= 1) {
|
|
216
|
+
const message = messages[j] as Message
|
|
217
|
+
if (message.role !== 'tool' || protectedBy[j] === null) continue
|
|
218
|
+
const id = (message as ToolMessage).toolCallId
|
|
219
|
+
for (let i = j - 1; i >= 0; i -= 1) {
|
|
220
|
+
const candidate = messages[i] as Message
|
|
221
|
+
if (isAssistantWithCalls(candidate) && (candidate.toolCalls ?? []).some((c) => c.id === id)) {
|
|
222
|
+
if (protectedBy[i] === null) protectedBy[i] = 'pair'
|
|
223
|
+
break
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
const scored: ScoredMessage[] = []
|
|
229
|
+
for (let i = 0; i < n; i += 1) {
|
|
230
|
+
const message = messages[i] as Message
|
|
231
|
+
const distance = n - 1 - i
|
|
232
|
+
const recency = 2 ** (-distance / Math.max(1, config.halfLifeMessages))
|
|
233
|
+
const relevance = maxRelevance > 0 ? (rawRelevance[i] as number) / maxRelevance : 0
|
|
234
|
+
|
|
235
|
+
let utility = 0
|
|
236
|
+
if (message.role === 'user') {
|
|
237
|
+
// An instruction is used by everything after it; an acknowledgment
|
|
238
|
+
// ("ok, go on") is not an instruction. The difference is whether it
|
|
239
|
+
// names anything or says more than a few words.
|
|
240
|
+
const tokens = tokenLists[i] as string[]
|
|
241
|
+
utility = citable(tokens).size > 0 || tokens.length >= 6 ? 1 : 0.2
|
|
242
|
+
} else if (message.role === 'tool') {
|
|
243
|
+
// Used is used: one identifier from this result named by a later
|
|
244
|
+
// turn is the evidence, and a count would let the recency of
|
|
245
|
+
// everything after it outvote the one result the run came back
|
|
246
|
+
// for. The eval that placed the account id deep in an early dump
|
|
247
|
+
// and cited it later watched the salience pass clear it under a
|
|
248
|
+
// thirds rule.
|
|
249
|
+
const mine = citable(tokenLists[i] as string[])
|
|
250
|
+
let hits = 0
|
|
251
|
+
for (const token of mine) if ((citedAfter[i] as Set<string>).has(token)) hits += 1
|
|
252
|
+
utility = hits > 0 ? 1 : 0
|
|
253
|
+
} else if (isAssistantWithCalls(message)) utility = 0.5
|
|
254
|
+
|
|
255
|
+
let redundancy = 0
|
|
256
|
+
const signature = signatures[i] as Uint32Array
|
|
257
|
+
// A caption or a repeated call cannot prove that two screenshots or
|
|
258
|
+
// documents contain the same evidence. The lexical scorer has no
|
|
259
|
+
// access to their meaning, so it must not call those messages duplicates.
|
|
260
|
+
if (!richContent[i] && !isEmptySignature(signature)) {
|
|
261
|
+
for (let j = i + 1; j < n; j += 1) {
|
|
262
|
+
if (richContent[j] || (messages[j] as Message).role !== message.role) continue
|
|
263
|
+
const sim = similarity(signature, signatures[j] as Uint32Array)
|
|
264
|
+
if (sim > redundancy) redundancy = sim
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
if (redundancy < config.duplicateThreshold) redundancy = redundancy >= 0.5 ? redundancy : 0
|
|
268
|
+
else redundancy = 1
|
|
269
|
+
if (message.role === 'tool' && !richContent[i]) {
|
|
270
|
+
// The result of a call a later turn repeats exactly: the newer
|
|
271
|
+
// result is the one that counts.
|
|
272
|
+
for (let k = i - 1; k >= 0; k -= 1) {
|
|
273
|
+
const producer = messages[k] as Message
|
|
274
|
+
if (!isAssistantWithCalls(producer)) continue
|
|
275
|
+
const call = (producer.toolCalls ?? []).find(
|
|
276
|
+
(c) => c.id === (message as ToolMessage).toolCallId,
|
|
277
|
+
)
|
|
278
|
+
if (call) {
|
|
279
|
+
const key = `${call.function.name}:${call.function.arguments}`
|
|
280
|
+
if ((laterCallKeys[i] as Set<string>).has(key)) redundancy = 1
|
|
281
|
+
break
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
const w = config.weights
|
|
287
|
+
const salience =
|
|
288
|
+
w.recency * recency +
|
|
289
|
+
w.relevance * relevance +
|
|
290
|
+
w.utility * utility -
|
|
291
|
+
w.redundancy * redundancy
|
|
292
|
+
scored.push({
|
|
293
|
+
index: i,
|
|
294
|
+
role: message.role,
|
|
295
|
+
tokens: estimateMessageTokens(message),
|
|
296
|
+
recency,
|
|
297
|
+
relevance,
|
|
298
|
+
utility,
|
|
299
|
+
redundancy,
|
|
300
|
+
salience,
|
|
301
|
+
protected: protectedBy[i] as ProtectedReason | null,
|
|
302
|
+
})
|
|
303
|
+
}
|
|
304
|
+
return scored
|
|
305
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An identifier-aware tokenizer for scoring, not for search.
|
|
3
|
+
*
|
|
4
|
+
* A coding conversation's vocabulary is paths, identifiers and error
|
|
5
|
+
* names. A word tokenizer sees `src/store.mjs` as one token that matches
|
|
6
|
+
* nothing and `removeTodo` as another; the model, asked about `store`,
|
|
7
|
+
* is looking at both. So a path splits on its separators, a `camelCase`
|
|
8
|
+
* or `snake_case` identifier splits into its words AND keeps its whole
|
|
9
|
+
* form, and a dotted attribute key (`namzu.run.id`) yields both the key
|
|
10
|
+
* and its parts. Everything is lower-cased; nothing is stemmed, because
|
|
11
|
+
* a stemmer that turns `tests` into `test` also turns `testing` into it,
|
|
12
|
+
* and the false matches cost more than the missed ones in a corpus this
|
|
13
|
+
* small. Stop words are the handful that carry no relevance in any
|
|
14
|
+
* sentence and would otherwise dominate term frequency.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
const STOP_WORDS: ReadonlySet<string> = new Set([
|
|
18
|
+
'a',
|
|
19
|
+
'an',
|
|
20
|
+
'and',
|
|
21
|
+
'are',
|
|
22
|
+
'as',
|
|
23
|
+
'at',
|
|
24
|
+
'be',
|
|
25
|
+
'by',
|
|
26
|
+
'for',
|
|
27
|
+
'from',
|
|
28
|
+
'i',
|
|
29
|
+
'if',
|
|
30
|
+
'in',
|
|
31
|
+
'is',
|
|
32
|
+
'it',
|
|
33
|
+
'of',
|
|
34
|
+
'on',
|
|
35
|
+
'or',
|
|
36
|
+
'that',
|
|
37
|
+
'the',
|
|
38
|
+
'then',
|
|
39
|
+
'this',
|
|
40
|
+
'to',
|
|
41
|
+
'was',
|
|
42
|
+
'will',
|
|
43
|
+
'with',
|
|
44
|
+
'you',
|
|
45
|
+
])
|
|
46
|
+
|
|
47
|
+
const WORD = /[\p{L}\p{N}_$][\p{L}\p{N}_$.\-/\\:]*/gu
|
|
48
|
+
|
|
49
|
+
function splitIdentifier(raw: string): string[] {
|
|
50
|
+
const parts = raw
|
|
51
|
+
.replace(/([a-z0-9])([A-Z])/g, '$1 $2')
|
|
52
|
+
.replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')
|
|
53
|
+
.split(/[_\s]+/)
|
|
54
|
+
.filter((p) => p.length > 0)
|
|
55
|
+
return parts.length > 1 ? parts : []
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** Tokens of `text`, lower-cased, with identifiers and paths opened up. */
|
|
59
|
+
export function tokenize(text: string): string[] {
|
|
60
|
+
const out: string[] = []
|
|
61
|
+
for (const match of text.matchAll(WORD)) {
|
|
62
|
+
const raw = match[0].replace(/^[.\-/\\:]+|[.\-/\\:]+$/g, '')
|
|
63
|
+
if (raw.length === 0) continue
|
|
64
|
+
const whole = raw.toLowerCase()
|
|
65
|
+
if (!STOP_WORDS.has(whole)) out.push(whole)
|
|
66
|
+
// Separators first: a path or dotted key contributes each segment.
|
|
67
|
+
const segments = raw.split(/[/\\.:\-]+/).filter((s) => s.length > 0)
|
|
68
|
+
if (segments.length > 1) {
|
|
69
|
+
for (const segment of segments) {
|
|
70
|
+
const lower = segment.toLowerCase()
|
|
71
|
+
if (!STOP_WORDS.has(lower) && lower !== whole) out.push(lower)
|
|
72
|
+
for (const part of splitIdentifier(segment)) out.push(part.toLowerCase())
|
|
73
|
+
}
|
|
74
|
+
} else {
|
|
75
|
+
for (const part of splitIdentifier(raw)) {
|
|
76
|
+
const lower = part.toLowerCase()
|
|
77
|
+
if (!STOP_WORDS.has(lower)) out.push(lower)
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return out
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** Term frequencies of `tokens`. */
|
|
85
|
+
export function termFrequencies(tokens: readonly string[]): Map<string, number> {
|
|
86
|
+
const tf = new Map<string, number>()
|
|
87
|
+
for (const token of tokens) tf.set(token, (tf.get(token) ?? 0) + 1)
|
|
88
|
+
return tf
|
|
89
|
+
}
|