@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
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
type Usage,
|
|
17
17
|
} from "@earendil-works/pi-ai";
|
|
18
18
|
import { openAICompletionsApi } from "@earendil-works/pi-ai/api/openai-completions.lazy";
|
|
19
|
+
import type { BackendCompletionTimings, BackendTimingsSource } from "../../core/cache-telemetry.js";
|
|
19
20
|
import type { ResponseModelIdObservation } from "../../core/response-model-id.js";
|
|
20
21
|
import {
|
|
21
22
|
type AppliedThinking,
|
|
@@ -41,6 +42,8 @@ declare module "@earendil-works/pi-ai" {
|
|
|
41
42
|
interface AssistantMessage {
|
|
42
43
|
/** Direct observation of model-id presence in an OpenAI-compatible response. */
|
|
43
44
|
responseModelIdObservation?: ResponseModelIdObservation;
|
|
45
|
+
/** Backend-reported prefill and prediction timings when available. */
|
|
46
|
+
backendTimings?: BackendCompletionTimings;
|
|
44
47
|
}
|
|
45
48
|
}
|
|
46
49
|
|
|
@@ -95,13 +98,57 @@ function isPlainRecord(value: unknown): value is Record<string, unknown> {
|
|
|
95
98
|
interface ResponseModelIdCapture {
|
|
96
99
|
reportedModelId: string | null;
|
|
97
100
|
observed: boolean;
|
|
98
|
-
|
|
101
|
+
modelIdDone: boolean;
|
|
102
|
+
backendTimings: BackendCompletionTimings | null;
|
|
103
|
+
backendTimingsSource: BackendTimingsSource | null;
|
|
99
104
|
buffer: string;
|
|
100
105
|
decoder: TextDecoder | null;
|
|
101
106
|
}
|
|
102
107
|
|
|
103
|
-
function
|
|
104
|
-
|
|
108
|
+
function nonnegativeFiniteNumber(value: unknown): number | null {
|
|
109
|
+
return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : null;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* The operator's llama.cpp router reported build b226-2115b73d8. Its nonstream
|
|
114
|
+
* response placed a `{ prompt_n, prompt_ms, predicted_n, predicted_ms, cache_n }`
|
|
115
|
+
* timing object at the top level. Its stream placed the timing object on the
|
|
116
|
+
* final SSE JSON event without `timings_per_token`. Setting
|
|
117
|
+
* `timings_per_token: true` repeated cumulative timing objects for individual
|
|
118
|
+
* tokens. LM Studio's OpenAI-compatible stream and nonstream responses omitted
|
|
119
|
+
* timings both with and without that flag. Its native runtime reported
|
|
120
|
+
* llama.cpp-win-x86_64-nvidia-cuda12-avx2 2.29.0.
|
|
121
|
+
*/
|
|
122
|
+
function backendCompletionTimings(value: unknown, source: BackendTimingsSource): BackendCompletionTimings | null {
|
|
123
|
+
if (!isPlainRecord(value)) return null;
|
|
124
|
+
const promptN = nonnegativeFiniteNumber(value.prompt_n);
|
|
125
|
+
const predictedN = nonnegativeFiniteNumber(value.predicted_n);
|
|
126
|
+
const promptMs = nonnegativeFiniteNumber(value.prompt_ms);
|
|
127
|
+
const predictedMs = nonnegativeFiniteNumber(value.predicted_ms);
|
|
128
|
+
if (promptN === null || predictedN === null || promptMs === null || predictedMs === null) return null;
|
|
129
|
+
const cacheN = nonnegativeFiniteNumber(value.cache_n);
|
|
130
|
+
return {
|
|
131
|
+
promptTokens: promptN + (cacheN ?? 0),
|
|
132
|
+
cachedTokens: cacheN,
|
|
133
|
+
predictedTokens: predictedN,
|
|
134
|
+
promptMs,
|
|
135
|
+
predictedMs,
|
|
136
|
+
source,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function backendTimingsSourceForModel(model: Model<Api>): BackendTimingsSource | null {
|
|
141
|
+
const metadata = (model as Model<Api> & ClioRuntimeMetadata).clio;
|
|
142
|
+
if (model.provider === "llamacpp" && metadata?.runtimeId === "llamacpp") return "llamacpp-timings";
|
|
143
|
+
if (model.provider === "lmstudio" && metadata?.runtimeId === "lmstudio") return "lmstudio-timings";
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function captureCanStopEarly(capture: ResponseModelIdCapture): boolean {
|
|
148
|
+
return capture.modelIdDone && capture.backendTimingsSource === null;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function observeResponseMetadataLine(line: string, capture: ResponseModelIdCapture): void {
|
|
105
152
|
const normalized = line.endsWith("\r") ? line.slice(0, -1) : line;
|
|
106
153
|
if (!normalized.startsWith("data:")) return;
|
|
107
154
|
const data = normalized.slice("data:".length).trimStart();
|
|
@@ -109,10 +156,16 @@ function observeResponseModelIdLine(line: string, capture: ResponseModelIdCaptur
|
|
|
109
156
|
try {
|
|
110
157
|
const payload = JSON.parse(data) as unknown;
|
|
111
158
|
if (!isPlainRecord(payload)) return;
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
159
|
+
if (!capture.modelIdDone) {
|
|
160
|
+
const model = payload.model;
|
|
161
|
+
if (typeof model === "string" && model.trim().length > 0) {
|
|
162
|
+
capture.reportedModelId = model.trim();
|
|
163
|
+
capture.modelIdDone = true;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
if (capture.backendTimingsSource !== null) {
|
|
167
|
+
const timings = backendCompletionTimings(payload.timings, capture.backendTimingsSource);
|
|
168
|
+
if (timings !== null) capture.backendTimings = timings;
|
|
116
169
|
}
|
|
117
170
|
} catch {
|
|
118
171
|
// A partial or vendor-specific event is pi-ai's parsing concern. This
|
|
@@ -125,14 +178,14 @@ function observeResponseModelIdBytes(
|
|
|
125
178
|
capture: ResponseModelIdCapture,
|
|
126
179
|
flush = false,
|
|
127
180
|
): void {
|
|
128
|
-
if (
|
|
181
|
+
if (!capture.decoder) return;
|
|
129
182
|
capture.buffer += chunk ? capture.decoder.decode(chunk, { stream: !flush }) : capture.decoder.decode();
|
|
130
183
|
let newline = capture.buffer.indexOf("\n");
|
|
131
184
|
while (newline >= 0) {
|
|
132
185
|
const line = capture.buffer.slice(0, newline);
|
|
133
186
|
capture.buffer = capture.buffer.slice(newline + 1);
|
|
134
|
-
|
|
135
|
-
if (capture
|
|
187
|
+
observeResponseMetadataLine(line, capture);
|
|
188
|
+
if (captureCanStopEarly(capture)) {
|
|
136
189
|
capture.buffer = "";
|
|
137
190
|
capture.decoder = null;
|
|
138
191
|
return;
|
|
@@ -140,10 +193,10 @@ function observeResponseModelIdBytes(
|
|
|
140
193
|
newline = capture.buffer.indexOf("\n");
|
|
141
194
|
}
|
|
142
195
|
if (flush && capture.buffer.length > 0) {
|
|
143
|
-
|
|
196
|
+
observeResponseMetadataLine(capture.buffer, capture);
|
|
144
197
|
capture.buffer = "";
|
|
145
198
|
}
|
|
146
|
-
if (capture
|
|
199
|
+
if (captureCanStopEarly(capture) || flush) capture.decoder = null;
|
|
147
200
|
}
|
|
148
201
|
|
|
149
202
|
function captureResponseModelId(response: Response, capture: ResponseModelIdCapture): Response {
|
|
@@ -154,12 +207,12 @@ function captureResponseModelId(response: Response, capture: ResponseModelIdCapt
|
|
|
154
207
|
new TransformStream<Uint8Array, Uint8Array>({
|
|
155
208
|
transform(chunk, controller) {
|
|
156
209
|
capture.observed = true;
|
|
157
|
-
|
|
210
|
+
observeResponseModelIdBytes(chunk, capture);
|
|
158
211
|
controller.enqueue(chunk);
|
|
159
212
|
},
|
|
160
213
|
flush() {
|
|
161
214
|
capture.observed = true;
|
|
162
|
-
|
|
215
|
+
observeResponseModelIdBytes(undefined, capture, true);
|
|
163
216
|
},
|
|
164
217
|
}),
|
|
165
218
|
);
|
|
@@ -171,13 +224,16 @@ function captureResponseModelId(response: Response, capture: ResponseModelIdCapt
|
|
|
171
224
|
}
|
|
172
225
|
|
|
173
226
|
function withResponseModelIdCapture<TOptions extends StreamOptions>(
|
|
227
|
+
model: Model<Api>,
|
|
174
228
|
options: TOptions,
|
|
175
229
|
sourceFactory: (capturedOptions: TOptions) => AssistantMessageEventStream,
|
|
176
230
|
): AssistantMessageEventStream {
|
|
177
231
|
const capture: ResponseModelIdCapture = {
|
|
178
232
|
reportedModelId: null,
|
|
179
233
|
observed: false,
|
|
180
|
-
|
|
234
|
+
modelIdDone: false,
|
|
235
|
+
backendTimings: null,
|
|
236
|
+
backendTimingsSource: backendTimingsSourceForModel(model),
|
|
181
237
|
buffer: "",
|
|
182
238
|
decoder: new TextDecoder(),
|
|
183
239
|
};
|
|
@@ -197,8 +253,13 @@ function withResponseModelIdCapture<TOptions extends StreamOptions>(
|
|
|
197
253
|
? { state: "not-reported" }
|
|
198
254
|
: { state: "reported", reportedModelId: capture.reportedModelId }
|
|
199
255
|
: { state: "not-observed" };
|
|
200
|
-
if (event.type === "done")
|
|
201
|
-
|
|
256
|
+
if (event.type === "done") {
|
|
257
|
+
event.message.responseModelIdObservation = observation;
|
|
258
|
+
if (capture.backendTimings !== null) event.message.backendTimings = capture.backendTimings;
|
|
259
|
+
} else if (event.type === "error") {
|
|
260
|
+
event.error.responseModelIdObservation = observation;
|
|
261
|
+
if (capture.backendTimings !== null) event.error.backendTimings = capture.backendTimings;
|
|
262
|
+
}
|
|
202
263
|
annotated.push(event as AssistantMessageEvent);
|
|
203
264
|
}
|
|
204
265
|
annotated.end();
|
|
@@ -863,6 +924,7 @@ export const openAICompletionsApiProvider: EngineApiProvider<"openai-completions
|
|
|
863
924
|
stripNeverReasoningFromStream(
|
|
864
925
|
filterGemmaChannelStream(
|
|
865
926
|
withResponseModelIdCapture(
|
|
927
|
+
model,
|
|
866
928
|
withRemainingContextBudget(model, effectiveContext, withSamplers),
|
|
867
929
|
(capturedOptions) =>
|
|
868
930
|
withLocalResidency(
|
|
@@ -895,6 +957,7 @@ export const openAICompletionsApiProvider: EngineApiProvider<"openai-completions
|
|
|
895
957
|
stripNeverReasoningFromStream(
|
|
896
958
|
filterGemmaChannelStream(
|
|
897
959
|
withResponseModelIdCapture(
|
|
960
|
+
model,
|
|
898
961
|
withRemainingContextBudget(model, effectiveContext, withSamplers),
|
|
899
962
|
(capturedOptions) =>
|
|
900
963
|
withLocalResidency(
|
|
@@ -12,12 +12,14 @@
|
|
|
12
12
|
import { join } from "node:path";
|
|
13
13
|
import { withStateFileLock } from "../../core/state-file-lock.js";
|
|
14
14
|
import { clioStatePath } from "../../core/xdg.js";
|
|
15
|
+
import { canonicalEndpointKey } from "../../domains/providers/endpoint-capacity.js";
|
|
15
16
|
|
|
16
17
|
/** Total time one process waits for another's mutation before proceeding unlocked. */
|
|
17
18
|
const LOCK_WAIT_MS = 120_000;
|
|
18
19
|
|
|
19
20
|
function lockTargetFor(targetKey: string): string {
|
|
20
|
-
|
|
21
|
+
const key = canonicalEndpointKey(targetKey) ?? targetKey;
|
|
22
|
+
return join(clioStatePath(), "residency-locks", key.replace(/[^a-zA-Z0-9._-]+/g, "_"));
|
|
21
23
|
}
|
|
22
24
|
|
|
23
25
|
/** Run `fn` while holding the per-target residency lock. */
|
|
@@ -35,7 +35,12 @@
|
|
|
35
35
|
* unload/load against the same server.
|
|
36
36
|
*/
|
|
37
37
|
|
|
38
|
-
import {
|
|
38
|
+
import {
|
|
39
|
+
BusChannels,
|
|
40
|
+
type ResidencyMutationPayload,
|
|
41
|
+
type RuntimeNoticeKind,
|
|
42
|
+
type RuntimeNoticePayload,
|
|
43
|
+
} from "../../core/bus-events.js";
|
|
39
44
|
import type { ProtectedModelRef, ResidencyRole } from "../../core/residency-protection.js";
|
|
40
45
|
import { getSharedBus } from "../../core/shared-bus.js";
|
|
41
46
|
import { withResidencyLock } from "./residency-lock.js";
|
|
@@ -73,6 +78,11 @@ export function emitResidencyNotice(notice: ResidencyNotice): void {
|
|
|
73
78
|
}
|
|
74
79
|
}
|
|
75
80
|
|
|
81
|
+
/** Publish one successful residency mutation to in-process cache telemetry. */
|
|
82
|
+
export function emitResidencyMutation(mutation: Omit<ResidencyMutationPayload, "at">): void {
|
|
83
|
+
getSharedBus().emit(BusChannels.ResidencyMutation, { ...mutation, at: Date.now() });
|
|
84
|
+
}
|
|
85
|
+
|
|
76
86
|
// --- configured-model protection ---------------------------------------------
|
|
77
87
|
|
|
78
88
|
// Wire model ids the operator's own configuration references, with the role
|
|
@@ -543,6 +553,13 @@ async function restoreEvictedModels(
|
|
|
543
553
|
try {
|
|
544
554
|
await adapter.reloadEvicted(entry.modelId);
|
|
545
555
|
restored.push(entry.modelId);
|
|
556
|
+
emitResidencyMutation({
|
|
557
|
+
targetKey: adapter.targetKey,
|
|
558
|
+
targetId: adapter.targetId,
|
|
559
|
+
runtimeId: adapter.runtimeId,
|
|
560
|
+
model: entry.modelId,
|
|
561
|
+
operation: "load",
|
|
562
|
+
});
|
|
546
563
|
} catch {
|
|
547
564
|
failed.push(entry.modelId);
|
|
548
565
|
}
|
|
@@ -705,6 +722,13 @@ export async function reconcileResidency(adapter: ResidencyAdapter): Promise<Rec
|
|
|
705
722
|
await adapter.unload(entry.modelId);
|
|
706
723
|
forgetClioLoaded(adapter.targetKey, entry.modelId);
|
|
707
724
|
evicted.push(entry);
|
|
725
|
+
emitResidencyMutation({
|
|
726
|
+
targetKey: adapter.targetKey,
|
|
727
|
+
targetId: adapter.targetId,
|
|
728
|
+
runtimeId: adapter.runtimeId,
|
|
729
|
+
model: entry.modelId,
|
|
730
|
+
operation: "evict",
|
|
731
|
+
});
|
|
708
732
|
} catch {
|
|
709
733
|
// Best-effort: a failed unload self-heals on the next reconcile.
|
|
710
734
|
}
|
|
@@ -712,6 +736,15 @@ export async function reconcileResidency(adapter: ResidencyAdapter): Promise<Rec
|
|
|
712
736
|
if (!adapter.load) return;
|
|
713
737
|
try {
|
|
714
738
|
await adapter.load(adapter.keepModelId);
|
|
739
|
+
if (!plan.keepResident) {
|
|
740
|
+
emitResidencyMutation({
|
|
741
|
+
targetKey: adapter.targetKey,
|
|
742
|
+
targetId: adapter.targetId,
|
|
743
|
+
runtimeId: adapter.runtimeId,
|
|
744
|
+
model: adapter.keepModelId,
|
|
745
|
+
operation: "load",
|
|
746
|
+
});
|
|
747
|
+
}
|
|
715
748
|
} catch (error) {
|
|
716
749
|
// The eviction bought nothing: the slot it freed is still empty and
|
|
717
750
|
// the target is now serving less than before the reconcile. Put back
|
|
@@ -1 +1,18 @@
|
|
|
1
|
-
|
|
1
|
+
import { parseCommandArgs, substituteArgs as substituteParsedArgs } from "@earendil-works/pi-agent-core";
|
|
2
|
+
|
|
3
|
+
export { parseCommandArgs };
|
|
4
|
+
|
|
5
|
+
const RAW_ARGUMENTS_PLACEHOLDER = /\$ARGUMENTS/g;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Substitute prompt arguments while optionally retaining the exact raw text
|
|
9
|
+
* for `$ARGUMENTS`. Positional, slice, and `$@` placeholders keep Pi's
|
|
10
|
+
* shell-style parsing semantics.
|
|
11
|
+
*/
|
|
12
|
+
export function substituteArgs(content: string, args: string[], rawArguments?: string): string {
|
|
13
|
+
if (rawArguments === undefined) return substituteParsedArgs(content, args);
|
|
14
|
+
return content
|
|
15
|
+
.split(RAW_ARGUMENTS_PLACEHOLDER)
|
|
16
|
+
.map((segment) => substituteParsedArgs(segment, args))
|
|
17
|
+
.join(rawArguments);
|
|
18
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { RESPONSE_SCHEMA_RUNTIME_ID } from "../core/response-schema.js";
|
|
1
|
+
import { RESPONSE_SCHEMA_RUNTIME_ID, type ResponseSchemaDialect } from "../core/response-schema.js";
|
|
2
2
|
import type { ThinkingLevel } from "../domains/providers/index.js";
|
|
3
3
|
import type { EngineModel } from "./types.js";
|
|
4
4
|
|
|
@@ -217,6 +217,34 @@ function patchLlamaCppResponseSchemaPayload(
|
|
|
217
217
|
};
|
|
218
218
|
}
|
|
219
219
|
|
|
220
|
+
/**
|
|
221
|
+
* Apply a JSON-schema response constraint in the dialect the runtime takes.
|
|
222
|
+
*
|
|
223
|
+
* Unlike the worker patcher above, this one is for a seam that treats native
|
|
224
|
+
* enforcement as an optimization: the caller looks the dialect up first and
|
|
225
|
+
* simply does not call this when there is none, so an unconstrained request
|
|
226
|
+
* still goes out and the prompt-level instruction carries it (issue #223).
|
|
227
|
+
* Returns undefined when the payload is not an object, which leaves it alone.
|
|
228
|
+
*/
|
|
229
|
+
export function patchResponseSchemaPayloadForDialect(
|
|
230
|
+
payload: unknown,
|
|
231
|
+
dialect: ResponseSchemaDialect,
|
|
232
|
+
responseSchema: Record<string, unknown>,
|
|
233
|
+
schemaName: string,
|
|
234
|
+
): unknown | undefined {
|
|
235
|
+
if (!isRecord(payload)) return undefined;
|
|
236
|
+
if (dialect === "llamacpp-json-object") {
|
|
237
|
+
return { ...payload, response_format: { type: "json_object", schema: responseSchema } };
|
|
238
|
+
}
|
|
239
|
+
return {
|
|
240
|
+
...payload,
|
|
241
|
+
response_format: {
|
|
242
|
+
type: "json_schema",
|
|
243
|
+
json_schema: { name: schemaName, strict: true, schema: responseSchema },
|
|
244
|
+
},
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
|
|
220
248
|
export interface WorkerPayloadPatchOptions {
|
|
221
249
|
runtimeId: string;
|
|
222
250
|
thinkingLevel?: ThinkingLevel;
|
|
@@ -23,7 +23,7 @@ import { type ToolName, ToolNames } from "../core/tool-names.js";
|
|
|
23
23
|
import {
|
|
24
24
|
type ObservedReadRanges,
|
|
25
25
|
type ObservedRunEffects,
|
|
26
|
-
|
|
26
|
+
parseWorkerResultContract,
|
|
27
27
|
RESULT_CONTRACT_REPAIR_LIMIT,
|
|
28
28
|
type ResultContract,
|
|
29
29
|
resultContractRepairMessages,
|
|
@@ -362,8 +362,11 @@ export function startWorkerRun(input: WorkerRunInput, emit: WorkerEventEmit): Wo
|
|
|
362
362
|
assertResponseSchemaRuntime(input);
|
|
363
363
|
// The wire carries the contract as data; the one strict parser owns its
|
|
364
364
|
// shape. The worker subprocess may not import it (it stays slim), so the
|
|
365
|
-
// check lands here, before any model call.
|
|
366
|
-
|
|
365
|
+
// check lands here, before any model call. The wire parser, not the recipe
|
|
366
|
+
// one: a dispatch request may override the seated recipe's postcondition
|
|
367
|
+
// with a kind the coordinator authors, and the recipe parser refusing those
|
|
368
|
+
// killed every council vote member with a fatal spec error.
|
|
369
|
+
if (input.resultContract !== undefined) parseWorkerResultContract(input.resultContract, "WorkerSpec.resultContract");
|
|
367
370
|
if (input.runtime.id === "claude-sdk") {
|
|
368
371
|
return startClaudeSdkWorkerRun(input, emit);
|
|
369
372
|
}
|