@cortexkit/opencode-magic-context 0.45.0 → 0.46.1
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/README.md +26 -0
- package/dist/{announcement-f75t58v9.js → announcement-y35wzg2r.js} +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/live-run-config.d.ts.map +1 -1
- package/dist/config/migrate-config-location.d.ts.map +1 -1
- package/dist/config/schema/magic-context.d.ts +13 -7
- package/dist/config/schema/magic-context.d.ts.map +1 -1
- package/dist/{conflict-warning-hook-5yrz2r24.js → conflict-warning-hook-7fj2b9jw.js} +6 -5
- package/dist/context-sh2m2vde.js +4525 -0
- package/dist/{derive-budgets-a63zsm5c.js → derive-budgets-7nj7r1rv.js} +2 -2
- package/dist/embedding-worker.js +4 -4
- package/dist/features/magic-context/checkout-claim-fake-subc.test-support.d.ts +45 -0
- package/dist/features/magic-context/checkout-claim-fake-subc.test-support.d.ts.map +1 -0
- package/dist/features/magic-context/checkout-claim.d.ts +155 -0
- package/dist/features/magic-context/checkout-claim.d.ts.map +1 -0
- package/dist/features/magic-context/compaction-marker.d.ts +20 -3
- package/dist/features/magic-context/compaction-marker.d.ts.map +1 -1
- package/dist/features/magic-context/compartment-storage.d.ts +23 -2
- package/dist/features/magic-context/compartment-storage.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/classify.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/evaluate-smart-notes.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/provider-output-failure.d.ts +6 -2
- package/dist/features/magic-context/dreamer/provider-output-failure.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/provider-output-failure.test-support.d.ts +30 -0
- package/dist/features/magic-context/dreamer/provider-output-failure.test-support.d.ts.map +1 -0
- package/dist/features/magic-context/dreamer/storage-dream-runs.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/task-executor.d.ts +9 -0
- package/dist/features/magic-context/dreamer/task-executor.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/task-gates.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/task-scheduler.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/verify-diff.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/verify-gate.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/verify.d.ts.map +1 -1
- package/dist/features/magic-context/git-commits/search-git-commits.d.ts.map +1 -1
- package/dist/features/magic-context/memory/embedding-local.d.ts.map +1 -1
- package/dist/features/magic-context/memory/project-identity-cache.d.ts.map +1 -1
- package/dist/features/magic-context/memory/storage-memory-verifications.d.ts.map +1 -1
- package/dist/features/magic-context/memory/storage-memory.d.ts +3 -0
- package/dist/features/magic-context/memory/storage-memory.d.ts.map +1 -1
- package/dist/features/magic-context/memory/verification-paths.d.ts +2 -2
- package/dist/features/magic-context/memory/verification-paths.d.ts.map +1 -1
- package/dist/features/magic-context/merged-reasoning-decisions.d.ts.map +1 -1
- package/dist/features/magic-context/message-index-async.d.ts +3 -3
- package/dist/features/magic-context/message-index-async.d.ts.map +1 -1
- package/dist/features/magic-context/message-index.d.ts +2 -0
- package/dist/features/magic-context/message-index.d.ts.map +1 -1
- package/dist/features/magic-context/migration-v95-perf-indexes.d.ts +12 -0
- package/dist/features/magic-context/migration-v95-perf-indexes.d.ts.map +1 -0
- package/dist/features/magic-context/migration-worker-client.d.ts +4 -4
- package/dist/features/magic-context/migration-worker-client.d.ts.map +1 -1
- package/dist/features/magic-context/migrations.d.ts +1 -0
- package/dist/features/magic-context/migrations.d.ts.map +1 -1
- package/dist/features/magic-context/mural/render-trigger.d.ts.map +1 -1
- package/dist/features/magic-context/mural/resolve-mural.d.ts +15 -4
- package/dist/features/magic-context/mural/resolve-mural.d.ts.map +1 -1
- package/dist/features/magic-context/mural/source-revision.d.ts +7 -0
- package/dist/features/magic-context/mural/source-revision.d.ts.map +1 -0
- package/dist/features/magic-context/mural/storage-mural-cues.d.ts.map +1 -1
- package/dist/features/magic-context/reclaim-protection.d.ts +15 -10
- package/dist/features/magic-context/reclaim-protection.d.ts.map +1 -1
- package/dist/features/magic-context/session-cache-ttl.d.ts +4 -2
- package/dist/features/magic-context/session-cache-ttl.d.ts.map +1 -1
- package/dist/features/magic-context/smart-notes/capabilities.d.ts +3 -0
- package/dist/features/magic-context/smart-notes/capabilities.d.ts.map +1 -1
- package/dist/features/magic-context/smart-notes/compiler.d.ts.map +1 -1
- package/dist/features/magic-context/smart-notes/github-token.d.ts +5 -0
- package/dist/features/magic-context/smart-notes/github-token.d.ts.map +1 -0
- package/dist/features/magic-context/smart-notes/runner.d.ts +1 -0
- package/dist/features/magic-context/smart-notes/runner.d.ts.map +1 -1
- package/dist/features/magic-context/smart-notes/sandbox-runner.d.ts +12 -0
- package/dist/features/magic-context/smart-notes/sandbox-runner.d.ts.map +1 -1
- package/dist/features/magic-context/smart-notes/ssrf-guard.d.ts +6 -0
- package/dist/features/magic-context/smart-notes/ssrf-guard.d.ts.map +1 -1
- package/dist/features/magic-context/smart-notes/storage.d.ts.map +1 -1
- package/dist/features/magic-context/smart-notes/types.d.ts +2 -0
- package/dist/features/magic-context/smart-notes/types.d.ts.map +1 -1
- package/dist/features/magic-context/storage-clone.d.ts.map +1 -1
- package/dist/features/magic-context/storage-db.d.ts +6 -9
- package/dist/features/magic-context/storage-db.d.ts.map +1 -1
- package/dist/features/magic-context/storage-meta-shared.d.ts +1 -1
- package/dist/features/magic-context/storage-meta-shared.d.ts.map +1 -1
- package/dist/features/magic-context/storage-ops.d.ts +8 -1
- package/dist/features/magic-context/storage-ops.d.ts.map +1 -1
- package/dist/features/magic-context/storage-replay-document.d.ts +7 -0
- package/dist/features/magic-context/storage-replay-document.d.ts.map +1 -1
- package/dist/features/magic-context/storage-schema-helpers.d.ts +2 -0
- package/dist/features/magic-context/storage-schema-helpers.d.ts.map +1 -1
- package/dist/features/magic-context/storage-session-tables.d.ts.map +1 -1
- package/dist/features/magic-context/storage-source.d.ts.map +1 -1
- package/dist/features/magic-context/storage-tags.d.ts +11 -3
- package/dist/features/magic-context/storage-tags.d.ts.map +1 -1
- package/dist/features/magic-context/storage.d.ts +2 -2
- package/dist/features/magic-context/storage.d.ts.map +1 -1
- package/dist/features/magic-context/temporal-decisions.d.ts +10 -0
- package/dist/features/magic-context/temporal-decisions.d.ts.map +1 -0
- package/dist/features/magic-context/tool-definition-tokens.d.ts +2 -0
- package/dist/features/magic-context/tool-definition-tokens.d.ts.map +1 -1
- package/dist/features/magic-context/transform-decision-log.d.ts.map +1 -1
- package/dist/features/magic-context/types.d.ts +7 -6
- package/dist/features/magic-context/types.d.ts.map +1 -1
- package/dist/features/magic-context/window-report-ledger.d.ts.map +1 -1
- package/dist/hooks/auto-update-checker/index.d.ts.map +1 -1
- package/dist/hooks/magic-context/apply-operations.d.ts +8 -0
- package/dist/hooks/magic-context/apply-operations.d.ts.map +1 -1
- package/dist/hooks/magic-context/cache-busting-signals.d.ts +6 -3
- package/dist/hooks/magic-context/cache-busting-signals.d.ts.map +1 -1
- package/dist/hooks/magic-context/channel2-cycle.d.ts +2 -0
- package/dist/hooks/magic-context/channel2-cycle.d.ts.map +1 -1
- package/dist/hooks/magic-context/compaction-marker-manager.d.ts +7 -0
- package/dist/hooks/magic-context/compaction-marker-manager.d.ts.map +1 -1
- package/dist/hooks/magic-context/compartment-prompt.d.ts +2 -2
- package/dist/hooks/magic-context/compartment-prompt.d.ts.map +1 -1
- package/dist/hooks/magic-context/compartment-render-epoch.d.ts +8 -0
- package/dist/hooks/magic-context/compartment-render-epoch.d.ts.map +1 -1
- package/dist/hooks/magic-context/compartment-runner-drop-queue.d.ts +18 -4
- package/dist/hooks/magic-context/compartment-runner-drop-queue.d.ts.map +1 -1
- package/dist/hooks/magic-context/compartment-runner-incremental.d.ts.map +1 -1
- package/dist/hooks/magic-context/compartment-runner-partial-recomp.d.ts.map +1 -1
- package/dist/hooks/magic-context/compartment-runner-recomp.d.ts.map +1 -1
- package/dist/hooks/magic-context/ctx-reduce-availability.d.ts +12 -0
- package/dist/hooks/magic-context/ctx-reduce-availability.d.ts.map +1 -1
- package/dist/hooks/magic-context/decision-calibration.d.ts +3 -0
- package/dist/hooks/magic-context/decision-calibration.d.ts.map +1 -1
- package/dist/hooks/magic-context/default-protection-pressure.test-support.d.ts +37 -0
- package/dist/hooks/magic-context/default-protection-pressure.test-support.d.ts.map +1 -0
- package/dist/hooks/magic-context/drop-stale-reduce-calls.d.ts +4 -0
- package/dist/hooks/magic-context/drop-stale-reduce-calls.d.ts.map +1 -1
- package/dist/hooks/magic-context/edit-marker.d.ts.map +1 -1
- package/dist/hooks/magic-context/emergency-drop.d.ts +2 -0
- package/dist/hooks/magic-context/emergency-drop.d.ts.map +1 -1
- package/dist/hooks/magic-context/emergency-fail-closed.d.ts +21 -1
- package/dist/hooks/magic-context/emergency-fail-closed.d.ts.map +1 -1
- package/dist/hooks/magic-context/event-handler.d.ts +5 -0
- package/dist/hooks/magic-context/event-handler.d.ts.map +1 -1
- package/dist/hooks/magic-context/final-wire-token-estimate.d.ts +30 -1
- package/dist/hooks/magic-context/final-wire-token-estimate.d.ts.map +1 -1
- package/dist/hooks/magic-context/heuristic-cleanup.d.ts +2 -0
- package/dist/hooks/magic-context/heuristic-cleanup.d.ts.map +1 -1
- package/dist/hooks/magic-context/historian-prompt-fit.d.ts +4 -2
- package/dist/hooks/magic-context/historian-prompt-fit.d.ts.map +1 -1
- package/dist/hooks/magic-context/hook.d.ts +2 -1
- package/dist/hooks/magic-context/hook.d.ts.map +1 -1
- package/dist/hooks/magic-context/inject-compartments.d.ts +9 -10
- package/dist/hooks/magic-context/inject-compartments.d.ts.map +1 -1
- package/dist/hooks/magic-context/lkg-measured-request.d.ts +69 -0
- package/dist/hooks/magic-context/lkg-measured-request.d.ts.map +1 -0
- package/dist/hooks/magic-context/lkg-persist.d.ts +2 -0
- package/dist/hooks/magic-context/lkg-persist.d.ts.map +1 -1
- package/dist/hooks/magic-context/lkg-replay-fit.d.ts +14 -0
- package/dist/hooks/magic-context/lkg-replay-fit.d.ts.map +1 -1
- package/dist/hooks/magic-context/lkg-replay.d.ts +10 -1
- package/dist/hooks/magic-context/lkg-replay.d.ts.map +1 -1
- package/dist/hooks/magic-context/lkg-slot.d.ts +4 -0
- package/dist/hooks/magic-context/lkg-slot.d.ts.map +1 -1
- package/dist/hooks/magic-context/module-state-sync.d.ts +2 -0
- package/dist/hooks/magic-context/module-state-sync.d.ts.map +1 -1
- package/dist/hooks/magic-context/module-transport.d.ts.map +1 -1
- package/dist/hooks/magic-context/module-wire.d.ts.map +1 -1
- package/dist/hooks/magic-context/note-nudger.d.ts +17 -5
- package/dist/hooks/magic-context/note-nudger.d.ts.map +1 -1
- package/dist/hooks/magic-context/read-session-chunk.d.ts +1 -1
- package/dist/hooks/magic-context/read-session-chunk.d.ts.map +1 -1
- package/dist/hooks/magic-context/read-session-db.d.ts +1 -0
- package/dist/hooks/magic-context/read-session-db.d.ts.map +1 -1
- package/dist/hooks/magic-context/read-session-formatting.d.ts +7 -0
- package/dist/hooks/magic-context/read-session-formatting.d.ts.map +1 -1
- package/dist/hooks/magic-context/read-session-raw.d.ts +4 -0
- package/dist/hooks/magic-context/read-session-raw.d.ts.map +1 -1
- package/dist/hooks/magic-context/read-session-true-raw-tokens.d.ts.map +1 -1
- package/dist/hooks/magic-context/recomp-orchestrator.d.ts +2 -0
- package/dist/hooks/magic-context/recomp-orchestrator.d.ts.map +1 -1
- package/dist/hooks/magic-context/reference-retrieval.d.ts +27 -17
- package/dist/hooks/magic-context/reference-retrieval.d.ts.map +1 -1
- package/dist/hooks/magic-context/request-hook-order.d.ts +56 -0
- package/dist/hooks/magic-context/request-hook-order.d.ts.map +1 -0
- package/dist/hooks/magic-context/rust-mode-transform.d.ts +22 -3
- package/dist/hooks/magic-context/rust-mode-transform.d.ts.map +1 -1
- package/dist/hooks/magic-context/strip-content.d.ts +4 -2
- package/dist/hooks/magic-context/strip-content.d.ts.map +1 -1
- package/dist/hooks/magic-context/supersession-reclaim.d.ts +4 -0
- package/dist/hooks/magic-context/supersession-reclaim.d.ts.map +1 -1
- package/dist/hooks/magic-context/system-prompt-hash.d.ts +7 -0
- package/dist/hooks/magic-context/system-prompt-hash.d.ts.map +1 -1
- package/dist/hooks/magic-context/tail-hygiene-walk.d.ts +12 -3
- package/dist/hooks/magic-context/tail-hygiene-walk.d.ts.map +1 -1
- package/dist/hooks/magic-context/temporal-awareness.d.ts +6 -3
- package/dist/hooks/magic-context/temporal-awareness.d.ts.map +1 -1
- package/dist/hooks/magic-context/temporal-served-projection.d.ts +4 -0
- package/dist/hooks/magic-context/temporal-served-projection.d.ts.map +1 -0
- package/dist/hooks/magic-context/tool-drop-target.d.ts.map +1 -1
- package/dist/hooks/magic-context/tool-reclaim.d.ts +2 -0
- package/dist/hooks/magic-context/tool-reclaim.d.ts.map +1 -1
- package/dist/hooks/magic-context/transform-message-helpers.d.ts +5 -0
- package/dist/hooks/magic-context/transform-message-helpers.d.ts.map +1 -1
- package/dist/hooks/magic-context/transform-postprocess-phase.d.ts +41 -17
- package/dist/hooks/magic-context/transform-postprocess-phase.d.ts.map +1 -1
- package/dist/hooks/magic-context/transform.d.ts +12 -0
- package/dist/hooks/magic-context/transform.d.ts.map +1 -1
- package/dist/hooks/magic-context/wrapup-orchestrator.d.ts.map +1 -1
- package/dist/{index-vvtfyw1z.js → index-0d3g3461.js} +5 -13
- package/dist/index-1bc61ans.js +154 -0
- package/dist/{index-n96ag4rk.js → index-1zx87sdm.js} +5 -1
- package/dist/{index-4krbw8z9.js → index-3h0ybwah.js} +608 -102
- package/dist/{index-gd5qx1j9.js → index-5eqk6z3s.js} +62 -1
- package/dist/index-5gq3b2ya.js +494 -0
- package/dist/{index-8fgkmxmy.js → index-5p8jdswx.js} +4 -3
- package/dist/{index-75zjgwga.js → index-7qw742ev.js} +1 -1
- package/dist/{index-f85teqck.js → index-8da2zjhz.js} +3 -256
- package/dist/{index-q7yesyk9.js → index-8x2v7gg9.js} +25 -24
- package/dist/{index-w9jwmntv.js → index-b35pxds2.js} +9 -1
- package/dist/{v2/server-a4m2b1yv.js → index-fg34g6a5.js} +55 -1
- package/dist/index-hpecdzec.js +28506 -0
- package/dist/{index-2ntg5sd4.js → index-k5bdx1bx.js} +9 -5
- package/dist/{index-bmzf7zxv.js → index-majxda46.js} +23 -5
- package/dist/{index-2aq21j41.js → index-pkbcrdqs.js} +418 -127
- package/dist/{index-remp7e2g.js → index-q4yp4b52.js} +16 -1
- package/dist/{index-fr2z4qy8.js → index-r5hmbx3t.js} +132 -169
- package/dist/index-sfnj6h8h.js +259 -0
- package/dist/{index-xgt9k6c6.js → index-sgthv3f7.js} +2 -1
- package/dist/index-sj29b3z2.js +30 -0
- package/dist/{index-16ny736w.js → index-sjthx78w.js} +20526 -19817
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1983 -33118
- package/dist/{message-time-backfill-an311pmk.js → message-time-backfill-68gj6t3e.js} +2 -2
- package/dist/migration-worker.js +12 -7
- package/dist/plugin/dream-timer.d.ts +25 -1
- package/dist/plugin/dream-timer.d.ts.map +1 -1
- package/dist/plugin/hooks/create-session-hooks.d.ts +2 -1
- package/dist/plugin/hooks/create-session-hooks.d.ts.map +1 -1
- package/dist/plugin/messages-transform.d.ts +13 -0
- package/dist/plugin/messages-transform.d.ts.map +1 -1
- package/dist/plugin/rpc-handlers.d.ts +4 -0
- package/dist/plugin/rpc-handlers.d.ts.map +1 -1
- package/dist/plugin/subagent-tool-policy.d.ts +14 -0
- package/dist/plugin/subagent-tool-policy.d.ts.map +1 -0
- package/dist/plugin/tool-registry.d.ts +1 -0
- package/dist/plugin/tool-registry.d.ts.map +1 -1
- package/dist/{read-session-chunk-8rxs0tc9.js → read-session-chunk-egz7r68d.js} +8 -8
- package/dist/{recomp-orchestrator-nzamtw29.js → recomp-orchestrator-y15j0rb9.js} +15 -15
- package/dist/{send-session-notification-nqpv7cne.js → send-session-notification-dyw42dtr.js} +4 -4
- package/dist/shared/announcement.d.ts.map +1 -1
- package/dist/shared/cache-ttl-display.d.ts +6 -4
- package/dist/shared/cache-ttl-display.d.ts.map +1 -1
- package/dist/shared/model-cache-ttl.d.ts +1 -1
- package/dist/shared/model-cache-ttl.d.ts.map +1 -1
- package/dist/shared/model-suggestion-retry.d.ts +2 -0
- package/dist/shared/model-suggestion-retry.d.ts.map +1 -1
- package/dist/shared/models-dev-cache.d.ts.map +1 -1
- package/dist/shared/protected-tools-policy.d.ts +6 -0
- package/dist/shared/protected-tools-policy.d.ts.map +1 -0
- package/dist/shared/quota-diagnostic.d.ts +4 -0
- package/dist/shared/quota-diagnostic.d.ts.map +1 -0
- package/dist/shared/rpc-server.d.ts.map +1 -1
- package/dist/shared/sqlite-context-pragmas.d.ts +12 -0
- package/dist/shared/sqlite-context-pragmas.d.ts.map +1 -0
- package/dist/shared/sqlite-helpers.d.ts +9 -0
- package/dist/shared/sqlite-helpers.d.ts.map +1 -1
- package/dist/shared/sqlite.d.ts +10 -0
- package/dist/shared/sqlite.d.ts.map +1 -1
- package/dist/shared/status-summary.d.ts +1 -0
- package/dist/shared/status-summary.d.ts.map +1 -1
- package/dist/shared/status-view-check.d.ts.map +1 -1
- package/dist/shared/status-view.d.ts +4 -0
- package/dist/shared/status-view.d.ts.map +1 -1
- package/dist/shared/storage-permissions.d.ts +24 -0
- package/dist/shared/storage-permissions.d.ts.map +1 -1
- package/dist/shared/temporal-upgrade-fixture.d.ts +19 -0
- package/dist/shared/temporal-upgrade-fixture.d.ts.map +1 -0
- package/dist/shared/user-facing-codes.d.ts +5 -0
- package/dist/shared/user-facing-codes.d.ts.map +1 -1
- package/dist/shared/write-transaction-timing.d.ts +8 -1
- package/dist/shared/write-transaction-timing.d.ts.map +1 -1
- package/dist/tools/ctx-expand/render.d.ts.map +1 -1
- package/dist/tools/ctx-memory/tools.d.ts.map +1 -1
- package/dist/tools/ctx-reduce/constants.d.ts +2 -0
- package/dist/tools/ctx-reduce/constants.d.ts.map +1 -1
- package/dist/tools/ctx-reduce/tools.d.ts +4 -4
- package/dist/tools/ctx-reduce/tools.d.ts.map +1 -1
- package/dist/{transform-postprocess-phase-414phndq.js → transform-postprocess-phase-bqhz6vdr.js} +15 -15
- package/dist/v2/context-zecmzk5s.js +52209 -0
- package/dist/v2/{derive-budgets-v0krf3t7.js → derive-budgets-kdgp4s3r.js} +4 -3
- package/dist/v2/embedding-worker.js +6 -5
- package/dist/v2/fold/boundary.d.ts +2 -0
- package/dist/v2/fold/boundary.d.ts.map +1 -1
- package/dist/v2/fold/owner.d.ts.map +1 -1
- package/dist/v2/hidden-child-native.d.ts +7 -0
- package/dist/v2/hidden-child-native.d.ts.map +1 -1
- package/dist/v2/hidden-child-record.d.ts +8 -0
- package/dist/v2/hidden-child-record.d.ts.map +1 -1
- package/dist/v2/hidden-completion.d.ts.map +1 -1
- package/dist/v2/hooks/channel2.d.ts +2 -0
- package/dist/v2/hooks/channel2.d.ts.map +1 -1
- package/dist/v2/hooks/context.d.ts +2 -2
- package/dist/v2/hooks/context.d.ts.map +1 -1
- package/dist/v2/hooks/dream-timer.d.ts +39 -0
- package/dist/v2/hooks/dream-timer.d.ts.map +1 -0
- package/dist/v2/hooks/dream-trigger.d.ts +15 -1
- package/dist/v2/hooks/dream-trigger.d.ts.map +1 -1
- package/dist/v2/hooks/hidden-child.d.ts +54 -3
- package/dist/v2/hooks/hidden-child.d.ts.map +1 -1
- package/dist/v2/hooks/payload.d.ts.map +1 -1
- package/dist/v2/hooks/store.d.ts.map +1 -1
- package/dist/v2/hooks/tools.d.ts +1 -1
- package/dist/v2/hooks/tools.d.ts.map +1 -1
- package/dist/v2/hooks/types.d.ts +12 -1
- package/dist/v2/hooks/types.d.ts.map +1 -1
- package/dist/v2/hooks/update-check.d.ts.map +1 -1
- package/dist/v2/{message-time-backfill-0n93vrd7.js → message-time-backfill-r6qkem1x.js} +3 -3
- package/dist/v2/migration-worker.js +13 -8
- package/dist/v2/{read-session-chunk-hjza38hr.js → read-session-chunk-8vjp6581.js} +9 -9
- package/dist/v2/recomp-orchestrator-8ejxvrzz.js +39 -0
- package/dist/v2/{safe-notification-target-wtj0bbc2.js → safe-notification-target-eb1n1vfb.js} +2 -2
- package/dist/v2/{send-session-notification-mq9frrtm.js → send-session-notification-qs0j78v6.js} +6 -6
- package/dist/v2/server-14vq4kpm.js +30 -0
- package/dist/v2/server-1bc61ans.js +154 -0
- package/dist/v2/{server-n96ag4rk.js → server-1zx87sdm.js} +5 -1
- package/dist/v2/server-3n4q9xme.js +79 -0
- package/dist/v2/{server-rhdgxp1t.js → server-51dv1pr5.js} +63 -2
- package/dist/v2/{server-5317ykaf.js → server-6r257mf5.js} +1 -1
- package/dist/v2/server-84w6rvvf.js +14 -0
- package/dist/v2/{server-qpg6wf72.js → server-ajzeteqw.js} +9 -1
- package/dist/v2/server-c5gz8wph.js +3892 -0
- package/dist/v2/{server-v5xgft5v.js → server-e29d7p7c.js} +188 -3533
- package/dist/{index-a4m2b1yv.js → v2/server-fg34g6a5.js} +55 -1
- package/dist/v2/{server-e36nf2p1.js → server-frbm99q5.js} +1595 -1599
- package/dist/v2/{server-remp7e2g.js → server-g0fjrkta.js} +16 -1
- package/dist/v2/{server-c4g2y1z8.js → server-jc7y02q0.js} +2816 -5392
- package/dist/v2/{server-z19x7eqz.js → server-mcfawjgc.js} +4 -4
- package/dist/v2/{server-hfjfbg59.js → server-qp5hx1ad.js} +608 -105
- package/dist/v2/server-vs5gpnd4.js +493 -0
- package/dist/v2/{server-w99cyt6a.js → server-wvjvfhck.js} +14 -6
- package/dist/v2/server-xa4xe3rv.js +3351 -0
- package/dist/v2/{server-0jqw05sa.js → server-y8maxeft.js} +6 -84
- package/dist/v2/server.d.ts.map +1 -1
- package/dist/v2/server.js +104 -49288
- package/dist/v2/store-reader.d.ts +39 -1
- package/dist/v2/store-reader.d.ts.map +1 -1
- package/dist/v2/tool-result.d.ts +8 -0
- package/dist/v2/tool-result.d.ts.map +1 -0
- package/dist/v2/tui/index.d.ts.map +1 -1
- package/dist/v2/{wrapup-orchestrator-tbyx78dz.js → wrapup-orchestrator-0snhvwcv.js} +20 -16
- package/dist/wrapup-orchestrator-39amhv9s.js +26 -0
- package/package.json +26 -10
- package/src/config/index.ts +21 -4
- package/src/config/latch-permanence-guard.test.ts +6 -1
- package/src/config/live-run-config.ts +1 -0
- package/src/config/migrate-config-location.test.ts +31 -1
- package/src/config/migrate-config-location.ts +8 -41
- package/src/config/protected-tools.test.ts +70 -0
- package/src/config/raw-loader.test.ts +15 -0
- package/src/config/raw-loader.ts +1 -1
- package/src/config/removed-agent-source-fence.test.ts +10 -1
- package/src/config/schema/magic-context.test.ts +20 -1
- package/src/config/schema/magic-context.ts +26 -7
- package/src/shared/announcement.ts +6 -5
- package/src/shared/cache-ttl-display.test.ts +1 -1
- package/src/shared/cache-ttl-display.ts +17 -16
- package/src/shared/fold-render-lock-fence.test.ts +84 -0
- package/src/shared/fold-render-lock-fixtures.test.ts +276 -0
- package/src/shared/model-cache-ttl.test.ts +2 -2
- package/src/shared/model-cache-ttl.ts +8 -4
- package/src/shared/model-suggestion-retry.test.ts +104 -1
- package/src/shared/model-suggestion-retry.ts +63 -6
- package/src/shared/models-dev-cache.ts +3 -11
- package/src/shared/protected-tools-policy.ts +23 -0
- package/src/shared/quota-diagnostic.ts +9 -0
- package/src/shared/rpc-server.ts +6 -54
- package/src/shared/sqlite-context-pragmas.test.ts +105 -0
- package/src/shared/sqlite-context-pragmas.ts +24 -0
- package/src/shared/sqlite-helpers.ts +17 -0
- package/src/shared/sqlite.ts +75 -0
- package/src/shared/status-detail-text.test.ts +18 -1
- package/src/shared/status-summary.ts +11 -0
- package/src/shared/status-view-check.ts +5 -0
- package/src/shared/status-view.test.ts +11 -2
- package/src/shared/status-view.ts +12 -1
- package/src/shared/storage-permissions.test.ts +204 -0
- package/src/shared/storage-permissions.ts +192 -0
- package/src/shared/temporal-upgrade-fixture.ts +50 -0
- package/src/shared/user-facing-codes.ts +6 -0
- package/src/shared/write-transaction-timing.test.ts +39 -0
- package/src/shared/write-transaction-timing.ts +25 -1
- package/src/tui/dialogs/status-dialog-render.test.ts +1 -1
- package/src/tui/index.tsx +3 -1
- package/src/tui/startup-order.test.ts +16 -0
- package/src/tui-compiled/index.tsx +3 -1
- package/src/v2/tui/index.ts +9 -2
- package/dist/index-anq4nn6f.js +0 -131
- package/dist/index-e44zzy84.js +0 -10
- package/dist/index-x23gah8c.js +0 -16
- package/dist/v2/recomp-orchestrator-1aq7h44c.js +0 -36
- package/dist/v2/server-e44zzy84.js +0 -10
- package/dist/v2/server-fgmxwrgy.js +0 -16
- package/dist/v2/server-r7cmye3k.js +0 -131
- package/dist/wrapup-orchestrator-h28bqsy6.js +0 -26
- package/dist/v2/{server-ckpc8pxy.js → server-1qbnzc80.js} +8 -8
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
import {
|
|
2
|
+
UNKNOWN_FIT_RATIO,
|
|
3
|
+
resolveDecisionCalibration,
|
|
4
|
+
hasMeasuredDecisionCalibration,
|
|
5
|
+
providerMass
|
|
6
|
+
} from "./server-1zx87sdm.js";
|
|
1
7
|
import {
|
|
2
8
|
OMO_INTERNAL_INITIATOR_MARKER,
|
|
3
9
|
isSystemDirective,
|
|
@@ -5,43 +11,70 @@ import {
|
|
|
5
11
|
extractTexts2,
|
|
6
12
|
extractToolResultBodyTokens,
|
|
7
13
|
extractToolCallSummaries,
|
|
14
|
+
hasTokenizerForFit,
|
|
15
|
+
tokenCountUsesByteBound,
|
|
8
16
|
estimateTokens,
|
|
17
|
+
createTokenCountMemo,
|
|
9
18
|
normalizeText,
|
|
10
19
|
compactRole,
|
|
11
20
|
formatBlock,
|
|
12
21
|
compactTextForSummary,
|
|
13
22
|
mergeCommitHashes
|
|
14
|
-
} from "./server-
|
|
23
|
+
} from "./server-51dv1pr5.js";
|
|
15
24
|
import {
|
|
16
|
-
getHarness
|
|
17
|
-
|
|
25
|
+
getHarness,
|
|
26
|
+
sessionLog
|
|
27
|
+
} from "./server-1qbnzc80.js";
|
|
18
28
|
import {
|
|
19
|
-
|
|
20
|
-
|
|
29
|
+
stableStringify,
|
|
30
|
+
tagOrderConstraintIndex,
|
|
31
|
+
getToolDefinitionMeasurementSignature,
|
|
32
|
+
getLargestMeasuredToolDefinitionTokens,
|
|
33
|
+
getMeasuredToolDefinitionTokens
|
|
34
|
+
} from "./server-vs5gpnd4.js";
|
|
35
|
+
import {
|
|
36
|
+
renderToolTemplate,
|
|
37
|
+
DEFAULT_PROTECTED_TOOLS,
|
|
38
|
+
normalizeProtectedToolName,
|
|
39
|
+
mergeProtectedTools
|
|
40
|
+
} from "./server-g0fjrkta.js";
|
|
21
41
|
import {
|
|
22
42
|
openCodeDbExists,
|
|
23
43
|
withReadOnlySessionDb,
|
|
24
44
|
getRawSessionMessageCountFromDb,
|
|
25
45
|
getMessageTimesFromOpenCodeDb
|
|
26
|
-
} from "./server-
|
|
27
|
-
import {
|
|
28
|
-
stableStringify,
|
|
29
|
-
getLargestMeasuredToolDefinitionTokens,
|
|
30
|
-
getMeasuredToolDefinitionTokens
|
|
31
|
-
} from "./server-r7cmye3k.js";
|
|
32
|
-
import {
|
|
33
|
-
UNKNOWN_FIT_RATIO,
|
|
34
|
-
resolveDecisionCalibration,
|
|
35
|
-
providerMass
|
|
36
|
-
} from "./server-n96ag4rk.js";
|
|
46
|
+
} from "./server-wvjvfhck.js";
|
|
37
47
|
import {
|
|
38
48
|
canonicalModelIdentity
|
|
39
49
|
} from "./server-avwt563y.js";
|
|
40
50
|
|
|
41
51
|
// src/features/magic-context/reclaim-protection.ts
|
|
42
|
-
var CTX_REDUCE_KEEP =
|
|
43
|
-
function
|
|
44
|
-
|
|
52
|
+
var CTX_REDUCE_KEEP = DEFAULT_PROTECTED_TOOLS.ctx_reduce;
|
|
53
|
+
function adoptedProtectedToolsPolicy(current, previous, rebuilding, hasBaseline) {
|
|
54
|
+
if (rebuilding || !hasBaseline)
|
|
55
|
+
return mergeProtectedTools(current);
|
|
56
|
+
return { ...previous ?? { todowrite: 0, ctx_reduce: 3 } };
|
|
57
|
+
}
|
|
58
|
+
function protectedToolTagNumbers(tags, protectedTools) {
|
|
59
|
+
const counts = mergeProtectedTools(protectedTools);
|
|
60
|
+
const protectedTags = new Set;
|
|
61
|
+
for (const tag of [...tags].sort((left, right) => right.tagNumber - left.tagNumber)) {
|
|
62
|
+
if (tag.status !== undefined && tag.status !== "active")
|
|
63
|
+
continue;
|
|
64
|
+
if (tag.type !== undefined && tag.type !== "tool")
|
|
65
|
+
continue;
|
|
66
|
+
const name = normalizeProtectedToolName(tag.toolName);
|
|
67
|
+
if (!Object.hasOwn(counts, name) || counts[name] <= 0)
|
|
68
|
+
continue;
|
|
69
|
+
protectedTags.add(tag.tagNumber);
|
|
70
|
+
counts[name] -= 1;
|
|
71
|
+
}
|
|
72
|
+
return protectedTags;
|
|
73
|
+
}
|
|
74
|
+
function protectedToolTokenCount(tags, counts, calibration) {
|
|
75
|
+
const protectedTags = protectedToolTagNumbers(tags, counts);
|
|
76
|
+
const tokens = tags.reduce((sum, tag) => sum + (protectedTags.has(tag.tagNumber) ? tag.tokenCount ?? 0 : 0), 0);
|
|
77
|
+
return calibration && hasMeasuredDecisionCalibration(calibration) ? providerMass({ tools: tokens }, calibration) : 0;
|
|
45
78
|
}
|
|
46
79
|
|
|
47
80
|
// src/hooks/magic-context/tag-content-primitives.ts
|
|
@@ -413,6 +446,7 @@ function isTodoItem(value) {
|
|
|
413
446
|
var MAX_CONTENT_MEMO_ENTRIES = 1e5;
|
|
414
447
|
var MAX_CONTENT_MEMO_BYTES = 64 * 1024 * 1024;
|
|
415
448
|
var contentMemo = new Map;
|
|
449
|
+
var contentMemoOrder = new Set;
|
|
416
450
|
var contentMemoBytes = 0;
|
|
417
451
|
var FNV1A_32_OFFSET = 2166136261;
|
|
418
452
|
var FNV1A_32_PRIME = 16777619;
|
|
@@ -434,25 +468,38 @@ function fnv1a32(value) {
|
|
|
434
468
|
return hash.toString(16).padStart(8, "0");
|
|
435
469
|
}
|
|
436
470
|
function memoizedContent(kind, content) {
|
|
437
|
-
|
|
438
|
-
|
|
471
|
+
let byContent = contentMemo.get(kind);
|
|
472
|
+
if (!byContent) {
|
|
473
|
+
byContent = new Map;
|
|
474
|
+
contentMemo.set(kind, byContent);
|
|
475
|
+
}
|
|
476
|
+
const cached = byContent.get(content);
|
|
439
477
|
if (cached)
|
|
440
478
|
return cached;
|
|
479
|
+
let hash = FNV1A_32_OFFSET;
|
|
480
|
+
for (const segment of [kind, "\x00", content]) {
|
|
481
|
+
for (let index = 0;index < segment.length; index += 1) {
|
|
482
|
+
hash ^= segment.charCodeAt(index);
|
|
483
|
+
hash = Math.imul(hash, FNV1A_32_PRIME) >>> 0;
|
|
484
|
+
}
|
|
485
|
+
}
|
|
441
486
|
const measured = {
|
|
442
|
-
hash:
|
|
487
|
+
hash: hash.toString(16).padStart(8, "0"),
|
|
443
488
|
tokens: kind === "excluded" ? 0 : undefined,
|
|
444
|
-
keyBytes:
|
|
489
|
+
keyBytes: (kind.length + 1 + content.length) * 2 + 32,
|
|
490
|
+
kind,
|
|
491
|
+
content
|
|
445
492
|
};
|
|
446
|
-
|
|
493
|
+
byContent.set(content, measured);
|
|
494
|
+
contentMemoOrder.add(measured);
|
|
447
495
|
contentMemoBytes += measured.keyBytes;
|
|
448
|
-
while (
|
|
449
|
-
const oldest =
|
|
450
|
-
if (
|
|
496
|
+
while (contentMemoOrder.size > MAX_CONTENT_MEMO_ENTRIES || contentMemoBytes > MAX_CONTENT_MEMO_BYTES) {
|
|
497
|
+
const oldest = contentMemoOrder.values().next().value;
|
|
498
|
+
if (!oldest)
|
|
451
499
|
break;
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
contentMemo.delete(oldest);
|
|
500
|
+
contentMemoBytes -= oldest.keyBytes;
|
|
501
|
+
contentMemo.get(oldest.kind)?.delete(oldest.content);
|
|
502
|
+
contentMemoOrder.delete(oldest);
|
|
456
503
|
}
|
|
457
504
|
return measured;
|
|
458
505
|
}
|
|
@@ -624,9 +671,9 @@ function messageIdForTag(tag) {
|
|
|
624
671
|
return tag.toolOwnerMessageId;
|
|
625
672
|
return contentTagOwnerMessageId(tag.messageId);
|
|
626
673
|
}
|
|
627
|
-
function resolveProtectedTagNumbers(tags, protectedTagNumbersInput) {
|
|
674
|
+
function resolveProtectedTagNumbers(tags, protectedTagNumbersInput, protectedToolTags) {
|
|
628
675
|
const protectedNumbers = new Set(protectedTagNumbersInput);
|
|
629
|
-
const protectedCtxReduceTags =
|
|
676
|
+
const protectedCtxReduceTags = protectedToolTags ?? protectedToolTagNumbers(tags);
|
|
630
677
|
for (const tagNumber of protectedCtxReduceTags)
|
|
631
678
|
protectedNumbers.add(tagNumber);
|
|
632
679
|
return protectedNumbers;
|
|
@@ -649,7 +696,7 @@ function neighborhoodConsistent(args) {
|
|
|
649
696
|
return args.orphanTagNumber >= previousMax && args.orphanTagNumber <= nextMin;
|
|
650
697
|
}
|
|
651
698
|
function buildTagAttribution(args) {
|
|
652
|
-
const protectedNumbers = resolveProtectedTagNumbers(args.tags, args.protectedTagNumbers);
|
|
699
|
+
const protectedNumbers = resolveProtectedTagNumbers(args.tags, args.protectedTagNumbers, args.protectedToolTags);
|
|
653
700
|
const messageTags = new Map;
|
|
654
701
|
const exactToolTags = new Map;
|
|
655
702
|
const orphanTagsByCall = new Map;
|
|
@@ -808,19 +855,34 @@ function sameTailHygieneStructuralSignature(expected, actual) {
|
|
|
808
855
|
return expected.partCounts.every((count, index) => count === actual.partCounts[index]);
|
|
809
856
|
}
|
|
810
857
|
function measureTailHygiene(input) {
|
|
858
|
+
return measureWithReplay(input);
|
|
859
|
+
}
|
|
860
|
+
function measureWithReplay(input, replay) {
|
|
811
861
|
const pendingDropTagNumbers = input.pendingDropTagNumbers ?? new Set;
|
|
862
|
+
const unchanged = input.messages.map((message, index) => {
|
|
863
|
+
const previous = replay?.messages[index];
|
|
864
|
+
return previous !== undefined && sameReplayMessage(previous, message);
|
|
865
|
+
});
|
|
812
866
|
const toolIdentities = collectToolPartIdentities(input.messages);
|
|
813
867
|
const attribution = buildTagAttribution({
|
|
814
868
|
messages: input.messages,
|
|
815
869
|
tags: input.tags,
|
|
816
870
|
toolIdentities,
|
|
817
|
-
protectedTagNumbers: input.protectedTagNumbers
|
|
871
|
+
protectedTagNumbers: input.protectedTagNumbers,
|
|
872
|
+
protectedToolTags: input.protectedToolTags
|
|
873
|
+
});
|
|
874
|
+
const toolOutputs = input.messages.map((message, index) => message.parts.map((part, partIndex) => unchanged[index] ? replay?.measured.toolOutputs[index][partIndex] ?? null : isRecord(part) ? toolOutputText(part) : null));
|
|
875
|
+
const outputByPart = new Map;
|
|
876
|
+
input.messages.forEach((message, index) => {
|
|
877
|
+
message.parts.forEach((part, partIndex) => {
|
|
878
|
+
outputByPart.set(part, toolOutputs[index][partIndex]);
|
|
879
|
+
});
|
|
818
880
|
});
|
|
819
881
|
const droppedToolOwners = new Set;
|
|
820
882
|
for (const [part, identity] of toolIdentities) {
|
|
821
883
|
if (!isRecord(part))
|
|
822
884
|
continue;
|
|
823
|
-
const output =
|
|
885
|
+
const output = outputByPart.get(part) ?? null;
|
|
824
886
|
if (output !== null && isDropSentinel(output)) {
|
|
825
887
|
droppedToolOwners.add(`${identity.ownerMessageId}\x00${identity.callId}`);
|
|
826
888
|
}
|
|
@@ -829,11 +891,47 @@ function measureTailHygiene(input) {
|
|
|
829
891
|
let t = 0;
|
|
830
892
|
let u = 0;
|
|
831
893
|
let newestMessagePartStart = 0;
|
|
894
|
+
const messagePartStarts = [];
|
|
832
895
|
for (let messageIndex = 0;messageIndex < input.messages.length; messageIndex += 1) {
|
|
833
896
|
const message = input.messages[messageIndex];
|
|
897
|
+
messagePartStarts.push(parts.length);
|
|
834
898
|
if (messageIndex === input.messages.length - 1)
|
|
835
899
|
newestMessagePartStart = parts.length;
|
|
836
900
|
const messageKey = messageIdentity(message, messageIndex);
|
|
901
|
+
const priorMessage = replay?.messages[messageIndex];
|
|
902
|
+
const reusable = unchanged[messageIndex] && priorMessage && message.parts.every((part, index) => {
|
|
903
|
+
const current = toolIdentities.get(part);
|
|
904
|
+
const prior = replay?.measured.toolOwners.get(priorMessage.parts[index]);
|
|
905
|
+
if (!current || !prior)
|
|
906
|
+
return current === prior;
|
|
907
|
+
const currentKey = `${current.ownerMessageId}\x00${current.callId}`;
|
|
908
|
+
const priorKey = `${prior.ownerMessageId}\x00${prior.callId}`;
|
|
909
|
+
return currentKey === priorKey && droppedToolOwners.has(currentKey) === replay?.measured.droppedToolOwners.has(priorKey);
|
|
910
|
+
});
|
|
911
|
+
if (reusable && replay) {
|
|
912
|
+
const start = replay.measured.messagePartStarts[messageIndex];
|
|
913
|
+
const end = replay.measured.messagePartStarts[messageIndex + 1] ?? replay.measured.parts.length;
|
|
914
|
+
for (let index = start;index < end; index += 1) {
|
|
915
|
+
const prior = replay.measured.parts[index];
|
|
916
|
+
const partIndex = Number(prior.key.slice(messageKey.length + 1).split("\x00")[0]);
|
|
917
|
+
const tag = prior.kind === "text" ? attribution.messageTags.get(`${message.info.id}:p${partIndex}`) : prior.kind === "file" ? attribution.messageTags.get(`${message.info.id}:file${partIndex}`) : prior.kind === "toolInput" || prior.kind === "toolOutput" ? attribution.toolTagsByPart.get(message.parts[partIndex]) : undefined;
|
|
918
|
+
const protectedPart = tag ? attribution.protectedNumbers.has(tag.tagNumber) : false;
|
|
919
|
+
const queuedForDrop = tag ? pendingDropTagNumbers.has(tag.tagNumber) : false;
|
|
920
|
+
const uTokens = tag?.status === "active" && !protectedPart && !queuedForDrop && prior.kind !== "excluded" ? prior.tokens : 0;
|
|
921
|
+
const measured = prior.tagNumber === (tag?.tagNumber ?? null) && prior.tagStatus === (tag?.status ?? null) && prior.protected === protectedPart && prior.queuedForDrop === queuedForDrop && prior.uTokens === uTokens ? prior : {
|
|
922
|
+
...prior,
|
|
923
|
+
tagNumber: tag?.tagNumber ?? null,
|
|
924
|
+
tagStatus: tag?.status ?? null,
|
|
925
|
+
protected: protectedPart,
|
|
926
|
+
queuedForDrop,
|
|
927
|
+
uTokens
|
|
928
|
+
};
|
|
929
|
+
parts.push(measured);
|
|
930
|
+
t += measured.tokens;
|
|
931
|
+
u += measured.uTokens;
|
|
932
|
+
}
|
|
933
|
+
continue;
|
|
934
|
+
}
|
|
837
935
|
const messageSynthetic = isSyntheticMessage(message);
|
|
838
936
|
for (let partIndex = 0;partIndex < message.parts.length; partIndex += 1) {
|
|
839
937
|
const part = message.parts[partIndex];
|
|
@@ -915,7 +1013,7 @@ function measureTailHygiene(input) {
|
|
|
915
1013
|
t += measured.tokens;
|
|
916
1014
|
u += measured.uTokens;
|
|
917
1015
|
}
|
|
918
|
-
const rawOutput =
|
|
1016
|
+
const rawOutput = outputByPart.get(part) ?? null;
|
|
919
1017
|
if (rawOutput !== null) {
|
|
920
1018
|
const output = stripChannel1ReminderSpans(rawOutput);
|
|
921
1019
|
if (isDropSentinel(output)) {
|
|
@@ -949,7 +1047,11 @@ function measureTailHygiene(input) {
|
|
|
949
1047
|
t: Math.max(0, t),
|
|
950
1048
|
contentSignature: contentSignature(parts),
|
|
951
1049
|
parts,
|
|
952
|
-
newestMessagePartStart
|
|
1050
|
+
newestMessagePartStart,
|
|
1051
|
+
messagePartStarts,
|
|
1052
|
+
toolOutputs,
|
|
1053
|
+
toolOwners: toolIdentities,
|
|
1054
|
+
droppedToolOwners
|
|
953
1055
|
};
|
|
954
1056
|
}
|
|
955
1057
|
function messageIdFromPartKey(key) {
|
|
@@ -1056,6 +1158,20 @@ function sameReplayValue(before, after) {
|
|
|
1056
1158
|
}
|
|
1057
1159
|
return true;
|
|
1058
1160
|
}
|
|
1161
|
+
function copyReplayValue(value) {
|
|
1162
|
+
if (Array.isArray(value))
|
|
1163
|
+
return value.map(copyReplayValue);
|
|
1164
|
+
if (value !== null && typeof value === "object") {
|
|
1165
|
+
const prototype = Object.getPrototypeOf(value);
|
|
1166
|
+
if (prototype !== Object.prototype && prototype !== null)
|
|
1167
|
+
return structuredClone(value);
|
|
1168
|
+
const copy = Object.create(prototype);
|
|
1169
|
+
for (const key of Object.keys(value))
|
|
1170
|
+
copy[key] = copyReplayValue(value[key]);
|
|
1171
|
+
return copy;
|
|
1172
|
+
}
|
|
1173
|
+
return value;
|
|
1174
|
+
}
|
|
1059
1175
|
function sameNumbers(before, after) {
|
|
1060
1176
|
if (before.size !== after.size)
|
|
1061
1177
|
return false;
|
|
@@ -1064,19 +1180,22 @@ function sameNumbers(before, after) {
|
|
|
1064
1180
|
return false;
|
|
1065
1181
|
return true;
|
|
1066
1182
|
}
|
|
1183
|
+
function sameReplayMessage(left, right) {
|
|
1184
|
+
return left.info.id === right.info.id && left.info.role === right.info.role && left.info.summary === right.info.summary && sameReplayValue(left.parts, right.parts);
|
|
1185
|
+
}
|
|
1067
1186
|
function sameReplayMessages(before, after) {
|
|
1068
1187
|
if (before.length !== after.length)
|
|
1069
1188
|
return false;
|
|
1070
1189
|
for (let index = 0;index < before.length; index += 1) {
|
|
1071
1190
|
const left = before[index];
|
|
1072
1191
|
const right = after[index];
|
|
1073
|
-
if (
|
|
1192
|
+
if (!sameReplayMessage(left, right))
|
|
1074
1193
|
return false;
|
|
1075
1194
|
}
|
|
1076
1195
|
return true;
|
|
1077
1196
|
}
|
|
1078
1197
|
var baselineMeasurementMemo = new Map;
|
|
1079
|
-
var MAX_BASELINE_MEMO_SIZE =
|
|
1198
|
+
var MAX_BASELINE_MEMO_SIZE = 128 * 1024 * 1024;
|
|
1080
1199
|
var baselineMemoSize = 0;
|
|
1081
1200
|
function retainBaselineMeasurement(key, memo) {
|
|
1082
1201
|
const previous = baselineMeasurementMemo.get(key);
|
|
@@ -1121,10 +1240,17 @@ function freezeTailHygieneMeasurement(measured) {
|
|
|
1121
1240
|
};
|
|
1122
1241
|
}
|
|
1123
1242
|
function refreshTailHygieneBaseline(input) {
|
|
1243
|
+
const protectedToolsPolicy = adoptedProtectedToolsPolicy(input.protectedTools, input.previous?.protectedToolsPolicy, input.cacheBusting, !!input.previous);
|
|
1244
|
+
const protectedToolTags = protectedToolTagNumbers(input.tags, protectedToolsPolicy);
|
|
1245
|
+
input = {
|
|
1246
|
+
...input,
|
|
1247
|
+
protectedToolTags,
|
|
1248
|
+
protectedTagNumbers: new Set([...input.protectedTagNumbers, ...protectedToolTags])
|
|
1249
|
+
};
|
|
1124
1250
|
const pendingDropTagNumbers = input.pendingDropTagNumbers ?? new Set;
|
|
1125
1251
|
const cached = input.previous ? baselineMeasurementMemo.get(input.previous.baselineParts) : undefined;
|
|
1126
1252
|
const hit = !input.cacheBusting && cached && sameReplayMessages(cached.messages, input.messages) && sameReplayValue(cached.tags, input.tags) && sameNumbers(cached.protectedTagNumbers, input.protectedTagNumbers) && sameNumbers(cached.pendingDropTagNumbers, pendingDropTagNumbers);
|
|
1127
|
-
const rawMeasured = hit ? cached.measured :
|
|
1253
|
+
const rawMeasured = hit ? cached.measured : measureWithReplay(input, cached);
|
|
1128
1254
|
const frozenCalibration = !input.cacheBusting && input.previous ? {
|
|
1129
1255
|
toolsRatio: input.previous.toolsRatio,
|
|
1130
1256
|
proseRatio: input.previous.proseRatio,
|
|
@@ -1143,26 +1269,38 @@ function refreshTailHygieneBaseline(input) {
|
|
|
1143
1269
|
})
|
|
1144
1270
|
};
|
|
1145
1271
|
const memo = hit ? cached : {
|
|
1146
|
-
messages:
|
|
1272
|
+
messages: input.messages.map((message, index) => cached?.messages[index] && sameReplayMessage(cached.messages[index], message) ? cached.messages[index] : {
|
|
1147
1273
|
info: {
|
|
1148
1274
|
id: message.info.id,
|
|
1149
1275
|
role: message.info.role,
|
|
1150
1276
|
summary: message.info.summary
|
|
1151
1277
|
},
|
|
1152
|
-
parts: message.parts
|
|
1153
|
-
})
|
|
1278
|
+
parts: copyReplayValue(message.parts)
|
|
1279
|
+
}),
|
|
1154
1280
|
tags: structuredClone(input.tags),
|
|
1155
1281
|
protectedTagNumbers: new Set(input.protectedTagNumbers),
|
|
1156
1282
|
pendingDropTagNumbers: new Set(pendingDropTagNumbers),
|
|
1157
1283
|
measured: rawMeasured,
|
|
1158
1284
|
size: 2 * structuralSize(input.messages) + 512 * input.tags.length
|
|
1159
1285
|
};
|
|
1286
|
+
if (!hit) {
|
|
1287
|
+
const owners = new Map;
|
|
1288
|
+
input.messages.forEach((message, index) => {
|
|
1289
|
+
message.parts.forEach((part, partIndex) => {
|
|
1290
|
+
const identity = rawMeasured.toolOwners.get(part);
|
|
1291
|
+
if (identity)
|
|
1292
|
+
owners.set(memo.messages[index].parts[partIndex], identity);
|
|
1293
|
+
});
|
|
1294
|
+
});
|
|
1295
|
+
rawMeasured.toolOwners = owners;
|
|
1296
|
+
}
|
|
1160
1297
|
const now = input.now ?? Date.now();
|
|
1161
1298
|
const refrozen = (mismatch) => {
|
|
1162
1299
|
const frozen = freezeTailHygieneMeasurement(measured);
|
|
1163
1300
|
retainBaselineMeasurement(frozen.baselineParts, memo);
|
|
1164
1301
|
return {
|
|
1165
1302
|
...frozen,
|
|
1303
|
+
protectedToolsPolicy,
|
|
1166
1304
|
hygieneUnitsVersion: frozenCalibration.hygieneUnitsVersion,
|
|
1167
1305
|
toolsRatio: frozenCalibration.toolsRatio,
|
|
1168
1306
|
proseRatio: frozenCalibration.proseRatio,
|
|
@@ -1191,6 +1329,7 @@ function refreshTailHygieneBaseline(input) {
|
|
|
1191
1329
|
}
|
|
1192
1330
|
return {
|
|
1193
1331
|
...input.previous,
|
|
1332
|
+
protectedToolsPolicy,
|
|
1194
1333
|
turnDeltaU,
|
|
1195
1334
|
turnDeltaT,
|
|
1196
1335
|
evaluable: true,
|
|
@@ -1210,6 +1349,11 @@ function assertTailHygieneContentUnchanged(input) {
|
|
|
1210
1349
|
throw new Error(`tail hygiene walk was not the last byte-affecting operation: expected ${input.expectedSignature}, got ${actual}`);
|
|
1211
1350
|
}
|
|
1212
1351
|
}
|
|
1352
|
+
function assertTailHygieneContentUnchangedIfEnabled(input) {
|
|
1353
|
+
if (process.env.MAGIC_CONTEXT_DEBUG_ASSERTIONS === "1") {
|
|
1354
|
+
assertTailHygieneContentUnchanged(input);
|
|
1355
|
+
}
|
|
1356
|
+
}
|
|
1213
1357
|
|
|
1214
1358
|
// src/hooks/magic-context/ctx-reduce-nudge.ts
|
|
1215
1359
|
var CHANNEL1_SENTINEL = "<system-reminder>";
|
|
@@ -1599,7 +1743,7 @@ function planEmergencyDrop(input) {
|
|
|
1599
1743
|
reserved.add(nums[i]);
|
|
1600
1744
|
}
|
|
1601
1745
|
}
|
|
1602
|
-
const
|
|
1746
|
+
const protectedTags = input.protectedToolTags ?? protectedToolTagNumbers(floorTags, input.protectedTools);
|
|
1603
1747
|
const byTier = { 1: [], 2: [], 3: [] };
|
|
1604
1748
|
for (const tag of tags) {
|
|
1605
1749
|
if (tag.status !== "active" || tag.type !== "tool")
|
|
@@ -1610,7 +1754,7 @@ function planEmergencyDrop(input) {
|
|
|
1610
1754
|
continue;
|
|
1611
1755
|
}
|
|
1612
1756
|
}
|
|
1613
|
-
if (
|
|
1757
|
+
if (protectedTags.has(tag.tagNumber))
|
|
1614
1758
|
continue;
|
|
1615
1759
|
const tier = resolveToolTier(tag.toolName);
|
|
1616
1760
|
if ((tier === 1 || tier === 2) && reserved.has(tag.tagNumber))
|
|
@@ -1655,6 +1799,124 @@ function measureEmergencyTag(tag, target, calibration, skeleton) {
|
|
|
1655
1799
|
return { ...tag, servedTokens: served, reclaimableTokens: 0 };
|
|
1656
1800
|
}
|
|
1657
1801
|
|
|
1802
|
+
// src/features/magic-context/storage-ops.ts
|
|
1803
|
+
var queuePendingOpStatements = new WeakMap;
|
|
1804
|
+
var queueUnchangedDropStatements = new WeakMap;
|
|
1805
|
+
var getPendingOpsStatements = new WeakMap;
|
|
1806
|
+
var getPendingOpsCountStatements = new WeakMap;
|
|
1807
|
+
var hasPendingDropOpsStatements = new WeakMap;
|
|
1808
|
+
var clearPendingOpsStatements = new WeakMap;
|
|
1809
|
+
var removePendingOpStatements = new WeakMap;
|
|
1810
|
+
function getQueuePendingOpStatement(db) {
|
|
1811
|
+
let stmt = queuePendingOpStatements.get(db);
|
|
1812
|
+
if (!stmt) {
|
|
1813
|
+
stmt = db.prepare(`INSERT INTO pending_ops (session_id, tag_id, operation, queued_at, harness)
|
|
1814
|
+
SELECT ?, ?, ?, ?, ? WHERE NOT EXISTS (
|
|
1815
|
+
SELECT 1 FROM pending_ops WHERE session_id = ? AND tag_id = ? AND operation = ?
|
|
1816
|
+
)`);
|
|
1817
|
+
queuePendingOpStatements.set(db, stmt);
|
|
1818
|
+
}
|
|
1819
|
+
return stmt;
|
|
1820
|
+
}
|
|
1821
|
+
function getPendingOpsStatement(db) {
|
|
1822
|
+
let stmt = getPendingOpsStatements.get(db);
|
|
1823
|
+
if (!stmt) {
|
|
1824
|
+
stmt = db.prepare("SELECT id, session_id, tag_id, operation, queued_at FROM pending_ops WHERE session_id = ? ORDER BY queued_at ASC, id ASC");
|
|
1825
|
+
getPendingOpsStatements.set(db, stmt);
|
|
1826
|
+
}
|
|
1827
|
+
return stmt;
|
|
1828
|
+
}
|
|
1829
|
+
function getClearPendingOpsStatement(db) {
|
|
1830
|
+
let stmt = clearPendingOpsStatements.get(db);
|
|
1831
|
+
if (!stmt) {
|
|
1832
|
+
stmt = db.prepare("DELETE FROM pending_ops WHERE session_id = ?");
|
|
1833
|
+
clearPendingOpsStatements.set(db, stmt);
|
|
1834
|
+
}
|
|
1835
|
+
return stmt;
|
|
1836
|
+
}
|
|
1837
|
+
function getRemovePendingOpStatement(db) {
|
|
1838
|
+
let stmt = removePendingOpStatements.get(db);
|
|
1839
|
+
if (!stmt) {
|
|
1840
|
+
stmt = db.prepare("DELETE FROM pending_ops WHERE session_id = ? AND tag_id = ?");
|
|
1841
|
+
removePendingOpStatements.set(db, stmt);
|
|
1842
|
+
}
|
|
1843
|
+
return stmt;
|
|
1844
|
+
}
|
|
1845
|
+
function isPendingOpRow(row) {
|
|
1846
|
+
if (row === null || typeof row !== "object")
|
|
1847
|
+
return false;
|
|
1848
|
+
const r = row;
|
|
1849
|
+
return typeof r.id === "number" && typeof r.session_id === "string" && typeof r.tag_id === "number" && typeof r.operation === "string" && typeof r.queued_at === "number";
|
|
1850
|
+
}
|
|
1851
|
+
function toPendingOp(row) {
|
|
1852
|
+
if (row.operation !== "drop") {
|
|
1853
|
+
sessionLog(row.session_id, `unknown pending operation "${row.operation}"; ignoring`);
|
|
1854
|
+
return null;
|
|
1855
|
+
}
|
|
1856
|
+
return {
|
|
1857
|
+
id: row.id,
|
|
1858
|
+
sessionId: row.session_id,
|
|
1859
|
+
tagId: row.tag_id,
|
|
1860
|
+
operation: row.operation,
|
|
1861
|
+
queuedAt: row.queued_at
|
|
1862
|
+
};
|
|
1863
|
+
}
|
|
1864
|
+
function queuePendingOp(db, sessionId, tagId, operation, queuedAt = Date.now()) {
|
|
1865
|
+
getQueuePendingOpStatement(db).run(sessionId, tagId, operation, queuedAt, getHarness(), sessionId, tagId, operation);
|
|
1866
|
+
}
|
|
1867
|
+
function queuePendingDropForUnchangedTag(db, sessionId, tag) {
|
|
1868
|
+
let statement = queueUnchangedDropStatements.get(db);
|
|
1869
|
+
if (!statement) {
|
|
1870
|
+
statement = db.prepare(`INSERT INTO pending_ops (session_id, tag_id, operation, queued_at, harness)
|
|
1871
|
+
SELECT session_id, tag_number, 'drop', ?, ? FROM tags
|
|
1872
|
+
WHERE id = ? AND session_id = ? AND tag_number = ? AND message_id = ?
|
|
1873
|
+
AND type = ? AND tool_owner_message_id IS ? AND status = 'active'
|
|
1874
|
+
AND NOT EXISTS (
|
|
1875
|
+
SELECT 1 FROM pending_ops WHERE session_id = tags.session_id
|
|
1876
|
+
AND tag_id = tags.tag_number AND operation = 'drop'
|
|
1877
|
+
)`);
|
|
1878
|
+
queueUnchangedDropStatements.set(db, statement);
|
|
1879
|
+
}
|
|
1880
|
+
return statement.run(Date.now(), getHarness(), tag.id ?? null, sessionId, tag.tagNumber, tag.messageId, tag.type, tag.toolOwnerMessageId).changes > 0;
|
|
1881
|
+
}
|
|
1882
|
+
function getPendingOps(db, sessionId) {
|
|
1883
|
+
const rows = getPendingOpsStatement(db).all(sessionId).filter(isPendingOpRow);
|
|
1884
|
+
return rows.map(toPendingOp).filter((op) => op !== null);
|
|
1885
|
+
}
|
|
1886
|
+
function hasPendingDropOps(db, sessionId) {
|
|
1887
|
+
let statement = hasPendingDropOpsStatements.get(db);
|
|
1888
|
+
if (!statement) {
|
|
1889
|
+
statement = db.prepare(`SELECT EXISTS (
|
|
1890
|
+
SELECT 1 FROM pending_ops WHERE session_id = ? AND operation = 'drop'
|
|
1891
|
+
AND typeof(id) IN ('integer', 'real')
|
|
1892
|
+
AND typeof(session_id) = 'text'
|
|
1893
|
+
AND typeof(tag_id) IN ('integer', 'real')
|
|
1894
|
+
AND typeof(queued_at) IN ('integer', 'real')
|
|
1895
|
+
) AS present`);
|
|
1896
|
+
hasPendingDropOpsStatements.set(db, statement);
|
|
1897
|
+
}
|
|
1898
|
+
return statement.get(sessionId).present === 1;
|
|
1899
|
+
}
|
|
1900
|
+
function getPendingOpsCount(db, sessionId) {
|
|
1901
|
+
try {
|
|
1902
|
+
let statement = getPendingOpsCountStatements.get(db);
|
|
1903
|
+
if (!statement) {
|
|
1904
|
+
statement = db.prepare("SELECT COUNT(*) AS count FROM pending_ops WHERE session_id = ?");
|
|
1905
|
+
getPendingOpsCountStatements.set(db, statement);
|
|
1906
|
+
}
|
|
1907
|
+
const row = statement.get(sessionId);
|
|
1908
|
+
return typeof row?.count === "number" && Number.isFinite(row.count) ? row.count : null;
|
|
1909
|
+
} catch {
|
|
1910
|
+
return null;
|
|
1911
|
+
}
|
|
1912
|
+
}
|
|
1913
|
+
function clearPendingOps(db, sessionId) {
|
|
1914
|
+
getClearPendingOpsStatement(db).run(sessionId);
|
|
1915
|
+
}
|
|
1916
|
+
function removePendingOp(db, sessionId, tagId) {
|
|
1917
|
+
getRemovePendingOpStatement(db).run(sessionId, tagId);
|
|
1918
|
+
}
|
|
1919
|
+
|
|
1658
1920
|
// src/features/magic-context/storage-tags.ts
|
|
1659
1921
|
var insertTagStatements = new WeakMap;
|
|
1660
1922
|
var updateTagStatusStatements = new WeakMap;
|
|
@@ -1800,8 +2062,7 @@ function getActiveToolTagsForAgeReclaim(db, sessionId) {
|
|
|
1800
2062
|
reclaimableTokens: outputTokens === null && inputTokens === null ? null : (outputTokens ?? 0) + (inputTokens ?? 0)
|
|
1801
2063
|
};
|
|
1802
2064
|
});
|
|
1803
|
-
|
|
1804
|
-
return tags.filter((tag) => !protectedCtxReduceTags.has(tag.tagNumber));
|
|
2065
|
+
return tags;
|
|
1805
2066
|
}
|
|
1806
2067
|
function getTriggerTagTokenUpperBound(db, sessionId, floor = 0) {
|
|
1807
2068
|
const sql = floor > 0 ? `SELECT
|
|
@@ -1816,13 +2077,43 @@ function getTriggerTagTokenUpperBound(db, sessionId, floor = 0) {
|
|
|
1816
2077
|
const row = floor > 0 ? db.prepare(sql).get(sessionId, floor) : db.prepare(sql).get(sessionId);
|
|
1817
2078
|
return { bound: row?.bound ?? 0, nullCount: row?.null_count ?? 0 };
|
|
1818
2079
|
}
|
|
1819
|
-
|
|
1820
|
-
|
|
2080
|
+
var scopedActiveTokenTotalStatements = new WeakMap;
|
|
2081
|
+
function getActiveTagTokenTotalsByMessage(db, sessionId, messageIds) {
|
|
2082
|
+
if (messageIds?.length === 0)
|
|
2083
|
+
return new Map;
|
|
2084
|
+
const fields = "id, tag_number, type, message_id, tool_owner_message_id, token_count, input_token_count, reasoning_token_count".split(", ").map((field) => `tags.${field}`).join(", ");
|
|
2085
|
+
let scoped = scopedActiveTokenTotalStatements.get(db);
|
|
2086
|
+
if (messageIds && !scoped) {
|
|
2087
|
+
scoped = db.prepare(`
|
|
2088
|
+
SELECT ${fields} FROM json_each(?) AS owners
|
|
2089
|
+
CROSS JOIN tags INDEXED BY idx_tags_session_message_id
|
|
2090
|
+
WHERE session_id = ? AND tags.type != 'tool' AND +status = 'active'
|
|
2091
|
+
AND message_id >= owners.value || ':' AND message_id < owners.value || ';'
|
|
2092
|
+
UNION
|
|
2093
|
+
SELECT ${fields} FROM tags INDEXED BY idx_tags_session_message_id
|
|
2094
|
+
WHERE session_id = ? AND type != 'tool' AND +status = 'active'
|
|
2095
|
+
AND message_id IN (SELECT value FROM json_each(?))
|
|
2096
|
+
UNION
|
|
2097
|
+
SELECT ${fields} FROM tags INDEXED BY idx_tags_pi_fallback_tool_owner
|
|
2098
|
+
WHERE session_id = ? AND type = 'tool' AND +status = 'active'
|
|
2099
|
+
AND tool_owner_message_id IN (SELECT value FROM json_each(?))
|
|
2100
|
+
UNION
|
|
2101
|
+
SELECT ${fields} FROM tags INDEXED BY idx_tags_session_message_id
|
|
2102
|
+
WHERE session_id = ? AND type = 'tool' AND +status = 'active'
|
|
2103
|
+
AND tool_owner_message_id IS NULL AND message_id IN (SELECT value FROM json_each(?))
|
|
2104
|
+
ORDER BY tag_number, id`);
|
|
2105
|
+
scopedActiveTokenTotalStatements.set(db, scoped);
|
|
2106
|
+
}
|
|
2107
|
+
const owners = messageIds ? new Set(messageIds) : undefined;
|
|
2108
|
+
const encoded = owners ? JSON.stringify([...owners]) : "";
|
|
2109
|
+
const rows = messageIds && scoped ? scoped.all(encoded, sessionId, sessionId, encoded, sessionId, encoded, sessionId, encoded) : db.prepare(`SELECT type, message_id, tool_owner_message_id, token_count, input_token_count, reasoning_token_count
|
|
1821
2110
|
FROM tags
|
|
1822
2111
|
WHERE session_id = ? AND status = 'active'`).all(sessionId);
|
|
1823
2112
|
const out = new Map;
|
|
1824
2113
|
for (const row of rows) {
|
|
1825
2114
|
const owner = ownerMessageIdForTagRow(row);
|
|
2115
|
+
if (owners && !owners.has(owner))
|
|
2116
|
+
continue;
|
|
1826
2117
|
let entry = out.get(owner);
|
|
1827
2118
|
if (!entry) {
|
|
1828
2119
|
entry = { conversation: 0, toolCall: 0, toolOutput: 0, hasNull: false };
|
|
@@ -1902,7 +2193,7 @@ function getMaxTagNumberBySessionStatement(db) {
|
|
|
1902
2193
|
function getTagNumberByMessageIdStatement(db) {
|
|
1903
2194
|
let stmt = getTagNumberByMessageIdStatements.get(db);
|
|
1904
2195
|
if (!stmt) {
|
|
1905
|
-
stmt = db.prepare("SELECT tag_number FROM tags WHERE session_id = ? AND message_id = ? ORDER BY tag_number ASC LIMIT 1");
|
|
2196
|
+
stmt = db.prepare("SELECT tag_number FROM tags INDEXED BY idx_tags_session_message_id WHERE session_id = ? AND message_id = ? ORDER BY tag_number ASC LIMIT 1");
|
|
1906
2197
|
getTagNumberByMessageIdStatements.set(db, stmt);
|
|
1907
2198
|
}
|
|
1908
2199
|
return stmt;
|
|
@@ -1978,20 +2269,24 @@ function markWhitespaceAssistantTagInert(db, sessionId, tagNumber, contentId) {
|
|
|
1978
2269
|
entry_fingerprint = ?
|
|
1979
2270
|
WHERE session_id = ? AND tag_number = ? AND type = 'message'`).run(`${WHITESPACE_ASSISTANT_INERT_MESSAGE_PREFIX}${tagNumber}`, `${WHITESPACE_ASSISTANT_INERT_FINGERPRINT_PREFIX}${contentId}`, sessionId, tagNumber);
|
|
1980
2271
|
}
|
|
2272
|
+
var inertWhitespaceStatements = new WeakMap;
|
|
1981
2273
|
function getInertWhitespaceAssistantTags(db, sessionId, messageIds) {
|
|
1982
2274
|
if (messageIds) {
|
|
1983
|
-
|
|
1984
|
-
|
|
1985
|
-
|
|
1986
|
-
|
|
1987
|
-
|
|
1988
|
-
|
|
1989
|
-
|
|
1990
|
-
|
|
1991
|
-
|
|
1992
|
-
|
|
1993
|
-
|
|
1994
|
-
|
|
2275
|
+
let statement = inertWhitespaceStatements.get(db);
|
|
2276
|
+
if (!statement) {
|
|
2277
|
+
statement = db.prepare(`SELECT tag_number AS tagNumber, entry_fingerprint AS entryFingerprint
|
|
2278
|
+
FROM json_each(?) AS owners CROSS JOIN tags
|
|
2279
|
+
WHERE tags.session_id = ? AND tags.type = 'message' AND tags.status = 'compacted'
|
|
2280
|
+
AND entry_fingerprint >= ? || owners.value || ':p'
|
|
2281
|
+
AND entry_fingerprint < ? || owners.value || ':q'
|
|
2282
|
+
ORDER BY CAST(owners.key AS INTEGER), entry_fingerprint, tags.id`);
|
|
2283
|
+
inertWhitespaceStatements.set(db, statement);
|
|
2284
|
+
}
|
|
2285
|
+
const rows = statement.all(JSON.stringify([...new Set(messageIds)]), sessionId, WHITESPACE_ASSISTANT_INERT_FINGERPRINT_PREFIX, WHITESPACE_ASSISTANT_INERT_FINGERPRINT_PREFIX);
|
|
2286
|
+
return rows.map((row) => ({
|
|
2287
|
+
tagNumber: row.tagNumber,
|
|
2288
|
+
contentId: row.entryFingerprint.slice(WHITESPACE_ASSISTANT_INERT_FINGERPRINT_PREFIX.length)
|
|
2289
|
+
}));
|
|
1995
2290
|
}
|
|
1996
2291
|
const rows = db.prepare(`SELECT tag_number AS tagNumber, entry_fingerprint AS entryFingerprint
|
|
1997
2292
|
FROM tags
|
|
@@ -2201,9 +2496,9 @@ function foldShrunkPartTags(db, sessionId, messages) {
|
|
|
2201
2496
|
result.foldedTagNumbers.sort((a, b) => a - b);
|
|
2202
2497
|
return result;
|
|
2203
2498
|
}
|
|
2204
|
-
function markTagsCompactedByMessageIds(db, sessionId, messageIds) {
|
|
2499
|
+
function markTagsCompactedByMessageIds(db, sessionId, messageIds, eligibleTagNumbers) {
|
|
2205
2500
|
const ids = new Set(messageIds);
|
|
2206
|
-
if (ids.size === 0)
|
|
2501
|
+
if (ids.size === 0 || eligibleTagNumbers?.size === 0)
|
|
2207
2502
|
return 0;
|
|
2208
2503
|
const asciiLower = (value) => value.replace(/[A-Z]/g, (char) => char.toLowerCase());
|
|
2209
2504
|
const foldedIds = new Set(Array.from(ids, asciiLower));
|
|
@@ -2229,7 +2524,7 @@ function markTagsCompactedByMessageIds(db, sessionId, messageIds) {
|
|
|
2229
2524
|
const rows = db.prepare(`WITH ids AS MATERIALIZED (
|
|
2230
2525
|
SELECT value AS source_id, lower(value) AS folded_id FROM json_each(?)
|
|
2231
2526
|
)
|
|
2232
|
-
SELECT id, message_id, tool_owner_message_id FROM tags INDEXED BY
|
|
2527
|
+
SELECT id, tag_number, message_id, tool_owner_message_id FROM tags INDEXED BY ${tagOrderConstraintIndex(db)}
|
|
2233
2528
|
WHERE session_id = ? AND status IN ('active', 'dropped') AND (
|
|
2234
2529
|
message_id IN (SELECT source_id FROM ids)
|
|
2235
2530
|
OR tool_owner_message_id IN (SELECT source_id FROM ids)
|
|
@@ -2240,14 +2535,14 @@ function markTagsCompactedByMessageIds(db, sessionId, messageIds) {
|
|
|
2240
2535
|
OR (? AND instr(message_id, ':') > 0)
|
|
2241
2536
|
OR ?
|
|
2242
2537
|
)`).all(JSON.stringify(Array.from(ids)), sessionId, Array.from(ids).some((id) => id.includes(":")) ? 1 : 0, nulPrefixes.size > 0 ? 1 : 0);
|
|
2243
|
-
const candidates = rows.filter((row) => matches(row.message_id, row.tool_owner_message_id));
|
|
2538
|
+
const candidates = rows.filter((row) => (eligibleTagNumbers === undefined || eligibleTagNumbers.has(row.tag_number)) && matches(row.message_id, row.tool_owner_message_id));
|
|
2244
2539
|
if (candidates.length === 0)
|
|
2245
2540
|
return 0;
|
|
2246
2541
|
const update = db.prepare(`UPDATE tags SET status = 'compacted'
|
|
2247
2542
|
WHERE id = ? AND session_id = ?
|
|
2248
2543
|
AND status IN ('active', 'dropped')
|
|
2249
2544
|
AND message_id IS ? AND tool_owner_message_id IS ?
|
|
2250
|
-
RETURNING
|
|
2545
|
+
RETURNING tag_number`);
|
|
2251
2546
|
let cursor = 0;
|
|
2252
2547
|
let changed = 0;
|
|
2253
2548
|
const batch = db.transaction(() => {
|
|
@@ -2255,8 +2550,11 @@ function markTagsCompactedByMessageIds(db, sessionId, messageIds) {
|
|
|
2255
2550
|
let processed = 0;
|
|
2256
2551
|
do {
|
|
2257
2552
|
const row = candidates[cursor++];
|
|
2258
|
-
|
|
2553
|
+
const retired = update.get(row.id, sessionId, row.message_id, row.tool_owner_message_id);
|
|
2554
|
+
if (retired) {
|
|
2555
|
+
removePendingOp(db, sessionId, retired.tag_number);
|
|
2259
2556
|
changed++;
|
|
2557
|
+
}
|
|
2260
2558
|
processed++;
|
|
2261
2559
|
} while (cursor < candidates.length && processed < 128 && performance.now() - start < 8);
|
|
2262
2560
|
});
|
|
@@ -2324,10 +2622,6 @@ function deriveTagLoadFloor(db, sessionId, rawIds) {
|
|
|
2324
2622
|
return Math.max(0, min - margin);
|
|
2325
2623
|
}
|
|
2326
2624
|
var TAG_SELECT_COLUMNS = "id, message_id, type, status, drop_mode, tool_name, input_byte_size, byte_size, reasoning_byte_size, session_id, tag_number, caveman_depth, tool_owner_message_id, token_count";
|
|
2327
|
-
function getTagsBySession(db, sessionId) {
|
|
2328
|
-
const rows = db.prepare(`SELECT ${TAG_SELECT_COLUMNS} FROM tags WHERE session_id = ? ORDER BY tag_number ASC, id ASC`).all(sessionId).filter(isTagRow);
|
|
2329
|
-
return rows.map(toTagEntry);
|
|
2330
|
-
}
|
|
2331
2625
|
var getActiveTagsBySessionStatements = new WeakMap;
|
|
2332
2626
|
var getNullOwnerToolTagsBySessionStatements = new WeakMap;
|
|
2333
2627
|
var getDroppedTagsBySessionStatements = new WeakMap;
|
|
@@ -2403,6 +2697,25 @@ function getTagsByNumbers(db, sessionId, tagNumbers) {
|
|
|
2403
2697
|
const rows = db.prepare(`SELECT ${TAG_SELECT_COLUMNS} FROM tags WHERE session_id = ? AND tag_number IN (${placeholders}) ORDER BY tag_number ASC, id ASC`).all(sessionId, ...tagNumbers).filter(isTagRow);
|
|
2404
2698
|
return rows.map(toTagEntry);
|
|
2405
2699
|
}
|
|
2700
|
+
var newestToolTagNumberStatements = new WeakMap;
|
|
2701
|
+
function getNewestToolTagNumbers(db, sessionId, limit) {
|
|
2702
|
+
if (limit <= 0)
|
|
2703
|
+
return [];
|
|
2704
|
+
let statement = newestToolTagNumberStatements.get(db);
|
|
2705
|
+
if (!statement) {
|
|
2706
|
+
statement = db.prepare(`SELECT tag_number FROM tags
|
|
2707
|
+
WHERE session_id = ? AND type = 'tool'
|
|
2708
|
+
AND typeof(message_id) = 'text'
|
|
2709
|
+
AND typeof(status) = 'text'
|
|
2710
|
+
AND typeof(byte_size) IN ('integer', 'real')
|
|
2711
|
+
AND typeof(tag_number) IN ('integer', 'real')
|
|
2712
|
+
ORDER BY tag_number DESC
|
|
2713
|
+
LIMIT ?`);
|
|
2714
|
+
newestToolTagNumberStatements.set(db, statement);
|
|
2715
|
+
}
|
|
2716
|
+
return statement.all(sessionId, limit).map((row) => row.tag_number);
|
|
2717
|
+
}
|
|
2718
|
+
var droppedNumberStatements = new WeakMap;
|
|
2406
2719
|
function getDroppedTagsByNumbers(db, sessionId, tagNumbers) {
|
|
2407
2720
|
if (tagNumbers.length === 0)
|
|
2408
2721
|
return [];
|
|
@@ -2413,16 +2726,26 @@ function getDroppedTagsByNumbers(db, sessionId, tagNumbers) {
|
|
|
2413
2726
|
}
|
|
2414
2727
|
return all;
|
|
2415
2728
|
}
|
|
2416
|
-
|
|
2417
|
-
|
|
2729
|
+
let statement = droppedNumberStatements.get(db);
|
|
2730
|
+
if (!statement) {
|
|
2731
|
+
statement = db.prepare(`SELECT ${TAG_SELECT_COLUMNS} FROM tags WHERE session_id = ? AND status = 'dropped' AND tag_number IN (SELECT value FROM json_each(?)) ORDER BY tag_number ASC, id ASC`);
|
|
2732
|
+
droppedNumberStatements.set(db, statement);
|
|
2733
|
+
}
|
|
2734
|
+
const rows = statement.all(sessionId, JSON.stringify(tagNumbers)).filter(isTagRow);
|
|
2418
2735
|
return rows.map(toTagEntry);
|
|
2419
2736
|
}
|
|
2420
2737
|
function getMaxDroppedTagNumber(db, sessionId) {
|
|
2421
2738
|
const row = getMaxDroppedTagNumberStatement(db).get(sessionId);
|
|
2422
2739
|
return isMaxTagNumberRow(row) ? row.max_tag_number : 0;
|
|
2423
2740
|
}
|
|
2741
|
+
var tagByIdStatements = new WeakMap;
|
|
2424
2742
|
function getTagById(db, sessionId, tagId) {
|
|
2425
|
-
|
|
2743
|
+
let statement = tagByIdStatements.get(db);
|
|
2744
|
+
if (!statement) {
|
|
2745
|
+
statement = db.prepare(`SELECT ${TAG_SELECT_COLUMNS} FROM tags WHERE session_id = ? AND tag_number = ?`);
|
|
2746
|
+
tagByIdStatements.set(db, statement);
|
|
2747
|
+
}
|
|
2748
|
+
const result = statement.get(sessionId, tagId);
|
|
2426
2749
|
if (!isTagRow(result)) {
|
|
2427
2750
|
return null;
|
|
2428
2751
|
}
|
|
@@ -2840,19 +3163,25 @@ function countRawSessionMessageOrdinalsFromDb(db, sessionId) {
|
|
|
2840
3163
|
)`).get(sessionId);
|
|
2841
3164
|
return typeof row?.count === "number" ? row.count : 0;
|
|
2842
3165
|
}
|
|
2843
|
-
function
|
|
2844
|
-
const
|
|
2845
|
-
const
|
|
2846
|
-
|
|
2847
|
-
|
|
2848
|
-
|
|
2849
|
-
|
|
2850
|
-
|
|
2851
|
-
|
|
2852
|
-
|
|
2853
|
-
|
|
3166
|
+
function readRawSessionMessageIdOrdinalsForRangeFromDb(db, sessionId, fromOrdinal, toOrdinal) {
|
|
3167
|
+
const from = Math.max(1, Math.floor(fromOrdinal));
|
|
3168
|
+
const to = Math.floor(toOrdinal);
|
|
3169
|
+
if (to < from)
|
|
3170
|
+
return new Map;
|
|
3171
|
+
const rows = db.prepare(`
|
|
3172
|
+
SELECT id, data FROM message WHERE session_id = ?
|
|
3173
|
+
AND CASE WHEN json_valid(data) THEN NOT (
|
|
3174
|
+
COALESCE(json_type(data, '$.summary'), '') = 'true'
|
|
3175
|
+
AND COALESCE(json_extract(data, '$.finish'), '') = 'stop'
|
|
3176
|
+
) ELSE 1 END
|
|
3177
|
+
ORDER BY time_created, id LIMIT ? OFFSET ?
|
|
3178
|
+
`).all(sessionId, to - from + 1, from - 1).filter(isRawMessageRow);
|
|
3179
|
+
const result = new Map;
|
|
3180
|
+
for (const [index, row] of rows.entries()) {
|
|
3181
|
+
if (parseJsonRecord(row.data))
|
|
3182
|
+
result.set(row.id, from + index);
|
|
2854
3183
|
}
|
|
2855
|
-
return
|
|
3184
|
+
return result;
|
|
2856
3185
|
}
|
|
2857
3186
|
function readRawSessionMessageOrdinalPageFromDb(db, sessionId, after, limit) {
|
|
2858
3187
|
const pageSize = Math.max(1, Math.floor(limit));
|
|
@@ -3061,6 +3390,17 @@ function readRawSessionMessageByIdFromDb(db, sessionId, messageId) {
|
|
|
3061
3390
|
version: row.time_updated ?? null
|
|
3062
3391
|
};
|
|
3063
3392
|
}
|
|
3393
|
+
function hasRawSessionMessageByIdFromDb(db, sessionId, messageId) {
|
|
3394
|
+
const row = db.prepare("SELECT id, data, time_created FROM message WHERE session_id = ? AND id = ?").get(sessionId, messageId);
|
|
3395
|
+
if (!row || !isRawMessageRow(row) || typeof row.time_created !== "number")
|
|
3396
|
+
return false;
|
|
3397
|
+
const info = parseJsonRecord(row.data);
|
|
3398
|
+
if (!info || isRawCompactionSummaryInfo(info))
|
|
3399
|
+
return false;
|
|
3400
|
+
if (info.summary === 1 && info.finish === "stop")
|
|
3401
|
+
return readRawSessionMessageByIdFromDb(db, sessionId, messageId) !== null;
|
|
3402
|
+
return true;
|
|
3403
|
+
}
|
|
3064
3404
|
function readRawSeedTailFromDb(db, sessionId, boundaryId) {
|
|
3065
3405
|
const rows = db.prepare(`
|
|
3066
3406
|
WITH canonical AS (
|
|
@@ -3109,6 +3449,7 @@ var MAX_MESSAGE_CACHE_KEY_BYTES = 64 * 1024 * 1024;
|
|
|
3109
3449
|
var FNV1A_32_OFFSET2 = 2166136261;
|
|
3110
3450
|
var FNV1A_32_PRIME2 = 16777619;
|
|
3111
3451
|
var messageEstimateCache = new Map;
|
|
3452
|
+
var messageEstimateKeysByField = new Map;
|
|
3112
3453
|
var messageEstimateCacheBytes = 0;
|
|
3113
3454
|
var EMPTY_BREAKDOWN = {
|
|
3114
3455
|
text: 0,
|
|
@@ -3316,16 +3657,33 @@ function setCachedEstimate(key, breakdown) {
|
|
|
3316
3657
|
const existing = messageEstimateCache.get(key);
|
|
3317
3658
|
if (existing)
|
|
3318
3659
|
messageEstimateCacheBytes -= existing.keyEstimateBytes;
|
|
3660
|
+
else {
|
|
3661
|
+
for (const field of new Set(key.split("\x00").slice(1, -1))) {
|
|
3662
|
+
const keys = messageEstimateKeysByField.get(field) ?? new Set;
|
|
3663
|
+
keys.add(key);
|
|
3664
|
+
messageEstimateKeysByField.set(field, keys);
|
|
3665
|
+
}
|
|
3666
|
+
}
|
|
3319
3667
|
messageEstimateCache.set(key, { breakdown, keyEstimateBytes });
|
|
3320
3668
|
messageEstimateCacheBytes += keyEstimateBytes;
|
|
3321
3669
|
while (messageEstimateCache.size > MAX_MESSAGE_CACHE_ENTRIES || messageEstimateCacheBytes > MAX_MESSAGE_CACHE_KEY_BYTES) {
|
|
3322
3670
|
const first = messageEstimateCache.keys().next().value;
|
|
3323
3671
|
if (typeof first !== "string")
|
|
3324
3672
|
break;
|
|
3325
|
-
|
|
3326
|
-
|
|
3327
|
-
|
|
3328
|
-
|
|
3673
|
+
deleteCachedEstimate(first);
|
|
3674
|
+
}
|
|
3675
|
+
}
|
|
3676
|
+
function deleteCachedEstimate(key) {
|
|
3677
|
+
const removed = messageEstimateCache.get(key);
|
|
3678
|
+
if (!removed)
|
|
3679
|
+
return;
|
|
3680
|
+
messageEstimateCacheBytes -= removed.keyEstimateBytes;
|
|
3681
|
+
messageEstimateCache.delete(key);
|
|
3682
|
+
for (const field of new Set(key.split("\x00").slice(1, -1))) {
|
|
3683
|
+
const keys = messageEstimateKeysByField.get(field);
|
|
3684
|
+
keys?.delete(key);
|
|
3685
|
+
if (keys?.size === 0)
|
|
3686
|
+
messageEstimateKeysByField.delete(field);
|
|
3329
3687
|
}
|
|
3330
3688
|
}
|
|
3331
3689
|
function cloneBreakdown(value) {
|
|
@@ -4046,9 +4404,12 @@ function serializedText(value) {
|
|
|
4046
4404
|
return "";
|
|
4047
4405
|
return (typeof value === "string" ? value : JSON.stringify(value)) ?? "";
|
|
4048
4406
|
}
|
|
4049
|
-
|
|
4407
|
+
var wireTextTokens = createTokenCountMemo(1e5, 128 * 1024 * 1024);
|
|
4408
|
+
function serializedTokens(value, bounded = false) {
|
|
4050
4409
|
const serialized = serializedText(value);
|
|
4051
|
-
|
|
4410
|
+
if (bounded && tokenCountUsesByteBound(serialized))
|
|
4411
|
+
return Buffer.byteLength(serialized);
|
|
4412
|
+
return serialized ? wireTextTokens(serialized) : 0;
|
|
4052
4413
|
}
|
|
4053
4414
|
function visitWireContent(message, visit) {
|
|
4054
4415
|
for (const part of message.parts) {
|
|
@@ -4108,11 +4469,11 @@ function visitWireContent(message, visit) {
|
|
|
4108
4469
|
}
|
|
4109
4470
|
}
|
|
4110
4471
|
}
|
|
4111
|
-
function estimateMessageTokens(message) {
|
|
4472
|
+
function estimateMessageTokens(message, bounded = false) {
|
|
4112
4473
|
const total = { conversation: 0, toolCall: 0 };
|
|
4113
4474
|
visitWireContent(message, {
|
|
4114
4475
|
text: (bucket, value) => {
|
|
4115
|
-
total[bucket] += serializedTokens(value);
|
|
4476
|
+
total[bucket] += serializedTokens(value, bounded);
|
|
4116
4477
|
},
|
|
4117
4478
|
image: (bucket, tokens) => {
|
|
4118
4479
|
total[bucket] += tokens;
|
|
@@ -4140,9 +4501,99 @@ function wireContentBytes(messages, abortAboveBytes, bytesPerToken) {
|
|
|
4140
4501
|
}
|
|
4141
4502
|
return { bytes, aborted: false };
|
|
4142
4503
|
}
|
|
4504
|
+
function createFinalWireUsageTracker() {
|
|
4505
|
+
const served = new Map;
|
|
4506
|
+
const wireRows = (input) => input.messages.filter((message) => message.parts.some((part) => !part || typeof part !== "object" || !["step-start", "step-finish"].includes(String(part.type))));
|
|
4507
|
+
const rowBytes = (message) => JSON.stringify({ id: message.info.id, role: message.info.role, parts: message.parts });
|
|
4508
|
+
const envelopeFor = (input) => {
|
|
4509
|
+
if (!input.providerID || !input.modelID || !input.systemPromptHash)
|
|
4510
|
+
return;
|
|
4511
|
+
const tools = getToolDefinitionMeasurementSignature(input.providerID, input.modelID, input.agentName);
|
|
4512
|
+
if (!tools)
|
|
4513
|
+
return;
|
|
4514
|
+
return JSON.stringify([
|
|
4515
|
+
input.providerID,
|
|
4516
|
+
input.modelID,
|
|
4517
|
+
input.agentName,
|
|
4518
|
+
input.systemPromptHash,
|
|
4519
|
+
input.systemPromptTokens,
|
|
4520
|
+
tools
|
|
4521
|
+
]);
|
|
4522
|
+
};
|
|
4523
|
+
return {
|
|
4524
|
+
estimate(sessionId, input, limit) {
|
|
4525
|
+
let measuredPrefix;
|
|
4526
|
+
try {
|
|
4527
|
+
const previous = served.get(sessionId);
|
|
4528
|
+
const rows = wireRows(input);
|
|
4529
|
+
if (previous && previous.envelope === envelopeFor(input) && rows.length > previous.prefix.length && previous.prefix.every((bytes, i) => rowBytes(rows[i]) === bytes)) {
|
|
4530
|
+
const reply = rows[previous.prefix.length]?.info;
|
|
4531
|
+
const tokens = reply.tokens;
|
|
4532
|
+
const time = reply.time;
|
|
4533
|
+
const counts = [tokens?.input, tokens?.cache?.read, tokens?.cache?.write];
|
|
4534
|
+
if (reply.role === "assistant" && reply.parentID === previous.parent && reply.providerID === input.providerID && reply.modelID === input.modelID && ["stop", "tool-calls", "length"].includes(String(reply.finish)) && !reply.error && typeof time?.completed === "number" && time.completed >= previous.at && counts.every((n) => typeof n === "number" && Number.isSafeInteger(n) && n >= 0)) {
|
|
4535
|
+
const inputTokens = counts.reduce((sum, n) => sum + (n ?? 0), 0);
|
|
4536
|
+
if (inputTokens > 0)
|
|
4537
|
+
measuredPrefix = {
|
|
4538
|
+
inputTokens,
|
|
4539
|
+
appendedMessages: rows.slice(previous.prefix.length)
|
|
4540
|
+
};
|
|
4541
|
+
}
|
|
4542
|
+
}
|
|
4543
|
+
} catch {}
|
|
4544
|
+
return estimateOutgoingWireForRefusal({ ...input, measuredPrefix }, limit);
|
|
4545
|
+
},
|
|
4546
|
+
capture(sessionId, input) {
|
|
4547
|
+
served.delete(sessionId);
|
|
4548
|
+
try {
|
|
4549
|
+
const envelope = envelopeFor(input);
|
|
4550
|
+
const rows = wireRows(input);
|
|
4551
|
+
const parent = [...rows].reverse().find((row) => row.info.role === "user")?.info.id;
|
|
4552
|
+
if (!envelope || typeof parent !== "string" || !rows.every(hasCountableParts))
|
|
4553
|
+
return;
|
|
4554
|
+
const prefix = rows.map(rowBytes);
|
|
4555
|
+
if (prefix.reduce((sum, text) => sum + text.length, 0) > 4 * 1024 * 1024)
|
|
4556
|
+
return;
|
|
4557
|
+
if (served.size >= 16)
|
|
4558
|
+
served.delete(served.keys().next().value);
|
|
4559
|
+
served.set(sessionId, { envelope, prefix, parent, at: Date.now() });
|
|
4560
|
+
} catch {}
|
|
4561
|
+
}
|
|
4562
|
+
};
|
|
4563
|
+
}
|
|
4564
|
+
function estimateOutgoingWireForRefusal(input, limit) {
|
|
4565
|
+
if (typeof limit === "number" && Number.isFinite(limit) && limit > 0) {
|
|
4566
|
+
const measured = input.measuredPrefix;
|
|
4567
|
+
const baseline = measured?.inputTokens ?? 0;
|
|
4568
|
+
const pricedMessages = measured?.appendedMessages ?? input.messages;
|
|
4569
|
+
const bytes = wireContentBytes(pricedMessages, Math.max(0, limit - baseline) * 4, 4);
|
|
4570
|
+
if (bytes) {
|
|
4571
|
+
const lower = baseline + Math.ceil(bytes.bytes / 4);
|
|
4572
|
+
const calibration = resolveDecisionCalibration(input.providerID, input.modelID);
|
|
4573
|
+
const tools = input.providerID && input.modelID ? getMeasuredToolDefinitionTokens(input.providerID, input.modelID, input.agentName) : undefined;
|
|
4574
|
+
const envelope = measured ? baseline : tools !== undefined && Number.isFinite(input.systemPromptTokens) && input.systemPromptTokens > 0 ? providerMass({ system: input.systemPromptTokens, tools }, calibration, true) : undefined;
|
|
4575
|
+
const upper = envelope === undefined ? undefined : envelope + Math.ceil(bytes.bytes * Math.max(UNKNOWN_FIT_RATIO, calibration.toolsRatio, calibration.proseRatio));
|
|
4576
|
+
if (bytes.aborted || lower > limit || upper !== undefined && upper <= limit) {
|
|
4577
|
+
const over = bytes.aborted || lower > limit;
|
|
4578
|
+
return {
|
|
4579
|
+
tokens: over ? lower : upper,
|
|
4580
|
+
trusted: !over,
|
|
4581
|
+
refusalGrade: over && envelope !== undefined,
|
|
4582
|
+
refusalTokens: over ? lower : undefined,
|
|
4583
|
+
refusalBasis: "byte-bound",
|
|
4584
|
+
messageTokens: { conversation: 0, toolCall: 0 },
|
|
4585
|
+
systemTokens: input.systemPromptTokens,
|
|
4586
|
+
toolDefinitionTokens: tools,
|
|
4587
|
+
toolDefinitionsMeasured: tools !== undefined
|
|
4588
|
+
};
|
|
4589
|
+
}
|
|
4590
|
+
}
|
|
4591
|
+
}
|
|
4592
|
+
return estimateFinalWireInputTokens({ ...input, boundedTokenization: true });
|
|
4593
|
+
}
|
|
4143
4594
|
function estimateFinalWireInputTokens(input) {
|
|
4144
4595
|
const messageTokens = input.messages.reduce((total, message) => {
|
|
4145
|
-
const next = estimateMessageTokens(message);
|
|
4596
|
+
const next = estimateMessageTokens(message, input.boundedTokenization);
|
|
4146
4597
|
total.conversation += next.conversation;
|
|
4147
4598
|
total.toolCall += next.toolCall;
|
|
4148
4599
|
return total;
|
|
@@ -4158,11 +4609,25 @@ function estimateFinalWireInputTokens(input) {
|
|
|
4158
4609
|
};
|
|
4159
4610
|
const tokens = providerMass(rawComponents, calibration, true);
|
|
4160
4611
|
const complete = Number.isFinite(tokens) && tokens > 0 && Number.isFinite(input.systemPromptTokens) && input.systemPromptTokens > 0 && toolDefinitions !== undefined && input.messages.every(hasCountableParts);
|
|
4612
|
+
const refusalGrade = complete && hasTokenizerForFit() && measuredToolDefinitions !== undefined && hasMeasuredDecisionCalibration(calibration) && input.messages.every(hasRefusalCountableParts);
|
|
4613
|
+
const measured = input.measuredPrefix;
|
|
4614
|
+
const useMeasured = refusalGrade && measured && Number.isSafeInteger(measured.inputTokens) && measured.inputTokens > 0 && measured.appendedMessages.every(hasCountableParts);
|
|
4615
|
+
const tail = useMeasured ? measured.appendedMessages.reduce((sum, message) => {
|
|
4616
|
+
const next = estimateMessageTokens(message, input.boundedTokenization);
|
|
4617
|
+
return {
|
|
4618
|
+
conversation: sum.conversation + next.conversation,
|
|
4619
|
+
toolCall: sum.toolCall + next.toolCall
|
|
4620
|
+
};
|
|
4621
|
+
}, { conversation: 0, toolCall: 0 }) : undefined;
|
|
4622
|
+
const refusalTokens = refusalGrade ? tail && measured ? measured.inputTokens + providerMass({ tools: tail.toolCall, prose: tail.conversation }, calibration) : providerMass(rawComponents, calibration) : undefined;
|
|
4161
4623
|
const systemTokens = Math.round(Math.max(0, input.systemPromptTokens) * calibration.systemRatio);
|
|
4162
4624
|
const toolDefinitionTokens = toolDefinitions === undefined ? undefined : Math.round(toolDefinitions * (calibration.seeded ? calibration.toolsRatio : UNKNOWN_FIT_RATIO));
|
|
4163
4625
|
return {
|
|
4164
4626
|
tokens,
|
|
4165
4627
|
trusted: complete,
|
|
4628
|
+
refusalGrade,
|
|
4629
|
+
refusalTokens,
|
|
4630
|
+
refusalBasis: refusalGrade ? useMeasured ? "provider-prefix" : "calibrated" : undefined,
|
|
4166
4631
|
rawTokens: rawComponents.system + rawComponents.tools + rawComponents.prose,
|
|
4167
4632
|
rawComponents,
|
|
4168
4633
|
completeness: complete ? "complete" : "partial",
|
|
@@ -4173,6 +4638,33 @@ function estimateFinalWireInputTokens(input) {
|
|
|
4173
4638
|
toolDefinitionsMeasured: measuredToolDefinitions !== undefined
|
|
4174
4639
|
};
|
|
4175
4640
|
}
|
|
4641
|
+
function hasRefusalCountableParts(message) {
|
|
4642
|
+
let exact = true;
|
|
4643
|
+
visitWireContent(message, {
|
|
4644
|
+
text: (_bucket, value) => {
|
|
4645
|
+
if (tokenCountUsesByteBound(serializedText(value)))
|
|
4646
|
+
exact = false;
|
|
4647
|
+
},
|
|
4648
|
+
image: () => {}
|
|
4649
|
+
});
|
|
4650
|
+
return exact;
|
|
4651
|
+
}
|
|
4652
|
+
function estimateAppendedWireTokens(input) {
|
|
4653
|
+
const messageTokens = input.messages.reduce((total, message) => {
|
|
4654
|
+
const next = estimateMessageTokens(message);
|
|
4655
|
+
total.conversation += next.conversation;
|
|
4656
|
+
total.toolCall += next.toolCall;
|
|
4657
|
+
return total;
|
|
4658
|
+
}, { conversation: 0, toolCall: 0 });
|
|
4659
|
+
const tokens = providerMass({ prose: messageTokens.conversation, tools: messageTokens.toolCall }, resolveDecisionCalibration(input.providerID, input.modelID), true);
|
|
4660
|
+
return {
|
|
4661
|
+
tokens,
|
|
4662
|
+
trusted: hasTokenizerForFit() && Number.isFinite(tokens) && tokens >= 0 && input.messages.every(hasCountableParts),
|
|
4663
|
+
messageTokens,
|
|
4664
|
+
systemTokens: 0,
|
|
4665
|
+
toolDefinitionTokens: 0
|
|
4666
|
+
};
|
|
4667
|
+
}
|
|
4176
4668
|
function hasCountableParts(message) {
|
|
4177
4669
|
return message.parts.every((part) => {
|
|
4178
4670
|
if (!part || typeof part !== "object")
|
|
@@ -4779,12 +5271,15 @@ class ToolMutationBatch {
|
|
|
4779
5271
|
}
|
|
4780
5272
|
const scopedSweep = this.resolveScopedSweep();
|
|
4781
5273
|
const removed = new Set;
|
|
4782
|
-
|
|
5274
|
+
let writeIndex = 0;
|
|
5275
|
+
for (let i = 0;i < this.messages.length; i += 1) {
|
|
4783
5276
|
if ((!scopedSweep || this.affectedMessages.has(this.messages[i])) && !this.messages[i].parts.some(hasMeaningfulPart)) {
|
|
4784
5277
|
removed.add(this.messages[i]);
|
|
4785
|
-
|
|
5278
|
+
} else {
|
|
5279
|
+
this.messages[writeIndex++] = this.messages[i];
|
|
4786
5280
|
}
|
|
4787
5281
|
}
|
|
5282
|
+
this.messages.length = writeIndex;
|
|
4788
5283
|
this.pruneServedRows(removed);
|
|
4789
5284
|
this.partsToRemove.clear();
|
|
4790
5285
|
this.affectedMessages.clear();
|
|
@@ -5101,17 +5596,17 @@ function readRawSessionMessages2(sessionId) {
|
|
|
5101
5596
|
}
|
|
5102
5597
|
return readRawSessionMessagesFromSource(sessionId);
|
|
5103
5598
|
}
|
|
5104
|
-
function readRawSessionMessagePage2(sessionId, afterOrdinal, limit, finalWatermark) {
|
|
5599
|
+
function readRawSessionMessagePage2(sessionId, afterOrdinal, limit, finalWatermark, after) {
|
|
5105
5600
|
const provider = sessionProviders.get(sessionId)?.provider;
|
|
5106
5601
|
if (provider?.readMessagePage) {
|
|
5107
|
-
return provider.readMessagePage(afterOrdinal, limit, finalWatermark);
|
|
5602
|
+
return provider.readMessagePage(afterOrdinal, limit, finalWatermark, after);
|
|
5108
5603
|
}
|
|
5109
5604
|
if (provider) {
|
|
5110
5605
|
return provider.readMessages().filter((message) => message.ordinal > afterOrdinal && message.ordinal <= finalWatermark).slice(0, limit);
|
|
5111
5606
|
}
|
|
5112
5607
|
if (!openCodeDbExists())
|
|
5113
5608
|
return [];
|
|
5114
|
-
return withReadOnlySessionDb((db) => readRawSessionMessagePageFromDb(db, sessionId, afterOrdinal, limit, finalWatermark));
|
|
5609
|
+
return withReadOnlySessionDb((db) => readRawSessionMessagePageFromDb(db, sessionId, afterOrdinal, limit, finalWatermark, after));
|
|
5115
5610
|
}
|
|
5116
5611
|
function getRawSessionMessageOrdinalCount2(sessionId) {
|
|
5117
5612
|
const provider = sessionProviders.get(sessionId)?.provider;
|
|
@@ -5324,7 +5819,10 @@ function readRawSessionMessageIdOrdinalsForRange2(sessionId, fromOrdinal, toOrdi
|
|
|
5324
5819
|
if (provider?.readMessageIdOrdinalsForRange) {
|
|
5325
5820
|
return provider.readMessageIdOrdinalsForRange(from, to);
|
|
5326
5821
|
}
|
|
5327
|
-
|
|
5822
|
+
if (!provider) {
|
|
5823
|
+
return !openCodeDbExists() ? new Map : withReadOnlySessionDb((db) => readRawSessionMessageIdOrdinalsForRangeFromDb(db, sessionId, from, to));
|
|
5824
|
+
}
|
|
5825
|
+
const all = provider?.readMessageIdOrdinals ? provider.readMessageIdOrdinals() : new Map(provider.readMessages().map((message) => [message.id, message.ordinal]));
|
|
5328
5826
|
return new Map([...all].filter(([, ordinal]) => ordinal >= from && ordinal <= to));
|
|
5329
5827
|
}
|
|
5330
5828
|
function readRawSessionMessageIdOrdinals2(sessionId) {
|
|
@@ -5348,6 +5846,8 @@ function hasRawSessionMessageById2(sessionId, messageId) {
|
|
|
5348
5846
|
const provider = sessionProviders.get(sessionId)?.provider;
|
|
5349
5847
|
if (provider?.hasMessageById)
|
|
5350
5848
|
return provider.hasMessageById(messageId);
|
|
5849
|
+
if (!provider)
|
|
5850
|
+
return openCodeDbExists() && withReadOnlySessionDb((db) => hasRawSessionMessageByIdFromDb(db, sessionId, messageId));
|
|
5351
5851
|
return readRawSessionMessageById2(sessionId, messageId) !== null;
|
|
5352
5852
|
}
|
|
5353
5853
|
function readRawSessionMessageOrdinalById2(sessionId, messageId) {
|
|
@@ -5491,8 +5991,9 @@ async function getRawSessionTagKeysThrough2(sessionId, upToMessageIndex, options
|
|
|
5491
5991
|
};
|
|
5492
5992
|
const firstOrdinal = Number.isFinite(options.fromMessageIndex) ? Math.max(1, Math.floor(options.fromMessageIndex ?? 1)) : 1;
|
|
5493
5993
|
let afterOrdinal = firstOrdinal - 1;
|
|
5994
|
+
let after;
|
|
5494
5995
|
while (afterOrdinal < finalWatermark) {
|
|
5495
|
-
const messages = readRawSessionMessages2.readPage(sessionId, afterOrdinal, pageSize, finalWatermark);
|
|
5996
|
+
const messages = readRawSessionMessages2.readPage(sessionId, afterOrdinal, pageSize, finalWatermark, after);
|
|
5496
5997
|
if (messages.length === 0)
|
|
5497
5998
|
break;
|
|
5498
5999
|
let nextOrdinal = afterOrdinal;
|
|
@@ -5534,6 +6035,8 @@ async function getRawSessionTagKeysThrough2(sessionId, upToMessageIndex, options
|
|
|
5534
6035
|
if (nextOrdinal <= afterOrdinal)
|
|
5535
6036
|
break;
|
|
5536
6037
|
afterOrdinal = nextOrdinal;
|
|
6038
|
+
const last = messages.at(-1);
|
|
6039
|
+
after = last ? { timeCreated: last.createdAt ?? 0, id: last.id } : undefined;
|
|
5537
6040
|
if (afterOrdinal < finalWatermark)
|
|
5538
6041
|
await yieldToEventLoop();
|
|
5539
6042
|
}
|
|
@@ -5860,4 +6363,4 @@ function readRawSessionSeedTail2(sessionId, boundaryId, onQuery) {
|
|
|
5860
6363
|
});
|
|
5861
6364
|
}
|
|
5862
6365
|
|
|
5863
|
-
export { isPrefixBoundThinkingModel, detectOverflow,
|
|
6366
|
+
export { isPrefixBoundThinkingModel, detectOverflow, protectedToolTagNumbers, protectedToolTokenCount, stripWellFormedLeadingTagPrefix, byteSize, stripTagPrefix, peelLeadingMcTagNotation, prependTag, isThinkingPart, isRecord, contentTagOwnerMessageId, estimateImageTokensFromDataUrl, estimateToolAttachmentImageTokens, normalizeTodoStateJson, buildSyntheticTodoPart, computeSyntheticCallId, isSyntheticTodoPart, countRealUserMessages, tailHygieneStructuralSignature, sameTailHygieneStructuralSignature, formatTailHygienePrefixMismatch, refreshTailHygieneBaseline, effectiveTailHygiene, assertTailHygieneContentUnchangedIfEnabled, CHANNEL1_SENTINEL, CHANNEL1_FLOOR_TOKENS, isDroppedToolOutput, toolOutputTokens, decideChannel1, evaluateChannel2, formatChannel1Evaluation, formatChannel2Evaluation, reclaimableToolOutputCount, buildChannel2Reminder, buildChannel1Reminder, estimateEmergencyDropReclaimTokens, planEmergencyDrop, measureEmergencyTag, queuePendingOp, queuePendingDropForUnchangedTag, getPendingOps, hasPendingDropOps, getPendingOpsCount, clearPendingOps, removePendingOp, getRecentTagOwnerMessageIds, AGE_RECLAIM_MIN_TOKENS, getOldestActiveUnprotectedToolTags, getActiveToolTagsForAgeReclaim, getTriggerTagTokenUpperBound, getActiveTagTokenTotalsByMessage, getAllStatusTagTokenTotalsFlat, tagTokenCountIsNull, backfillTagTokenCounts, insertTag, updateTagStatus, markWhitespaceAssistantTagInert, getInertWhitespaceAssistantTags, updateTagDropMode, updateCavemanDepth, updateTagMessageId, foldShrunkPartTags, markTagsCompactedByMessageIds, getMaxTagNumberBySession, getTagNumberByMessageId, getAssignableTagNumberByMessageId, deriveTagLoadFloor, TAG_SELECT_COLUMNS, getActiveTagsBySession, getTailHygieneTags, getDroppedTagsBySession, getTagsByNumbers, getNewestToolTagNumbers, getDroppedTagsByNumbers, getMaxDroppedTagNumber, getTagById, getToolTagNumberByOwner, getNullOwnerToolTag, adoptNullOwnerToolTag, getCandidateToolOwners, pickNearestPriorOwner, expandToolPart, markHostUnservedRow, retreatPastHostUnservedRows, snapTerminalCompartmentToServedRow, isHostRenderedSystemMessage, isStrictGapHealingMessage, isRawCompactionSummaryInfo, extractInMemoryMessageViews, buildInMemoryTailRawMessages, completedToolArcCrossesBoundary, estimateTrueRawMessageTokens, buildToolArcs, fenceBoundaryForCompletedToolArcs, fenceBoundaryForToolArcs, buildTrueRawTokenIndex, computeRawRangeFingerprint, stripSystemInjection, isTextPart, isToolPartWithOutput, isFilePart, buildFileSourceContent, toolPartHasUserAnswer, DreamTokenBudgetExceeded, TOKEN_BUDGET_FINALIZE_MESSAGE, registerBudgetFinalizeChild, releaseBudgetFinalizeChild, createDreamTokenBudget, recordToolParameters, createDroppedInputGuard, assertExecutableToolInput, isEditTool, describeFinalWireTail, estimateMessageTokens, wireContentBytes, createFinalWireUsageTracker, estimateFinalWireInputTokens, estimateAppendedWireTokens, modelAcceptsEmptyContent, isAnthropicFamilyRoute, neutralizeDroppedReasoningPart, restoreNeutralizedReasoningPart, isNeutralizedReasoningPart, variantChangeBustsProviderCache, makeSentinel, makeWholeMessageSentinel, isSentinel, replaySentinelByMessageIds, SKELETON_REAL_INPUT_MAX_BYTES, partHasCompletedResult, extractToolCallObservation, ToolMutationBatch, createToolDropTarget, resolveHostServedBoundaryId2, hasRawMessageProvider2, setRawMessageProvider2, setBoundedRawMessageProvider2, withRawMessageProvider2, cleanUserText2, withRawSessionMessageCache2, readRawSessionMessages2, readRawSessionMessagePage2, getRawSessionMessageOrdinalCount2, RAW_MESSAGE_VISIT_PAGE_SIZE2, visitRawSessionMessages2, readRawSessionMessageRange2, primeTailRawMessageCache2, getCachedAbsoluteMessageCount2, primeInMemoryTailRawMessageCache2, readRawSessionMessageOrdinalPage2, getRawSessionStoredMessageCount2, readRawSessionMessageIdOrdinalsForRange2, readRawSessionMessageIdOrdinals2, readRawSessionMessagePartsById2, hasRawSessionMessageById2, readRawSessionMessageOrdinalById2, compareRawSessionMessageOrder2, readRawSessionMessageById2, getRawSessionMessageCount2, RAW_SESSION_TAG_KEY_PAGE_SIZE2, getRawSessionTagKeysThrough2, getLegacyProtectedTailStartOrdinal2, getProtectedTailStartOrdinal2, readSessionChunk2, getRawSessionMessageIdsThrough2, readRawSessionSeedTail2 };
|