@iowarp/clio-coder 0.3.7 → 0.3.9
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 +80 -0
- package/README.md +13 -4
- package/dist/{acp-SK4MD6MM.js → acp-7LOELQFP.js} +13 -13
- package/dist/{agents-2FN2K6ME.js → agents-FIBG2SHA.js} +41 -37
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-QIYZWM5I.js → auth-OI4LIH2I.js} +31 -24
- package/dist/builtins-AD25UL3C.js +17 -0
- package/dist/{chunk-5FR74PWO.js → chunk-2JDWVJND.js} +2 -2
- package/dist/chunk-3DPEIQKN.js +113 -0
- package/dist/{chunk-EOOQZZDE.js → chunk-3DUR4WUA.js} +19 -19
- package/dist/{chunk-WHJYKASB.js → chunk-3MRC2YSQ.js} +2 -2
- package/dist/{chunk-EBEFWSGL.js → chunk-3UUY7R3Z.js} +14 -10
- package/dist/{chunk-LADCF22A.js → chunk-3V5AYSEQ.js} +113 -54
- package/dist/{chunk-BMWK7ZIZ.js → chunk-465CC7FK.js} +16 -13
- package/dist/{chunk-5WIGXA4T.js → chunk-47CMYGET.js} +111 -4
- package/dist/{chunk-CEYBNUGC.js → chunk-4H6ULJ3H.js} +378 -36
- package/dist/{chunk-YTYFXUI3.js → chunk-4LJX2PUC.js} +9 -9
- package/dist/{chunk-DOOEX22V.js → chunk-56KB5IJP.js} +5 -5
- package/dist/{chunk-SPULKLCF.js → chunk-5DQRIYDZ.js} +2 -2
- package/dist/{chunk-TSHXZTOQ.js → chunk-5HFBWUMU.js} +23 -11
- package/dist/{chunk-5UJ6ECTS.js → chunk-5PVQ4SRS.js} +80 -8
- package/dist/{chunk-ZWLZP4ZT.js → chunk-5QKCQQ3E.js} +359 -17
- package/dist/{chunk-6M7VS3J3.js → chunk-5T7RBWN2.js} +111 -5
- package/dist/chunk-774ILSRL.js +172 -0
- package/dist/chunk-7C6RYZGQ.js +391 -0
- package/dist/{chunk-GH5622CP.js → chunk-A2NJGIB3.js} +2 -2
- package/dist/{chunk-C4JBQ5SR.js → chunk-AD7Y7STJ.js} +6 -6
- package/dist/{chunk-GEYXPTRF.js → chunk-AEYBF3TB.js} +33 -12
- package/dist/{chunk-2SFS6XQE.js → chunk-AMKHQW3C.js} +3 -2
- package/dist/{chunk-D4MDIG46.js → chunk-B5CSFE7B.js} +7 -7
- package/dist/{chunk-MXI6J5JF.js → chunk-B5XRQOLB.js} +10 -10
- package/dist/{chunk-X2KV5FXT.js → chunk-BVDVID7E.js} +2 -2
- package/dist/{chunk-JNXPYBB4.js → chunk-CA42X6KT.js} +3 -3
- package/dist/{chunk-VREKEFLL.js → chunk-D73KXYPF.js} +3 -3
- package/dist/{chunk-JTSEDYVQ.js → chunk-DG4M6ZUE.js} +7 -7
- package/dist/{chunk-DQA7QLMD.js → chunk-EBOC7MT3.js} +10 -25
- package/dist/{chunk-KZ2H5X4G.js → chunk-ECUO3KDP.js} +129 -14
- package/dist/{chunk-JRIO5UD2.js → chunk-EQ63NRB7.js} +5 -5
- package/dist/{chunk-YD734TPH.js → chunk-FALJGAWU.js} +2 -2
- package/dist/{chunk-GWS3VEIW.js → chunk-FWDFM5ZU.js} +24 -3
- package/dist/{chunk-XEGB6BCN.js → chunk-GAYUJ7LE.js} +68 -14
- package/dist/{chunk-UND3GU2L.js → chunk-H7IXIC72.js} +2 -2
- package/dist/{chunk-IR4CFBFN.js → chunk-HAY4ZE2P.js} +12 -12
- package/dist/{chunk-UVDSQ6LW.js → chunk-HCBCAYZU.js} +74 -147
- package/dist/{chunk-4DWFMQDR.js → chunk-HJB5IUKP.js} +89 -145
- package/dist/{chunk-M4AKACEO.js → chunk-HKO36JWF.js} +33 -5
- package/dist/{chunk-KCMKRQX4.js → chunk-HPCTNZM2.js} +45 -82
- package/dist/{chunk-465YSENW.js → chunk-IFBNV6H6.js} +3 -3
- package/dist/{chunk-FJ3H4MN5.js → chunk-IHKBWSXF.js} +2 -2
- package/dist/chunk-JEQQR47K.js +3025 -0
- package/dist/{chunk-FO5ZOVUY.js → chunk-KV2AOLDF.js} +27 -7
- package/dist/chunk-LU7P4LHA.js +33 -0
- package/dist/{chunk-6TUKSZVF.js → chunk-LXPJXFM5.js} +11 -11
- package/dist/{chunk-VQNODYQ4.js → chunk-MIX5N5AC.js} +488 -3668
- package/dist/chunk-MLOK6ZOS.js +2888 -0
- package/dist/{chunk-ZZMN5OM4.js → chunk-MV2VUEJC.js} +2 -2
- package/dist/{chunk-MVVUPGPW.js → chunk-MXHC5QYU.js} +6 -6
- package/dist/{chunk-OBMAI2DP.js → chunk-N3PBVRTZ.js} +12 -388
- package/dist/{chunk-WJHBC77E.js → chunk-N5XKWMDW.js} +17 -7
- package/dist/{chunk-5C3AQNDW.js → chunk-NNNWO6F2.js} +124 -36
- package/dist/{chunk-UFQ3F4FW.js → chunk-NQ6UCCOD.js} +4 -4
- package/dist/chunk-NUGM5KR6.js +165 -0
- package/dist/{chunk-DMD2AGVS.js → chunk-NZU6YDNV.js} +20 -18
- package/dist/{chunk-WHGPSPT5.js → chunk-O6I4CIEU.js} +151 -13
- package/dist/{chunk-XN3L4EYL.js → chunk-OEDBCISO.js} +2 -2
- package/dist/{chunk-PD3MESLB.js → chunk-P3JGPQFL.js} +4 -4
- package/dist/{chunk-UHXRNZ2J.js → chunk-PNY46YEY.js} +23 -6
- package/dist/{chunk-THKY7CD7.js → chunk-PZ4I4JE2.js} +134 -29
- package/dist/{chunk-SROCI7ZU.js → chunk-QQ7EKM72.js} +5 -5
- package/dist/{chunk-QCTRSGHQ.js → chunk-R7LNVMCS.js} +91 -53
- package/dist/{chunk-GOXNB3AO.js → chunk-RAPCMZL4.js} +75 -4
- package/dist/chunk-RKKLTLYB.js +45 -0
- package/dist/{chunk-OB5HIGJY.js → chunk-RKRLDWD3.js} +4 -1
- package/dist/{chunk-DJNLUABN.js → chunk-S4COXYBG.js} +588 -32
- package/dist/{chunk-3HAPLH5M.js → chunk-T3Z6VAAF.js} +172 -11
- package/dist/{chunk-FOT2FX5J.js → chunk-TD7UE2L5.js} +12 -10
- package/dist/{chunk-UUANF5CR.js → chunk-TEO2TLVN.js} +856 -967
- package/dist/{chunk-FCSXB6T2.js → chunk-UOSL25KY.js} +14 -2
- package/dist/{chunk-EELBMBT6.js → chunk-VKBMFOYV.js} +74 -15
- package/dist/chunk-VO2LKSTM.js +165 -0
- package/dist/{chunk-5C77SEEY.js → chunk-VPTUJU4P.js} +3 -3
- package/dist/{chunk-WEH5XRJQ.js → chunk-WIE7ZOSW.js} +2 -2
- package/dist/{chunk-J7PIKKWC.js → chunk-WXCJ7VME.js} +8 -8
- package/dist/{chunk-4DGYLA73.js → chunk-XDOQXGFO.js} +22 -7
- package/dist/{chunk-PPAMZ32Z.js → chunk-XK56QHLX.js} +6 -1
- package/dist/{chunk-AB4XIIVB.js → chunk-YKOFT37S.js} +6 -6
- package/dist/chunk-YSEHGPCT.js +127 -0
- package/dist/{chunk-HFSBBKSQ.js → chunk-YW7UVM5V.js} +138 -3
- package/dist/cli/index.js +32 -32
- package/dist/{clio-WBVQEBKO.js → clio-LT5V7SSZ.js} +9 -9
- package/dist/{code-nav-FGGFIE7L.js → code-nav-LMW275PA.js} +5 -5
- package/dist/codewiki/build-worker.js +4 -4
- package/dist/{components-F7OEATSO.js → components-ZFA3SAER.js} +8 -8
- package/dist/{config-TRBL3RCF.js → config-RXS5T3JT.js} +98 -65
- package/dist/{configure-OLCVPHNM.js → configure-2WYWSCSD.js} +26 -22
- package/dist/{context-MJIJ6GOX.js → context-I3BTOTCS.js} +12 -12
- package/dist/{context-XEWE3MOJ.js → context-MVOORGMF.js} +54 -47
- package/dist/{context-WFPKQSM6.js → context-PALKKQYL.js} +28 -28
- package/dist/{context-clear-KNOS2JPB.js → context-clear-N2WOYZ2K.js} +53 -46
- package/dist/{context-index-SSR5ECNE.js → context-index-HNG3MOME.js} +6 -6
- package/dist/{context-working-set-EUXAZI6N.js → context-working-set-MIEVECVZ.js} +17 -18
- package/dist/{dispatch-runner-B7MTOVKL.js → dispatch-runner-VVA4SRRH.js} +90 -61
- package/dist/{docs-FLJTIDSE.js → docs-7LQ23DLM.js} +8 -8
- package/dist/doctor-TWBWFK5V.js +165 -0
- package/dist/eval-IJ5VEZDJ.js +4483 -0
- package/dist/{evidence-JZNBUOQZ.js → evidence-L5APPXNV.js} +68 -61
- package/dist/{evolve-FJVC4KKI.js → evolve-RGNKFJ52.js} +47 -40
- package/dist/{extensions-IQL36S7K.js → extensions-7WYWUX5A.js} +13 -7
- package/dist/{fleet-BDKYJFCP.js → fleet-6CNVBZZP.js} +113 -76
- package/dist/{fleet-commands-ZFIWZSB3.js → fleet-commands-L2SXSYEI.js} +10 -10
- package/dist/{fleet-graph-Y6HPXIVF.js → fleet-graph-2J3OOIPO.js} +17 -15
- package/dist/{fleet-preflight-BHSNPBMH.js → fleet-preflight-CZRJ4JP5.js} +5 -6
- package/dist/{fleet-validate-BIYREGIK.js → fleet-validate-C5RI6DP7.js} +20 -19
- package/dist/{init-LQUB5COQ.js → init-VBN2ACVA.js} +70 -63
- package/dist/{library-NJAHIGG4.js → library-JHGUMLY2.js} +22 -20
- package/dist/{memory-OG6HOYKM.js → memory-K4OQIYWG.js} +49 -42
- package/dist/{models-5ZG5XY7J.js → models-2NCZUWDD.js} +35 -29
- package/dist/{monitor-TJ7AMTGB.js → monitor-MMVTJABD.js} +64 -45
- package/dist/{orchestrator-WZYB54DM.js → orchestrator-ZKBPCHW6.js} +1971 -520
- package/dist/{paths-XUC7GS6E.js → paths-DBXMZMDU.js} +5 -5
- package/dist/registry-LG64LTF4.js +11 -0
- package/dist/{reset-PXQT45IY.js → reset-DD5JGOY3.js} +11 -11
- package/dist/{run-FQ74YF62.js → run-QEGNX7FL.js} +89 -83
- package/dist/{share-FW7SVCL3.js → share-JKD3BQMW.js} +20 -18
- package/dist/{skills-7E7IRB3R.js → skills-LMQIKDOZ.js} +23 -21
- package/dist/{skills-eval-LI75W6OK.js → skills-eval-I7X2774U.js} +59 -52
- package/dist/{steer-GGWFUJUD.js → steer-CF5TDANS.js} +3 -3
- package/dist/support-I7LOJLIF.js +38 -0
- package/dist/{targets-4CIFKCTW.js → targets-RUSR6B5Z.js} +77 -42
- package/dist/{terminal-lease-WUZY7ZV5.js → terminal-lease-QYVORFR4.js} +6 -4
- package/dist/{trace-PNCASAXC.js → trace-ODOQIVIW.js} +61 -6
- package/dist/{uninstall-7FV7IP4E.js → uninstall-ZJF5H5ZN.js} +8 -8
- package/dist/{upgrade-K2HVIVMQ.js → upgrade-XANW3FXB.js} +29 -26
- package/dist/{usage-GTZELZQX.js → usage-4H7ZRXQT.js} +110 -61
- package/dist/{verifiers-RLAHT27O.js → verifiers-UZXNBZEB.js} +13 -13
- package/dist/{verify-BX3BRKH5.js → verify-BVKWTNDL.js} +9 -9
- package/dist/{wiki-generate-ASIFASCN.js → wiki-generate-MY7WV2QI.js} +76 -69
- package/dist/worker/entry.js +69 -66
- package/docs/alcf-provider.md +1 -1
- package/docs/architecture.md +1 -1
- package/docs/artifact-versions.md +11 -5
- package/docs/built-in-agents.md +1 -1
- package/docs/capacity-and-scheduling.md +23 -2
- package/docs/commands-and-modes.md +2 -2
- package/docs/configuration-and-targets.md +37 -5
- package/docs/context-engine.md +63 -4
- package/docs/documentation-coverage.md +3 -3
- package/docs/documentation-guide.md +1 -1
- package/docs/environment-variables.md +2 -0
- package/docs/eval-runner.md +262 -11
- package/docs/evals-internal.md +72 -2
- package/docs/evidence-and-memory.md +77 -12
- package/docs/evolution.md +1 -1
- package/docs/extensions-and-sharing.md +3 -1
- package/docs/fleet-dispatch.md +34 -9
- package/docs/glossary.md +21 -1
- package/docs/installation-and-lifecycle.md +1 -1
- package/docs/middleware-and-components.md +1 -1
- package/docs/model-catalog.md +1 -1
- package/docs/observability.md +54 -3
- package/docs/proactive-memory.md +127 -14
- package/docs/prompt-envelope-and-tools.md +22 -2
- package/docs/provider-adapter-cookbook.md +1 -1
- package/docs/release-cut-checklist.md +60 -41
- package/docs/safety-model.md +1 -1
- package/docs/scientific-validation.md +1 -1
- package/docs/skills-marketplace.md +1 -1
- package/docs/tool-usage.md +1 -1
- package/docs/trace-store.md +1 -1
- package/docs/troubleshooting.md +87 -0
- package/docs/tui-design.md +1 -1
- package/docs/worker-dispatch-mechanics.md +1 -1
- package/package.json +2 -2
- package/src/cli/agents.ts +1 -1
- package/src/cli/argv.ts +5 -0
- package/src/cli/config-inspect.ts +33 -6
- package/src/cli/config.ts +1 -1
- package/src/cli/configure.ts +107 -23
- package/src/cli/doctor-state-size.ts +82 -0
- package/src/cli/doctor.ts +7 -1
- package/src/cli/eval.ts +80 -16
- package/src/cli/evidence.ts +30 -25
- package/src/cli/extensions.ts +5 -1
- package/src/cli/fleet-preflight.ts +2 -12
- package/src/cli/fleet.ts +32 -3
- package/src/cli/shared.ts +1 -0
- package/src/cli/targets.ts +45 -11
- package/src/cli/trace.ts +63 -4
- package/src/cli/usage.ts +63 -14
- package/src/cli/validate-model.ts +60 -5
- package/src/core/bus-events.ts +54 -1
- package/src/core/cache-telemetry.ts +42 -0
- package/src/core/commit-attribution.ts +4 -4
- package/src/core/config.ts +18 -0
- package/src/core/defaults.ts +36 -6
- package/src/core/endpoint-key.ts +27 -0
- package/src/core/path-boundary.ts +100 -0
- package/src/core/residency-target-key.ts +25 -0
- package/src/core/response-schema.ts +36 -2
- package/src/domains/agents/extension.ts +2 -11
- package/src/domains/agents/fleet-contract.ts +30 -12
- package/src/domains/agents/recipe.ts +7 -1
- package/src/domains/agents/registry.ts +73 -5
- package/src/domains/agents/result-contract.ts +128 -17
- package/src/domains/agents/write-boundary.ts +15 -50
- package/src/domains/config/classify.ts +3 -0
- package/src/domains/context/codewiki/coordinator.ts +12 -4
- package/src/domains/context/project-rules.ts +51 -1
- package/src/domains/dispatch/admission.ts +40 -3
- package/src/domains/dispatch/assignment-reconcile.ts +22 -5
- package/src/domains/dispatch/assignment-store.ts +151 -14
- package/src/domains/dispatch/capacity-lease.ts +98 -9
- package/src/domains/dispatch/contract.ts +26 -1
- package/src/domains/dispatch/delegation-plan.ts +2 -5
- package/src/domains/dispatch/execution-plan.ts +44 -4
- package/src/domains/dispatch/execution-role.ts +9 -1
- package/src/domains/dispatch/extension.ts +309 -96
- package/src/domains/dispatch/fleet-run.ts +78 -4
- package/src/domains/dispatch/gate-role-prompts.ts +38 -0
- package/src/domains/dispatch/heartbeat.ts +32 -8
- package/src/domains/dispatch/index.ts +6 -1
- package/src/domains/dispatch/intent-requirements.ts +40 -0
- package/src/domains/dispatch/intent.ts +84 -8
- package/src/domains/dispatch/orphan-recovery.ts +5 -0
- package/src/domains/dispatch/path-scope.ts +370 -0
- package/src/domains/dispatch/receipt-integrity.ts +2 -1
- package/src/domains/dispatch/reservation-store.ts +116 -8
- package/src/domains/dispatch/state.ts +4 -0
- package/src/domains/dispatch/types.ts +14 -7
- package/src/domains/dispatch/validation.ts +6 -3
- package/src/domains/dispatch/worker-spawn.ts +25 -11
- package/src/domains/dispatch/write-boundary-enforcer.ts +62 -0
- package/src/domains/dispatch/write-boundary.ts +262 -22
- package/src/domains/eval/artifacts/store.ts +62 -0
- package/src/domains/eval/compare/behavioral.ts +224 -0
- package/src/domains/eval/compare/compare.ts +355 -2
- package/src/domains/eval/compare/envelope.ts +128 -0
- package/src/domains/eval/compare/gates.ts +24 -6
- package/src/domains/eval/compare/thresholds.ts +30 -3
- package/src/domains/eval/execution-provenance.ts +240 -0
- package/src/domains/eval/metrics/aggregate.ts +136 -0
- package/src/domains/eval/metrics/call-ledger-stream.ts +112 -0
- package/src/domains/eval/metrics/evidence.ts +79 -2
- package/src/domains/eval/metrics/tracked.ts +413 -0
- package/src/domains/eval/provenance.ts +117 -0
- package/src/domains/eval/reports/comparison.ts +128 -0
- package/src/domains/eval/reports/junit.ts +17 -3
- package/src/domains/eval/reports/markdown.ts +3 -3
- package/src/domains/eval/reports/text.ts +14 -0
- package/src/domains/eval/run-compare.ts +20 -0
- package/src/domains/eval/runners/clio-run.ts +139 -2
- package/src/domains/eval/runners/external-command.ts +28 -3
- package/src/domains/eval/schema/adapter.ts +111 -0
- package/src/domains/eval/schema/artifact.ts +20 -0
- package/src/domains/eval/schema/behavioral-metrics.ts +204 -0
- package/src/domains/eval/schema/behavioral.ts +520 -0
- package/src/domains/eval/schema/execution-envelope.ts +194 -0
- package/src/domains/eval/schema/serving.ts +74 -0
- package/src/domains/eval/schema/suite.ts +38 -8
- package/src/domains/eval/schema/validate.ts +58 -3
- package/src/domains/eval/schema/verdict.ts +237 -0
- package/src/domains/eval/suites/resolve.ts +2 -0
- package/src/domains/eval/suites/run.ts +264 -33
- package/src/domains/eval/verifiers/command.ts +2 -1
- package/src/domains/eval/workspaces/temp-copy.ts +145 -13
- package/src/domains/evidence/build.ts +68 -21
- package/src/domains/evidence/eval.ts +2 -12
- package/src/domains/evidence/findings-markdown.ts +33 -0
- package/src/domains/evidence/index.ts +21 -0
- package/src/domains/evidence/provenance.ts +46 -11
- package/src/domains/evidence/run-trust.ts +7 -113
- package/src/domains/evidence/trust-projection.ts +274 -0
- package/src/domains/evidence/trust-status.ts +145 -17
- package/src/domains/evidence/types.ts +4 -0
- package/src/domains/extensions/compatibility.ts +285 -0
- package/src/domains/extensions/discovery.ts +126 -4
- package/src/domains/extensions/resources.ts +21 -9
- package/src/domains/extensions/state.ts +18 -5
- package/src/domains/extensions/types.ts +6 -1
- package/src/domains/lifecycle/doctor.ts +209 -2
- package/src/domains/memory/index.ts +14 -0
- package/src/domains/memory/task-bank-promotion.ts +64 -0
- package/src/domains/memory/task-memory-policy.ts +77 -8
- package/src/domains/memory/task-memory-spend.ts +131 -0
- package/src/domains/memory/task-memory-status.ts +7 -0
- package/src/domains/memory/task-memory-telemetry.ts +2 -0
- package/src/domains/middleware/index.ts +1 -0
- package/src/domains/middleware/memory-intervention.ts +69 -5
- package/src/domains/middleware/memory-step-endpoint.ts +71 -0
- package/src/domains/observability/background-memory-usage.ts +140 -0
- package/src/domains/observability/cost.ts +1 -1
- package/src/domains/observability/index.ts +7 -0
- package/src/domains/observability/out-of-turn-usage.ts +51 -2
- package/src/domains/observability/trace-store.ts +192 -2
- package/src/domains/prompts/compiler.ts +100 -13
- package/src/domains/prompts/contract.ts +3 -5
- package/src/domains/providers/endpoint-capacity.ts +96 -0
- package/src/domains/providers/extension.ts +30 -2
- package/src/domains/providers/index.ts +10 -0
- package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +243 -1
- package/src/domains/providers/runtime-resolution.ts +8 -1
- package/src/domains/providers/runtimes/common/probe-helpers.ts +31 -9
- package/src/domains/providers/runtimes/local-native/llamacpp-anthropic.ts +1 -1
- package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
- package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +1 -1
- package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +1 -1
- package/src/domains/providers/runtimes/local-native/llamacpp.ts +4 -1
- package/src/domains/providers/runtimes/local-native/lmstudio.ts +4 -1
- package/src/domains/providers/runtimes/local-native/ollama-native.ts +6 -1
- package/src/domains/providers/types/capability-flags.ts +2 -0
- package/src/domains/providers/types/target-descriptor.ts +2 -0
- package/src/domains/resources/common-loader.ts +3 -0
- package/src/domains/resources/prompts/loader.ts +184 -17
- package/src/domains/safety/call-target.ts +52 -0
- package/src/domains/safety/policy-engine.ts +5 -5
- package/src/domains/safety/run-effects.ts +96 -2
- package/src/domains/safety/scope.ts +7 -12
- package/src/domains/session/context-accounting.ts +52 -1
- package/src/domains/session/context-ledger.ts +37 -13
- package/src/domains/session/index.ts +6 -0
- package/src/domains/session/prompt-cache.ts +140 -0
- package/src/domains/session/prompt-manifest.ts +42 -0
- package/src/engine/acp/adapter.ts +18 -3
- package/src/engine/acp/server.ts +4 -1
- package/src/engine/ai.ts +35 -0
- package/src/engine/apis/llamacpp-residency.ts +55 -3
- package/src/engine/apis/lmstudio.ts +25 -5
- package/src/engine/apis/ollama-native.ts +2 -1
- package/src/engine/apis/openai-completions.ts +80 -17
- package/src/engine/apis/residency-lock.ts +3 -1
- package/src/engine/apis/residency.ts +34 -1
- package/src/engine/prompt-templates.ts +18 -1
- package/src/engine/provider-payload.ts +29 -1
- package/src/engine/worker-runtime.ts +6 -3
- package/src/entry/orchestrator.ts +176 -30
- package/src/interactive/chat-loop-messages.ts +26 -7
- package/src/interactive/chat-loop.ts +318 -41
- package/src/interactive/chat-panel.ts +62 -8
- package/src/interactive/clio-editor.ts +45 -8
- package/src/interactive/context-activity.ts +5 -1
- package/src/interactive/context-meter.ts +1 -1
- package/src/interactive/context-overlay.ts +40 -10
- package/src/interactive/cost-overlay.ts +64 -6
- package/src/interactive/dispatch-board.ts +127 -5
- package/src/interactive/fleet-run-preview.ts +41 -15
- package/src/interactive/handoff-round.ts +41 -2
- package/src/interactive/interactive-application.ts +24 -1
- package/src/interactive/interactive-event-projection.ts +14 -0
- package/src/interactive/interactive-input-runtime.ts +8 -0
- package/src/interactive/interactive-presentation.ts +4 -0
- package/src/interactive/interactive-shell.ts +20 -17
- package/src/interactive/interactive-slash-runtime.ts +27 -4
- package/src/interactive/memory-overlay.ts +8 -0
- package/src/interactive/mutation-preview.ts +295 -0
- package/src/interactive/overlay-general-openers.ts +16 -0
- package/src/interactive/overlay-key-routing.ts +38 -0
- package/src/interactive/overlay-lifecycle.ts +38 -5
- package/src/interactive/overlay-permission-lifecycle.ts +22 -2
- package/src/interactive/overlay-session-lifecycle.ts +73 -9
- package/src/interactive/overlays/ask-user.ts +91 -19
- package/src/interactive/overlays/help-reference.ts +4 -0
- package/src/interactive/overlays/prompts.ts +11 -1
- package/src/interactive/overlays/settings.ts +176 -48
- package/src/interactive/permission-hint.ts +34 -2
- package/src/interactive/permission-overlay.ts +159 -9
- package/src/interactive/prewarm.ts +197 -0
- package/src/interactive/render-trace.ts +162 -15
- package/src/interactive/renderers/tool-execution.ts +4 -0
- package/src/interactive/side-question.ts +58 -1
- package/src/interactive/slash-commands.ts +7 -2
- package/src/interactive/status/controller.ts +11 -0
- package/src/interactive/status/state-machine.ts +54 -2
- package/src/interactive/status/types.ts +7 -0
- package/src/interactive/terminal-lease.ts +2 -0
- package/src/interactive/turn-context.ts +299 -31
- package/src/interactive/turn-persistence.ts +14 -4
- package/src/interactive/turn-prewarm.ts +364 -0
- package/src/interactive/turn-queues.ts +7 -4
- package/src/interactive/turn-runtime.ts +8 -1
- package/src/interactive/turn-state.ts +23 -0
- package/src/interactive/view/artifacts.ts +42 -9
- package/src/interactive/view/view-overlay.ts +43 -6
- package/src/interactive/worker-receipts.ts +14 -2
- package/src/interactive/worker-stream.ts +8 -0
- package/src/tools/ask-user.ts +43 -2
- package/src/tools/dispatch-admission.ts +12 -13
- package/src/tools/dispatch-arguments.ts +27 -0
- package/src/tools/dispatch-plan.ts +46 -9
- package/src/tools/dispatch-runner.ts +48 -13
- package/src/tools/dispatch-scout.ts +1 -1
- package/src/tools/monitor.ts +13 -0
- package/src/tools/registry.ts +16 -0
- package/src/tools/worker-evidence.ts +19 -13
- package/src/worker/spec-contract.ts +2 -1
- package/dist/chunk-AOCYTWAV.js +0 -449
- package/dist/chunk-HWUFFB6L.js +0 -83
- package/dist/chunk-R346GLFC.js +0 -31
- package/dist/chunk-ZGH7FGS5.js +0 -1079
- package/dist/doctor-RN4YKO2X.js +0 -87
- package/dist/eval-RUBJVSNQ.js +0 -2557
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
sanitizeToolResultDigest,
|
|
5
5
|
type ToolResultDigest,
|
|
6
6
|
} from "../../tools/result-disposition.js";
|
|
7
|
-
import { TASK_MEMORY_DEFAULT_PROCEDURAL_CAP, type TaskMemoryBank } from "../memory/task-bank.js";
|
|
7
|
+
import { TASK_MEMORY_DEFAULT_PROCEDURAL_CAP, type TaskMemoryBank, type TaskMemoryEntry } from "../memory/task-bank.js";
|
|
8
8
|
import {
|
|
9
9
|
runTaskMemoryPolicy,
|
|
10
10
|
TASK_MEMORY_POLICY_DEFAULT_TIMEOUT_MS,
|
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
type TaskMemoryModelClient,
|
|
13
13
|
type TaskMemoryPolicyReason,
|
|
14
14
|
type TaskMemoryPolicyResult,
|
|
15
|
+
type TaskMemoryStepUsage,
|
|
15
16
|
type TaskMemoryTrajectoryStep,
|
|
16
17
|
} from "../memory/task-memory-policy.js";
|
|
17
18
|
import type { TaskMemoryActivityEvent } from "../memory/task-memory-status.js";
|
|
@@ -75,6 +76,25 @@ export interface MemoryInterventionDeps {
|
|
|
75
76
|
everyNTools?: number;
|
|
76
77
|
/** Lazily resolves the explicitly configured background role. Null means rules-only. */
|
|
77
78
|
getModelClient?: () => TaskMemoryModelClient | null;
|
|
79
|
+
/**
|
|
80
|
+
* True when the background target's inference endpoint is already serving the
|
|
81
|
+
* chat target's stream. A memory step then either queues behind the operator's
|
|
82
|
+
* own turn on a single-slot server or makes the server evict the resident
|
|
83
|
+
* model to serve it, so the boundary is skipped and the skip is recorded.
|
|
84
|
+
*/
|
|
85
|
+
backgroundEndpointBusy?: () => boolean;
|
|
86
|
+
/**
|
|
87
|
+
* Provider-reported spend for one completed model step. The composition root
|
|
88
|
+
* routes it to the cost ledger; the middleware never prices anything.
|
|
89
|
+
*/
|
|
90
|
+
onStepUsage?: (usage: TaskMemoryStepUsage) => void;
|
|
91
|
+
/**
|
|
92
|
+
* Bank entries an llm-tier reminder cited when it reached the operator. The
|
|
93
|
+
* composition root proposes them into the durable memory store, which is what
|
|
94
|
+
* connects the session bank to the records `/memory` and `clio-coder memory`
|
|
95
|
+
* read. Best effort and content-bearing, exactly like `onEnvelope`.
|
|
96
|
+
*/
|
|
97
|
+
onInjectedEntries?: (entries: ReadonlyArray<TaskMemoryEntry>) => void;
|
|
78
98
|
/** Live next-turn settings view; individual fields above remain test-friendly fallbacks. */
|
|
79
99
|
getSettings?: () => Readonly<MemoryInterventionSettings>;
|
|
80
100
|
/** Best-effort content-free telemetry; sink failures never affect intervention. */
|
|
@@ -348,6 +368,7 @@ export function createMemoryInterventionRegistration(deps: MemoryInterventionDep
|
|
|
348
368
|
reminder: null,
|
|
349
369
|
inputTokens: 0,
|
|
350
370
|
outputTokens: 0,
|
|
371
|
+
usage: null,
|
|
351
372
|
effects: NO_EFFECTS,
|
|
352
373
|
});
|
|
353
374
|
const live = settings();
|
|
@@ -361,10 +382,20 @@ export function createMemoryInterventionRegistration(deps: MemoryInterventionDep
|
|
|
361
382
|
let tier: TaskMemoryTelemetryTier = "rules";
|
|
362
383
|
promptedStepTier = tier;
|
|
363
384
|
let promptedResult: TaskMemoryPolicyResult;
|
|
385
|
+
// A boundary that never reached the model is a skipped boundary rather than
|
|
386
|
+
// a policy decision, and `dropped` is the telemetry outcome for exactly
|
|
387
|
+
// that. The returned decision stays `silent`, since no reminder was
|
|
388
|
+
// produced and the policy vocabulary has no value for a step that never ran.
|
|
389
|
+
let telemetryDecision: TaskMemoryTelemetryDecision | null = null;
|
|
364
390
|
try {
|
|
365
391
|
const client = deps.getModelClient?.() ?? null;
|
|
366
392
|
if (client === null) {
|
|
367
393
|
promptedResult = silent("no_client");
|
|
394
|
+
} else if (deps.backgroundEndpointBusy?.() === true) {
|
|
395
|
+
tier = "llm";
|
|
396
|
+
promptedStepTier = tier;
|
|
397
|
+
promptedResult = silent("endpoint_busy");
|
|
398
|
+
telemetryDecision = "dropped";
|
|
368
399
|
} else {
|
|
369
400
|
tier = "llm";
|
|
370
401
|
promptedStepTier = tier;
|
|
@@ -396,10 +427,18 @@ export function createMemoryInterventionRegistration(deps: MemoryInterventionDep
|
|
|
396
427
|
});
|
|
397
428
|
}
|
|
398
429
|
lastDecision = promptedResult.decision;
|
|
430
|
+
if (promptedResult.usage !== null) {
|
|
431
|
+
try {
|
|
432
|
+
deps.onStepUsage?.(promptedResult.usage);
|
|
433
|
+
} catch {
|
|
434
|
+
// Accounting is bookkeeping. A failing sink never changes memory behavior.
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
if (promptedResult.decision === "injected") reportInjectedEntries(promptedResult.reminder);
|
|
399
438
|
emitTelemetry(
|
|
400
439
|
triggers,
|
|
401
440
|
tier,
|
|
402
|
-
promptedResult.decision,
|
|
441
|
+
telemetryDecision ?? promptedResult.decision,
|
|
403
442
|
promptedResult.reason,
|
|
404
443
|
citedEntryCount(promptedResult.reminder),
|
|
405
444
|
promptedResult.inputTokens,
|
|
@@ -462,10 +501,35 @@ export function createMemoryInterventionRegistration(deps: MemoryInterventionDep
|
|
|
462
501
|
if (activity.length > MEMORY_INTERVENTION_ACTIVITY_LIMIT) activity.length = MEMORY_INTERVENTION_ACTIVITY_LIMIT;
|
|
463
502
|
}
|
|
464
503
|
|
|
465
|
-
function
|
|
466
|
-
if (message === null) return
|
|
504
|
+
function citedEntries(message: string | null): TaskMemoryEntry[] {
|
|
505
|
+
if (message === null) return [];
|
|
467
506
|
const snapshot = deps.bank.snapshot();
|
|
468
|
-
return [...snapshot.knowledge, ...snapshot.procedural].filter((entry) => message.includes(`[${entry.id}]`))
|
|
507
|
+
return [...snapshot.knowledge, ...snapshot.procedural].filter((entry) => message.includes(`[${entry.id}]`));
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
function citedEntryCount(message: string | null): number {
|
|
511
|
+
return citedEntries(message).length;
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
/**
|
|
515
|
+
* Hand the cited entries to the durable store.
|
|
516
|
+
*
|
|
517
|
+
* Only the model tier reports here. A rules-tier reminder cites an entry this
|
|
518
|
+
* middleware wrote itself out of one repeated tool failure, and proposing
|
|
519
|
+
* every one of those as a durable lesson would fill the operator's review
|
|
520
|
+
* queue with rows nobody asked for. The model tier's entries are the ones the
|
|
521
|
+
* background plane produced, which is what #229 asks to be reviewable.
|
|
522
|
+
*/
|
|
523
|
+
function reportInjectedEntries(reminder: string | null): void {
|
|
524
|
+
if (deps.onInjectedEntries === undefined) return;
|
|
525
|
+
const entries = citedEntries(reminder);
|
|
526
|
+
if (entries.length === 0) return;
|
|
527
|
+
try {
|
|
528
|
+
deps.onInjectedEntries(entries);
|
|
529
|
+
} catch {
|
|
530
|
+
// A failing store is the composition root's problem to report, never a
|
|
531
|
+
// reason to fail the step that produced the reminder.
|
|
532
|
+
}
|
|
469
533
|
}
|
|
470
534
|
|
|
471
535
|
function observeBeforeTool(input: MiddlewareHookInput): void {
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Publishing and accounting for the endpoint a background memory step uses.
|
|
3
|
+
*
|
|
4
|
+
* A proactive-memory step that runs on the chat target's own endpoint moves
|
|
5
|
+
* that server's prefix cache, so the next turn is cold for a reason Clio caused
|
|
6
|
+
* and can name. The turn context turns {@link BusChannels.MemoryStepCompleted}
|
|
7
|
+
* into the `background_memory` expected-cold reason; without it `/context`
|
|
8
|
+
* reports the turn as an unexplained provider re-prefill.
|
|
9
|
+
*
|
|
10
|
+
* The disturbance is a property of the request having left the process, not of
|
|
11
|
+
* the answer coming back. A step that times out still had its whole trajectory
|
|
12
|
+
* prefilled into the single prefix slot, because aborting the HTTP request does
|
|
13
|
+
* not stop a llama.cpp prefill (the measurement is recorded in
|
|
14
|
+
* `src/interactive/turn-prewarm.ts`). Publishing from the usage sink instead
|
|
15
|
+
* missed exactly that case, since usage is only assigned once the call resolves.
|
|
16
|
+
*
|
|
17
|
+
* The same request also occupies real endpoint capacity. Both responsibilities
|
|
18
|
+
* live here around the client's `complete`: the slot is registered only after
|
|
19
|
+
* the middleware's `endpoint_busy` admission check, so a step never sees its
|
|
20
|
+
* own slot, then released in the `finally` that also announces the disturbance.
|
|
21
|
+
* Both happen on resolve, timeout, and transport throw, and neither happens for
|
|
22
|
+
* a boundary that skipped the model altogether (`endpoint_busy`, no configured
|
|
23
|
+
* route), because those never call `complete`.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
import { BusChannels } from "../../core/bus-events.js";
|
|
27
|
+
import type { SafeEventBus } from "../../core/event-bus.js";
|
|
28
|
+
import { registerForegroundStream } from "../providers/endpoint-capacity.js";
|
|
29
|
+
|
|
30
|
+
/** What the announcer needs: somewhere to publish, and the route to name. */
|
|
31
|
+
export interface MemoryStepEndpointAnnouncerDeps {
|
|
32
|
+
bus: Pick<SafeEventBus, "emit"> | null;
|
|
33
|
+
/** Canonical endpoint the step calls, or null when the route has none. */
|
|
34
|
+
endpointKey: string | null;
|
|
35
|
+
targetId: string;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Wrap one background memory `complete` so every request that leaves the
|
|
40
|
+
* process holds one endpoint slot and publishes its endpoint exactly once,
|
|
41
|
+
* whatever the call does next.
|
|
42
|
+
*
|
|
43
|
+
* A route with no canonical endpoint key is unchanged. A null bus suppresses
|
|
44
|
+
* the announcement but still counts capacity for a route whose key is known.
|
|
45
|
+
*/
|
|
46
|
+
export function announceMemoryStepEndpoint<Request, Response>(
|
|
47
|
+
deps: MemoryStepEndpointAnnouncerDeps,
|
|
48
|
+
complete: (request: Request) => Promise<Response>,
|
|
49
|
+
): (request: Request) => Promise<Response> {
|
|
50
|
+
const { bus, endpointKey, targetId } = deps;
|
|
51
|
+
if (endpointKey === null) return complete;
|
|
52
|
+
return async (request: Request): Promise<Response> => {
|
|
53
|
+
// `runPromptedStep` performs its busy check before it invokes `complete`,
|
|
54
|
+
// so this registration counts the outgoing request without self-refusing.
|
|
55
|
+
const releaseEndpointSlot = registerForegroundStream(endpointKey);
|
|
56
|
+
try {
|
|
57
|
+
return await complete(request);
|
|
58
|
+
} finally {
|
|
59
|
+
releaseEndpointSlot();
|
|
60
|
+
// Bookkeeping never changes memory behavior, and a crashing subscriber
|
|
61
|
+
// must not turn a resolved step into a failed one.
|
|
62
|
+
if (bus !== null) {
|
|
63
|
+
try {
|
|
64
|
+
bus.emit(BusChannels.MemoryStepCompleted, { endpointKey, targetId });
|
|
65
|
+
} catch {
|
|
66
|
+
// The safe bus already contains listener errors; this covers the rest.
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Accounting for one proactive-memory step.
|
|
3
|
+
*
|
|
4
|
+
* A background memory step is a priced model call that never enters the
|
|
5
|
+
* session: it appends nothing to the session JSONL, exactly as a `/btw` side
|
|
6
|
+
* question does not. Until this existed the spend was recorded nowhere at all.
|
|
7
|
+
* The operator's own telemetry ledger held 60 model steps, 137,205 tokens, and
|
|
8
|
+
* 1,666 seconds of model time across 14 days while `/cost` showed no row for
|
|
9
|
+
* any of it and `clio-coder usage report` could not see it either (#229).
|
|
10
|
+
*
|
|
11
|
+
* The two writes are the same pair the side-question path makes: the
|
|
12
|
+
* in-process cost tracker under the `background-memory` label, which is what
|
|
13
|
+
* `/cost` folds, and one durable row in the out-of-turn usage store, which is
|
|
14
|
+
* what an archive reader folds after the process is gone.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { uncachedPrefillTokens } from "../../core/cache-telemetry.js";
|
|
18
|
+
import type { CostProvenance } from "../providers/index.js";
|
|
19
|
+
import type { CostEntryLabel, UsageBreakdown } from "./cost.js";
|
|
20
|
+
import { appendOutOfTurnUsageRow, type OutOfTurnUsageRow } from "./out-of-turn-usage.js";
|
|
21
|
+
|
|
22
|
+
/** Provider-reported spend for one memory step, as the calling client observed it. */
|
|
23
|
+
export interface BackgroundMemoryStepUsage {
|
|
24
|
+
targetId: string;
|
|
25
|
+
attributedModelId: string;
|
|
26
|
+
input: number;
|
|
27
|
+
output: number;
|
|
28
|
+
cacheRead: number;
|
|
29
|
+
cacheWrite: number;
|
|
30
|
+
reasoning: number;
|
|
31
|
+
totalTokens: number;
|
|
32
|
+
costUsd: number;
|
|
33
|
+
costProvenance: CostProvenance;
|
|
34
|
+
durationMs: number;
|
|
35
|
+
backend: {
|
|
36
|
+
promptTokens: number;
|
|
37
|
+
cachedTokens: number | null;
|
|
38
|
+
promptMs: number;
|
|
39
|
+
source: string;
|
|
40
|
+
} | null;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** The subset of the observability contract this accounting needs. */
|
|
44
|
+
export interface BackgroundMemoryUsageSink {
|
|
45
|
+
recordTokens(
|
|
46
|
+
providerId: string,
|
|
47
|
+
attributedModelId: string,
|
|
48
|
+
tokens: number,
|
|
49
|
+
costUsd?: number,
|
|
50
|
+
breakdown?: Partial<UsageBreakdown>,
|
|
51
|
+
costProvenance?: CostProvenance,
|
|
52
|
+
modelIdFacts?: unknown,
|
|
53
|
+
label?: CostEntryLabel,
|
|
54
|
+
): void;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export interface RecordBackgroundMemoryStepInput {
|
|
58
|
+
usage: BackgroundMemoryStepUsage;
|
|
59
|
+
stateDir: string;
|
|
60
|
+
sessionId: string | null;
|
|
61
|
+
/** The cwd hash the session ledger is filed under, so `usage report --repo` selects it. */
|
|
62
|
+
repoIdentity: string | null;
|
|
63
|
+
observability?: BackgroundMemoryUsageSink | undefined;
|
|
64
|
+
now?: Date;
|
|
65
|
+
/** Test seam; production appends to the out-of-turn store under the state dir. */
|
|
66
|
+
appendRow?: (stateDir: string, row: OutOfTurnUsageRow) => void;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** Build the durable row for one memory step without writing it. */
|
|
70
|
+
export function backgroundMemoryUsageRow(
|
|
71
|
+
usage: BackgroundMemoryStepUsage,
|
|
72
|
+
options: { sessionId: string | null; repoIdentity: string | null; now?: Date },
|
|
73
|
+
): OutOfTurnUsageRow {
|
|
74
|
+
return {
|
|
75
|
+
label: "background-memory",
|
|
76
|
+
sessionId: options.sessionId,
|
|
77
|
+
repoIdentity: options.repoIdentity,
|
|
78
|
+
timestamp: (options.now ?? new Date()).toISOString(),
|
|
79
|
+
target: usage.targetId,
|
|
80
|
+
attributedModelId: usage.attributedModelId,
|
|
81
|
+
usage: {
|
|
82
|
+
input: usage.input,
|
|
83
|
+
output: usage.output,
|
|
84
|
+
cacheRead: usage.cacheRead,
|
|
85
|
+
cacheWrite: usage.cacheWrite,
|
|
86
|
+
reasoning: usage.reasoning,
|
|
87
|
+
totalTokens: usage.totalTokens,
|
|
88
|
+
costUsd: usage.costUsd,
|
|
89
|
+
costProvenance: usage.costProvenance,
|
|
90
|
+
},
|
|
91
|
+
timing: { durationMs: usage.durationMs },
|
|
92
|
+
...(usage.backend === null
|
|
93
|
+
? {}
|
|
94
|
+
: {
|
|
95
|
+
promptCache: {
|
|
96
|
+
promptTokens: usage.backend.promptTokens,
|
|
97
|
+
cachedTokens: usage.backend.cachedTokens,
|
|
98
|
+
uncachedPrefillTokens: uncachedPrefillTokens({
|
|
99
|
+
promptTokens: usage.backend.promptTokens,
|
|
100
|
+
cachedTokens: usage.backend.cachedTokens,
|
|
101
|
+
predictedTokens: 0,
|
|
102
|
+
promptMs: usage.backend.promptMs,
|
|
103
|
+
predictedMs: 0,
|
|
104
|
+
source: "llamacpp-timings",
|
|
105
|
+
}),
|
|
106
|
+
promptMs: usage.backend.promptMs,
|
|
107
|
+
source: usage.backend.source,
|
|
108
|
+
},
|
|
109
|
+
}),
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/** Record one memory step in the session's cost totals and in the durable store. */
|
|
114
|
+
export function recordBackgroundMemoryStep(input: RecordBackgroundMemoryStepInput): OutOfTurnUsageRow {
|
|
115
|
+
input.observability?.recordTokens(
|
|
116
|
+
input.usage.targetId,
|
|
117
|
+
input.usage.attributedModelId,
|
|
118
|
+
input.usage.totalTokens,
|
|
119
|
+
input.usage.costUsd,
|
|
120
|
+
{
|
|
121
|
+
input: input.usage.input,
|
|
122
|
+
output: input.usage.output,
|
|
123
|
+
cacheRead: input.usage.cacheRead,
|
|
124
|
+
cacheWrite: input.usage.cacheWrite,
|
|
125
|
+
reasoningTokens: input.usage.reasoning,
|
|
126
|
+
totalTokens: input.usage.totalTokens,
|
|
127
|
+
apiCalls: 1,
|
|
128
|
+
},
|
|
129
|
+
input.usage.costProvenance,
|
|
130
|
+
undefined,
|
|
131
|
+
"background-memory",
|
|
132
|
+
);
|
|
133
|
+
const row = backgroundMemoryUsageRow(input.usage, {
|
|
134
|
+
sessionId: input.sessionId,
|
|
135
|
+
repoIdentity: input.repoIdentity,
|
|
136
|
+
...(input.now === undefined ? {} : { now: input.now }),
|
|
137
|
+
});
|
|
138
|
+
(input.appendRow ?? appendOutOfTurnUsageRow)(input.stateDir, row);
|
|
139
|
+
return row;
|
|
140
|
+
}
|
|
@@ -116,7 +116,7 @@ export interface UsageBreakdown {
|
|
|
116
116
|
* the usage surfaces separate these out so an operator can see that money was
|
|
117
117
|
* spent beside the session rather than inside it.
|
|
118
118
|
*/
|
|
119
|
-
export type CostEntryLabel = "side-question" | "handoff";
|
|
119
|
+
export type CostEntryLabel = "side-question" | "handoff" | "prewarm" | "background-memory";
|
|
120
120
|
|
|
121
121
|
export interface CostEntry {
|
|
122
122
|
providerId: string;
|
|
@@ -16,6 +16,13 @@ export function createObservabilityDomainModule(options: ObservabilityBundleOpti
|
|
|
16
16
|
|
|
17
17
|
export type { AccountabilitySummary } from "./accountability.js";
|
|
18
18
|
export { readAccountabilitySummary, summarizeEvidenceIndex } from "./accountability.js";
|
|
19
|
+
export {
|
|
20
|
+
type BackgroundMemoryStepUsage,
|
|
21
|
+
type BackgroundMemoryUsageSink,
|
|
22
|
+
backgroundMemoryUsageRow,
|
|
23
|
+
type RecordBackgroundMemoryStepInput,
|
|
24
|
+
recordBackgroundMemoryStep,
|
|
25
|
+
} from "./background-memory-usage.js";
|
|
19
26
|
export type {
|
|
20
27
|
ObservabilityContract,
|
|
21
28
|
ObservabilityNotice,
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Durable record of the model calls that were billed beside a session rather
|
|
3
|
-
* than inside it: `/btw` side questions
|
|
3
|
+
* than inside it: `/btw` side questions, `/handoff` extraction rounds, and the
|
|
4
|
+
* session pre-warm.
|
|
4
5
|
*
|
|
5
6
|
* These rounds deliberately append nothing to the session JSONL. A fleet run
|
|
6
7
|
* briefs its workers from the transcript, so a question the operator asked to
|
|
@@ -50,6 +51,27 @@ export const MAX_OUT_OF_TURN_USAGE_ROWS = 1000;
|
|
|
50
51
|
*/
|
|
51
52
|
const BOUND_CHECK_INTERVAL = 64;
|
|
52
53
|
|
|
54
|
+
/** Wall-clock facts about one out-of-turn call. */
|
|
55
|
+
export interface OutOfTurnTiming {
|
|
56
|
+
/** Duration of the model call itself, as the caller measured it. */
|
|
57
|
+
durationMs: number;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Backend prefill facts for one out-of-turn call, in the shape brief #247
|
|
62
|
+
* established for assistant entries. A background memory step re-sends a whole
|
|
63
|
+
* trajectory to a server that has just been serving the chat prefix, so whether
|
|
64
|
+
* that prefill was cached is the difference between a cheap step and a step
|
|
65
|
+
* that re-prefills thousands of tokens on the operator's own machine.
|
|
66
|
+
*/
|
|
67
|
+
export interface OutOfTurnPromptCache {
|
|
68
|
+
promptTokens: number;
|
|
69
|
+
cachedTokens: number | null;
|
|
70
|
+
uncachedPrefillTokens: number | null;
|
|
71
|
+
promptMs: number;
|
|
72
|
+
source: string;
|
|
73
|
+
}
|
|
74
|
+
|
|
53
75
|
/** Provider-reported usage for one out-of-turn call. */
|
|
54
76
|
export interface OutOfTurnUsage {
|
|
55
77
|
input: number;
|
|
@@ -75,6 +97,10 @@ export interface OutOfTurnUsageRow {
|
|
|
75
97
|
target: string;
|
|
76
98
|
attributedModelId: string;
|
|
77
99
|
usage: OutOfTurnUsage;
|
|
100
|
+
/** Present when the caller measured the call. */
|
|
101
|
+
timing?: OutOfTurnTiming;
|
|
102
|
+
/** Present when the serving backend reported prefill facts. */
|
|
103
|
+
promptCache?: OutOfTurnPromptCache;
|
|
78
104
|
}
|
|
79
105
|
|
|
80
106
|
export interface OutOfTurnUsageReadResult {
|
|
@@ -179,10 +205,13 @@ export function readOutOfTurnUsageRows(stateDir: string): OutOfTurnUsageReadResu
|
|
|
179
205
|
function asOutOfTurnUsageRow(value: unknown): OutOfTurnUsageRow | null {
|
|
180
206
|
if (!isRecord(value)) return null;
|
|
181
207
|
const label = value.label;
|
|
182
|
-
if (label !== "side-question" && label !== "handoff"
|
|
208
|
+
if (label !== "side-question" && label !== "handoff" && label !== "prewarm" && label !== "background-memory")
|
|
209
|
+
return null;
|
|
183
210
|
if (typeof value.timestamp !== "string" || value.timestamp.length === 0) return null;
|
|
184
211
|
if (!isRecord(value.usage)) return null;
|
|
185
212
|
const usage = value.usage;
|
|
213
|
+
const timing = asTiming(value.timing);
|
|
214
|
+
const promptCache = asPromptCache(value.promptCache);
|
|
186
215
|
return {
|
|
187
216
|
label,
|
|
188
217
|
sessionId: typeof value.sessionId === "string" ? value.sessionId : null,
|
|
@@ -203,6 +232,26 @@ function asOutOfTurnUsageRow(value: unknown): OutOfTurnUsageRow | null {
|
|
|
203
232
|
costUsd: numberOr0(usage.costUsd),
|
|
204
233
|
costProvenance: asCostProvenance(usage.costProvenance),
|
|
205
234
|
},
|
|
235
|
+
...(timing === null ? {} : { timing }),
|
|
236
|
+
...(promptCache === null ? {} : { promptCache }),
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
function asTiming(value: unknown): OutOfTurnTiming | null {
|
|
241
|
+
if (!isRecord(value)) return null;
|
|
242
|
+
const durationMs = numberOr0(value.durationMs);
|
|
243
|
+
return durationMs === 0 ? null : { durationMs };
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
function asPromptCache(value: unknown): OutOfTurnPromptCache | null {
|
|
247
|
+
if (!isRecord(value)) return null;
|
|
248
|
+
if (typeof value.source !== "string" || value.source.length === 0) return null;
|
|
249
|
+
return {
|
|
250
|
+
promptTokens: numberOr0(value.promptTokens),
|
|
251
|
+
cachedTokens: typeof value.cachedTokens === "number" ? value.cachedTokens : null,
|
|
252
|
+
uncachedPrefillTokens: typeof value.uncachedPrefillTokens === "number" ? value.uncachedPrefillTokens : null,
|
|
253
|
+
promptMs: numberOr0(value.promptMs),
|
|
254
|
+
source: value.source,
|
|
206
255
|
};
|
|
207
256
|
}
|
|
208
257
|
|