@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
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
getVersionInfo
|
|
4
|
+
} from "./chunk-XPLRXC72.js";
|
|
2
5
|
import {
|
|
3
6
|
require_dist
|
|
4
7
|
} from "./chunk-APJ265NV.js";
|
|
@@ -16,8 +19,222 @@ import {
|
|
|
16
19
|
// src/domains/extensions/discovery.ts
|
|
17
20
|
init_esm_shims();
|
|
18
21
|
var import_yaml = __toESM(require_dist(), 1);
|
|
19
|
-
import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
|
|
22
|
+
import { existsSync, lstatSync, readdirSync, readFileSync, realpathSync, statSync } from "node:fs";
|
|
20
23
|
import path from "node:path";
|
|
24
|
+
|
|
25
|
+
// src/domains/extensions/compatibility.ts
|
|
26
|
+
init_esm_shims();
|
|
27
|
+
var MAX_RANGE_CHARS = 256;
|
|
28
|
+
var NUMERIC = "(?:0|[1-9]\\d*)";
|
|
29
|
+
var IDENTIFIER = "[0-9A-Za-z-]+";
|
|
30
|
+
var VERSION_RE = new RegExp(
|
|
31
|
+
`^v?(${NUMERIC})\\.(${NUMERIC})\\.(${NUMERIC})(?:-(${IDENTIFIER}(?:\\.${IDENTIFIER})*))?(?:\\+${IDENTIFIER}(?:\\.${IDENTIFIER})*)?$`
|
|
32
|
+
);
|
|
33
|
+
var PARTIAL_RE = new RegExp(
|
|
34
|
+
`^v?(${NUMERIC}|[xX*])(?:\\.(${NUMERIC}|[xX*]))?(?:\\.(${NUMERIC}|[xX*]))?(?:-(${IDENTIFIER}(?:\\.${IDENTIFIER})*))?(?:\\+${IDENTIFIER}(?:\\.${IDENTIFIER})*)?$`
|
|
35
|
+
);
|
|
36
|
+
function prerelease(value) {
|
|
37
|
+
if (value === void 0) return [];
|
|
38
|
+
const out = [];
|
|
39
|
+
for (const identifier of value.split(".")) {
|
|
40
|
+
if (identifier.length === 0) return null;
|
|
41
|
+
if (/^\d+$/u.test(identifier)) {
|
|
42
|
+
if (identifier.length > 1 && identifier.startsWith("0")) return null;
|
|
43
|
+
const parsed = Number(identifier);
|
|
44
|
+
if (!Number.isSafeInteger(parsed)) return null;
|
|
45
|
+
out.push(parsed);
|
|
46
|
+
} else {
|
|
47
|
+
out.push(identifier);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return out;
|
|
51
|
+
}
|
|
52
|
+
function parseSemVer(value) {
|
|
53
|
+
const match = VERSION_RE.exec(value);
|
|
54
|
+
if (match === null) return null;
|
|
55
|
+
const parsedPrerelease = prerelease(match[4]);
|
|
56
|
+
if (parsedPrerelease === null) return null;
|
|
57
|
+
const major = Number(match[1]);
|
|
58
|
+
const minor = Number(match[2]);
|
|
59
|
+
const patch = Number(match[3]);
|
|
60
|
+
if (![major, minor, patch].every(Number.isSafeInteger)) return null;
|
|
61
|
+
return { major, minor, patch, prerelease: parsedPrerelease };
|
|
62
|
+
}
|
|
63
|
+
function parsePart(value) {
|
|
64
|
+
if (value === void 0 || value === "x" || value === "X" || value === "*") return null;
|
|
65
|
+
const parsed = Number(value);
|
|
66
|
+
return Number.isSafeInteger(parsed) ? parsed : null;
|
|
67
|
+
}
|
|
68
|
+
function parsePartial(value) {
|
|
69
|
+
const match = PARTIAL_RE.exec(value);
|
|
70
|
+
if (match === null) return null;
|
|
71
|
+
for (const part of match.slice(1, 4)) {
|
|
72
|
+
if (part === void 0 || part === "x" || part === "X" || part === "*") continue;
|
|
73
|
+
if (!Number.isSafeInteger(Number(part))) return null;
|
|
74
|
+
}
|
|
75
|
+
const major = parsePart(match[1]);
|
|
76
|
+
const minor = parsePart(match[2]);
|
|
77
|
+
const patch = parsePart(match[3]);
|
|
78
|
+
if (major === null && (match[2] !== void 0 || match[3] !== void 0) || minor === null && match[3] !== void 0) {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
const parsedPrerelease = prerelease(match[4]);
|
|
82
|
+
if (parsedPrerelease === null) return null;
|
|
83
|
+
if (parsedPrerelease.length > 0 && (major === null || minor === null || patch === null)) return null;
|
|
84
|
+
return { major, minor, patch, prerelease: parsedPrerelease };
|
|
85
|
+
}
|
|
86
|
+
function compareIdentifiers(left, right) {
|
|
87
|
+
if (left === right) return 0;
|
|
88
|
+
if (typeof left === "number" && typeof right === "number") return left < right ? -1 : 1;
|
|
89
|
+
if (typeof left === "number") return -1;
|
|
90
|
+
if (typeof right === "number") return 1;
|
|
91
|
+
return left < right ? -1 : 1;
|
|
92
|
+
}
|
|
93
|
+
function compare(left, right) {
|
|
94
|
+
for (const key of ["major", "minor", "patch"]) {
|
|
95
|
+
if (left[key] !== right[key]) return left[key] < right[key] ? -1 : 1;
|
|
96
|
+
}
|
|
97
|
+
if (left.prerelease.length === 0 || right.prerelease.length === 0) {
|
|
98
|
+
if (left.prerelease.length === right.prerelease.length) return 0;
|
|
99
|
+
return left.prerelease.length === 0 ? 1 : -1;
|
|
100
|
+
}
|
|
101
|
+
const length = Math.max(left.prerelease.length, right.prerelease.length);
|
|
102
|
+
for (let index = 0; index < length; index += 1) {
|
|
103
|
+
const leftPart = left.prerelease[index];
|
|
104
|
+
const rightPart = right.prerelease[index];
|
|
105
|
+
if (leftPart === void 0 || rightPart === void 0) {
|
|
106
|
+
if (leftPart === rightPart) return 0;
|
|
107
|
+
return leftPart === void 0 ? -1 : 1;
|
|
108
|
+
}
|
|
109
|
+
const order = compareIdentifiers(leftPart, rightPart);
|
|
110
|
+
if (order !== 0) return order;
|
|
111
|
+
}
|
|
112
|
+
return 0;
|
|
113
|
+
}
|
|
114
|
+
function floor(partial) {
|
|
115
|
+
return {
|
|
116
|
+
major: partial.major ?? 0,
|
|
117
|
+
minor: partial.minor ?? 0,
|
|
118
|
+
patch: partial.patch ?? 0,
|
|
119
|
+
prerelease: partial.prerelease
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
function nextWildcard(partial) {
|
|
123
|
+
if (partial.major === null) return null;
|
|
124
|
+
if (partial.minor === null) return { major: partial.major + 1, minor: 0, patch: 0, prerelease: [] };
|
|
125
|
+
if (partial.patch === null) return { major: partial.major, minor: partial.minor + 1, patch: 0, prerelease: [] };
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
function lowerBound(version, inclusive) {
|
|
129
|
+
return (candidate) => inclusive ? compare(candidate, version) >= 0 : compare(candidate, version) > 0;
|
|
130
|
+
}
|
|
131
|
+
function upperBound(version, inclusive) {
|
|
132
|
+
return (candidate) => inclusive ? compare(candidate, version) <= 0 : compare(candidate, version) < 0;
|
|
133
|
+
}
|
|
134
|
+
function core(version) {
|
|
135
|
+
return `${version.major}.${version.minor}.${version.patch}`;
|
|
136
|
+
}
|
|
137
|
+
function predicatesForToken(token) {
|
|
138
|
+
const match = /^(<=|>=|<|>|=|~|\^)?(.+)$/u.exec(token);
|
|
139
|
+
if (match === null) return null;
|
|
140
|
+
const operator = match[1] ?? "";
|
|
141
|
+
const partial = parsePartial(match[2] ?? "");
|
|
142
|
+
if (partial === null) return null;
|
|
143
|
+
const base = floor(partial);
|
|
144
|
+
const wildcardUpper = nextWildcard(partial);
|
|
145
|
+
const prereleaseCore = partial.prerelease.length > 0 ? core(base) : null;
|
|
146
|
+
if (operator === "" || operator === "=") {
|
|
147
|
+
if (partial.major === null) return { predicates: [], prereleaseCore };
|
|
148
|
+
if (wildcardUpper !== null) {
|
|
149
|
+
return { predicates: [lowerBound(base, true), upperBound(wildcardUpper, false)], prereleaseCore };
|
|
150
|
+
}
|
|
151
|
+
return { predicates: [(candidate) => compare(candidate, base) === 0], prereleaseCore };
|
|
152
|
+
}
|
|
153
|
+
if (operator === ">=") return { predicates: [lowerBound(base, true)], prereleaseCore };
|
|
154
|
+
if (operator === "<") return { predicates: [upperBound(base, false)], prereleaseCore };
|
|
155
|
+
if (operator === ">") {
|
|
156
|
+
return {
|
|
157
|
+
predicates: [wildcardUpper === null ? lowerBound(base, false) : lowerBound(wildcardUpper, true)],
|
|
158
|
+
prereleaseCore
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
if (operator === "<=") {
|
|
162
|
+
return {
|
|
163
|
+
predicates: [wildcardUpper === null ? upperBound(base, true) : upperBound(wildcardUpper, false)],
|
|
164
|
+
prereleaseCore
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
if (partial.major === null) return { predicates: [], prereleaseCore };
|
|
168
|
+
if (operator === "~") {
|
|
169
|
+
const upper2 = partial.minor === null ? { major: partial.major + 1, minor: 0, patch: 0, prerelease: [] } : { major: partial.major, minor: partial.minor + 1, patch: 0, prerelease: [] };
|
|
170
|
+
return { predicates: [lowerBound(base, true), upperBound(upper2, false)], prereleaseCore };
|
|
171
|
+
}
|
|
172
|
+
const upper = partial.major > 0 ? { major: partial.major + 1, minor: 0, patch: 0, prerelease: [] } : partial.minor === null ? { major: 1, minor: 0, patch: 0, prerelease: [] } : (partial.minor ?? 0) > 0 ? { major: 0, minor: (partial.minor ?? 0) + 1, patch: 0, prerelease: [] } : partial.patch === null ? { major: 0, minor: 1, patch: 0, prerelease: [] } : { major: 0, minor: 0, patch: (partial.patch ?? 0) + 1, prerelease: [] };
|
|
173
|
+
return { predicates: [lowerBound(base, true), upperBound(upper, false)], prereleaseCore };
|
|
174
|
+
}
|
|
175
|
+
function predicatesForSet(raw) {
|
|
176
|
+
const hyphen = /^(\S+)\s+-\s+(\S+)$/u.exec(raw);
|
|
177
|
+
if (hyphen !== null) {
|
|
178
|
+
const left = parsePartial(hyphen[1] ?? "");
|
|
179
|
+
const right = parsePartial(hyphen[2] ?? "");
|
|
180
|
+
if (left === null || right === null || left.major === null || right.major === null) return null;
|
|
181
|
+
const rightUpper = nextWildcard(right);
|
|
182
|
+
return {
|
|
183
|
+
predicates: [
|
|
184
|
+
lowerBound(floor(left), true),
|
|
185
|
+
rightUpper === null ? upperBound(floor(right), true) : upperBound(rightUpper, false)
|
|
186
|
+
],
|
|
187
|
+
prereleaseCores: new Set(
|
|
188
|
+
[
|
|
189
|
+
left.prerelease.length > 0 ? core(floor(left)) : null,
|
|
190
|
+
right.prerelease.length > 0 ? core(floor(right)) : null
|
|
191
|
+
].filter((entry) => entry !== null)
|
|
192
|
+
)
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
const normalized = raw.replace(/(<=|>=|<|>|=|~|\^)\s+/gu, "$1");
|
|
196
|
+
const tokens = normalized.split(/\s+/u).filter((entry) => entry.length > 0);
|
|
197
|
+
if (tokens.length === 0) return null;
|
|
198
|
+
const predicates = [];
|
|
199
|
+
const prereleaseCores = /* @__PURE__ */ new Set();
|
|
200
|
+
for (const token of tokens) {
|
|
201
|
+
const parsed = predicatesForToken(token);
|
|
202
|
+
if (parsed === null) return null;
|
|
203
|
+
predicates.push(...parsed.predicates);
|
|
204
|
+
if (parsed.prereleaseCore !== null) prereleaseCores.add(parsed.prereleaseCore);
|
|
205
|
+
}
|
|
206
|
+
return { predicates, prereleaseCores };
|
|
207
|
+
}
|
|
208
|
+
function parseRange(range) {
|
|
209
|
+
const trimmed = range.trim();
|
|
210
|
+
if (trimmed.length === 0 || trimmed.length > MAX_RANGE_CHARS) return null;
|
|
211
|
+
const sets = trimmed.split("||");
|
|
212
|
+
if (sets.some((set) => set.trim().length === 0)) return null;
|
|
213
|
+
const parsed = sets.map((set) => predicatesForSet(set.trim()));
|
|
214
|
+
return parsed.every((set) => set !== null) ? parsed : null;
|
|
215
|
+
}
|
|
216
|
+
function isValidSemVerRange(range) {
|
|
217
|
+
return parseRange(range) !== null;
|
|
218
|
+
}
|
|
219
|
+
function satisfiesSemVerRange(version, range) {
|
|
220
|
+
const candidate = parseSemVer(version);
|
|
221
|
+
const sets = parseRange(range);
|
|
222
|
+
if (candidate === null || sets === null) return false;
|
|
223
|
+
return sets.some((set) => {
|
|
224
|
+
if (candidate.prerelease.length > 0 && !set.prereleaseCores.has(core(candidate))) return false;
|
|
225
|
+
return set.predicates.every((predicate) => predicate(candidate));
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
function evaluateClioCompatibility(range, runningVersion = getVersionInfo().clio) {
|
|
229
|
+
const rangeValid = isValidSemVerRange(range);
|
|
230
|
+
return {
|
|
231
|
+
rangeValid,
|
|
232
|
+
satisfied: rangeValid && satisfiesSemVerRange(runningVersion, range),
|
|
233
|
+
runningVersion
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// src/domains/extensions/discovery.ts
|
|
21
238
|
var MANIFEST_NAMES = ["clio-coder-extension.yaml", "clio-coder-extension.yml", "clio-coder-extension.json"];
|
|
22
239
|
function isRecord(value) {
|
|
23
240
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
@@ -44,12 +261,85 @@ function normalizeResources(value) {
|
|
|
44
261
|
const out = {};
|
|
45
262
|
const skills = trimString(value.skills);
|
|
46
263
|
const prompts = trimString(value.prompts);
|
|
264
|
+
const agents = trimString(value.agents);
|
|
265
|
+
const fleets = trimString(value.fleets);
|
|
47
266
|
const themes = trimString(value.themes);
|
|
48
267
|
if (skills) out.skills = skills;
|
|
49
268
|
if (prompts) out.prompts = prompts;
|
|
269
|
+
if (agents) out.agents = agents;
|
|
270
|
+
if (fleets) out.fleets = fleets;
|
|
50
271
|
if (themes) out.themes = themes;
|
|
51
272
|
return out;
|
|
52
273
|
}
|
|
274
|
+
function contained(root, candidate) {
|
|
275
|
+
const relative = path.relative(root, candidate);
|
|
276
|
+
return relative === "" || !relative.startsWith(`..${path.sep}`) && relative !== ".." && !path.isAbsolute(relative);
|
|
277
|
+
}
|
|
278
|
+
function validateResourceTree(root, resourcePath, kind, diagnostics) {
|
|
279
|
+
if (path.isAbsolute(resourcePath)) {
|
|
280
|
+
diagnostics.push({ type: "error", message: `resources.${kind} must be relative`, path: resourcePath });
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
const resolvedRoot = path.resolve(root);
|
|
284
|
+
const resolved = path.resolve(resolvedRoot, resourcePath);
|
|
285
|
+
if (!contained(resolvedRoot, resolved) || resolved === resolvedRoot) {
|
|
286
|
+
diagnostics.push({ type: "error", message: `resources.${kind} escapes the extension root`, path: resourcePath });
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
let canonicalRoot;
|
|
290
|
+
let canonicalResource;
|
|
291
|
+
try {
|
|
292
|
+
canonicalRoot = realpathSync(resolvedRoot);
|
|
293
|
+
canonicalResource = realpathSync(resolved);
|
|
294
|
+
if (!lstatSync(resolved).isDirectory()) {
|
|
295
|
+
diagnostics.push({ type: "error", message: `resources.${kind} is not a directory`, path: resolved });
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
} catch (error) {
|
|
299
|
+
diagnostics.push({
|
|
300
|
+
type: "error",
|
|
301
|
+
message: `resources.${kind} cannot be resolved: ${error instanceof Error ? error.message : String(error)}`,
|
|
302
|
+
path: resolved
|
|
303
|
+
});
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
if (!contained(canonicalRoot, canonicalResource)) {
|
|
307
|
+
diagnostics.push({ type: "error", message: `resources.${kind} escapes through a symbolic link`, path: resolved });
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
const pending = [resolved];
|
|
311
|
+
while (pending.length > 0) {
|
|
312
|
+
const directory = pending.pop();
|
|
313
|
+
if (!directory) continue;
|
|
314
|
+
for (const entry of readdirSync(directory, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name))) {
|
|
315
|
+
const candidate = path.join(directory, entry.name);
|
|
316
|
+
if (entry.isSymbolicLink()) {
|
|
317
|
+
try {
|
|
318
|
+
if (!contained(canonicalRoot, realpathSync(candidate))) {
|
|
319
|
+
diagnostics.push({
|
|
320
|
+
type: "error",
|
|
321
|
+
message: `resources.${kind} contains an escaping symbolic link`,
|
|
322
|
+
path: candidate
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
} catch (error) {
|
|
326
|
+
diagnostics.push({
|
|
327
|
+
type: "error",
|
|
328
|
+
message: `resources.${kind} contains an unresolved symbolic link: ${error instanceof Error ? error.message : String(error)}`,
|
|
329
|
+
path: candidate
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
} else if (entry.isDirectory()) {
|
|
333
|
+
pending.push(candidate);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
function validateResourceRoots(root, resources, diagnostics) {
|
|
339
|
+
for (const [kind, resourcePath] of Object.entries(resources)) {
|
|
340
|
+
if (resourcePath) validateResourceTree(root, resourcePath, kind, diagnostics);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
53
343
|
function stringArray(value) {
|
|
54
344
|
if (!Array.isArray(value)) return void 0;
|
|
55
345
|
const out = value.map((entry) => trimString(entry)).filter((entry) => entry !== void 0);
|
|
@@ -77,7 +367,32 @@ function parseExtensionManifest(value, manifestPath) {
|
|
|
77
367
|
const resources = normalizeResources(value.resources);
|
|
78
368
|
const tools = stringArray(value.tools);
|
|
79
369
|
const settings = stringArray(value.settings);
|
|
80
|
-
|
|
370
|
+
let compatibility;
|
|
371
|
+
if (value.compatibility !== void 0) {
|
|
372
|
+
if (!isRecord(value.compatibility)) {
|
|
373
|
+
diagnostics.push({ type: "error", message: "compatibility must be an object", path: manifestPath });
|
|
374
|
+
} else if ("clio" in value.compatibility) {
|
|
375
|
+
const range = trimString(value.compatibility.clio);
|
|
376
|
+
if (range === void 0) {
|
|
377
|
+
diagnostics.push({
|
|
378
|
+
type: "error",
|
|
379
|
+
message: "compatibility.clio must be a non-empty semver range",
|
|
380
|
+
path: manifestPath
|
|
381
|
+
});
|
|
382
|
+
} else {
|
|
383
|
+
const evaluation = evaluateClioCompatibility(range);
|
|
384
|
+
if (!evaluation.rangeValid) {
|
|
385
|
+
diagnostics.push({
|
|
386
|
+
type: "error",
|
|
387
|
+
message: `extension ${id ?? "<unknown>"} declares malformed compatibility.clio range '${range}'`,
|
|
388
|
+
path: manifestPath
|
|
389
|
+
});
|
|
390
|
+
} else {
|
|
391
|
+
compatibility = { clio: range };
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
}
|
|
81
396
|
if (!id || !name || !version || !description || diagnostics.some((diag) => diag.type === "error")) {
|
|
82
397
|
return { diagnostics };
|
|
83
398
|
}
|
|
@@ -92,6 +407,17 @@ function parseExtensionManifest(value, manifestPath) {
|
|
|
92
407
|
if (tools) manifest.tools = tools;
|
|
93
408
|
if (settings) manifest.settings = settings;
|
|
94
409
|
if (compatibility && Object.keys(compatibility).length > 0) manifest.compatibility = compatibility;
|
|
410
|
+
const clioRange = manifest.compatibility?.clio;
|
|
411
|
+
if (clioRange !== void 0) {
|
|
412
|
+
const evaluation = evaluateClioCompatibility(clioRange);
|
|
413
|
+
if (!evaluation.satisfied) {
|
|
414
|
+
diagnostics.push({
|
|
415
|
+
type: "error",
|
|
416
|
+
message: `extension ${manifest.id} requires Clio '${clioRange}', but running Clio version is '${evaluation.runningVersion}'`,
|
|
417
|
+
path: manifestPath
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
}
|
|
95
421
|
return { manifest, diagnostics };
|
|
96
422
|
}
|
|
97
423
|
function findExtensionManifestPath(root) {
|
|
@@ -115,6 +441,7 @@ function loadManifestFromRoot(root) {
|
|
|
115
441
|
}
|
|
116
442
|
try {
|
|
117
443
|
const parsed = parseExtensionManifest(readJsonOrYaml(manifestPath), manifestPath);
|
|
444
|
+
if (parsed.manifest) validateResourceRoots(root, parsed.manifest.resources, parsed.diagnostics);
|
|
118
445
|
return {
|
|
119
446
|
path: root,
|
|
120
447
|
manifestPath,
|
|
@@ -222,6 +549,8 @@ function installedFromRoot(root, scope, state) {
|
|
|
222
549
|
const candidate = loadManifestFromRoot(root);
|
|
223
550
|
const manifest = candidate.manifest;
|
|
224
551
|
if (!manifest || !candidate.manifestPath) return null;
|
|
552
|
+
const clioRange = manifest.compatibility?.clio;
|
|
553
|
+
const compatible = clioRange === void 0 || evaluateClioCompatibility(clioRange).satisfied;
|
|
225
554
|
return {
|
|
226
555
|
id: manifest.id,
|
|
227
556
|
name: manifest.name,
|
|
@@ -231,6 +560,7 @@ function installedFromRoot(root, scope, state) {
|
|
|
231
560
|
rootPath: root,
|
|
232
561
|
manifestPath: candidate.manifestPath,
|
|
233
562
|
enabled: !state.disabled.includes(manifest.id),
|
|
563
|
+
compatible,
|
|
234
564
|
effective: false,
|
|
235
565
|
resources: manifest.resources,
|
|
236
566
|
diagnostics: candidate.diagnostics
|
|
@@ -259,13 +589,13 @@ function listInstalledExtensions(cwd = process.cwd(), options = {}) {
|
|
|
259
589
|
byId.set(entry.id, list);
|
|
260
590
|
}
|
|
261
591
|
for (const group of byId.values()) {
|
|
262
|
-
const winner =
|
|
592
|
+
const winner = group.filter((entry) => entry.compatible).sort((a, b) => scopeRank(a.scope) - scopeRank(b.scope)).at(-1);
|
|
263
593
|
for (const entry of group) {
|
|
264
594
|
entry.effective = entry === winner;
|
|
265
|
-
if (!entry.effective && winner) entry.overriddenBy = winner.scope;
|
|
595
|
+
if (entry.compatible && !entry.effective && winner) entry.overriddenBy = winner.scope;
|
|
266
596
|
}
|
|
267
597
|
}
|
|
268
|
-
const all = options.all === true ? entries : entries.filter((entry) => entry.effective);
|
|
598
|
+
const all = options.all === true ? entries : entries.filter((entry) => entry.effective || !entry.compatible);
|
|
269
599
|
return all.sort((a, b) => {
|
|
270
600
|
const id = a.id.localeCompare(b.id);
|
|
271
601
|
if (id !== 0) return id;
|
|
@@ -284,7 +614,7 @@ function installExtension(sourcePath, options = {}) {
|
|
|
284
614
|
const cwd = options.cwd ?? process.cwd();
|
|
285
615
|
const source = path2.resolve(sourcePath);
|
|
286
616
|
const candidate = loadManifestFromRoot(source);
|
|
287
|
-
if (!candidate.manifest) return { diagnostics: candidate.diagnostics };
|
|
617
|
+
if (!candidate.manifest || !candidate.valid) return { diagnostics: candidate.diagnostics };
|
|
288
618
|
const targetRoot = path2.join(extensionBaseDir(scope, cwd), candidate.manifest.id);
|
|
289
619
|
if (existsSync2(targetRoot)) {
|
|
290
620
|
if (!options.force) {
|
|
@@ -307,7 +637,11 @@ function installExtension(sourcePath, options = {}) {
|
|
|
307
637
|
rmSync(backupRoot, { recursive: true, force: true });
|
|
308
638
|
cpSync(source, stagingRoot, {
|
|
309
639
|
recursive: true,
|
|
310
|
-
|
|
640
|
+
// `state.json` beside the installed extension directories belongs to
|
|
641
|
+
// Clio's extension manager. An extension may legitimately ship nested
|
|
642
|
+
// resources with the same basename (for example a project-state JSON
|
|
643
|
+
// template), so exclude only a bookkeeping file at the package root.
|
|
644
|
+
filter: (src) => path2.relative(source, src) !== "state.json"
|
|
311
645
|
});
|
|
312
646
|
if (existsSync2(targetRoot)) {
|
|
313
647
|
renameSync(targetRoot, backupRoot);
|
|
@@ -379,32 +713,40 @@ init_esm_shims();
|
|
|
379
713
|
|
|
380
714
|
// src/domains/extensions/resources.ts
|
|
381
715
|
init_esm_shims();
|
|
382
|
-
import {
|
|
716
|
+
import { lstatSync as lstatSync2, realpathSync as realpathSync2 } from "node:fs";
|
|
383
717
|
import path3 from "node:path";
|
|
384
718
|
function extensionResourcePath(rootPath, resourcePath) {
|
|
385
719
|
const root = path3.resolve(rootPath);
|
|
386
720
|
const full = path3.resolve(root, resourcePath);
|
|
387
721
|
const relative = path3.relative(root, full);
|
|
388
|
-
if (relative === "" ||
|
|
389
|
-
|
|
722
|
+
if (relative === "" || relative === ".." || relative.startsWith(`..${path3.sep}`) || path3.isAbsolute(relative))
|
|
723
|
+
return null;
|
|
724
|
+
try {
|
|
725
|
+
const rootReal = realpathSync2(root);
|
|
726
|
+
const fullReal = realpathSync2(full);
|
|
727
|
+
const canonicalRelative = path3.relative(rootReal, fullReal);
|
|
728
|
+
if (canonicalRelative === ".." || canonicalRelative.startsWith(`..${path3.sep}`) || path3.isAbsolute(canonicalRelative)) {
|
|
729
|
+
return null;
|
|
730
|
+
}
|
|
731
|
+
if (!lstatSync2(full).isDirectory()) return null;
|
|
732
|
+
return full;
|
|
733
|
+
} catch {
|
|
734
|
+
return null;
|
|
735
|
+
}
|
|
390
736
|
}
|
|
391
737
|
function enabledExtensionResourceRoots(kind, cwd = process.cwd()) {
|
|
392
738
|
const roots = [];
|
|
393
739
|
for (const entry of listInstalledExtensions(cwd)) {
|
|
394
|
-
if (!entry.enabled || !entry.effective) continue;
|
|
740
|
+
if (!entry.enabled || !entry.compatible || !entry.effective) continue;
|
|
395
741
|
const rel = entry.resources[kind];
|
|
396
742
|
if (!rel) continue;
|
|
397
743
|
const full = extensionResourcePath(entry.rootPath, rel);
|
|
398
744
|
if (!full) continue;
|
|
399
|
-
try {
|
|
400
|
-
if (!statSync2(full).isDirectory()) continue;
|
|
401
|
-
} catch {
|
|
402
|
-
continue;
|
|
403
|
-
}
|
|
404
745
|
roots.push({
|
|
405
746
|
id: entry.id,
|
|
406
747
|
scope: entry.scope,
|
|
407
748
|
path: full,
|
|
749
|
+
rootPath: entry.rootPath,
|
|
408
750
|
source: `extension:${entry.scope}:${entry.id}`
|
|
409
751
|
});
|
|
410
752
|
}
|
|
@@ -474,4 +816,4 @@ export {
|
|
|
474
816
|
enabledExtensionResourceRoots,
|
|
475
817
|
ExtensionsDomainModule
|
|
476
818
|
};
|
|
477
|
-
//# sourceMappingURL=chunk-
|
|
819
|
+
//# sourceMappingURL=chunk-5QKCQQ3E.js.map
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
inspectEvidence
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-TEO2TLVN.js";
|
|
5
5
|
import {
|
|
6
6
|
TASK_MEMORY_CONTENT_MAX_CHARS,
|
|
7
7
|
TASK_MEMORY_DEFAULT_KNOWLEDGE_CAP,
|
|
8
|
-
TASK_MEMORY_DEFAULT_PROCEDURAL_CAP
|
|
9
|
-
|
|
8
|
+
TASK_MEMORY_DEFAULT_PROCEDURAL_CAP,
|
|
9
|
+
TASK_MEMORY_TELEMETRY_FILE,
|
|
10
|
+
parseTaskMemoryTelemetryRecord
|
|
11
|
+
} from "./chunk-O6I4CIEU.js";
|
|
10
12
|
import {
|
|
11
13
|
createRedactionTally,
|
|
12
14
|
redactSecretsText
|
|
@@ -16,7 +18,10 @@ import {
|
|
|
16
18
|
} from "./chunk-ECH6PKUQ.js";
|
|
17
19
|
import {
|
|
18
20
|
ceilChars
|
|
19
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-AEYBF3TB.js";
|
|
22
|
+
import {
|
|
23
|
+
clioStateDir
|
|
24
|
+
} from "./chunk-BNAZZHFG.js";
|
|
20
25
|
import {
|
|
21
26
|
safeResourceWrite
|
|
22
27
|
} from "./chunk-WEPFGWHJ.js";
|
|
@@ -1116,6 +1121,30 @@ function compareStrings3(a, b) {
|
|
|
1116
1121
|
return a.localeCompare(b);
|
|
1117
1122
|
}
|
|
1118
1123
|
|
|
1124
|
+
// src/domains/memory/task-bank-promotion.ts
|
|
1125
|
+
init_esm_shims();
|
|
1126
|
+
async function proposeInjectedTaskMemory(dataDir, input) {
|
|
1127
|
+
const result = { records: [], errors: [] };
|
|
1128
|
+
const sessionId = input.sessionId;
|
|
1129
|
+
const repository = canonicalMemoryRepositoryIdentity(input.cwd);
|
|
1130
|
+
if (sessionId === null || sessionId.length === 0 || repository === null) return result;
|
|
1131
|
+
for (const entry of input.entries) {
|
|
1132
|
+
if (entry.kind === "status") continue;
|
|
1133
|
+
try {
|
|
1134
|
+
const proposal = await proposeMemoryPromotion(
|
|
1135
|
+
dataDir,
|
|
1136
|
+
{ kind: "task-bank-entry", sessionId, evidenceRefs: [`session:${sessionId}`], entry },
|
|
1137
|
+
{ scope: "repo", repository },
|
|
1138
|
+
input.now ?? /* @__PURE__ */ new Date()
|
|
1139
|
+
);
|
|
1140
|
+
result.records.push(proposal.record);
|
|
1141
|
+
} catch (error) {
|
|
1142
|
+
result.errors.push(`${entry.id}: ${error instanceof Error ? error.message : String(error)}`);
|
|
1143
|
+
}
|
|
1144
|
+
}
|
|
1145
|
+
return result;
|
|
1146
|
+
}
|
|
1147
|
+
|
|
1119
1148
|
// src/domains/memory/task-memory-handoff.ts
|
|
1120
1149
|
init_esm_shims();
|
|
1121
1150
|
import { existsSync, readdirSync, readFileSync as readFileSync2, statSync } from "node:fs";
|
|
@@ -1367,6 +1396,80 @@ function compareStrings4(left, right) {
|
|
|
1367
1396
|
return left < right ? -1 : left > right ? 1 : 0;
|
|
1368
1397
|
}
|
|
1369
1398
|
|
|
1399
|
+
// src/domains/memory/task-memory-spend.ts
|
|
1400
|
+
init_esm_shims();
|
|
1401
|
+
import { readFileSync as readFileSync3, statSync as statSync2 } from "node:fs";
|
|
1402
|
+
import { join as join3 } from "node:path";
|
|
1403
|
+
function taskMemoryStepsPath(stateDir = clioStateDir()) {
|
|
1404
|
+
return join3(stateDir, "memory", TASK_MEMORY_TELEMETRY_FILE);
|
|
1405
|
+
}
|
|
1406
|
+
function emptyTaskMemorySpendSummary() {
|
|
1407
|
+
return {
|
|
1408
|
+
llmSteps: 0,
|
|
1409
|
+
injections: 0,
|
|
1410
|
+
hitRate: 0,
|
|
1411
|
+
inputTokens: 0,
|
|
1412
|
+
outputTokens: 0,
|
|
1413
|
+
totalTokens: 0,
|
|
1414
|
+
modelMs: 0,
|
|
1415
|
+
slowestStepMs: 0,
|
|
1416
|
+
timeouts: 0,
|
|
1417
|
+
endpointBusySkips: 0,
|
|
1418
|
+
firstAt: null,
|
|
1419
|
+
lastAt: null
|
|
1420
|
+
};
|
|
1421
|
+
}
|
|
1422
|
+
function foldTaskMemorySpend(lines) {
|
|
1423
|
+
const summary = emptyTaskMemorySpendSummary();
|
|
1424
|
+
for (const line of lines) {
|
|
1425
|
+
if (line.trim().length === 0) continue;
|
|
1426
|
+
let parsed;
|
|
1427
|
+
try {
|
|
1428
|
+
parsed = JSON.parse(line);
|
|
1429
|
+
} catch {
|
|
1430
|
+
continue;
|
|
1431
|
+
}
|
|
1432
|
+
const record = parseTaskMemoryTelemetryRecord(parsed);
|
|
1433
|
+
if (record === null) continue;
|
|
1434
|
+
if (summary.firstAt === null || record.at < summary.firstAt) summary.firstAt = record.at;
|
|
1435
|
+
if (summary.lastAt === null || record.at > summary.lastAt) summary.lastAt = record.at;
|
|
1436
|
+
if (record.reason === "endpoint_busy") summary.endpointBusySkips += 1;
|
|
1437
|
+
if (record.tier !== "llm") continue;
|
|
1438
|
+
summary.llmSteps += 1;
|
|
1439
|
+
if (record.decision === "injected") summary.injections += 1;
|
|
1440
|
+
if (record.decision === "timeout") summary.timeouts += 1;
|
|
1441
|
+
summary.inputTokens += record.tokenCost.input;
|
|
1442
|
+
summary.outputTokens += record.tokenCost.output;
|
|
1443
|
+
summary.totalTokens += record.tokenCost.total;
|
|
1444
|
+
summary.modelMs += record.latencyMs;
|
|
1445
|
+
summary.slowestStepMs = Math.max(summary.slowestStepMs, record.latencyMs);
|
|
1446
|
+
}
|
|
1447
|
+
summary.hitRate = summary.llmSteps === 0 ? 0 : summary.injections / summary.llmSteps;
|
|
1448
|
+
return summary;
|
|
1449
|
+
}
|
|
1450
|
+
var spendCache = /* @__PURE__ */ new Map();
|
|
1451
|
+
function readTaskMemorySpendSummary(stateDir = clioStateDir()) {
|
|
1452
|
+
const path = taskMemoryStepsPath(stateDir);
|
|
1453
|
+
try {
|
|
1454
|
+
const info = statSync2(path);
|
|
1455
|
+
const cached = spendCache.get(path);
|
|
1456
|
+
if (cached !== void 0 && cached.mtimeMs === info.mtimeMs && cached.size === info.size) return cached.summary;
|
|
1457
|
+
const summary = foldTaskMemorySpend(readFileSync3(path, "utf8").split("\n"));
|
|
1458
|
+
spendCache.set(path, { mtimeMs: info.mtimeMs, size: info.size, summary });
|
|
1459
|
+
return summary;
|
|
1460
|
+
} catch {
|
|
1461
|
+
return emptyTaskMemorySpendSummary();
|
|
1462
|
+
}
|
|
1463
|
+
}
|
|
1464
|
+
function formatTaskMemorySpend(summary) {
|
|
1465
|
+
if (summary.llmSteps === 0) return "";
|
|
1466
|
+
const tokens = summary.totalTokens >= 1e3 ? `${(summary.totalTokens / 1e3).toFixed(1)}k tok` : `${summary.totalTokens} tok`;
|
|
1467
|
+
const seconds = summary.modelMs / 1e3;
|
|
1468
|
+
const time = seconds >= 60 ? `${(seconds / 60).toFixed(1)}m` : `${seconds.toFixed(1)}s`;
|
|
1469
|
+
const rate = `${Math.round(summary.hitRate * 100)}%`;
|
|
1470
|
+
return `spend ${summary.llmSteps} steps \xB7 ${tokens} \xB7 ${time} \xB7 hit ${summary.injections}/${summary.llmSteps} (${rate})`;
|
|
1471
|
+
}
|
|
1472
|
+
|
|
1370
1473
|
// src/domains/memory/task-memory-status.ts
|
|
1371
1474
|
init_esm_shims();
|
|
1372
1475
|
function describeTaskMemoryActivity(event) {
|
|
@@ -1441,13 +1544,16 @@ export {
|
|
|
1441
1544
|
proposeMemoryPromotion,
|
|
1442
1545
|
buildMemoryPromptSection,
|
|
1443
1546
|
proposeMemoryFromEvidence,
|
|
1547
|
+
proposeInjectedTaskMemory,
|
|
1444
1548
|
renderTaskMemoryHandoffSource,
|
|
1445
1549
|
parseTaskMemoryHandoffSnapshot,
|
|
1446
1550
|
taskMemoryHandoffSeedOffer,
|
|
1447
1551
|
seedTaskMemoryFromNewestHandoff,
|
|
1552
|
+
readTaskMemorySpendSummary,
|
|
1553
|
+
formatTaskMemorySpend,
|
|
1448
1554
|
describeTaskMemoryActivity,
|
|
1449
1555
|
taskMemoryBankSize,
|
|
1450
1556
|
taskMemoryTracePath,
|
|
1451
1557
|
createTaskMemoryTrace
|
|
1452
1558
|
};
|
|
1453
|
-
//# sourceMappingURL=chunk-
|
|
1559
|
+
//# sourceMappingURL=chunk-5T7RBWN2.js.map
|