@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,237 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sub-agents defined in a Markdown file.
|
|
3
|
+
*
|
|
4
|
+
* Skills are defined this way one directory over (`skills/loader.ts`): YAML
|
|
5
|
+
* frontmatter for what the thing IS, a Markdown body for what it is told.
|
|
6
|
+
* An agent file is the same shape for a delegate — a name the `Agent` tool
|
|
7
|
+
* can be asked for, a description the model chooses by, and optionally a
|
|
8
|
+
* tool allowlist, a model and a read-only flag — so a repository can say
|
|
9
|
+
* "our reviewer uses these tools and this model" once, and every host that
|
|
10
|
+
* builds delegates from this kernel offers the same reviewer.
|
|
11
|
+
*
|
|
12
|
+
* ```md
|
|
13
|
+
* ---
|
|
14
|
+
* name: reviewer
|
|
15
|
+
* description: Reviews a diff for correctness and convention drift.
|
|
16
|
+
* tools: read, grep, glob # optional allowlist, intersected with the parent's set
|
|
17
|
+
* model: claude-sonnet-4-5 # optional override
|
|
18
|
+
* readOnly: true # optional; keeps only read-only tools
|
|
19
|
+
* ---
|
|
20
|
+
* You review changes for this repository. Cite file:line for every finding …
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* `tools` is one comma-separated line: this kernel's frontmatter reader
|
|
24
|
+
* refuses block lists and flow sequences by design, so there is no other
|
|
25
|
+
* form to accept.
|
|
26
|
+
*
|
|
27
|
+
* This module decides what a file MEANS. Where files live — which
|
|
28
|
+
* directories, in which order, which one shadows which — is the host's
|
|
29
|
+
* decision, passed in as an ordered list of roots; later roots win. A file
|
|
30
|
+
* that cannot be loaded is REPORTED with its path and reason rather than
|
|
31
|
+
* silently absent, and never takes the rest of the roster with it: an
|
|
32
|
+
* agent whose `tools` line failed to parse would otherwise run with the
|
|
33
|
+
* parent's whole set, which is the opposite of what the line was for.
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
import { readFile, readdir, stat } from 'node:fs/promises'
|
|
37
|
+
import { join } from 'node:path'
|
|
38
|
+
|
|
39
|
+
import { parseFrontmatter } from '../utils/frontmatter.js'
|
|
40
|
+
import { SCOPE_ATTRIBUTE } from '../utils/log/types.js'
|
|
41
|
+
import { type Logger, resolveLogger } from '../utils/logger.js'
|
|
42
|
+
|
|
43
|
+
/** Per-file character budget for the prompt body. */
|
|
44
|
+
export const MAX_AGENT_FILE_CHARS = 32_000
|
|
45
|
+
|
|
46
|
+
/** Bytes above which a file is not even read. */
|
|
47
|
+
const MAX_AGENT_FILE_BYTES = 4 * 1024 * 1024
|
|
48
|
+
|
|
49
|
+
/** The names a file may not claim by default: the delegate types a host ships. */
|
|
50
|
+
export const DEFAULT_RESERVED_AGENT_NAMES: ReadonlySet<string> = new Set([
|
|
51
|
+
'general-purpose',
|
|
52
|
+
'explore',
|
|
53
|
+
])
|
|
54
|
+
|
|
55
|
+
const NAME_PATTERN = /^[a-z][a-z0-9-]{0,63}$/
|
|
56
|
+
|
|
57
|
+
export interface AgentFileDefinition {
|
|
58
|
+
readonly name: string
|
|
59
|
+
readonly description: string
|
|
60
|
+
/** The system prompt: the file's body, already cut to the budget. */
|
|
61
|
+
readonly prompt: string
|
|
62
|
+
/** Tool names the agent may use; absent means the parent's working set. */
|
|
63
|
+
readonly tools?: readonly string[]
|
|
64
|
+
readonly model?: string
|
|
65
|
+
readonly readOnly: boolean
|
|
66
|
+
readonly path: string
|
|
67
|
+
/** The host's label for the root this file came from (`user`, `project`, …). */
|
|
68
|
+
readonly source: string
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export interface SkippedAgentFile {
|
|
72
|
+
readonly path: string
|
|
73
|
+
readonly reason: string
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export interface AgentDefinitionRoot {
|
|
77
|
+
readonly dir: string
|
|
78
|
+
readonly source: string
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export interface DiscoveredAgentDefinitions {
|
|
82
|
+
/** In first-seen order; a later root's file replaces an earlier one's by name. */
|
|
83
|
+
readonly definitions: readonly AgentFileDefinition[]
|
|
84
|
+
readonly skipped: readonly SkippedAgentFile[]
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export interface DiscoverAgentDefinitionsOptions {
|
|
88
|
+
/** Names refused in a file. Defaults to `DEFAULT_RESERVED_AGENT_NAMES`. */
|
|
89
|
+
readonly reserved?: ReadonlySet<string>
|
|
90
|
+
readonly log?: Logger
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Every `*.md` in every root, later roots shadowing earlier ones by name.
|
|
95
|
+
* A root that is not there contributes nothing; a file that is there and
|
|
96
|
+
* wrong is reported.
|
|
97
|
+
*/
|
|
98
|
+
export async function discoverAgentDefinitions(
|
|
99
|
+
roots: readonly AgentDefinitionRoot[],
|
|
100
|
+
options: DiscoverAgentDefinitionsOptions = {},
|
|
101
|
+
): Promise<DiscoveredAgentDefinitions> {
|
|
102
|
+
const logger = resolveLogger(options.log).child({ [SCOPE_ATTRIBUTE]: 'agents/file-definitions' })
|
|
103
|
+
const byName = new Map<string, AgentFileDefinition>()
|
|
104
|
+
const skipped: SkippedAgentFile[] = []
|
|
105
|
+
for (const root of roots) {
|
|
106
|
+
let files: string[]
|
|
107
|
+
try {
|
|
108
|
+
files = (await readdir(root.dir, { withFileTypes: true }))
|
|
109
|
+
.filter((entry) => entry.isFile() && entry.name.endsWith('.md'))
|
|
110
|
+
.map((entry) => entry.name)
|
|
111
|
+
.sort()
|
|
112
|
+
} catch {
|
|
113
|
+
logger.debug('agent definitions directory not found', { 'namzu.agents.dir': root.dir })
|
|
114
|
+
continue
|
|
115
|
+
}
|
|
116
|
+
for (const file of files) {
|
|
117
|
+
const found = await parseAgentFile(join(root.dir, file), root.source, options.reserved)
|
|
118
|
+
if ('reason' in found) skipped.push(found)
|
|
119
|
+
else byName.set(found.name, found)
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return { definitions: [...byName.values()], skipped }
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export async function parseAgentFile(
|
|
126
|
+
path: string,
|
|
127
|
+
source: string,
|
|
128
|
+
reserved: ReadonlySet<string> = DEFAULT_RESERVED_AGENT_NAMES,
|
|
129
|
+
): Promise<AgentFileDefinition | SkippedAgentFile> {
|
|
130
|
+
let raw: string
|
|
131
|
+
try {
|
|
132
|
+
if ((await stat(path)).size > MAX_AGENT_FILE_BYTES) {
|
|
133
|
+
return { path, reason: 'is larger than 4 MiB, which no agent file is' }
|
|
134
|
+
}
|
|
135
|
+
raw = await readFile(path, 'utf8')
|
|
136
|
+
} catch (error) {
|
|
137
|
+
return {
|
|
138
|
+
path,
|
|
139
|
+
reason: `could not be read: ${error instanceof Error ? error.message : String(error)}`,
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return parseAgentMarkdown(raw, path, source, reserved)
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** Pure: the file's text to a definition, or the reason it is refused. */
|
|
146
|
+
export function parseAgentMarkdown(
|
|
147
|
+
raw: string,
|
|
148
|
+
path: string,
|
|
149
|
+
source: string,
|
|
150
|
+
reserved: ReadonlySet<string> = DEFAULT_RESERVED_AGENT_NAMES,
|
|
151
|
+
): AgentFileDefinition | SkippedAgentFile {
|
|
152
|
+
if (!raw.trimStart().startsWith('---')) {
|
|
153
|
+
return { path, reason: 'has no frontmatter; an agent file starts with `---` and a `name:`' }
|
|
154
|
+
}
|
|
155
|
+
let parsed: ReturnType<typeof parseFrontmatter>
|
|
156
|
+
try {
|
|
157
|
+
parsed = parseFrontmatter(raw, path)
|
|
158
|
+
} catch (error) {
|
|
159
|
+
return {
|
|
160
|
+
path,
|
|
161
|
+
reason: `frontmatter did not parse: ${error instanceof Error ? error.message : String(error)}`,
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
const { values, body } = parsed
|
|
165
|
+
|
|
166
|
+
const name = scalar(values.name)
|
|
167
|
+
if (name === undefined) return { path, reason: 'has no `name:` in its frontmatter' }
|
|
168
|
+
if (!NAME_PATTERN.test(name)) {
|
|
169
|
+
return { path, reason: `\`name: ${name}\` is not a lower-case identifier (a-z, 0-9, -)` }
|
|
170
|
+
}
|
|
171
|
+
if (reserved.has(name)) {
|
|
172
|
+
return { path, reason: `\`name: ${name}\` is a built-in type and cannot be redefined` }
|
|
173
|
+
}
|
|
174
|
+
const description = scalar(values.description)
|
|
175
|
+
if (description === undefined || description.trim().length === 0) {
|
|
176
|
+
return { path, reason: 'has no `description:`; the model chooses an agent by it' }
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
let tools: readonly string[] | undefined
|
|
180
|
+
if (values.tools !== undefined) {
|
|
181
|
+
const list = stringList(values.tools)
|
|
182
|
+
if (list === undefined || list.length === 0) {
|
|
183
|
+
return { path, reason: '`tools:` must be a non-empty, comma-separated list of tool names' }
|
|
184
|
+
}
|
|
185
|
+
tools = list
|
|
186
|
+
}
|
|
187
|
+
const model = scalar(values.model)
|
|
188
|
+
if (values.model !== undefined && (model === undefined || model.trim().length === 0)) {
|
|
189
|
+
return { path, reason: '`model:` must be a model name' }
|
|
190
|
+
}
|
|
191
|
+
let readOnly = false
|
|
192
|
+
if (values.readOnly !== undefined) {
|
|
193
|
+
const flag = scalar(values.readOnly)
|
|
194
|
+
if (flag !== 'true' && flag !== 'false') {
|
|
195
|
+
return { path, reason: '`readOnly:` must be true or false' }
|
|
196
|
+
}
|
|
197
|
+
readOnly = flag === 'true'
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
const trimmed = body.trim()
|
|
201
|
+
if (trimmed.length === 0) {
|
|
202
|
+
return { path, reason: "has an empty body; the body is the agent's system prompt" }
|
|
203
|
+
}
|
|
204
|
+
const prompt =
|
|
205
|
+
trimmed.length > MAX_AGENT_FILE_CHARS
|
|
206
|
+
? `${trimmed.slice(0, MAX_AGENT_FILE_CHARS)}\n\n[namzu: this prompt was cut at ${MAX_AGENT_FILE_CHARS} characters; ${trimmed.length - MAX_AGENT_FILE_CHARS} were omitted]`
|
|
207
|
+
: trimmed
|
|
208
|
+
|
|
209
|
+
return {
|
|
210
|
+
name,
|
|
211
|
+
description: description.trim(),
|
|
212
|
+
prompt,
|
|
213
|
+
...(tools ? { tools } : {}),
|
|
214
|
+
...(model ? { model: model.trim() } : {}),
|
|
215
|
+
readOnly,
|
|
216
|
+
path,
|
|
217
|
+
source,
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
type FrontmatterValue = ReturnType<typeof parseFrontmatter>['values'][string]
|
|
222
|
+
|
|
223
|
+
function scalar(value: FrontmatterValue | undefined): string | undefined {
|
|
224
|
+
return value?.kind === 'scalar' ? value.value : undefined
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/** A comma-separated scalar; anything else is refused. */
|
|
228
|
+
function stringList(value: FrontmatterValue): readonly string[] | undefined {
|
|
229
|
+
if (value.kind !== 'scalar') return undefined
|
|
230
|
+
const text = value.value.trim()
|
|
231
|
+
const inner = text.startsWith('[') && text.endsWith(']') ? text.slice(1, -1) : text
|
|
232
|
+
const items = inner
|
|
233
|
+
.split(',')
|
|
234
|
+
.map((item) => item.trim())
|
|
235
|
+
.filter((item) => item.length > 0)
|
|
236
|
+
return items.length > 0 ? items : undefined
|
|
237
|
+
}
|
package/src/agents/index.ts
CHANGED
|
@@ -17,3 +17,18 @@ export {
|
|
|
17
17
|
DEFAULT_TOKEN_BUDGET,
|
|
18
18
|
} from './runAgent.js'
|
|
19
19
|
export type { AgentIdentity, RunAgentOptions, RunAgentResult } from './runAgent.js'
|
|
20
|
+
export {
|
|
21
|
+
DEFAULT_RESERVED_AGENT_NAMES,
|
|
22
|
+
MAX_AGENT_FILE_CHARS,
|
|
23
|
+
discoverAgentDefinitions,
|
|
24
|
+
parseAgentFile,
|
|
25
|
+
parseAgentMarkdown,
|
|
26
|
+
} from './file-definitions.js'
|
|
27
|
+
export type {
|
|
28
|
+
AgentDefinitionRoot,
|
|
29
|
+
AgentFileDefinition,
|
|
30
|
+
DiscoverAgentDefinitionsOptions,
|
|
31
|
+
DiscoveredAgentDefinitions,
|
|
32
|
+
SkippedAgentFile,
|
|
33
|
+
} from './file-definitions.js'
|
|
34
|
+
export { EXPLORE_AGENT_DESCRIPTION, EXPLORE_AGENT_ID, EXPLORE_AGENT_PROMPT } from './explore.js'
|
package/src/bridge/a2a/mapper.ts
CHANGED
|
@@ -245,6 +245,12 @@ const MAPPING: {
|
|
|
245
245
|
// strategies fired is a property of how it manages its own window, and a
|
|
246
246
|
// peer modelling a task lifecycle can act on none of them.
|
|
247
247
|
compaction_tool_results_cleared: null,
|
|
248
|
+
// What the run wrote to its own memory store is this runtime's business;
|
|
249
|
+
// a peer sees the task's outcome, not its housekeeping.
|
|
250
|
+
memory_consolidated: null,
|
|
251
|
+
// A job's exit is housekeeping of this runtime's host; the peer sees the
|
|
252
|
+
// task's outcome.
|
|
253
|
+
background_job_exited: null,
|
|
248
254
|
// Compaction, succeeded or declined, is a property of how this runtime
|
|
249
255
|
// manages its own context. A peer models a task lifecycle and cannot act on
|
|
250
256
|
// either outcome.
|
package/src/bridge/sse/mapper.ts
CHANGED
|
@@ -133,6 +133,28 @@ const MAPPING: {
|
|
|
133
133
|
// dominate the stream it rides on.
|
|
134
134
|
request_envelope: null,
|
|
135
135
|
|
|
136
|
+
background_job_exited: {
|
|
137
|
+
wire: 'background_job.exited',
|
|
138
|
+
transform: (e, runId) => ({
|
|
139
|
+
run_id: runId,
|
|
140
|
+
job_id: e.jobId,
|
|
141
|
+
command: e.command,
|
|
142
|
+
status: e.status,
|
|
143
|
+
...(e.exitCode !== undefined ? { exit_code: e.exitCode } : {}),
|
|
144
|
+
...(e.signal ? { signal: e.signal } : {}),
|
|
145
|
+
}),
|
|
146
|
+
},
|
|
147
|
+
memory_consolidated: {
|
|
148
|
+
wire: 'memory.consolidated',
|
|
149
|
+
transform: (e, runId) => ({
|
|
150
|
+
run_id: runId,
|
|
151
|
+
memory_id: e.memoryId,
|
|
152
|
+
title: e.title,
|
|
153
|
+
decisions: e.decisions,
|
|
154
|
+
discoveries: e.discoveries,
|
|
155
|
+
failures: e.failures,
|
|
156
|
+
}),
|
|
157
|
+
},
|
|
136
158
|
compaction_tool_results_cleared: {
|
|
137
159
|
wire: 'compaction.tool_results_cleared',
|
|
138
160
|
transform: (e, runId) => ({
|
package/src/bus/lock.ts
CHANGED
|
@@ -42,16 +42,7 @@ export class FileLockManager {
|
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
private generateLockId(): LockId {
|
|
45
|
-
|
|
46
|
-
// return TYPE alone accepts any `lock_`-shaped string today, and will
|
|
47
|
-
// stop accepting one the moment the id types go nominal (NZ-SURF-11).
|
|
48
|
-
//
|
|
49
|
-
// The UUID stays, and `utils/id.ts` deliberately does not gain a
|
|
50
|
-
// `generateLockId`. Every generator there mints 12 base-36 characters;
|
|
51
|
-
// moving this one would change the shape of a value `FileLockManager`
|
|
52
|
-
// writes to disk, which is a behaviour change wearing a refactor's
|
|
53
|
-
// clothes. What this task is about is the constructor, not the entropy.
|
|
54
|
-
return asLockId(`lock_${randomUUID()}`)
|
|
45
|
+
return asLockId(randomUUID())
|
|
55
46
|
}
|
|
56
47
|
|
|
57
48
|
private getAgentLockSet(owner: RunId): Set<string> {
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Consolidation: what a run learned, written down where the next run can
|
|
3
|
+
* find it.
|
|
4
|
+
*
|
|
5
|
+
* The working state is episodic memory — what happened in THIS run: the
|
|
6
|
+
* decisions taken, the discoveries made, the failures met and how. It
|
|
7
|
+
* dies with the run, and the semantic store behind `search_memory` only
|
|
8
|
+
* ever received what a model chose to `save_memory` mid-task, which is
|
|
9
|
+
* rarely the thing a later run needed. Consolidation is the bridge: at
|
|
10
|
+
* the end of a run, the entries that can outlive it become one memory
|
|
11
|
+
* entry, tagged so a later run can search for what was learned rather
|
|
12
|
+
* than what was done. What is deliberately NOT carried: the tool
|
|
13
|
+
* results, the plan, the requirements — those describe the task, not a
|
|
14
|
+
* lesson. Pure: the caller writes the entry, this only says what it is.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import type { CreateMemoryParams } from '../types/memory/index.js'
|
|
18
|
+
import type { WorkingState } from './types.js'
|
|
19
|
+
|
|
20
|
+
export const CONSOLIDATION_TAG = 'learning'
|
|
21
|
+
|
|
22
|
+
export interface ConsolidationMeta {
|
|
23
|
+
readonly runId: string
|
|
24
|
+
/** Milliseconds since the epoch, for the entry's metadata. */
|
|
25
|
+
readonly at: number
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const MAX_TASK_IN_TITLE = 72
|
|
29
|
+
|
|
30
|
+
function head(text: string, max: number): string {
|
|
31
|
+
const line = text.split('\n')[0]?.trim() ?? ''
|
|
32
|
+
return line.length <= max ? line : `${line.slice(0, max - 1)}…`
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* The memory entry a run's state consolidates to, or `null` when the run
|
|
37
|
+
* learned nothing worth a later run's attention — no decisions, no
|
|
38
|
+
* discoveries, no failures. A run that only read and edited leaves no
|
|
39
|
+
* entry rather than an empty one.
|
|
40
|
+
*/
|
|
41
|
+
export function consolidationEntry(
|
|
42
|
+
state: WorkingState,
|
|
43
|
+
meta: ConsolidationMeta,
|
|
44
|
+
): CreateMemoryParams | null {
|
|
45
|
+
const decisions = state.decisions.filter((d) => d.trim().length > 0)
|
|
46
|
+
const discoveries = state.discoveries.filter((d) => d.trim().length > 0)
|
|
47
|
+
const failures = state.failures.filter((f) => f.trim().length > 0)
|
|
48
|
+
if (decisions.length + discoveries.length + failures.length === 0) return null
|
|
49
|
+
|
|
50
|
+
const task = state.task.trim()
|
|
51
|
+
const files = [...state.files.values()]
|
|
52
|
+
.filter((slot) => slot.actions.some((a) => a.type !== 'read'))
|
|
53
|
+
.map((slot) => slot.path)
|
|
54
|
+
const section = (name: string, items: readonly string[]): string[] =>
|
|
55
|
+
items.length === 0 ? [] : [`## ${name}`, '', ...items.map((item) => `- ${item}`), '']
|
|
56
|
+
const content = [
|
|
57
|
+
task ? `Task: ${task}` : 'Task: (not stated)',
|
|
58
|
+
'',
|
|
59
|
+
...section('Decisions', decisions),
|
|
60
|
+
...section('Discoveries', discoveries),
|
|
61
|
+
...section('Failures and what was done about them', failures),
|
|
62
|
+
...(files.length ? ['## Files changed', '', ...files.map((f) => `- \`${f}\``), ''] : []),
|
|
63
|
+
].join('\n')
|
|
64
|
+
const counts = [
|
|
65
|
+
decisions.length ? `${decisions.length} decision${decisions.length === 1 ? '' : 's'}` : '',
|
|
66
|
+
discoveries.length
|
|
67
|
+
? `${discoveries.length} discover${discoveries.length === 1 ? 'y' : 'ies'}`
|
|
68
|
+
: '',
|
|
69
|
+
failures.length ? `${failures.length} failure${failures.length === 1 ? '' : 's'}` : '',
|
|
70
|
+
].filter((part) => part.length > 0)
|
|
71
|
+
return {
|
|
72
|
+
title: task ? `Learned: ${head(task, MAX_TASK_IN_TITLE)}` : `Learned in run ${meta.runId}`,
|
|
73
|
+
summary: `${counts.join(', ')} from run ${meta.runId}.`,
|
|
74
|
+
content,
|
|
75
|
+
format: 'markdown',
|
|
76
|
+
tags: [CONSOLIDATION_TAG, `run:${meta.runId}`],
|
|
77
|
+
metadata: { runId: meta.runId, consolidatedAt: meta.at, kind: 'consolidation' },
|
|
78
|
+
}
|
|
79
|
+
}
|
|
@@ -33,6 +33,9 @@ export function createConversationManager(
|
|
|
33
33
|
): ConversationManager {
|
|
34
34
|
switch (strategy) {
|
|
35
35
|
case 'structured':
|
|
36
|
+
case 'salience':
|
|
37
|
+
// The salience pass changes what is evicted, not how the state
|
|
38
|
+
// slots are kept; the structured manager owns those for both.
|
|
36
39
|
return new StructuredCompactionManager(config)
|
|
37
40
|
case 'sliding-window':
|
|
38
41
|
return new SlidingWindowManager({
|
package/src/compaction/index.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
export type {
|
|
2
|
-
|
|
3
|
-
PlanSlot,
|
|
4
|
-
FileSlot,
|
|
2
|
+
CompactionStrategy,
|
|
5
3
|
FileAction,
|
|
4
|
+
FileSlot,
|
|
5
|
+
PinSlot,
|
|
6
|
+
PlanSlot,
|
|
6
7
|
ToolResultSlot,
|
|
7
|
-
|
|
8
|
+
WorkingState,
|
|
9
|
+
WorkingStatePin,
|
|
8
10
|
} from './types.js'
|
|
9
11
|
|
|
10
12
|
export type {
|
|
@@ -70,3 +72,31 @@ export type { ToolResultEditConfig, ToolResultEditOutcome } from './tool-result-
|
|
|
70
72
|
export { compactNow, compactRegion } from './manual.js'
|
|
71
73
|
export type { CompactionResult, CompactNowInput, CompactRegionInput } from './manual.js'
|
|
72
74
|
export { COMPACTION_HEADER, buildCompactionMessage, isCompactionMessage } from './summary.js'
|
|
75
|
+
|
|
76
|
+
// The salience-scored working set: every message scored, the least salient
|
|
77
|
+
// evicted first. See `docs/sdk/salience-working-set.md`.
|
|
78
|
+
export {
|
|
79
|
+
DEFAULT_SALIENCE_CONFIG,
|
|
80
|
+
DEFAULT_SALIENCE_WEIGHTS,
|
|
81
|
+
buildGoal,
|
|
82
|
+
isStubbedNarration,
|
|
83
|
+
messageText,
|
|
84
|
+
planWorkingSet,
|
|
85
|
+
scoreMessages,
|
|
86
|
+
} from './salience/index.js'
|
|
87
|
+
export type {
|
|
88
|
+
GoalSources,
|
|
89
|
+
ProtectedReason,
|
|
90
|
+
SalienceConfig,
|
|
91
|
+
SalienceWeights,
|
|
92
|
+
ScoreOptions,
|
|
93
|
+
ScoredMessage,
|
|
94
|
+
WorkingSetAction,
|
|
95
|
+
WorkingSetOptions,
|
|
96
|
+
WorkingSetPlan,
|
|
97
|
+
} from './salience/index.js'
|
|
98
|
+
export { DEFAULT_SOFT_TARGET, planSalienceWorkingSet } from './plan.js'
|
|
99
|
+
|
|
100
|
+
// Episodic → semantic: what a run learned, as the entry a later run searches.
|
|
101
|
+
export { CONSOLIDATION_TAG, consolidationEntry } from './consolidation.js'
|
|
102
|
+
export type { ConsolidationMeta } from './consolidation.js'
|
|
@@ -1,10 +1,23 @@
|
|
|
1
1
|
import type { CompactionConfig } from '../config/runtime.js'
|
|
2
|
-
import type {
|
|
2
|
+
import type {
|
|
3
|
+
FileAction,
|
|
4
|
+
FileSlot,
|
|
5
|
+
PinSlot,
|
|
6
|
+
PlanSlot,
|
|
7
|
+
ToolResultSlot,
|
|
8
|
+
WorkingState,
|
|
9
|
+
} from './types.js'
|
|
10
|
+
|
|
11
|
+
/** Pins kept at most; the oldest is dropped past this, and the drop is counted. */
|
|
12
|
+
export const MAX_PINS = 40
|
|
13
|
+
/** Characters one pin may carry; a pin is a fact, not a document. */
|
|
14
|
+
export const MAX_PIN_CHARS = 600
|
|
3
15
|
|
|
4
16
|
function createEmptyState(): WorkingState {
|
|
5
17
|
return {
|
|
6
18
|
task: '',
|
|
7
19
|
plan: [],
|
|
20
|
+
pins: new Map<string, PinSlot>(),
|
|
8
21
|
files: new Map<string, FileSlot>(),
|
|
9
22
|
decisions: [],
|
|
10
23
|
failures: [],
|
|
@@ -34,6 +47,30 @@ export class WorkingStateManager {
|
|
|
34
47
|
this.state.plan = plan
|
|
35
48
|
}
|
|
36
49
|
|
|
50
|
+
/** Pin a fact under `key`, replacing what that key held; empty text unpins. */
|
|
51
|
+
pin(key: string, text: string, source: string): void {
|
|
52
|
+
const k = key.trim()
|
|
53
|
+
if (k.length === 0) return
|
|
54
|
+
const body = text.trim().slice(0, MAX_PIN_CHARS)
|
|
55
|
+
if (body.length === 0) {
|
|
56
|
+
this.state.pins?.delete(k)
|
|
57
|
+
return
|
|
58
|
+
}
|
|
59
|
+
if (!this.state.pins) this.state.pins = new Map()
|
|
60
|
+
this.state.pins.delete(k)
|
|
61
|
+
this.state.pins.set(k, { key: k, text: body, source, updatedAt: Date.now() })
|
|
62
|
+
while (this.state.pins.size > MAX_PINS) {
|
|
63
|
+
const oldest = [...this.state.pins.values()].sort((a, b) => a.updatedAt - b.updatedAt)[0]
|
|
64
|
+
if (!oldest) break
|
|
65
|
+
this.state.pins.delete(oldest.key)
|
|
66
|
+
this.state.evicted.pins = (this.state.evicted.pins ?? 0) + 1
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
unpin(key: string): void {
|
|
71
|
+
this.state.pins?.delete(key.trim())
|
|
72
|
+
}
|
|
73
|
+
|
|
37
74
|
trackFile(path: string, action: FileAction): void {
|
|
38
75
|
const existing = this.state.files.get(path)
|
|
39
76
|
if (existing) {
|
|
@@ -116,6 +153,7 @@ export class WorkingStateManager {
|
|
|
116
153
|
let count = 0
|
|
117
154
|
if (this.state.task) count++
|
|
118
155
|
count += this.state.plan.length
|
|
156
|
+
count += this.state.pins?.size ?? 0
|
|
119
157
|
count += this.state.files.size
|
|
120
158
|
count += this.state.decisions.length
|
|
121
159
|
count += this.state.failures.length
|
package/src/compaction/plan.ts
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import type { CompactionConfig } from '../config/runtime.js'
|
|
2
|
-
import { CHARS_PER_TOKEN } from '../constants/limits.js'
|
|
3
2
|
import type { Message } from '../types/message/index.js'
|
|
4
3
|
import { findSafeTrimIndex } from './dangling.js'
|
|
4
|
+
import { buildGoal } from './salience/goal.js'
|
|
5
|
+
import { scoreMessages } from './salience/score.js'
|
|
6
|
+
import { type WorkingSetPlan, planWorkingSet } from './salience/working-set.js'
|
|
7
|
+
import { estimateMessageTokens, estimateMessagesTokens } from './token-estimate.js'
|
|
5
8
|
import { clearStaleToolResults } from './tool-result-editing.js'
|
|
6
9
|
|
|
7
10
|
/**
|
|
@@ -43,6 +46,8 @@ export type CompactionPlan =
|
|
|
43
46
|
readonly kind: 'cleared'
|
|
44
47
|
readonly messages: readonly Message[]
|
|
45
48
|
readonly clearedCount: number
|
|
49
|
+
/** Assistant narrations cut to their first sentence by the salience pass. */
|
|
50
|
+
readonly stubbedCount?: number
|
|
46
51
|
readonly charsReclaimed: number
|
|
47
52
|
readonly reclaimedTokens: number
|
|
48
53
|
readonly reliefWasEnough: boolean
|
|
@@ -86,24 +91,6 @@ export interface CompactionPlanInput {
|
|
|
86
91
|
readonly skipToolResultClear?: boolean
|
|
87
92
|
}
|
|
88
93
|
|
|
89
|
-
/**
|
|
90
|
-
* How many characters a message's content is worth.
|
|
91
|
-
*
|
|
92
|
-
* An image costs far fewer tokens than its base64 length divided by four —
|
|
93
|
-
* but under-counting it to zero is the worse error: it let a run full of
|
|
94
|
-
* screenshots read as an empty context.
|
|
95
|
-
*/
|
|
96
|
-
function measureContentChars(content: unknown): number {
|
|
97
|
-
if (typeof content === 'string') return content.length
|
|
98
|
-
if (!Array.isArray(content)) return 0
|
|
99
|
-
let total = 0
|
|
100
|
-
for (const block of content as readonly Record<string, unknown>[]) {
|
|
101
|
-
if (block.type === 'text' && typeof block.text === 'string') total += block.text.length
|
|
102
|
-
else if (block.type === 'image' && typeof block.data === 'string') total += block.data.length
|
|
103
|
-
}
|
|
104
|
-
return total
|
|
105
|
-
}
|
|
106
|
-
|
|
107
94
|
/**
|
|
108
95
|
* The last index whose tail fits in `budgetTokens`, walking backwards.
|
|
109
96
|
*
|
|
@@ -125,7 +112,7 @@ export function naiveKeepStartByTokens(messages: readonly Message[], budgetToken
|
|
|
125
112
|
let tokens = 0
|
|
126
113
|
let start = messages.length
|
|
127
114
|
for (let index = messages.length - 1; index >= 0; index--) {
|
|
128
|
-
const cost =
|
|
115
|
+
const cost = estimateMessageTokens(messages[index] as Message)
|
|
129
116
|
// Checked BEFORE adding, so the boundary never includes a message
|
|
130
117
|
// that pushes the tail over. Adding first and trimming after would
|
|
131
118
|
// admit one oversized message on every run.
|
|
@@ -136,6 +123,49 @@ export function naiveKeepStartByTokens(messages: readonly Message[], budgetToken
|
|
|
136
123
|
return start
|
|
137
124
|
}
|
|
138
125
|
|
|
126
|
+
/**
|
|
127
|
+
* The salience pass: score every message and evict the least salient
|
|
128
|
+
* until the context is under `softTarget`. Returned as a `cleared` plan
|
|
129
|
+
* so the phase commits it the way it commits the stale-result pass; the
|
|
130
|
+
* summary path runs after it only when the trigger threshold is still
|
|
131
|
+
* exceeded.
|
|
132
|
+
*/
|
|
133
|
+
/** Where the salience pass holds the context, as a fraction of the window. */
|
|
134
|
+
export const DEFAULT_SOFT_TARGET = 0.5
|
|
135
|
+
|
|
136
|
+
export function planSalienceWorkingSet(input: {
|
|
137
|
+
readonly messages: readonly Message[]
|
|
138
|
+
readonly config: CompactionConfig
|
|
139
|
+
readonly contextWindowTokens: number
|
|
140
|
+
readonly estimatedTokens: number
|
|
141
|
+
readonly openTasks?: readonly string[]
|
|
142
|
+
}): Extract<CompactionPlan, { kind: 'cleared' }> & { readonly working: WorkingSetPlan } {
|
|
143
|
+
const { config, estimatedTokens, contextWindowTokens: budget } = input
|
|
144
|
+
const goal = buildGoal(input.messages, {
|
|
145
|
+
...(input.openTasks ? { openTasks: input.openTasks } : {}),
|
|
146
|
+
})
|
|
147
|
+
const scored = scoreMessages(input.messages, {
|
|
148
|
+
goal,
|
|
149
|
+
keepRecentMessages: config.keepRecentMessages,
|
|
150
|
+
})
|
|
151
|
+
const working = planWorkingSet(input.messages, scored, {
|
|
152
|
+
estimatedTokens,
|
|
153
|
+
targetTokens: Math.floor(budget * (config.softTarget ?? DEFAULT_SOFT_TARGET)),
|
|
154
|
+
minToolResultChars: config.minToolResultCharsToClear,
|
|
155
|
+
...(config.preserveToolResultsFrom ? { preserveTools: config.preserveToolResultsFrom } : {}),
|
|
156
|
+
})
|
|
157
|
+
return {
|
|
158
|
+
kind: 'cleared',
|
|
159
|
+
messages: working.messages,
|
|
160
|
+
clearedCount: working.clearedCount,
|
|
161
|
+
stubbedCount: working.stubbedCount,
|
|
162
|
+
charsReclaimed: working.charsReclaimed,
|
|
163
|
+
reclaimedTokens: working.reclaimedTokens,
|
|
164
|
+
reliefWasEnough: (estimatedTokens - working.reclaimedTokens) / budget < config.triggerThreshold,
|
|
165
|
+
working,
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
139
169
|
export function planCompaction(input: CompactionPlanInput): CompactionPlan {
|
|
140
170
|
const { config, estimatedTokens, contextWindowTokens: budget } = input
|
|
141
171
|
|
|
@@ -151,7 +181,8 @@ export function planCompaction(input: CompactionPlanInput): CompactionPlan {
|
|
|
151
181
|
})
|
|
152
182
|
|
|
153
183
|
if (edit.clearedCount > 0) {
|
|
154
|
-
const reclaimedTokens =
|
|
184
|
+
const reclaimedTokens =
|
|
185
|
+
estimateMessagesTokens(input.messages) - estimateMessagesTokens(edit.messages)
|
|
155
186
|
// NOT on a forced pass. A forced pass runs because the provider
|
|
156
187
|
// REJECTED the prompt as too long, which is a measurement — and
|
|
157
188
|
// answering it with the same estimate the provider just refuted
|