@iowarp/clio-coder 0.4.3 → 0.4.4
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 +63 -0
- package/README.md +1 -1
- package/dist/{acp-H2NGRPWO.js → acp-WNAYYF4F.js} +4 -5
- package/dist/{agents-TL5LLUQP.js → agents-3OKXHLOI.js} +33 -31
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-E5SW4HMS.js → auth-VKNNMGPU.js} +10 -11
- package/dist/{builtins-IA7V7FUC.js → builtins-WGALA46I.js} +4 -4
- package/dist/{chunk-F5JHEYZM.js → chunk-23L32XTI.js} +10 -7
- package/dist/{chunk-DWUOQKRU.js → chunk-25QBEXRS.js} +2 -2
- package/dist/{chunk-LLDJM5XK.js → chunk-26QSH3EJ.js} +2 -2
- package/dist/{chunk-N2Z7HLVY.js → chunk-2ASED4PZ.js} +10 -10
- package/dist/{chunk-MCEPRMZW.js → chunk-2CU2H6KE.js} +2 -2
- package/dist/chunk-2DSOYNFC.js +108 -0
- package/dist/{chunk-LDJG7DW3.js → chunk-2ZSONWVL.js} +4 -4
- package/dist/{chunk-GI7YYQ3F.js → chunk-36CT5VVL.js} +324 -41
- package/dist/{chunk-4UVU7BJ5.js → chunk-3GY4F45V.js} +2 -2
- package/dist/{chunk-PUVDKJ2Y.js → chunk-3ODX73FK.js} +3 -5
- package/dist/{chunk-IUE3Y34X.js → chunk-3UNOLWNZ.js} +2 -2
- package/dist/{chunk-6PTFB5VS.js → chunk-3UUXNFEX.js} +8 -4
- package/dist/{chunk-2APPQIER.js → chunk-4M6Z5QVF.js} +4 -4
- package/dist/{chunk-K6BSR66V.js → chunk-4NSRCOYP.js} +4 -1
- package/dist/{chunk-JGRC33J2.js → chunk-54X7T7DK.js} +12 -3
- package/dist/{chunk-YQWYVTMC.js → chunk-5636DCO5.js} +4 -4
- package/dist/{chunk-7E7I3WLS.js → chunk-57XXR6DR.js} +23 -22
- package/dist/{chunk-7ZYNNDKC.js → chunk-5TUB6SLS.js} +2 -2
- package/dist/{chunk-VW6DOEDG.js → chunk-6OSVSQL5.js} +11 -2
- package/dist/{chunk-L47TF46W.js → chunk-6PAZTBPA.js} +14 -2
- package/dist/{chunk-XIVNBFZS.js → chunk-6Q3CYFD3.js} +34 -16
- package/dist/{chunk-RSJ25QSL.js → chunk-6QOTUPRG.js} +155 -36
- package/dist/{chunk-JKKCYP3C.js → chunk-6UINWWS6.js} +10 -4
- package/dist/{chunk-WBKFA554.js → chunk-72YIHOZQ.js} +2 -2
- package/dist/{chunk-PAJQJ7BS.js → chunk-75W7L2E2.js} +246 -697
- package/dist/{chunk-RRNP2ANY.js → chunk-7UGL4MB5.js} +4 -4
- package/dist/{chunk-EKCHAPYA.js → chunk-AUPNRN7C.js} +2 -2
- package/dist/{chunk-ZDN3Y73Y.js → chunk-BJVFZO5U.js} +6 -48
- package/dist/{chunk-IWT4SF4R.js → chunk-CUSRQKPU.js} +64 -2
- package/dist/{chunk-SKHCAU7K.js → chunk-DQOVN6KV.js} +3 -2
- package/dist/{chunk-ZWPRK62N.js → chunk-DT3LWJOB.js} +4 -4
- package/dist/chunk-DXKJURES.js +671 -0
- package/dist/{chunk-BEPZRGGU.js → chunk-EL24TAU4.js} +2 -2
- package/dist/{chunk-OML5D5V5.js → chunk-ELWDPP3Y.js} +5 -5
- package/dist/{chunk-NDINPTJ4.js → chunk-ELZVTCGV.js} +5 -4
- package/dist/chunk-EXLD33WO.js +381 -0
- package/dist/{chunk-IJNZMHLA.js → chunk-FEAXX7B6.js} +2 -2
- package/dist/{chunk-TM6LQDI3.js → chunk-FFUPXJC4.js} +74 -323
- package/dist/chunk-GX5WYQO4.js +59 -0
- package/dist/chunk-I2DWJ4GM.js +390 -0
- package/dist/{chunk-TXOTCRLG.js → chunk-I5FWO7L5.js} +5 -5
- package/dist/chunk-IRXAATOX.js +539 -0
- package/dist/chunk-IXIY2H4R.js +44 -0
- package/dist/{chunk-KK4JZPBQ.js → chunk-IZXGRF7P.js} +76 -10
- package/dist/{chunk-5TSRNF4G.js → chunk-JCI2ROMZ.js} +164 -6
- package/dist/{chunk-INY6HTFL.js → chunk-JEIYHLOR.js} +2 -2
- package/dist/{chunk-MUW2BDDH.js → chunk-JQLNNIKT.js} +2 -2
- package/dist/{chunk-XPWWI35G.js → chunk-JSD46VO2.js} +19 -8
- package/dist/{chunk-VA5FNYMT.js → chunk-JT2RFCC5.js} +39 -2
- package/dist/{chunk-V2ANDPVT.js → chunk-K6T2ZAMZ.js} +168 -6
- package/dist/{chunk-B4OAX3SI.js → chunk-KFV5L5SK.js} +13 -6
- package/dist/{chunk-JEQ3XTHC.js → chunk-LLXSDWXS.js} +2 -2
- package/dist/{chunk-E3TPLWFX.js → chunk-LTIKRKFL.js} +3 -3
- package/dist/{chunk-NIQJ66N4.js → chunk-N56KALIC.js} +17 -17
- package/dist/{chunk-JDAY6FIL.js → chunk-NAI6ZFCY.js} +13 -9
- package/dist/{chunk-AF4YM7Z4.js → chunk-NRO2BJRH.js} +2490 -2182
- package/dist/{chunk-WRBAGUNF.js → chunk-NXIMQY5W.js} +2 -2
- package/dist/{chunk-I7ZPNEJM.js → chunk-NXYCB2VD.js} +5 -5
- package/dist/chunk-ODGTEFFI.js +50 -0
- package/dist/{chunk-2VIKGWFZ.js → chunk-OEJSLEPW.js} +2 -2
- package/dist/{chunk-KKOJXO6R.js → chunk-OMQNJVKW.js} +4 -2
- package/dist/{chunk-54CBCGIR.js → chunk-Q4WO54TA.js} +132 -77
- package/dist/{chunk-B4VEBZKF.js → chunk-QUFRYSWI.js} +12 -6
- package/dist/{chunk-42FMPA75.js → chunk-QZWQA4DE.js} +2 -2
- package/dist/{chunk-HEQY7ZFI.js → chunk-RAY4OVGZ.js} +2 -2
- package/dist/{chunk-G76U63X4.js → chunk-RQCKCSRL.js} +7 -7
- package/dist/{chunk-64I3JVYM.js → chunk-RXTN6AKH.js} +2 -2
- package/dist/{chunk-UPZU6GE4.js → chunk-RZDWV63N.js} +3 -3
- package/dist/{chunk-2UH2KFUP.js → chunk-S6PYF2XF.js} +2 -2
- package/dist/{chunk-JSC3U7TI.js → chunk-TOIVGRUX.js} +2 -2
- package/dist/{chunk-7DRAWPTZ.js → chunk-TQAHXW6Y.js} +1 -1
- package/dist/{chunk-JIEGK6UF.js → chunk-U6TMQNSI.js} +48 -4
- package/dist/{chunk-AX2THNSA.js → chunk-UEPWCCTY.js} +4 -4
- package/dist/{chunk-QWGDJJYJ.js → chunk-USR47QNF.js} +4 -4
- package/dist/{chunk-Y3CBHOR6.js → chunk-V6HJFQZE.js} +2 -2
- package/dist/chunk-V76WTFTW.js +318 -0
- package/dist/{chunk-NMJXSHBJ.js → chunk-W54I7H25.js} +2 -2
- package/dist/{chunk-2UG5F4C5.js → chunk-XULDXHTN.js} +24 -12
- package/dist/chunk-XXYSBZIQ.js +283 -0
- package/dist/{chunk-MWUZBSAQ.js → chunk-Y55JBDO5.js} +331 -51
- package/dist/{chunk-W6RRQCPQ.js → chunk-YD5GIKET.js} +4 -4
- package/dist/{chunk-CE5AX47J.js → chunk-YECAMM3D.js} +2 -2
- package/dist/{chunk-WCXUNS7U.js → chunk-YNFKXPEC.js} +6 -6
- package/dist/cli/index.js +36 -35
- package/dist/{clio-CMMK4KRR.js → clio-QLICPCF5.js} +2 -2
- package/dist/{code-nav-MDZNQS33.js → code-nav-IJR2DBPR.js} +6 -6
- package/dist/{components-UCUQ4QXW.js → components-2TGAI2RC.js} +3 -4
- package/dist/{config-SVM5P5YI.js → config-IUA6OYNS.js} +52 -47
- package/dist/{configure-LE3IK2TJ.js → configure-VEPX4NMX.js} +14 -15
- package/dist/{context-VNCR7KAG.js → context-2DKHWH2T.js} +23 -23
- package/dist/{context-2OHRKS42.js → context-4MPR7WKB.js} +48 -42
- package/dist/{context-E3VC7RX5.js → context-BOYF5EJM.js} +11 -11
- package/dist/{context-clear-BW4O37TG.js → context-clear-S4ZJCQUX.js} +48 -42
- package/dist/{context-working-set-VDS25HXZ.js → context-working-set-3I3FYX6Y.js} +8 -8
- package/dist/detail-A7JAVSIG.js +98 -0
- package/dist/{dispatch-runner-5AHT53RF.js → dispatch-runner-RJ5I2F2O.js} +71 -58
- package/dist/{docs-PD3EXDKU.js → docs-SPOV3BAN.js} +3 -5
- package/dist/{doctor-WNNVO6FY.js → doctor-DKICC2SN.js} +54 -31
- package/dist/{eval-7G7SGAYO.js → eval-OQOQUDHK.js} +47 -56
- package/dist/{evidence-VD6736FQ.js → evidence-4DQ25GUQ.js} +53 -150
- package/dist/evidence-4F5USFKH.js +208 -0
- package/dist/{evolve-AL3NGVRL.js → evolve-GSS52E5J.js} +44 -41
- package/dist/{extensions-MOVJ32NM.js → extensions-G7MFLYHT.js} +4 -5
- package/dist/{fleet-QZHUMAGI.js → fleet-Q37YHHAQ.js} +74 -68
- package/dist/{fleet-commands-BAYT5FJZ.js → fleet-commands-G7E4N7SM.js} +14 -11
- package/dist/{fleet-decisions-IREVMRU4.js → fleet-decisions-O7M6QBA2.js} +6 -6
- package/dist/{fleet-graph-YCTT3HTI.js → fleet-graph-TOUBW6OW.js} +13 -13
- package/dist/{fleet-inspect-QVJTDAVB.js → fleet-inspect-SW33JJNI.js} +43 -39
- package/dist/{fleet-preflight-25QAFPK4.js → fleet-preflight-CV2655TW.js} +2 -3
- package/dist/{fleet-validate-5O57AAJ7.js → fleet-validate-KESZX2YH.js} +16 -16
- package/dist/{fleet-verify-CPH2W2T6.js → fleet-verify-UQPMTVE3.js} +42 -38
- package/dist/{fleet-view-SWBR3VGQ.js → fleet-view-MN2VG4MR.js} +43 -39
- package/dist/{init-J477LKZH.js → init-PXEXQSBF.js} +60 -54
- package/dist/{interop-3FCM6XLG.js → interop-ZG5T62U3.js} +6 -7
- package/dist/inventory-C26CFDRR.js +101 -0
- package/dist/{library-QUQEIUG6.js → library-B2W4N74O.js} +16 -17
- package/dist/{memory-SGGSEP65.js → memory-YCANYS5A.js} +45 -42
- package/dist/{models-HEKUAXXK.js → models-GERTU3YI.js} +20 -22
- package/dist/{monitor-HKU57TYQ.js → monitor-CPNIUULB.js} +50 -44
- package/dist/{orchestrator-VDFAEFAI.js → orchestrator-J4BSH4WQ.js} +491 -1182
- package/dist/{panes-DN2SSFOH.js → panes-BOHAEGYC.js} +3 -3
- package/dist/{panes-TALGNPZT.js → panes-NXSLDQZ2.js} +5 -6
- package/dist/{paths-NBMFAIEZ.js → paths-VSUWNC22.js} +3 -4
- package/dist/{reset-EAJFFJVB.js → reset-TNWTB5LU.js} +5 -6
- package/dist/{resources-OVKSEFVE.js → resources-4PXNMD5G.js} +14 -14
- package/dist/{run-7DP7ZF2J.js → run-D6XJ34CN.js} +79 -83
- package/dist/{share-WML67FT3.js → share-2NWMJJEE.js} +14 -15
- package/dist/{skills-SG662R2K.js → skills-KR7WON5G.js} +18 -19
- package/dist/{skills-eval-VVZEUU46.js → skills-eval-O2ZNOLDS.js} +49 -46
- package/dist/{skills-inventory-I2E23GET.js → skills-inventory-ZZOUBK7O.js} +14 -14
- package/dist/{slash-commands-S7MBJDQK.js → slash-commands-ZXPJD64J.js} +32 -23
- package/dist/{steer-2LQOMCPB.js → steer-XA25PSCS.js} +3 -3
- package/dist/{support-CC2UJBJ6.js → support-7EMVWYG2.js} +2 -2
- package/dist/{targets-4QC3HIEW.js → targets-OMH2XCSN.js} +25 -27
- package/dist/tasks-IPAGMEIX.js +36 -0
- package/dist/{terminal-lease-TUHIJ6Y2.js → terminal-lease-C2J3JYRE.js} +4 -4
- package/dist/{tools-TFGJICCU.js → tools-EFFEAIDP.js} +5 -6
- package/dist/{uninstall-5PEVOE5B.js → uninstall-HALS6BLF.js} +7 -8
- package/dist/{upgrade-M4WXY6KN.js → upgrade-MS72RJEP.js} +14 -11
- package/dist/{usage-N7ZNVLEM.js → usage-NHG6MCJM.js} +60 -51
- package/dist/{verifiers-DJTP4XX6.js → verifiers-7AUNVXDY.js} +150 -17
- package/dist/{verify-RWE4PPEK.js → verify-FWYGPKMR.js} +12 -10
- package/dist/{web-fetch-MPARV2K7.js → web-fetch-V4FKSDAV.js} +4 -4
- package/dist/{wiki-generate-C7IQOXSP.js → wiki-generate-743CIGJW.js} +63 -56
- package/dist/{with-panes-4GCGSL7J.js → with-panes-BDQEWBRT.js} +2 -2
- package/dist/worker/entry.js +36 -33
- package/docs/README.md +3 -2
- package/docs/architecture/acp.md +17 -0
- package/docs/architecture/artifact-versions.md +1 -1
- package/docs/architecture/dispatch-typed-intent.md +1 -1
- package/docs/architecture/evidence-and-memory.md +1 -1
- package/docs/architecture/observability.md +7 -1
- package/docs/architecture/prompt-envelope-and-tools.md +15 -5
- package/docs/architecture/safety-model.md +10 -17
- package/docs/architecture/tui-design.md +1 -1
- package/docs/guide/built-in-agents.md +8 -8
- package/docs/guide/commands-and-modes.md +17 -2
- package/docs/guide/configuration-and-targets.md +3 -1
- package/docs/guide/configuration-reference.md +10 -5
- package/docs/guide/environment-variables.md +2 -2
- package/docs/guide/tool-usage.md +78 -3
- package/docs/history/config-knobs-audit.md +2 -2
- package/docs/process/development-pipeline.md +6 -1
- package/docs/process/git-commit-provenance.md +15 -0
- package/docs/process/release-cut-checklist.md +207 -0
- package/docs/process/scientific-validation.md +18 -17
- package/evals/behavioral-machinery-support.ts +1 -0
- package/evals/behavioral-machinery.yaml +1 -1
- package/package.json +1 -1
- package/skills/coding/coding-standards/SKILL.md +14 -4
- package/skills/context/context-handoff/SKILL.md +3 -3
- package/skills/context/context-prime/SKILL.md +3 -3
- package/skills/planning/architecture/SKILL.md +5 -5
- package/skills/planning/backlog/SKILL.md +4 -4
- package/skills/planning/prd/SKILL.md +4 -3
- package/skills/planning/product-intent/SKILL.md +8 -8
- package/skills/planning/tech-spec/SKILL.md +4 -4
- package/skills/registry.yaml +32 -32
- package/skills/research/arxiv-literature/SKILL.md +3 -3
- package/skills/research/experiment-protocol/SKILL.md +3 -3
- package/skills/research/scientific-debugging/SKILL.md +3 -2
- package/skills/research/scientific-modernization/SKILL.md +3 -3
- package/skills/skill-marketplace.json +16 -16
- package/skills/workflow/cut-it/SKILL.md +3 -4
- package/skills/workflow/design-council/SKILL.md +5 -10
- package/skills/workflow/grill-me/SKILL.md +14 -15
- package/skills/workflow/workflow-distiller/SKILL.md +4 -4
- package/src/cli/args.ts +0 -8
- package/src/cli/configure.ts +2 -1
- package/src/cli/doctor-state-size.ts +1 -12
- package/src/cli/doctor-validation-contract.ts +28 -0
- package/src/cli/doctor.ts +5 -0
- package/src/cli/evidence-detail.ts +1 -75
- package/src/cli/evidence-inventory.ts +1 -167
- package/src/cli/index.ts +2 -0
- package/src/cli/run.ts +0 -2
- package/src/cli/targets.ts +1 -1
- package/src/cli/tasks.ts +84 -0
- package/src/cli/upgrade.ts +10 -5
- package/src/cli/usage.ts +6 -0
- package/src/cli/verifiers.ts +147 -1
- package/src/cli/wiki-generate.ts +1 -0
- package/src/core/commit-attribution.ts +41 -1
- package/src/core/git-commit-attribution.ts +46 -3
- package/src/core/run-overrides.ts +0 -5
- package/src/core/skill-activation.ts +3 -0
- package/src/core/tool-names.ts +5 -2
- package/src/domains/agents/builtins/architect.md +1 -1
- package/src/domains/agents/builtins/coder.md +1 -1
- package/src/domains/agents/builtins/documenter.md +1 -1
- package/src/domains/agents/builtins/git-master.md +1 -1
- package/src/domains/agents/builtins/provenance.md +7 -7
- package/src/domains/agents/builtins/tester.md +1 -1
- package/src/domains/agents/builtins/verifier.md +2 -2
- package/src/domains/agents/builtins/wiki-writer.md +4 -3
- package/src/domains/context/extension.ts +31 -7
- package/src/domains/context/refresh.ts +3 -0
- package/src/domains/context/wiki/frontmatter.ts +5 -2
- package/src/domains/context/wiki/generate.ts +6 -0
- package/src/domains/context/wiki/prompts.ts +43 -0
- package/src/domains/dispatch/active-route-planner.ts +4 -0
- package/src/domains/dispatch/code-step.ts +11 -4
- package/src/domains/dispatch/contract.ts +31 -7
- package/src/domains/dispatch/execution-scheduler.ts +2 -0
- package/src/domains/dispatch/extension.ts +50 -27
- package/src/domains/dispatch/fleet-commit-attribution.ts +5 -0
- package/src/domains/dispatch/fleet-run.ts +1 -0
- package/src/domains/dispatch/host-verification.ts +114 -13
- package/src/domains/dispatch/intent.ts +28 -18
- package/src/domains/dispatch/orphan-recovery.ts +2 -0
- package/src/domains/dispatch/receipt-integrity.ts +4 -0
- package/src/domains/dispatch/reservation-store.ts +5 -3
- package/src/domains/dispatch/state.ts +15 -2
- package/src/domains/dispatch/types.ts +17 -2
- package/src/domains/eval/runners/clio-run.ts +12 -9
- package/src/domains/eval/runners/context-index.ts +2 -7
- package/src/domains/eval/runners/context-init.ts +3 -6
- package/src/domains/eval/runners/external-command.ts +29 -11
- package/src/domains/evidence/build.ts +102 -15
- package/src/domains/evidence/detail.ts +69 -0
- package/src/domains/evidence/eval.ts +13 -1
- package/src/domains/evidence/finish-contract-map.ts +5 -1
- package/src/domains/evidence/inventory.ts +167 -0
- package/src/domains/evidence/store.ts +16 -0
- package/src/domains/evidence/types.ts +12 -0
- package/src/domains/extensions/resources.ts +7 -0
- package/src/domains/middleware/marketplace-offer.ts +20 -1
- package/src/domains/middleware/runtime.ts +7 -3
- package/src/domains/mux/detect.ts +3 -6
- package/src/domains/observability/accountability.ts +15 -1
- package/src/domains/observability/contract.ts +52 -7
- package/src/domains/observability/evidence-index.ts +10 -0
- package/src/domains/observability/extension.ts +9 -5
- package/src/domains/observability/projection.ts +394 -45
- package/src/{interactive → domains/observability}/worker-progress.ts +3 -3
- package/src/domains/prompts/fragments/operating/contract.md +2 -0
- package/src/domains/prompts/fragments/wiki/page.md +8 -0
- package/src/domains/providers/model-discovery.ts +1 -4
- package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +16 -14
- package/src/domains/providers/runtimes/claude/claude-code.ts +9 -0
- package/src/domains/providers/support.ts +1 -1
- package/src/domains/providers/types/runtime-descriptor.ts +1 -1
- package/src/domains/safety/action-classifier.ts +7 -0
- package/src/domains/safety/default-path-policy.ts +2 -0
- package/src/domains/safety/finish-contract-registration.ts +29 -14
- package/src/domains/safety/finish-contract.ts +252 -40
- package/src/domains/safety/index.ts +20 -1
- package/src/domains/safety/policy-engine.ts +26 -6
- package/src/domains/safety/rigor.ts +53 -39
- package/src/domains/safety/validation-contract.ts +388 -0
- package/src/domains/session/archive-readers.ts +10 -1
- package/src/domains/session/decision-board.ts +101 -2
- package/src/domains/session/entries.ts +44 -7
- package/src/domains/session/extension.ts +4 -4
- package/src/domains/session/handoff.ts +2 -1
- package/src/domains/session/manager.ts +2 -3
- package/src/domains/session/task-board.ts +14 -1
- package/src/domains/session/tree/fork.ts +1 -2
- package/src/domains/session/tree/navigator.ts +1 -1
- package/src/domains/user-tasks/acceptance.ts +56 -0
- package/src/domains/user-tasks/active-acceptance.ts +40 -0
- package/src/domains/user-tasks/store.ts +34 -3
- package/src/engine/acp/adapter.ts +24 -6
- package/src/engine/acp/server.ts +21 -4
- package/src/engine/acp/transport.ts +53 -8
- package/src/engine/acp/types.ts +4 -0
- package/src/engine/apis/ollama-native.ts +15 -0
- package/src/engine/claude/subprocess-runtime.ts +107 -60
- package/src/engine/external-subprocess.ts +12 -4
- package/src/entry/orchestrator.ts +11 -2
- package/src/interactive/dispatch-board.ts +46 -717
- package/src/interactive/fleet-run-preview.ts +2 -1
- package/src/interactive/interactive-application.ts +3 -2
- package/src/interactive/interactive-presentation.ts +55 -12
- package/src/interactive/interactive-slash-runtime.ts +2 -1
- package/src/interactive/oracle.ts +5 -2
- package/src/interactive/overlays/fleet-run-approval.ts +3 -2
- package/src/interactive/overlays/message-picker.ts +2 -2
- package/src/interactive/overlays/settings.ts +2 -2
- package/src/interactive/overlays/tree-selector.ts +2 -2
- package/src/interactive/renderers/branch-summary.ts +1 -1
- package/src/interactive/slash-autocomplete.ts +4 -6
- package/src/interactive/slash-commands.ts +25 -39
- package/src/interactive/slash-spec.ts +28 -0
- package/src/interactive/view/artifacts.ts +2 -0
- package/src/interactive/worker-stream.ts +7 -3
- package/src/tools/bootstrap.ts +4 -0
- package/src/tools/builtin-tool-catalog.ts +31 -0
- package/src/tools/compete-worktrees.ts +7 -1
- package/src/tools/core-bootstrap.ts +16 -0
- package/src/tools/decide.ts +136 -0
- package/src/tools/dispatch-admission.ts +21 -0
- package/src/tools/dispatch-plan.ts +5 -2
- package/src/tools/dispatch-runner.ts +15 -1
- package/src/tools/dispatch-types.ts +6 -0
- package/src/tools/evidence.ts +96 -0
- package/src/tools/limitation.ts +76 -0
- package/src/tools/policy.ts +9 -0
- package/src/tools/presentation.ts +3 -0
- package/src/tools/registry.ts +1 -1
- package/src/tools/result-shaping.ts +17 -5
- package/src/tools/task-worktree.ts +13 -3
- package/src/tools/tasks.ts +10 -1
- package/src/tools/verify/authoring.ts +170 -83
- package/src/tools/verify/catalog.ts +122 -5
- package/src/tools/verify/index.ts +2 -1
- package/src/tools/verify/numeric.ts +298 -0
- package/src/tools/verify/perf.ts +143 -0
- package/src/tools/verify/scripts.ts +229 -2
- package/dist/chunk-7DICMOS6.js +0 -313
- package/dist/chunk-RVG5JXAL.js +0 -41
- package/dist/chunk-T56WDKA5.js +0 -183
- package/dist/chunk-VPKWYKEY.js +0 -169
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
gitCommitAttributionEnabled,
|
|
4
4
|
reportCommitAttributionDiagnostic,
|
|
5
5
|
withManagedGitCommitAttributionEnvironment
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-U6TMQNSI.js";
|
|
7
7
|
import {
|
|
8
8
|
clampTimerDelayMs
|
|
9
9
|
} from "./chunk-EBY63B7G.js";
|
|
@@ -193,4 +193,4 @@ export {
|
|
|
193
193
|
runCommandVector,
|
|
194
194
|
combineSafeOutput
|
|
195
195
|
};
|
|
196
|
-
//# sourceMappingURL=chunk-
|
|
196
|
+
//# sourceMappingURL=chunk-TOIVGRUX.js.map
|
|
@@ -34,6 +34,9 @@ var CLIO_COMMIT_TRAILERS = {
|
|
|
34
34
|
reviewed: `Reviewed-by: ${CLIO_COMMIT_IDENTITY}`,
|
|
35
35
|
coAuthored: `Co-authored-by: ${CLIO_COMMIT_IDENTITY}`
|
|
36
36
|
};
|
|
37
|
+
var CLIO_DECISION_TRAILER_KEY = "Clio-Decision";
|
|
38
|
+
var CLIO_DECISION_TRAILER_CAP = 32;
|
|
39
|
+
var DECISION_REF_PATTERN = /^[A-Za-z0-9][A-Za-z0-9:._-]{0,127}\/[a-z0-9]+(?:[_-][a-z0-9]+)*$/u;
|
|
37
40
|
var TRAILER_LINE = /^([A-Za-z0-9][A-Za-z0-9-]*):[ \t]+(.+)$/u;
|
|
38
41
|
var SHA256 = /^[0-9a-f]{64}$/u;
|
|
39
42
|
function normalizedTrailer(line) {
|
|
@@ -45,7 +48,18 @@ var KNOWN_CLIO_TRAILERS = new Set(
|
|
|
45
48
|
Object.values(CLIO_COMMIT_TRAILERS).map((line) => normalizedTrailer(line)).filter((line) => line !== null)
|
|
46
49
|
);
|
|
47
50
|
function isClioTrailer(key) {
|
|
48
|
-
return KNOWN_CLIO_TRAILERS.has(key) || key.startsWith("clio-evidence:receipt-v20/sha256:");
|
|
51
|
+
return KNOWN_CLIO_TRAILERS.has(key) || key.startsWith("clio-evidence:receipt-v20/sha256:") || key.startsWith(`${CLIO_DECISION_TRAILER_KEY.toLowerCase()}:`);
|
|
52
|
+
}
|
|
53
|
+
function decisionTrailerRefs(decisions) {
|
|
54
|
+
if (decisions === void 0) return [];
|
|
55
|
+
const refs = /* @__PURE__ */ new Set();
|
|
56
|
+
for (const ref of decisions) {
|
|
57
|
+
if (typeof ref === "string" && DECISION_REF_PATTERN.test(ref)) refs.add(ref);
|
|
58
|
+
}
|
|
59
|
+
return [...refs].sort().slice(0, CLIO_DECISION_TRAILER_CAP);
|
|
60
|
+
}
|
|
61
|
+
function decisionTrailer(ref) {
|
|
62
|
+
return `${CLIO_DECISION_TRAILER_KEY}: ${ref}`;
|
|
49
63
|
}
|
|
50
64
|
function trailerBlockStart(lines) {
|
|
51
65
|
if (lines.length < 2) return null;
|
|
@@ -92,6 +106,7 @@ function attributeCommitMessage(originalMessage, evidence, enabled = true) {
|
|
|
92
106
|
if (evidence.materiallyAuthored === true) desired.push(CLIO_COMMIT_TRAILERS.coAuthored);
|
|
93
107
|
const receipt = receiptTrailer(evidence.receipt);
|
|
94
108
|
if (receipt !== null) desired.push(receipt);
|
|
109
|
+
for (const ref of decisionTrailerRefs(evidence.decisions)) desired.push(decisionTrailer(ref));
|
|
95
110
|
const existing = new Set(
|
|
96
111
|
(blockStart === null ? [] : retained.slice(blockStart)).map((line) => normalizedTrailer(line)).filter((line) => line !== null)
|
|
97
112
|
);
|
|
@@ -112,9 +127,10 @@ function attributeCommitMessage(originalMessage, evidence, enabled = true) {
|
|
|
112
127
|
var CLIO_GIT_COMMITS_ENABLED_ENV = "CLIO_CODER_GIT_COMMITS_ENABLED";
|
|
113
128
|
var ASSISTED_ENV = "CLIO_CODER_COMMIT_ASSISTED";
|
|
114
129
|
var AUTHORED_ENV = "CLIO_CODER_COMMIT_AUTHORED";
|
|
130
|
+
var DECISIONS_ENV = "CLIO_CODER_COMMIT_DECISIONS";
|
|
115
131
|
var CONFIG_BASE_COUNT_ENV = "CLIO_CODER_GIT_CONFIG_BASE_COUNT";
|
|
116
132
|
var DEFAULT_HOOKS_EQUIVALENT_ENV = "CLIO_CODER_GIT_DEFAULT_HOOKS_EQUIVALENT";
|
|
117
|
-
var MANAGED_HOOK_VERSION =
|
|
133
|
+
var MANAGED_HOOK_VERSION = 3;
|
|
118
134
|
var DIAGNOSTIC_MAX_CHARS = 300;
|
|
119
135
|
var COUNT = /^(?:0|[1-9][0-9]*)$/u;
|
|
120
136
|
var reportedDiagnostics = /* @__PURE__ */ new Set();
|
|
@@ -122,7 +138,24 @@ var PROBE_CACHE_TTL_MS = 1e4;
|
|
|
122
138
|
var PROBE_CACHE_MAX_ENTRIES = 32;
|
|
123
139
|
var probeCache = /* @__PURE__ */ new Map();
|
|
124
140
|
var installedHooksDirectory = null;
|
|
125
|
-
var PER_SPAWN_ENV_NAMES = [
|
|
141
|
+
var PER_SPAWN_ENV_NAMES = [
|
|
142
|
+
ASSISTED_ENV,
|
|
143
|
+
AUTHORED_ENV,
|
|
144
|
+
DECISIONS_ENV,
|
|
145
|
+
CONFIG_BASE_COUNT_ENV,
|
|
146
|
+
DEFAULT_HOOKS_EQUIVALENT_ENV
|
|
147
|
+
];
|
|
148
|
+
var decisionRefsProvider = null;
|
|
149
|
+
function setCommitDecisionRefsProvider(provider) {
|
|
150
|
+
decisionRefsProvider = provider;
|
|
151
|
+
}
|
|
152
|
+
function providedDecisionRefs() {
|
|
153
|
+
try {
|
|
154
|
+
return decisionRefsProvider?.() ?? [];
|
|
155
|
+
} catch {
|
|
156
|
+
return [];
|
|
157
|
+
}
|
|
158
|
+
}
|
|
126
159
|
function reportCommitAttributionDiagnostic(diagnostic) {
|
|
127
160
|
if (diagnostic === null || reportedDiagnostics.has(diagnostic)) return;
|
|
128
161
|
reportedDiagnostics.add(diagnostic);
|
|
@@ -279,6 +312,14 @@ if [ "$${ASSISTED_ENV}" = '1' ] || [ "$${AUTHORED_ENV}" = '1' ]; then
|
|
|
279
312
|
append_trailer '${CLIO_COMMIT_TRAILERS.assisted}'
|
|
280
313
|
fi
|
|
281
314
|
if [ "$${AUTHORED_ENV}" = '1' ]; then append_trailer '${CLIO_COMMIT_TRAILERS.coAuthored}'; fi
|
|
315
|
+
# Decision refs are validated again here: only <id>/<key> shapes become
|
|
316
|
+
# trailers, so a stray value cannot inject a second line into the message.
|
|
317
|
+
for decision_ref in $${DECISIONS_ENV}; do
|
|
318
|
+
case "$decision_ref" in
|
|
319
|
+
*[!A-Za-z0-9:._/-]* | */*/* | /* | */ | *-*-) continue ;;
|
|
320
|
+
*/*) append_trailer "${CLIO_DECISION_TRAILER_KEY}: $decision_ref" ;;
|
|
321
|
+
esac
|
|
322
|
+
done
|
|
282
323
|
exit 0
|
|
283
324
|
`;
|
|
284
325
|
function installManagedHook(directory, name) {
|
|
@@ -358,6 +399,8 @@ function withManagedGitCommitAttributionEnvironment(source, options = {}) {
|
|
|
358
399
|
const evidence = options.evidence ?? { materiallyAssisted: true, materiallyAuthored: true };
|
|
359
400
|
env[ASSISTED_ENV] = evidence.materiallyAssisted === true ? "1" : "0";
|
|
360
401
|
env[AUTHORED_ENV] = evidence.materiallyAuthored === true ? "1" : "0";
|
|
402
|
+
const decisions = decisionTrailerRefs(evidence.decisions ?? providedDecisionRefs());
|
|
403
|
+
if (decisions.length > 0) env[DECISIONS_ENV] = decisions.join(" ");
|
|
361
404
|
const countRaw = env.GIT_CONFIG_COUNT;
|
|
362
405
|
const count = countRaw === void 0 ? 0 : COUNT.test(countRaw) ? Number(countRaw) : Number.NaN;
|
|
363
406
|
if (!Number.isSafeInteger(count) || count > 1024) {
|
|
@@ -394,9 +437,10 @@ function withManagedGitCommitAttributionEnvironment(source, options = {}) {
|
|
|
394
437
|
|
|
395
438
|
export {
|
|
396
439
|
attributeCommitMessage,
|
|
440
|
+
setCommitDecisionRefsProvider,
|
|
397
441
|
reportCommitAttributionDiagnostic,
|
|
398
442
|
setGitCommitAttributionEnabled,
|
|
399
443
|
gitCommitAttributionEnabled,
|
|
400
444
|
withManagedGitCommitAttributionEnvironment
|
|
401
445
|
};
|
|
402
|
-
//# sourceMappingURL=chunk-
|
|
446
|
+
//# sourceMappingURL=chunk-U6TMQNSI.js.map
|
|
@@ -159,7 +159,7 @@ Run \`clio-coder auth login ${verdict.store}\` if the endpoint requires one; loc
|
|
|
159
159
|
} else if (verdict.kind !== "usable") {
|
|
160
160
|
process.stdout.write(`${describeVerdict(verdict)} Starting \`clio-coder configure\`.
|
|
161
161
|
`);
|
|
162
|
-
const { runConfigureCommand } = await import("./configure-
|
|
162
|
+
const { runConfigureCommand } = await import("./configure-VEPX4NMX.js");
|
|
163
163
|
const configured = await runConfigureCommand([]);
|
|
164
164
|
if (configured !== 0) return configured;
|
|
165
165
|
startupSettings = readStrictLayeredSettings(process.cwd()).settings;
|
|
@@ -174,7 +174,7 @@ Run \`clio-coder auth login ${verdict.store}\` if the endpoint requires one; loc
|
|
|
174
174
|
let terminalLease;
|
|
175
175
|
try {
|
|
176
176
|
if (terminalLeaseEligible(options)) {
|
|
177
|
-
const { createProcessTerminalLease, instantShellEnabled } = await import("./terminal-lease-
|
|
177
|
+
const { createProcessTerminalLease, instantShellEnabled } = await import("./terminal-lease-C2J3JYRE.js");
|
|
178
178
|
if (instantShellEnabled()) {
|
|
179
179
|
let stage0FrameId = null;
|
|
180
180
|
terminalLease = createProcessTerminalLease({
|
|
@@ -197,7 +197,7 @@ Run \`clio-coder auth login ${verdict.store}\` if the endpoint requires one; loc
|
|
|
197
197
|
throw new Error("injected Stage 1 hydration failure");
|
|
198
198
|
}
|
|
199
199
|
}
|
|
200
|
-
const { bootOrchestrator } = await import("./orchestrator-
|
|
200
|
+
const { bootOrchestrator } = await import("./orchestrator-J4BSH4WQ.js");
|
|
201
201
|
const result = await bootOrchestrator({
|
|
202
202
|
...options,
|
|
203
203
|
...startupSettings ? { startupSettings } : {},
|
|
@@ -220,4 +220,4 @@ Run \`clio-coder auth login ${verdict.store}\` if the endpoint requires one; loc
|
|
|
220
220
|
export {
|
|
221
221
|
runClioCommand
|
|
222
222
|
};
|
|
223
|
-
//# sourceMappingURL=chunk-
|
|
223
|
+
//# sourceMappingURL=chunk-UEPWCCTY.js.map
|
|
@@ -4,10 +4,10 @@ import {
|
|
|
4
4
|
} from "./chunk-5ICU3EUH.js";
|
|
5
5
|
import {
|
|
6
6
|
parseAgentRecipeSchema
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-7UGL4MB5.js";
|
|
8
8
|
import {
|
|
9
9
|
parseFleetContract
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-OEJSLEPW.js";
|
|
11
11
|
import {
|
|
12
12
|
parseFrontmatter
|
|
13
13
|
} from "./chunk-RKKLTLYB.js";
|
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
import {
|
|
22
22
|
assertAgentSpecPolicy,
|
|
23
23
|
normalizeAgentSpec
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-KFV5L5SK.js";
|
|
25
25
|
import {
|
|
26
26
|
readSettings,
|
|
27
27
|
settingsPath,
|
|
@@ -792,4 +792,4 @@ export {
|
|
|
792
792
|
importShareArchive,
|
|
793
793
|
ShareDomainModule
|
|
794
794
|
};
|
|
795
|
-
//# sourceMappingURL=chunk-
|
|
795
|
+
//# sourceMappingURL=chunk-USR47QNF.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
sha256
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-CUSRQKPU.js";
|
|
5
5
|
import {
|
|
6
6
|
resolvePackageRoot
|
|
7
7
|
} from "./chunk-IWHMRKLL.js";
|
|
@@ -225,4 +225,4 @@ export {
|
|
|
225
225
|
renderCodewikiDigest,
|
|
226
226
|
loadFragments
|
|
227
227
|
};
|
|
228
|
-
//# sourceMappingURL=chunk-
|
|
228
|
+
//# sourceMappingURL=chunk-V6HJFQZE.js.map
|
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
compareCodepoints
|
|
4
|
+
} from "./chunk-I5FWO7L5.js";
|
|
5
|
+
import {
|
|
6
|
+
byteLength
|
|
7
|
+
} from "./chunk-6XLNIQDB.js";
|
|
8
|
+
import {
|
|
9
|
+
resolveSafeCwd
|
|
10
|
+
} from "./chunk-TOIVGRUX.js";
|
|
11
|
+
import {
|
|
12
|
+
require_dist
|
|
13
|
+
} from "./chunk-APJ265NV.js";
|
|
14
|
+
import {
|
|
15
|
+
__toESM,
|
|
16
|
+
init_esm_shims
|
|
17
|
+
} from "./chunk-3R73A4XB.js";
|
|
18
|
+
|
|
19
|
+
// src/domains/safety/validation-contract.ts
|
|
20
|
+
init_esm_shims();
|
|
21
|
+
var import_yaml = __toESM(require_dist(), 1);
|
|
22
|
+
import { existsSync, readFileSync, realpathSync, statSync } from "node:fs";
|
|
23
|
+
import path from "node:path";
|
|
24
|
+
var VALIDATION_CONTRACT_VERSION = 1;
|
|
25
|
+
var VALIDATION_CONTRACT_YAML_PATHS = [
|
|
26
|
+
".clio-coder/validation.yaml",
|
|
27
|
+
".clio-coder/validation.yml",
|
|
28
|
+
"validation.yaml",
|
|
29
|
+
"validation.yml"
|
|
30
|
+
];
|
|
31
|
+
var VALIDATION_CONTRACT_MARKDOWN_PATH = "VALIDATION.md";
|
|
32
|
+
var VALIDATION_CONTRACT_CAPS = Object.freeze({
|
|
33
|
+
fileBytes: 256 * 1024,
|
|
34
|
+
textBytes: 4096,
|
|
35
|
+
notesBytes: 16 * 1024,
|
|
36
|
+
artifacts: 256,
|
|
37
|
+
validators: 128,
|
|
38
|
+
modules: 64,
|
|
39
|
+
mapEntries: 256,
|
|
40
|
+
mapKeyBytes: 256
|
|
41
|
+
});
|
|
42
|
+
var RUNTIME_KINDS = ["local", "slurm", "mpi", "other"];
|
|
43
|
+
var ROOT_FIELDS = /* @__PURE__ */ new Set(["version", "task", "runtime", "artifacts", "validators", "notes"]);
|
|
44
|
+
var RUNTIME_FIELDS = /* @__PURE__ */ new Set(["kind", "nodes", "ranks", "walltime", "modules"]);
|
|
45
|
+
var ARTIFACT_FIELDS = /* @__PURE__ */ new Set([
|
|
46
|
+
"path",
|
|
47
|
+
"format",
|
|
48
|
+
"expected_dimensions",
|
|
49
|
+
"expected_attributes",
|
|
50
|
+
"numerical_tolerances",
|
|
51
|
+
"preserve"
|
|
52
|
+
]);
|
|
53
|
+
var TOLERANCE_FIELDS = /* @__PURE__ */ new Set(["relative", "absolute", "ulp"]);
|
|
54
|
+
function isRecord(value) {
|
|
55
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
56
|
+
}
|
|
57
|
+
function unknownFields(record, allowed) {
|
|
58
|
+
return Object.keys(record).filter((key) => !allowed.has(key)).sort(compareCodepoints);
|
|
59
|
+
}
|
|
60
|
+
function boundedText(value, location, cap) {
|
|
61
|
+
if (typeof value !== "string" || value.length === 0) return new Error(`${location} must be a non-empty string`);
|
|
62
|
+
if (value.includes("\0")) return new Error(`${location} must not contain a NUL byte`);
|
|
63
|
+
if (byteLength(value) > cap) return new Error(`${location} exceeds the ${cap}-byte cap`);
|
|
64
|
+
return value;
|
|
65
|
+
}
|
|
66
|
+
function positiveInteger(value, location) {
|
|
67
|
+
if (typeof value !== "number" || !Number.isInteger(value) || value <= 0) {
|
|
68
|
+
return new Error(`${location} must be a positive integer`);
|
|
69
|
+
}
|
|
70
|
+
return value;
|
|
71
|
+
}
|
|
72
|
+
function nonNegativeNumber(value, location) {
|
|
73
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value < 0) {
|
|
74
|
+
return new Error(`${location} must be a finite non-negative number`);
|
|
75
|
+
}
|
|
76
|
+
return value;
|
|
77
|
+
}
|
|
78
|
+
function boundedStringList(value, location, cap) {
|
|
79
|
+
if (!Array.isArray(value)) return new Error(`${location} must be an array of strings`);
|
|
80
|
+
if (value.length > cap) return new Error(`${location} exceeds the ${cap}-entry cap`);
|
|
81
|
+
const items = [];
|
|
82
|
+
for (const [index, entry] of value.entries()) {
|
|
83
|
+
const text = boundedText(entry, `${location}[${index}]`, VALIDATION_CONTRACT_CAPS.textBytes);
|
|
84
|
+
if (text instanceof Error) return text;
|
|
85
|
+
items.push(text);
|
|
86
|
+
}
|
|
87
|
+
return items;
|
|
88
|
+
}
|
|
89
|
+
function boundedMap(value, location, validateEntry) {
|
|
90
|
+
if (!isRecord(value)) return new Error(`${location} must be a map`);
|
|
91
|
+
const keys = Object.keys(value);
|
|
92
|
+
if (keys.length > VALIDATION_CONTRACT_CAPS.mapEntries) {
|
|
93
|
+
return new Error(`${location} exceeds the ${VALIDATION_CONTRACT_CAPS.mapEntries}-entry cap`);
|
|
94
|
+
}
|
|
95
|
+
const out = {};
|
|
96
|
+
for (const key of keys.sort(compareCodepoints)) {
|
|
97
|
+
const entryLocation = `${location}.${key}`;
|
|
98
|
+
if (key.length === 0) return new Error(`${location} has an empty key`);
|
|
99
|
+
if (byteLength(key) > VALIDATION_CONTRACT_CAPS.mapKeyBytes) {
|
|
100
|
+
return new Error(`${entryLocation} key exceeds the ${VALIDATION_CONTRACT_CAPS.mapKeyBytes}-byte cap`);
|
|
101
|
+
}
|
|
102
|
+
const entry = validateEntry(value[key], entryLocation);
|
|
103
|
+
if (entry instanceof Error) return entry;
|
|
104
|
+
out[key] = entry;
|
|
105
|
+
}
|
|
106
|
+
return out;
|
|
107
|
+
}
|
|
108
|
+
function validateRuntime(value, location) {
|
|
109
|
+
if (!isRecord(value)) return new Error(`${location} must be an object with a kind field`);
|
|
110
|
+
const unknown = unknownFields(value, RUNTIME_FIELDS);
|
|
111
|
+
if (unknown.length > 0) return new Error(`${location} has unknown field(s): ${unknown.join(", ")}`);
|
|
112
|
+
if (!Object.hasOwn(value, "kind")) return new Error(`${location}.kind is required`);
|
|
113
|
+
const kind = value.kind;
|
|
114
|
+
if (typeof kind !== "string" || !RUNTIME_KINDS.includes(kind)) {
|
|
115
|
+
return new Error(`${location}.kind must be one of ${RUNTIME_KINDS.join(", ")}`);
|
|
116
|
+
}
|
|
117
|
+
const runtime = { kind };
|
|
118
|
+
if (Object.hasOwn(value, "nodes")) {
|
|
119
|
+
const nodes = positiveInteger(value.nodes, `${location}.nodes`);
|
|
120
|
+
if (nodes instanceof Error) return nodes;
|
|
121
|
+
runtime.nodes = nodes;
|
|
122
|
+
}
|
|
123
|
+
if (Object.hasOwn(value, "ranks")) {
|
|
124
|
+
const ranks = positiveInteger(value.ranks, `${location}.ranks`);
|
|
125
|
+
if (ranks instanceof Error) return ranks;
|
|
126
|
+
runtime.ranks = ranks;
|
|
127
|
+
}
|
|
128
|
+
if (Object.hasOwn(value, "walltime")) {
|
|
129
|
+
const walltime = boundedText(value.walltime, `${location}.walltime`, VALIDATION_CONTRACT_CAPS.textBytes);
|
|
130
|
+
if (walltime instanceof Error) return walltime;
|
|
131
|
+
runtime.walltime = walltime;
|
|
132
|
+
}
|
|
133
|
+
if (Object.hasOwn(value, "modules")) {
|
|
134
|
+
const modules = boundedStringList(value.modules, `${location}.modules`, VALIDATION_CONTRACT_CAPS.modules);
|
|
135
|
+
if (modules instanceof Error) return modules;
|
|
136
|
+
runtime.modules = modules;
|
|
137
|
+
}
|
|
138
|
+
return runtime;
|
|
139
|
+
}
|
|
140
|
+
function validateTolerances(value, location) {
|
|
141
|
+
if (!isRecord(value)) return new Error(`${location} must be an object`);
|
|
142
|
+
const unknown = unknownFields(value, TOLERANCE_FIELDS);
|
|
143
|
+
if (unknown.length > 0) return new Error(`${location} has unknown field(s): ${unknown.join(", ")}`);
|
|
144
|
+
const tolerances = {};
|
|
145
|
+
if (Object.hasOwn(value, "relative")) {
|
|
146
|
+
const relative = nonNegativeNumber(value.relative, `${location}.relative`);
|
|
147
|
+
if (relative instanceof Error) return relative;
|
|
148
|
+
tolerances.relative = relative;
|
|
149
|
+
}
|
|
150
|
+
if (Object.hasOwn(value, "absolute")) {
|
|
151
|
+
const absolute = nonNegativeNumber(value.absolute, `${location}.absolute`);
|
|
152
|
+
if (absolute instanceof Error) return absolute;
|
|
153
|
+
tolerances.absolute = absolute;
|
|
154
|
+
}
|
|
155
|
+
if (Object.hasOwn(value, "ulp")) {
|
|
156
|
+
const ulp = value.ulp;
|
|
157
|
+
if (typeof ulp !== "number" || !Number.isInteger(ulp) || ulp < 0) {
|
|
158
|
+
return new Error(`${location}.ulp must be a non-negative integer`);
|
|
159
|
+
}
|
|
160
|
+
tolerances.ulp = ulp;
|
|
161
|
+
}
|
|
162
|
+
return tolerances;
|
|
163
|
+
}
|
|
164
|
+
function validateArtifact(value, location) {
|
|
165
|
+
if (!isRecord(value)) return new Error(`${location} must be an object with a path field`);
|
|
166
|
+
const unknown = unknownFields(value, ARTIFACT_FIELDS);
|
|
167
|
+
if (unknown.length > 0) return new Error(`${location} has unknown field(s): ${unknown.join(", ")}`);
|
|
168
|
+
if (!Object.hasOwn(value, "path")) return new Error(`${location}.path is required`);
|
|
169
|
+
const artifactPath = boundedText(value.path, `${location}.path`, VALIDATION_CONTRACT_CAPS.textBytes);
|
|
170
|
+
if (artifactPath instanceof Error) return artifactPath;
|
|
171
|
+
const artifact = { path: artifactPath };
|
|
172
|
+
if (Object.hasOwn(value, "format")) {
|
|
173
|
+
const format = boundedText(value.format, `${location}.format`, VALIDATION_CONTRACT_CAPS.textBytes);
|
|
174
|
+
if (format instanceof Error) return format;
|
|
175
|
+
artifact.format = format;
|
|
176
|
+
}
|
|
177
|
+
if (Object.hasOwn(value, "expected_dimensions")) {
|
|
178
|
+
const dimensions = boundedMap(
|
|
179
|
+
value.expected_dimensions,
|
|
180
|
+
`${location}.expected_dimensions`,
|
|
181
|
+
(entry, entryLocation) => typeof entry === "number" && Number.isInteger(entry) && entry >= 0 ? entry : new Error(`${entryLocation} must be a non-negative integer`)
|
|
182
|
+
);
|
|
183
|
+
if (dimensions instanceof Error) return dimensions;
|
|
184
|
+
artifact.expected_dimensions = dimensions;
|
|
185
|
+
}
|
|
186
|
+
if (Object.hasOwn(value, "expected_attributes")) {
|
|
187
|
+
const attributes = boundedMap(
|
|
188
|
+
value.expected_attributes,
|
|
189
|
+
`${location}.expected_attributes`,
|
|
190
|
+
(entry, entryLocation) => typeof entry === "string" ? boundedText(entry, entryLocation, VALIDATION_CONTRACT_CAPS.textBytes) : new Error(`${entryLocation} must be a string`)
|
|
191
|
+
);
|
|
192
|
+
if (attributes instanceof Error) return attributes;
|
|
193
|
+
artifact.expected_attributes = attributes;
|
|
194
|
+
}
|
|
195
|
+
if (Object.hasOwn(value, "numerical_tolerances")) {
|
|
196
|
+
const tolerances = validateTolerances(value.numerical_tolerances, `${location}.numerical_tolerances`);
|
|
197
|
+
if (tolerances instanceof Error) return tolerances;
|
|
198
|
+
artifact.numerical_tolerances = tolerances;
|
|
199
|
+
}
|
|
200
|
+
if (Object.hasOwn(value, "preserve")) {
|
|
201
|
+
if (typeof value.preserve !== "boolean") return new Error(`${location}.preserve must be a boolean`);
|
|
202
|
+
artifact.preserve = value.preserve;
|
|
203
|
+
}
|
|
204
|
+
return artifact;
|
|
205
|
+
}
|
|
206
|
+
function parseValidationContractText(text, contractPath) {
|
|
207
|
+
const invalid = (reason) => ({ ok: false, path: contractPath, reason });
|
|
208
|
+
const document = (0, import_yaml.parseDocument)(text, { prettyErrors: false, strict: true, uniqueKeys: true });
|
|
209
|
+
if (document.errors.length > 0) {
|
|
210
|
+
return invalid(`invalid YAML: ${document.errors.map((error) => error.message).join("; ")}`);
|
|
211
|
+
}
|
|
212
|
+
let parsed;
|
|
213
|
+
try {
|
|
214
|
+
parsed = document.toJS({ maxAliasCount: 0 });
|
|
215
|
+
} catch (error) {
|
|
216
|
+
return invalid(`invalid YAML: ${error instanceof Error ? error.message : String(error)}`);
|
|
217
|
+
}
|
|
218
|
+
if (!isRecord(parsed)) return invalid("root must be an object with a version field");
|
|
219
|
+
const rootUnknown = unknownFields(parsed, ROOT_FIELDS);
|
|
220
|
+
if (rootUnknown.length > 0) return invalid(`root has unknown field(s): ${rootUnknown.join(", ")}`);
|
|
221
|
+
if (!Object.hasOwn(parsed, "version")) return invalid("root.version is required");
|
|
222
|
+
if (parsed.version !== VALIDATION_CONTRACT_VERSION) {
|
|
223
|
+
return invalid(
|
|
224
|
+
`unsupported version ${JSON.stringify(parsed.version)}; supported version is ${VALIDATION_CONTRACT_VERSION}`
|
|
225
|
+
);
|
|
226
|
+
}
|
|
227
|
+
const contract = { version: VALIDATION_CONTRACT_VERSION };
|
|
228
|
+
if (Object.hasOwn(parsed, "task")) {
|
|
229
|
+
const task = boundedText(parsed.task, "root.task", VALIDATION_CONTRACT_CAPS.textBytes);
|
|
230
|
+
if (task instanceof Error) return invalid(task.message);
|
|
231
|
+
contract.task = task;
|
|
232
|
+
}
|
|
233
|
+
if (Object.hasOwn(parsed, "runtime")) {
|
|
234
|
+
const runtime = validateRuntime(parsed.runtime, "root.runtime");
|
|
235
|
+
if (runtime instanceof Error) return invalid(runtime.message);
|
|
236
|
+
contract.runtime = runtime;
|
|
237
|
+
}
|
|
238
|
+
if (Object.hasOwn(parsed, "artifacts")) {
|
|
239
|
+
if (!Array.isArray(parsed.artifacts)) return invalid("root.artifacts must be an array");
|
|
240
|
+
if (parsed.artifacts.length > VALIDATION_CONTRACT_CAPS.artifacts) {
|
|
241
|
+
return invalid(`root.artifacts exceeds the ${VALIDATION_CONTRACT_CAPS.artifacts}-entry cap`);
|
|
242
|
+
}
|
|
243
|
+
const artifacts = [];
|
|
244
|
+
for (const [index, value] of parsed.artifacts.entries()) {
|
|
245
|
+
const artifact = validateArtifact(value, `artifacts[${index}]`);
|
|
246
|
+
if (artifact instanceof Error) return invalid(artifact.message);
|
|
247
|
+
artifacts.push(artifact);
|
|
248
|
+
}
|
|
249
|
+
contract.artifacts = artifacts;
|
|
250
|
+
}
|
|
251
|
+
if (Object.hasOwn(parsed, "validators")) {
|
|
252
|
+
const validators = boundedStringList(parsed.validators, "root.validators", VALIDATION_CONTRACT_CAPS.validators);
|
|
253
|
+
if (validators instanceof Error) return invalid(validators.message);
|
|
254
|
+
contract.validators = validators;
|
|
255
|
+
}
|
|
256
|
+
if (Object.hasOwn(parsed, "notes")) {
|
|
257
|
+
const notes = boundedText(parsed.notes, "root.notes", VALIDATION_CONTRACT_CAPS.notesBytes);
|
|
258
|
+
if (notes instanceof Error) return invalid(notes.message);
|
|
259
|
+
contract.notes = notes;
|
|
260
|
+
}
|
|
261
|
+
return { ok: true, contract, path: contractPath };
|
|
262
|
+
}
|
|
263
|
+
function readContractText(absolutePath, workspaceRoot) {
|
|
264
|
+
let realPath;
|
|
265
|
+
try {
|
|
266
|
+
const realRoot = realpathSync(workspaceRoot);
|
|
267
|
+
realPath = realpathSync(absolutePath);
|
|
268
|
+
resolveSafeCwd(realPath, realRoot);
|
|
269
|
+
} catch (error) {
|
|
270
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
271
|
+
return new Error(`contract file must resolve inside the workspace root (${message})`);
|
|
272
|
+
}
|
|
273
|
+
try {
|
|
274
|
+
const stats = statSync(realPath);
|
|
275
|
+
if (!stats.isFile()) return new Error("contract path must be a regular file");
|
|
276
|
+
if (stats.size > VALIDATION_CONTRACT_CAPS.fileBytes) {
|
|
277
|
+
return new Error(`file exceeds the ${VALIDATION_CONTRACT_CAPS.fileBytes}-byte cap`);
|
|
278
|
+
}
|
|
279
|
+
return readFileSync(realPath, "utf8");
|
|
280
|
+
} catch (error) {
|
|
281
|
+
return new Error(`cannot read contract (${error instanceof Error ? error.message : String(error)})`);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
function loadValidationContract(workspaceRoot) {
|
|
285
|
+
let contractPath = null;
|
|
286
|
+
try {
|
|
287
|
+
contractPath = VALIDATION_CONTRACT_YAML_PATHS.find((relative) => existsSync(path.join(workspaceRoot, relative))) ?? null;
|
|
288
|
+
if (contractPath === null) {
|
|
289
|
+
if (existsSync(path.join(workspaceRoot, VALIDATION_CONTRACT_MARKDOWN_PATH))) {
|
|
290
|
+
return { ok: true, contract: null, path: VALIDATION_CONTRACT_MARKDOWN_PATH, advisory: true };
|
|
291
|
+
}
|
|
292
|
+
return { ok: true, contract: null };
|
|
293
|
+
}
|
|
294
|
+
} catch (error) {
|
|
295
|
+
return {
|
|
296
|
+
ok: false,
|
|
297
|
+
path: contractPath ?? VALIDATION_CONTRACT_YAML_PATHS[0] ?? "validation.yaml",
|
|
298
|
+
reason: `cannot inspect workspace root (${error instanceof Error ? error.message : String(error)})`
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
const text = readContractText(path.join(workspaceRoot, contractPath), workspaceRoot);
|
|
302
|
+
if (text instanceof Error) return { ok: false, path: contractPath, reason: text.message };
|
|
303
|
+
return parseValidationContractText(text, contractPath);
|
|
304
|
+
}
|
|
305
|
+
function describeValidationContract(result) {
|
|
306
|
+
if (!result.ok) return `${result.path}: ${result.reason}`;
|
|
307
|
+
if (result.contract === null) {
|
|
308
|
+
return "advisory" in result ? `${result.path} is advisory prose and does not raise rigor; add a version-1 validation.yaml to raise the default to high` : null;
|
|
309
|
+
}
|
|
310
|
+
return null;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
export {
|
|
314
|
+
VALIDATION_CONTRACT_MARKDOWN_PATH,
|
|
315
|
+
loadValidationContract,
|
|
316
|
+
describeValidationContract
|
|
317
|
+
};
|
|
318
|
+
//# sourceMappingURL=chunk-V76WTFTW.js.map
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
gitCommitAttributionEnabled,
|
|
4
4
|
reportCommitAttributionDiagnostic,
|
|
5
5
|
withManagedGitCommitAttributionEnvironment
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-U6TMQNSI.js";
|
|
7
7
|
import {
|
|
8
8
|
clampTimerDelayMs
|
|
9
9
|
} from "./chunk-EBY63B7G.js";
|
|
@@ -280,4 +280,4 @@ export {
|
|
|
280
280
|
combineBashOutput,
|
|
281
281
|
runBashCommand
|
|
282
282
|
};
|
|
283
|
-
//# sourceMappingURL=chunk-
|
|
283
|
+
//# sourceMappingURL=chunk-W54I7H25.js.map
|
|
@@ -7,17 +7,17 @@ import {
|
|
|
7
7
|
} from "./chunk-2WZ546HR.js";
|
|
8
8
|
import {
|
|
9
9
|
isTerminalRunEnvelope
|
|
10
|
-
} from "./chunk-
|
|
11
|
-
import {
|
|
12
|
-
taskBoardCounts
|
|
13
|
-
} from "./chunk-L47TF46W.js";
|
|
10
|
+
} from "./chunk-75W7L2E2.js";
|
|
14
11
|
import {
|
|
15
12
|
hashToolCall
|
|
16
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-6QOTUPRG.js";
|
|
14
|
+
import {
|
|
15
|
+
taskBoardCounts
|
|
16
|
+
} from "./chunk-6PAZTBPA.js";
|
|
17
17
|
import {
|
|
18
18
|
legacyToolResultDigest,
|
|
19
19
|
sanitizeToolResultDigest
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-NAI6ZFCY.js";
|
|
21
21
|
import {
|
|
22
22
|
SKILL_INSTALL_OFFER_OPTION_NEVER,
|
|
23
23
|
SKILL_INSTALL_OFFER_OPTION_NOT_NOW,
|
|
@@ -25,13 +25,13 @@ import {
|
|
|
25
25
|
SKILL_INSTALL_OFFER_OPTION_USER,
|
|
26
26
|
SKILL_SUGGESTION_ANCHOR,
|
|
27
27
|
SKILL_SUGGESTION_PREFIX
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-54X7T7DK.js";
|
|
29
29
|
import {
|
|
30
30
|
ToolNames
|
|
31
|
-
} from "./chunk-
|
|
31
|
+
} from "./chunk-4NSRCOYP.js";
|
|
32
32
|
import {
|
|
33
33
|
registerForegroundStream
|
|
34
|
-
} from "./chunk-
|
|
34
|
+
} from "./chunk-JSD46VO2.js";
|
|
35
35
|
import {
|
|
36
36
|
ceilChars
|
|
37
37
|
} from "./chunk-NZMNUPZZ.js";
|
|
@@ -41,7 +41,7 @@ import {
|
|
|
41
41
|
import {
|
|
42
42
|
reportCommitAttributionDiagnostic,
|
|
43
43
|
withManagedGitCommitAttributionEnvironment
|
|
44
|
-
} from "./chunk-
|
|
44
|
+
} from "./chunk-U6TMQNSI.js";
|
|
45
45
|
import {
|
|
46
46
|
require_dist
|
|
47
47
|
} from "./chunk-APJ265NV.js";
|
|
@@ -1217,8 +1217,11 @@ var NO_EFFECTS2 = [];
|
|
|
1217
1217
|
function offerBindingTag(offerTag) {
|
|
1218
1218
|
return `[clio-install:${offerTag}]`;
|
|
1219
1219
|
}
|
|
1220
|
+
function boundedDescription(text) {
|
|
1221
|
+
return text.replace(/\[[^[\]]*\]/gu, " ").replace(/\s+/gu, " ").trim().slice(0, 200);
|
|
1222
|
+
}
|
|
1220
1223
|
function marketplaceOfferReminder(entry, offerTag) {
|
|
1221
|
-
return `[Marketplace] This request may need expertise no installed skill covers. The local marketplace has "${entry.name}" (not installed): ${entry.description} First check the installed side with context(scope="skills"); if ${entry.name} is genuinely the right fit and nothing installed serves, ask the operator with ask_user (mode=single_question, header "Install skill") whether to install ${entry.name}, offering exactly these options in this order: "${SKILL_INSTALL_OFFER_OPTION_PROJECT}", "${SKILL_INSTALL_OFFER_OPTION_USER}", "${SKILL_INSTALL_OFFER_OPTION_NOT_NOW}", "${SKILL_INSTALL_OFFER_OPTION_NEVER}". Include the exact tag ${offerBindingTag(offerTag)} verbatim in that question's text so the harness can bind the answer to this offer; the harness acts only on an answer carrying this tag. Then continue the task in the same turn. The harness handles the answer; never install or load a skill yourself. If it is not actually needed, do not mention it.`;
|
|
1224
|
+
return `[Marketplace] This request may need expertise no installed skill covers. The local marketplace has "${entry.name}" (not installed): ${boundedDescription(entry.description)} First check the installed side with context(scope="skills"); if ${entry.name} is genuinely the right fit and nothing installed serves, ask the operator with ask_user (mode=single_question, header "Install skill") whether to install ${entry.name}, offering exactly these options in this order: "${SKILL_INSTALL_OFFER_OPTION_PROJECT}", "${SKILL_INSTALL_OFFER_OPTION_USER}", "${SKILL_INSTALL_OFFER_OPTION_NOT_NOW}", "${SKILL_INSTALL_OFFER_OPTION_NEVER}". Include the exact tag ${offerBindingTag(offerTag)} verbatim in that question's text so the harness can bind the answer to this offer; the harness acts only on an answer carrying this tag. Then continue the task in the same turn. The harness handles the answer; never install or load a skill yourself. If it is not actually needed, do not mention it.`;
|
|
1222
1225
|
}
|
|
1223
1226
|
function answersFromDetails(details) {
|
|
1224
1227
|
const raw = details?.answers;
|
|
@@ -1366,6 +1369,15 @@ function createMarketplaceOfferRegistration(deps) {
|
|
|
1366
1369
|
const match = bestMatch(input.text ?? "");
|
|
1367
1370
|
if (!match) return NO_EFFECTS2;
|
|
1368
1371
|
offeredNames.add(match.entry.name);
|
|
1372
|
+
if (deps.interactive === false) {
|
|
1373
|
+
return [
|
|
1374
|
+
{
|
|
1375
|
+
kind: "inject_reminder",
|
|
1376
|
+
severity: "info",
|
|
1377
|
+
message: `[Marketplace] Skill "${match.entry.name}" matches this request; install with clio-coder skills install ${match.entry.name}.`
|
|
1378
|
+
}
|
|
1379
|
+
];
|
|
1380
|
+
}
|
|
1369
1381
|
const tag = newOfferTag();
|
|
1370
1382
|
pendingOffer = { entry: match.entry, tag };
|
|
1371
1383
|
return [{ kind: "inject_reminder", severity: "info", message: marketplaceOfferReminder(match.entry, tag) }];
|
|
@@ -3084,4 +3096,4 @@ export {
|
|
|
3084
3096
|
createWatchdogRegistration,
|
|
3085
3097
|
MiddlewareDomainModule
|
|
3086
3098
|
};
|
|
3087
|
-
//# sourceMappingURL=chunk-
|
|
3099
|
+
//# sourceMappingURL=chunk-XULDXHTN.js.map
|