@iowarp/clio-coder 0.4.6 → 0.4.7
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/.claude-plugin/marketplace.json +283 -0
- package/CHANGELOG.md +50 -0
- package/CONTRIBUTING.md +102 -29
- package/NOTICE +8 -0
- package/README.md +37 -5
- package/dist/{acp-UVEVWSDL.js → acp-W3Y3TRHD.js} +12 -12
- package/dist/{agents-VWY37DTK.js → agents-J4ICNLQ3.js} +52 -52
- package/dist/assets/codewiki.json +1 -1
- package/dist/assets/tui-notices/get-east-asian-width-LICENSE +9 -0
- package/dist/assets/tui-notices/marked-LICENSE +44 -0
- package/dist/assets/tui-notices/pi-tui-LICENSE +21 -0
- package/dist/{auth-PCV2XQDV.js → auth-X2UJUMOC.js} +24 -24
- package/dist/{builtins-PD652MTK.js → builtins-XLXWWSRF.js} +6 -6
- package/dist/{chunk-DZK63TZJ.js → chunk-24S3DN22.js} +336 -612
- package/dist/{chunk-NTK3WTHM.js → chunk-24TOGHPO.js} +2 -2
- package/dist/{chunk-M6TAYK66.js → chunk-2O2LVQQK.js} +11 -4
- package/dist/{chunk-OQM5IVJY.js → chunk-34XHRVKG.js} +3 -3
- package/dist/{chunk-LY4N4TTL.js → chunk-3LXJOICS.js} +2 -2
- package/dist/{chunk-3BJGMT2D.js → chunk-3XE4NRLF.js} +1 -1
- package/dist/{chunk-N2OKBREN.js → chunk-4MFBBY2Z.js} +3 -3
- package/dist/{chunk-5VTJP36Q.js → chunk-4N2RZ4TO.js} +2 -2
- package/dist/{chunk-WNGF5AJX.js → chunk-4QKAITQT.js} +3 -3
- package/dist/chunk-4UHVS5T7.js +207 -0
- package/dist/{chunk-GLYBJ4RQ.js → chunk-5AJPUR72.js} +6 -6
- package/dist/{chunk-5CY4Q6QI.js → chunk-5EQO5NWP.js} +105 -3
- package/dist/{chunk-6HAO6X5B.js → chunk-65BGHOUR.js} +8 -5
- package/dist/{chunk-6VRRJT7L.js → chunk-6CA2BHOR.js} +2 -2
- package/dist/{chunk-HL26ADLH.js → chunk-6CB2IL4N.js} +2 -1
- package/dist/{chunk-E7RF4KBO.js → chunk-6LRLOJHQ.js} +3 -3
- package/dist/{chunk-HXHFDHB6.js → chunk-6TAATXXH.js} +6 -6
- package/dist/{chunk-P6M7RKMI.js → chunk-6YHPAAZR.js} +3 -3
- package/dist/{chunk-5QRX7SLS.js → chunk-7EEGBKV4.js} +7 -7
- package/dist/{chunk-BS4GAMUB.js → chunk-A67NR5AT.js} +2 -2
- package/dist/{chunk-WJIMKGD6.js → chunk-BAU36233.js} +8 -8
- package/dist/{chunk-PZN2LQY6.js → chunk-BO4XV5VX.js} +4 -4
- package/dist/{chunk-I2K2NCZQ.js → chunk-BQQ5MXUC.js} +6 -6
- package/dist/{chunk-X3BI7HTV.js → chunk-C3G5PNUO.js} +21 -21
- package/dist/{chunk-SRZOW5L2.js → chunk-C6GEXX4L.js} +1 -1
- package/dist/{chunk-6RYDAVQT.js → chunk-CE64C5K5.js} +219 -64
- package/dist/chunk-CP3HIR5H.js +2119 -0
- package/dist/{chunk-BBV5TKE6.js → chunk-CPXGJI2A.js} +2 -2
- package/dist/{chunk-IGLVVNEG.js → chunk-CULVKYTK.js} +4 -4
- package/dist/{chunk-DXLUVUD4.js → chunk-D2T66PDV.js} +5 -5
- package/dist/{chunk-NF3BK5WR.js → chunk-DACXIVVF.js} +5 -5
- package/dist/{chunk-IKRWLEDA.js → chunk-DLIYANB7.js} +20 -15
- package/dist/{chunk-RGZNQ5CT.js → chunk-DO7M3LSX.js} +9 -9
- package/dist/{chunk-2QPI3TR3.js → chunk-DVJL77SO.js} +2 -2
- package/dist/{chunk-ODUTYZIU.js → chunk-EUEXGXXR.js} +5 -5
- package/dist/{chunk-WKUYQBCG.js → chunk-EUZRMP4Y.js} +18 -16
- package/dist/{chunk-JMPL7NUB.js → chunk-G4LGUTOE.js} +4 -4
- package/dist/{chunk-CBSKDFWL.js → chunk-GEVQNST4.js} +2 -2
- package/dist/{chunk-NNWJYUNO.js → chunk-GFQ7P2UF.js} +7 -7
- package/dist/{chunk-SXQKNKRA.js → chunk-GI5RRMAH.js} +14 -14
- package/dist/{chunk-HPTJF6DG.js → chunk-GVZFCJHE.js} +336 -83
- package/dist/{chunk-ACCKVSHU.js → chunk-GXIWHXDB.js} +3 -3
- package/dist/{chunk-LUL5Z66S.js → chunk-HOX4YZ2K.js} +6 -5
- package/dist/chunk-HRAKUPIH.js +57 -0
- package/dist/{chunk-F5Z7EWMN.js → chunk-IJMW64DX.js} +50 -50
- package/dist/{chunk-QNWRHOMF.js → chunk-IMOD2YPV.js} +16 -9
- package/dist/{chunk-HZ2T2YED.js → chunk-IQCNVLO6.js} +28 -8
- package/dist/{chunk-HZFBVU5X.js → chunk-ISNCCX42.js} +8 -8
- package/dist/{chunk-7JSSKXG2.js → chunk-IZYTT3CD.js} +7 -3
- package/dist/chunk-KKEYGFX4.js +915 -0
- package/dist/{chunk-HHVJNVUJ.js → chunk-KS7ETA3P.js} +2 -2
- package/dist/{chunk-BLTEAUCB.js → chunk-L3Z5ANCV.js} +7 -7
- package/dist/{chunk-4VMV6OS6.js → chunk-LBFQMYS3.js} +2 -2
- package/dist/{chunk-URBGEOH3.js → chunk-M6Z2V6YU.js} +5 -5
- package/dist/{chunk-BT7HGDOX.js → chunk-MBJO5VNZ.js} +12 -12
- package/dist/chunk-MNQN3X6Y.js +595 -0
- package/dist/{chunk-3QKXHCGS.js → chunk-MZHXENL7.js} +5 -5
- package/dist/chunk-MZNWZUJM.js +1801 -0
- package/dist/{chunk-7YJWEF2L.js → chunk-N37QC5FV.js} +5 -5
- package/dist/{chunk-TJFDL26W.js → chunk-NCCQ6DVS.js} +7 -7
- package/dist/{chunk-P5JMBPDJ.js → chunk-NO7J45X6.js} +162 -47
- package/dist/chunk-OH3YYA3B.js +15 -0
- package/dist/{chunk-22PQ4TX4.js → chunk-P4DL2LM5.js} +16 -77
- package/dist/{chunk-LIN2K3EL.js → chunk-PFLOULP3.js} +4 -4
- package/dist/{chunk-QXFBABFJ.js → chunk-QKWL7SYE.js} +11 -11
- package/dist/chunk-RFCKPS2V.js +26 -0
- package/dist/{chunk-ZS43Y2FT.js → chunk-RTLNFZMD.js} +12 -4
- package/dist/{chunk-U7H5WRG5.js → chunk-RXFPB32E.js} +8 -6
- package/dist/{chunk-Q7NNUHQV.js → chunk-SEDI5K5B.js} +16 -16
- package/dist/{chunk-WV6TDAPN.js → chunk-SELG4SUR.js} +7 -7
- package/dist/{chunk-3WBALRQH.js → chunk-SER7RRAE.js} +27 -832
- package/dist/{chunk-K2HL3GBL.js → chunk-T4TY5GG3.js} +165 -15
- package/dist/chunk-T7QQBNLH.js +691 -0
- package/dist/{chunk-6OII3LOK.js → chunk-TLTGZTXI.js} +3 -3
- package/dist/chunk-TZ6UVP2H.js +637 -0
- package/dist/{chunk-3JLFK5MW.js → chunk-TZHN5ITX.js} +13 -41
- package/dist/{chunk-VANN3GDP.js → chunk-U3TPUXOQ.js} +399 -234
- package/dist/{chunk-VHMX7SXF.js → chunk-UA3W4FGC.js} +6 -6
- package/dist/{chunk-3O2ZAUGQ.js → chunk-UA6W4XFJ.js} +2 -2
- package/dist/chunk-UWD3JD5X.js +709 -0
- package/dist/chunk-V4ZKOKRB.js +13433 -0
- package/dist/{chunk-NC4KV7EL.js → chunk-VCRVEDUC.js} +5 -5
- package/dist/{chunk-4DU2TVI4.js → chunk-VMATUZB6.js} +12 -10
- package/dist/{chunk-J2FYEQ5L.js → chunk-VTYHHQ57.js} +2 -2
- package/dist/chunk-WB7POC6M.js +891 -0
- package/dist/{chunk-3HQVBIKD.js → chunk-WBVKKTUT.js} +2 -2
- package/dist/{chunk-EHOSNVVM.js → chunk-WLHX3MM5.js} +6 -2
- package/dist/{chunk-24T2YZ7A.js → chunk-WN552PKN.js} +553 -298
- package/dist/{chunk-4U4TKZFR.js → chunk-WT5TRMO4.js} +51 -26
- package/dist/{chunk-XWMSPJYN.js → chunk-WURGVOZJ.js} +56 -12
- package/dist/{chunk-7WUZEB2M.js → chunk-XR3XJN2M.js} +2 -2
- package/dist/chunk-XW2UZICE.js +372 -0
- package/dist/{chunk-2AKYFREM.js → chunk-XZ6UFQ52.js} +11 -11
- package/dist/chunk-Y3JU5RPK.js +8 -0
- package/dist/chunk-YKRJTYNP.js +1143 -0
- package/dist/{chunk-PWWSIB2A.js → chunk-ZGIGW4ZG.js} +5 -5
- package/dist/cli/index.js +34 -36
- package/dist/{clio-QQCMTUZE.js → clio-L2P7S2R2.js} +9 -9
- package/dist/{code-nav-GUPM6766.js → code-nav-B5LNX4KU.js} +25 -25
- package/dist/{components-TNIKXCBH.js → components-63MMQKUT.js} +6 -6
- package/dist/{config-IIM7YOD3.js → config-YXARKGTX.js} +70 -67
- package/dist/{configure-4ZM5HWJX.js → configure-LMVQJ46J.js} +47 -35
- package/dist/{context-OL5P3HEP.js → context-7HJEWTTP.js} +87 -44
- package/dist/{context-44BZLJ3J.js → context-XSZKKFBW.js} +14 -14
- package/dist/{context-AIDVQKMW.js → context-YG2LZDYZ.js} +60 -58
- package/dist/{context-clear-OQV76MYP.js → context-clear-AC5NXHM2.js} +57 -55
- package/dist/{context-index-HP2JFUWA.js → context-index-KKTPRV5G.js} +3 -3
- package/dist/{context-map-INTXD54D.js → context-map-T7ROR5D5.js} +4 -4
- package/dist/{context-working-set-ZUW3EGLS.js → context-working-set-F4Q4J3NS.js} +12 -10
- package/dist/{detail-UXPWRANG.js → detail-H73BEF2N.js} +58 -56
- package/dist/{dispatch-runner-P3ZW6G77.js → dispatch-runner-3RY5FSJC.js} +74 -72
- package/dist/{doctor-JJVGPZWT.js → doctor-EQYJOGUG.js} +44 -30
- package/dist/{eval-V2RTN3UH.js → eval-4P7O6CCE.js} +109 -46
- package/dist/{evidence-35PYWGSO.js → evidence-D6GUSYJW.js} +57 -55
- package/dist/{evidence-CIGGKI6J.js → evidence-O76QF7TZ.js} +62 -59
- package/dist/{evolve-33SM3NJP.js → evolve-H47BCETS.js} +58 -56
- package/dist/{extensions-YVRHX6ZI.js → extensions-NNL3ZOCU.js} +98 -20
- package/dist/{fleet-LFO7SIPC.js → fleet-KMNS6NOM.js} +106 -99
- package/dist/{fleet-commands-RLK72GU3.js → fleet-commands-DOWSYCBX.js} +14 -14
- package/dist/{fleet-decisions-3SBSCTCW.js → fleet-decisions-S3PTZV2D.js} +9 -9
- package/dist/{fleet-graph-JZIBCGMW.js → fleet-graph-F2DE2TME.js} +26 -24
- package/dist/{fleet-inspect-2L5YGGZJ.js → fleet-inspect-EN2Q6IVB.js} +60 -57
- package/dist/{fleet-preflight-QRSHIIDE.js → fleet-preflight-FRLETDD3.js} +3 -3
- package/dist/{fleet-validate-LIAVKDUU.js → fleet-validate-B2XDLS57.js} +28 -29
- package/dist/{fleet-verify-JIK3OQZR.js → fleet-verify-4JKUWGJ7.js} +57 -55
- package/dist/{fleet-view-IWHYGQKK.js → fleet-view-BHJFW26B.js} +60 -57
- package/dist/{init-NJEDOTQW.js → init-XAT5N5YM.js} +79 -74
- package/dist/interop-FVECHFKG.js +246 -0
- package/dist/{inventory-74UL7UHU.js → inventory-7KFQGLCV.js} +60 -57
- package/dist/library-NY2XOT75.js +492 -0
- package/dist/library-QAPAO23R.js +306 -0
- package/dist/library-import-5Y6MAS3R.js +183 -0
- package/dist/library-inventory-JT6HWITQ.js +56 -0
- package/dist/library-validation-EQUH25DC.js +42 -0
- package/dist/{memory-I76I5VUH.js → memory-DYVTTCP6.js} +58 -56
- package/dist/{models-D4YDIQZQ.js → models-MASFJ6Y2.js} +48 -36
- package/dist/{monitor-NKVD55HX.js → monitor-YMP4NXJJ.js} +64 -61
- package/dist/{orchestrator-I6OATVPK.js → orchestrator-AFQRRTEI.js} +3685 -1841
- package/dist/{panes-7BTYH3XQ.js → panes-D3Y2KFG5.js} +4 -4
- package/dist/{panes-WPOMEMRH.js → panes-NICTHQCV.js} +7 -7
- package/dist/{paths-J3KN7UAO.js → paths-PSFAUIGO.js} +5 -5
- package/dist/{preload-EJAWJEIO.js → preload-5Q7VXRFJ.js} +57 -55
- package/dist/{reset-4XMQKDNZ.js → reset-7NKZK7JN.js} +9 -9
- package/dist/{resources-TVYVXK3Q.js → resources-NILSIZAT.js} +94 -38
- package/dist/{run-OWQNNSJU.js → run-BPZGEBZV.js} +121 -105
- package/dist/{share-NPZZMUXG.js → share-EZ6ERBMH.js} +31 -28
- package/dist/skills-BTVVNYVM.js +100 -0
- package/dist/{skills-eval-J5TCKSJA.js → skills-eval-UY34MNK7.js} +110 -72
- package/dist/{skills-inventory-7II4DM57.js → skills-inventory-JDHSIA7I.js} +30 -25
- package/dist/{slash-commands-MDSDSWYF.js → slash-commands-K4FNQ2AT.js} +49 -46
- package/dist/{steer-S7D7IKPU.js → steer-2B3EQGFH.js} +4 -4
- package/dist/{support-5VAEC32W.js → support-L2SOL3IE.js} +7 -7
- package/dist/{targets-KILZEOCE.js → targets-44VKGFLN.js} +64 -58
- package/dist/{tasks-R6P6OV22.js → tasks-3KODKFU7.js} +12 -12
- package/dist/{terminal-lease-LZCG2KN3.js → terminal-lease-LXA7MMPO.js} +32 -19
- package/dist/{tools-6OCQ6SVB.js → tools-3UB7TEVR.js} +7 -7
- package/dist/{trace-JHLXWUMN.js → trace-TAMIU4OJ.js} +5 -4
- package/dist/{tui-primitives-RCY2HN7G.js → tui-primitives-A6MUW32V.js} +3 -2
- package/dist/{uninstall-FXYMFFRT.js → uninstall-QYVRPEM4.js} +9 -9
- package/dist/{upgrade-D2OZH6IQ.js → upgrade-7PMKM2JH.js} +15 -16
- package/dist/{usage-PIASNUS4.js → usage-6EQV7EQK.js} +70 -67
- package/dist/{verifiers-LTHUY2PX.js → verifiers-JLITWSHU.js} +15 -15
- package/dist/{verify-HYF7KBVE.js → verify-T7NAEVIG.js} +13 -13
- package/dist/{web-fetch-MQN4FH3X.js → web-fetch-W4TNW4Q7.js} +4 -4
- package/dist/{wiki-generate-RK7JQ5NP.js → wiki-generate-T2TJQJUA.js} +81 -76
- package/dist/{with-panes-OFTNAR4Y.js → with-panes-CHFC7HGI.js} +4 -4
- package/dist/worker/entry.js +283 -76
- package/docs/README.md +43 -0
- package/docs/architecture/architecture.md +8 -7
- package/docs/architecture/artifact-versions.md +3 -3
- package/docs/architecture/context-engine.md +35 -1
- package/docs/architecture/library.md +32 -0
- package/docs/architecture/middleware-and-components.md +1 -1
- package/docs/architecture/model-catalog.md +21 -1
- package/docs/architecture/pi-boundary.md +18 -0
- package/docs/architecture/prompt-envelope-and-tools.md +5 -5
- package/docs/architecture/safety-model.md +21 -2
- package/docs/architecture/session-lifecycle.md +12 -1
- package/docs/architecture/tui-design.md +108 -9
- package/docs/architecture/worker-context.md +106 -0
- package/docs/guide/authoring-plugins.md +160 -0
- package/docs/guide/built-in-agents.md +5 -5
- package/docs/guide/commands-and-modes.md +161 -56
- package/docs/guide/configuration-and-targets.md +1 -1
- package/docs/guide/configuration-reference.md +27 -34
- package/docs/guide/environment-variables.md +2 -2
- package/docs/guide/exit-codes-and-output.md +1 -1
- package/docs/guide/extensions-and-sharing.md +93 -53
- package/docs/guide/fleet-dispatch.md +31 -4
- package/docs/guide/glossary.md +1 -1
- package/docs/guide/harness-extensions.md +291 -0
- package/docs/guide/installation-and-lifecycle.md +9 -9
- package/docs/guide/interop.md +243 -0
- package/docs/guide/panes-and-files.md +3 -3
- package/docs/guide/plugins.md +80 -0
- package/docs/guide/resource-library.md +111 -45
- package/docs/guide/skills-marketplace.md +35 -72
- package/docs/guide/tool-usage.md +19 -7
- package/docs/guide/troubleshooting.md +1 -1
- package/docs/process/development-pipeline.md +14 -14
- package/docs/process/documentation-coverage.md +28 -1
- package/docs/process/documentation-guide.md +15 -7
- package/docs/process/eval-runner.md +8 -3
- package/docs/process/performance-methodology.md +1 -1
- package/docs/process/release-cut-checklist.md +4 -0
- package/docs/process/scientific-validation.md +23 -0
- package/evals/scalar-decision-machinery.ts +1 -1
- package/examples/extensions/README.md +67 -0
- package/examples/extensions/lab-status/clio-coder-extension.json +14 -0
- package/examples/extensions/lab-status/extension.mjs +68 -0
- package/examples/extensions/lab-status/jobs.synthetic.json +9 -0
- package/examples/extensions/measurements/clio-coder-extension.json +28 -0
- package/examples/extensions/measurements/summarize.cjs +23 -0
- package/library/README.md +109 -0
- package/library/_authoring/templates/agent/README.md +28 -0
- package/library/_authoring/templates/agent/agents/benchmark-scout.md +30 -0
- package/library/_authoring/templates/agent/plugin.json +23 -0
- package/library/_authoring/templates/fleet/README.md +29 -0
- package/library/_authoring/templates/fleet/fleets/pipeline-review.md +31 -0
- package/library/_authoring/templates/fleet/plugin.json +23 -0
- package/library/_authoring/templates/plugin/README.md +37 -0
- package/library/_authoring/templates/plugin/agents/data-curator.md +31 -0
- package/library/_authoring/templates/plugin/assets/curation-guide.md +22 -0
- package/library/_authoring/templates/plugin/plugin.json +42 -0
- package/library/_authoring/templates/plugin/prompts/inspect-dataset.md +15 -0
- package/library/_authoring/templates/plugin/skills/dataset-curation/SKILL.md +36 -0
- package/library/_authoring/templates/plugin/skills/dataset-curation/evals.md +17 -0
- package/library/_authoring/templates/prompt/README.md +28 -0
- package/library/_authoring/templates/prompt/plugin.json +23 -0
- package/library/_authoring/templates/prompt/prompts/paper-summary.md +26 -0
- package/library/_authoring/templates/skill/README.md +24 -0
- package/library/_authoring/templates/skill/SKILL.md +39 -0
- package/library/_authoring/templates/skill/evals.md +30 -0
- package/library/_authoring/templates/skill/plugin.json +23 -0
- package/library/agents/README.md +7 -0
- package/library/fleets/README.md +7 -0
- package/library/plugins/materio/README.md +137 -0
- package/library/plugins/materio/ai.iowarp.clio/agents/materio-lab-definer.md +208 -0
- package/library/plugins/materio/ai.iowarp.clio/agents/materio-literature-reviewer.md +308 -0
- package/library/plugins/materio/ai.iowarp.clio/agents/materio-research-explorer.md +249 -0
- package/library/plugins/materio/ai.iowarp.clio/agents/materio-task-executor.md +416 -0
- package/library/plugins/materio/ai.iowarp.clio/agents/materio-task-verifier.md +60 -0
- package/library/plugins/materio/ai.iowarp.clio/agents/materio-workflow-planner.md +238 -0
- package/library/plugins/materio/ai.iowarp.clio/fleets/materio-execute-task.md +50 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/add-task.md +66 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/archive-task.md +65 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/checkpoint.md +26 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/define-research-tasks.md +230 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/define-virtual-lab.md +181 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/execute-task.md +292 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/help.md +129 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/identify-research.md +206 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/literature-review.md +201 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/pause-research.md +12 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/progress.md +105 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/remove-task.md +63 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/resume-research.md +64 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/settings.md +16 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/status.md +92 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/upload-data.md +104 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/wtfp.md +145 -0
- package/library/plugins/materio/ai.iowarp.clio/references/execution.md +56 -0
- package/library/plugins/materio/ai.iowarp.portability/provenance.json +9 -0
- package/library/plugins/materio/assets/actions/add-task.md +86 -0
- package/library/plugins/materio/assets/actions/archive-task.md +84 -0
- package/library/plugins/materio/assets/actions/checkpoint.md +47 -0
- package/library/plugins/materio/assets/actions/define-research-tasks.md +228 -0
- package/library/plugins/materio/assets/actions/define-virtual-lab.md +179 -0
- package/library/plugins/materio/assets/actions/execute-task.md +290 -0
- package/library/plugins/materio/assets/actions/help.md +140 -0
- package/library/plugins/materio/assets/actions/identify-research.md +204 -0
- package/library/plugins/materio/assets/actions/literature-review.md +199 -0
- package/library/plugins/materio/assets/actions/pause-research.md +34 -0
- package/library/plugins/materio/assets/actions/progress.md +125 -0
- package/library/plugins/materio/assets/actions/remove-task.md +82 -0
- package/library/plugins/materio/assets/actions/resume-research.md +84 -0
- package/library/plugins/materio/assets/actions/settings.md +38 -0
- package/library/plugins/materio/assets/actions/status.md +112 -0
- package/library/plugins/materio/assets/actions/upload-data.md +123 -0
- package/library/plugins/materio/assets/actions/wtfp.md +179 -0
- package/library/plugins/materio/assets/references/research-domains.md +134 -0
- package/library/plugins/materio/assets/references/research-policy.md +77 -0
- package/library/plugins/materio/assets/references/traditional-workflows.md +146 -0
- package/library/plugins/materio/assets/scripts/check_physics.py +271 -0
- package/library/plugins/materio/assets/scripts/check_scripts.py +248 -0
- package/library/plugins/materio/assets/scripts/project_plugin.py +165 -0
- package/library/plugins/materio/assets/scripts/research_state.py +400 -0
- package/library/plugins/materio/assets/scripts/verify_citations.py +616 -0
- package/library/plugins/materio/assets/templates/RESEARCH.md +39 -0
- package/library/plugins/materio/assets/templates/VIRTUAL-LAB.md +120 -0
- package/library/plugins/materio/assets/templates/WORKFLOW.md +42 -0
- package/library/plugins/materio/assets/templates/config.json +5 -0
- package/library/plugins/materio/evals/scripts.yaml +29 -0
- package/library/plugins/materio/plugin.json +530 -0
- package/library/plugins/materio/skills/materio-lab-definer/SKILL.md +74 -0
- package/library/plugins/materio/skills/materio-literature-reviewer/SKILL.md +64 -0
- package/library/plugins/materio/skills/materio-research-explorer/SKILL.md +74 -0
- package/library/plugins/materio/skills/materio-task-executor/SKILL.md +214 -0
- package/library/plugins/materio/skills/materio-task-verifier/SKILL.md +46 -0
- package/library/plugins/materio/skills/materio-workflow-planner/SKILL.md +79 -0
- package/library/plugins/materio/tests/test_check_physics.py +139 -0
- package/library/plugins/materio/tests/test_check_scripts.py +140 -0
- package/library/plugins/materio/tests/test_research_state.py +291 -0
- package/library/plugins/materio/tests/test_verify_citations.py +337 -0
- package/library/prompts/README.md +7 -0
- package/library/registry.yaml +921 -0
- package/library/skills/README.md +120 -0
- package/{skills → library/skills}/coding/ast-grep/SKILL.md +1 -1
- package/{skills → library/skills}/coding/ast-grep/evals.md +1 -1
- package/library/skills/coding/ast-grep/plugin.json +23 -0
- package/{skills → library/skills}/coding/coding-standards/SKILL.md +1 -1
- package/{skills → library/skills}/coding/coding-standards/evals.md +1 -1
- package/library/skills/coding/coding-standards/plugin.json +23 -0
- package/{skills → library/skills}/coding/prototype/SKILL.md +1 -1
- package/{skills → library/skills}/coding/prototype/evals.md +1 -1
- package/library/skills/coding/prototype/plugin.json +23 -0
- package/{skills → library/skills}/coding/tdd/SKILL.md +1 -1
- package/{skills → library/skills}/coding/tdd/evals.md +1 -1
- package/library/skills/coding/tdd/plugin.json +23 -0
- package/{skills → library/skills}/context/context-handoff/SKILL.md +1 -1
- package/{skills → library/skills}/context/context-handoff/evals.md +1 -1
- package/library/skills/context/context-handoff/plugin.json +23 -0
- package/{skills → library/skills}/context/context-prime/SKILL.md +1 -1
- package/{skills → library/skills}/context/context-prime/evals.md +1 -1
- package/library/skills/context/context-prime/plugin.json +23 -0
- package/{skills → library/skills}/git/branch-closeout/SKILL.md +1 -1
- package/library/skills/git/branch-closeout/plugin.json +23 -0
- package/{skills → library/skills}/git/file-ticket/SKILL.md +1 -1
- package/library/skills/git/file-ticket/plugin.json +23 -0
- package/{skills → library/skills}/git/fix-issue/SKILL.md +1 -1
- package/library/skills/git/fix-issue/plugin.json +23 -0
- package/{skills → library/skills}/git/resolve-merge-conflicts/SKILL.md +1 -1
- package/{skills → library/skills}/git/resolve-merge-conflicts/evals.md +1 -1
- package/library/skills/git/resolve-merge-conflicts/plugin.json +23 -0
- package/{skills → library/skills}/git/ship/SKILL.md +1 -1
- package/library/skills/git/ship/plugin.json +23 -0
- package/{skills → library/skills}/git/worktree-create/SKILL.md +1 -1
- package/library/skills/git/worktree-create/plugin.json +23 -0
- package/{skills → library/skills}/git/worktree-merge/SKILL.md +1 -1
- package/library/skills/git/worktree-merge/plugin.json +23 -0
- package/{skills → library/skills}/meta/clio-coder-dev/SKILL.md +1 -1
- package/{skills → library/skills}/meta/clio-coder-dev/evals.md +1 -1
- package/library/skills/meta/clio-coder-dev/plugin.json +23 -0
- package/{skills → library/skills}/meta/clio-coder-test/SKILL.md +1 -1
- package/{skills → library/skills}/meta/clio-coder-test/evals.md +1 -1
- package/library/skills/meta/clio-coder-test/plugin.json +23 -0
- package/{skills → library/skills}/meta/credentials/SKILL.md +1 -1
- package/{skills → library/skills}/meta/credentials/evals.md +1 -1
- package/library/skills/meta/credentials/plugin.json +23 -0
- package/library/skills/meta/find-skills/SKILL.md +85 -0
- package/library/skills/meta/find-skills/evals.md +65 -0
- package/library/skills/meta/find-skills/plugin.json +23 -0
- package/{skills → library/skills}/meta/herdr/SKILL.md +1 -1
- package/{skills → library/skills}/meta/herdr/evals.md +1 -1
- package/library/skills/meta/herdr/plugin.json +23 -0
- package/{skills → library/skills}/meta/skill-craft/SKILL.md +23 -9
- package/{skills → library/skills}/meta/skill-craft/evals.md +11 -3
- package/library/skills/meta/skill-craft/plugin.json +23 -0
- package/{skills → library/skills}/planning/archify/SKILL.md +13 -13
- package/library/skills/planning/archify/plugin.json +23 -0
- package/{skills → library/skills}/planning/architecture/SKILL.md +1 -1
- package/{skills → library/skills}/planning/architecture/evals.md +1 -1
- package/library/skills/planning/architecture/plugin.json +23 -0
- package/{skills → library/skills}/planning/backlog/SKILL.md +1 -1
- package/{skills → library/skills}/planning/backlog/evals.md +1 -1
- package/library/skills/planning/backlog/plugin.json +23 -0
- package/{skills → library/skills}/planning/prd/SKILL.md +1 -1
- package/{skills → library/skills}/planning/prd/evals.md +1 -1
- package/library/skills/planning/prd/plugin.json +23 -0
- package/{skills → library/skills}/planning/product-intent/SKILL.md +1 -1
- package/{skills → library/skills}/planning/product-intent/evals.md +1 -1
- package/library/skills/planning/product-intent/plugin.json +23 -0
- package/{skills → library/skills}/planning/tech-spec/SKILL.md +1 -1
- package/{skills → library/skills}/planning/tech-spec/evals.md +1 -1
- package/library/skills/planning/tech-spec/plugin.json +23 -0
- package/{skills → library/skills}/registry.yaml +7 -7
- package/{skills → library/skills}/remote.yaml +1 -1
- package/{skills → library/skills}/research/arxiv-literature/SKILL.md +1 -1
- package/{skills → library/skills}/research/arxiv-literature/evals.md +1 -1
- package/library/skills/research/arxiv-literature/plugin.json +23 -0
- package/{skills → library/skills}/research/experiment-protocol/SKILL.md +1 -1
- package/{skills → library/skills}/research/experiment-protocol/evals.md +1 -1
- package/library/skills/research/experiment-protocol/plugin.json +23 -0
- package/{skills → library/skills}/research/scientific-debugging/SKILL.md +1 -1
- package/{skills → library/skills}/research/scientific-debugging/evals.md +1 -1
- package/library/skills/research/scientific-debugging/plugin.json +23 -0
- package/{skills → library/skills}/research/scientific-modernization/SKILL.md +1 -1
- package/{skills → library/skills}/research/scientific-modernization/evals.md +1 -1
- package/library/skills/research/scientific-modernization/plugin.json +23 -0
- package/{skills → library/skills}/skill-marketplace.json +37 -37
- package/{skills → library/skills}/workflow/cut-it/SKILL.md +1 -1
- package/{skills → library/skills}/workflow/cut-it/evals.md +1 -1
- package/library/skills/workflow/cut-it/plugin.json +23 -0
- package/{skills → library/skills}/workflow/design-council/SKILL.md +1 -1
- package/{skills → library/skills}/workflow/design-council/evals.md +1 -1
- package/library/skills/workflow/design-council/plugin.json +23 -0
- package/{skills → library/skills}/workflow/grill-me/SKILL.md +1 -1
- package/{skills → library/skills}/workflow/grill-me/evals.md +1 -1
- package/library/skills/workflow/grill-me/plugin.json +23 -0
- package/{skills → library/skills}/workflow/workflow-distiller/SKILL.md +14 -11
- package/{skills → library/skills}/workflow/workflow-distiller/evals.md +14 -6
- package/library/skills/workflow/workflow-distiller/plugin.json +23 -0
- package/package.json +12 -5
- package/src/cli/agents.ts +1 -1
- package/src/cli/config-inspect.ts +1 -1
- package/src/cli/configure.ts +2 -2
- package/src/cli/eval.ts +40 -6
- package/src/cli/extensions.ts +74 -8
- package/src/cli/fleet-preflight.ts +2 -0
- package/src/cli/fleet.ts +2 -0
- package/src/cli/index.ts +1 -3
- package/src/cli/interop-inspect.ts +61 -33
- package/src/cli/interop.ts +79 -9
- package/src/cli/library-import.ts +139 -0
- package/src/cli/library.ts +418 -120
- package/src/cli/run.ts +26 -9
- package/src/cli/skills-eval.ts +43 -6
- package/src/cli/skills-inventory.ts +6 -2
- package/src/cli/skills.ts +44 -491
- package/src/core/bus-events.ts +5 -0
- package/src/core/defaults.ts +1 -1
- package/src/core/recent-models.ts +2 -2
- package/src/core/session-routing.ts +3 -3
- package/src/core/state-file-lock.ts +1 -1
- package/src/core/tool-names.ts +5 -0
- package/src/domains/agents/extension.ts +42 -6
- package/src/domains/agents/fleet-commands.ts +92 -1
- package/src/domains/agents/fleet-contract.ts +87 -19
- package/src/domains/agents/recipe.ts +5 -4
- package/src/domains/agents/registry.ts +80 -24
- package/src/domains/config/keybindings.ts +155 -95
- package/src/domains/context/worker/contract.ts +91 -0
- package/src/domains/context/worker/pressure.ts +120 -0
- package/src/domains/context/worker/recall.ts +62 -0
- package/src/domains/context/worker/select.ts +164 -0
- package/src/domains/context/worker/snapshot.ts +35 -0
- package/src/domains/context/worker/store.ts +16 -0
- package/src/domains/context/working-set/replay/synthetic.ts +2 -1
- package/src/domains/dispatch/active-route-planner.ts +2 -0
- package/src/domains/dispatch/backoff.ts +1 -0
- package/src/domains/dispatch/code-step.ts +12 -2
- package/src/domains/dispatch/contract.ts +3 -0
- package/src/domains/dispatch/execution-plan.ts +2 -0
- package/src/domains/dispatch/extension.ts +109 -27
- package/src/domains/dispatch/fleet-plan.ts +10 -0
- package/src/domains/dispatch/fleet-run.ts +1 -0
- package/src/domains/dispatch/orphan-recovery.ts +1 -0
- package/src/domains/dispatch/receipt-integrity.ts +4 -0
- package/src/domains/dispatch/state.ts +1 -0
- package/src/domains/dispatch/types.ts +5 -0
- package/src/domains/dispatch/validation.ts +12 -0
- package/src/domains/dispatch/workspace-checkpoint.ts +1 -1
- package/src/domains/evidence/failure-attribution.ts +1 -0
- package/src/domains/evidence/trust-status.ts +22 -3
- package/src/domains/extensions/command-schema.ts +145 -0
- package/src/domains/extensions/command-tools.ts +15 -0
- package/src/domains/extensions/compatibility.ts +7 -0
- package/src/domains/extensions/contract.ts +0 -4
- package/src/domains/extensions/discovery.ts +69 -205
- package/src/domains/extensions/extension.ts +0 -4
- package/src/domains/extensions/index.ts +1 -5
- package/src/domains/extensions/manager.ts +1 -6
- package/src/domains/extensions/operator-commands.ts +29 -0
- package/src/domains/extensions/operator-runtime.ts +483 -0
- package/src/domains/extensions/public-api.ts +53 -0
- package/src/domains/extensions/runtime-child.mjs +114 -0
- package/src/domains/extensions/runtime-process.ts +306 -0
- package/src/domains/extensions/runtime-schema.ts +146 -0
- package/src/domains/extensions/{resources.ts → snapshot-access.ts} +1 -17
- package/src/domains/extensions/snapshot.ts +4 -32
- package/src/domains/extensions/state.ts +5 -83
- package/src/domains/extensions/types.ts +33 -34
- package/src/domains/interop/adopt.ts +546 -0
- package/src/domains/interop/detect.ts +50 -12
- package/src/domains/interop/foreign.ts +554 -0
- package/src/domains/interop/import.ts +277 -0
- package/src/domains/interop/index.ts +24 -0
- package/src/domains/interop/install.ts +6 -0
- package/src/domains/interop/inventory.ts +351 -0
- package/src/domains/interop/projection.ts +360 -0
- package/src/domains/interop/registry.ts +106 -3
- package/src/domains/interop/types.ts +51 -0
- package/src/domains/lifecycle/migrations/index.ts +0 -2
- package/src/domains/lifecycle/naming-resources.ts +1 -1
- package/src/domains/middleware/marketplace-offer.ts +1 -1
- package/src/domains/mux/contract.ts +1 -1
- package/src/domains/plugins/catalog.ts +204 -0
- package/src/domains/plugins/contract.ts +24 -0
- package/src/domains/plugins/discovery.ts +316 -0
- package/src/domains/plugins/extension.ts +40 -0
- package/src/domains/plugins/index.ts +77 -0
- package/src/domains/plugins/integrity.ts +6 -0
- package/src/domains/plugins/manifest.ts +3 -0
- package/src/domains/plugins/resources.ts +102 -0
- package/src/domains/plugins/state.ts +753 -0
- package/src/domains/plugins/types.ts +217 -0
- package/src/domains/prompts/extension.ts +9 -2
- package/src/domains/prompts/fragments/operating/skills.md +10 -10
- package/src/domains/resources/common-loader.ts +9 -6
- package/src/domains/resources/index.ts +67 -0
- package/src/domains/resources/library-actions.ts +836 -0
- package/src/domains/resources/library-evals.ts +38 -0
- package/src/domains/resources/library-inventory.ts +1048 -0
- package/src/domains/resources/library-types.ts +50 -0
- package/src/domains/resources/library-validation.ts +634 -0
- package/src/domains/resources/library.ts +437 -156
- package/src/domains/resources/package-references.ts +66 -0
- package/src/domains/resources/prompts/loader.ts +75 -41
- package/src/domains/resources/skills/install.ts +2 -2
- package/src/domains/resources/skills/loader.ts +77 -22
- package/src/domains/resources/skills/marketplace.ts +48 -57
- package/src/domains/resources/skills/promotion.ts +2 -2
- package/src/domains/resources/skills/provenance-pin.ts +17 -4
- package/src/domains/safety/action-classifier.ts +2 -2
- package/src/domains/safety/default-path-policy.ts +3 -1
- package/src/domains/safety/policy-engine.ts +1 -1
- package/src/domains/safety/protected-artifacts.ts +21 -5
- package/src/domains/safety/skill-authority.ts +5 -2
- package/src/domains/share/archive.ts +1 -1
- package/src/engine/apis/openai-completions.ts +52 -2
- package/src/engine/notices/pi-tui-LICENSE +21 -0
- package/src/engine/tui.ts +3 -0
- package/src/engine/worker-runtime.ts +58 -14
- package/src/engine/worker-tools.ts +5 -0
- package/src/entry/orchestrator.ts +26 -5
- package/src/entry/plugin-reload.ts +18 -0
- package/src/interactive/application-controller.ts +67 -21
- package/src/interactive/chat-loop.ts +32 -5
- package/src/interactive/chat-panel.ts +5 -1
- package/src/interactive/clio-editor.ts +53 -21
- package/src/interactive/command-output.ts +56 -1
- package/src/interactive/editor-submit.ts +65 -28
- package/src/interactive/fleet-run-preview.ts +2 -0
- package/src/interactive/follow-up-queue-panel.ts +3 -3
- package/src/interactive/footer/dashboard.ts +4 -1
- package/src/interactive/footer/notifications.ts +2 -2
- package/src/interactive/footer/widgets.ts +2 -2
- package/src/interactive/interactive-application.ts +209 -21
- package/src/interactive/interactive-input-runtime.ts +254 -7
- package/src/interactive/interactive-presentation.ts +41 -12
- package/src/interactive/interactive-slash-runtime.ts +37 -8
- package/src/interactive/keybinding-manager.ts +156 -79
- package/src/interactive/keyboard-owner.ts +37 -0
- package/src/interactive/leader-key.ts +49 -102
- package/src/interactive/leader-menu.ts +45 -0
- package/src/interactive/overlay-ask-user-lifecycle.ts +9 -1
- package/src/interactive/overlay-frame.ts +15 -0
- package/src/interactive/overlay-key-routing.ts +46 -47
- package/src/interactive/overlay-lifecycle.ts +30 -15
- package/src/interactive/overlay-resource-openers.ts +56 -46
- package/src/interactive/overlays/ask-user.ts +630 -556
- package/src/interactive/overlays/extension-panel.ts +70 -0
- package/src/interactive/overlays/extensions.ts +28 -5
- package/src/interactive/overlays/fleet-run-approval.ts +7 -3
- package/src/interactive/overlays/help-reference.ts +89 -40
- package/src/interactive/overlays/interop.ts +122 -3
- package/src/interactive/overlays/keybinding-detail.ts +2 -2
- package/src/interactive/overlays/library-lifecycle.ts +90 -0
- package/src/interactive/overlays/library-model.ts +574 -0
- package/src/interactive/overlays/library-review.ts +557 -0
- package/src/interactive/overlays/library-tabs.ts +3 -15
- package/src/interactive/overlays/library.ts +602 -0
- package/src/interactive/overlays/list-overlay.ts +218 -39
- package/src/interactive/overlays/model-selector.ts +28 -25
- package/src/interactive/overlays/session-selector.ts +9 -3
- package/src/interactive/overlays/settings.ts +25 -18
- package/src/interactive/overlays/tree-selector.ts +16 -11
- package/src/interactive/permission-hint.ts +13 -0
- package/src/interactive/permission-overlay.ts +77 -28
- package/src/interactive/prompt-source-label.ts +21 -0
- package/src/interactive/renderers/reference-card.ts +35 -0
- package/src/interactive/renderers/worker-entry.ts +35 -3
- package/src/interactive/slash-autocomplete.ts +99 -1
- package/src/interactive/slash-commands.ts +390 -67
- package/src/interactive/slash-spec.ts +0 -1
- package/src/interactive/terminal-lease.ts +44 -12
- package/src/interactive/turn-queues.ts +8 -7
- package/src/interactive/turn-runtime.ts +1 -1
- package/src/interactive/view/view-overlay.ts +19 -14
- package/src/interactive/welcome-dashboard.ts +525 -408
- package/src/tools/bootstrap.ts +8 -0
- package/src/tools/builtin-tool-catalog.ts +7 -2
- package/src/tools/context/index.ts +58 -5
- package/src/tools/context/library.ts +465 -0
- package/src/tools/context/surface.ts +20 -6
- package/src/tools/core-bootstrap.ts +3 -0
- package/src/tools/dispatch-admission.ts +24 -1
- package/src/tools/dispatch-arguments.ts +8 -0
- package/src/tools/dispatch-plan.ts +32 -0
- package/src/tools/dispatch-schema.ts +31 -1
- package/src/tools/dispatch-types.ts +3 -0
- package/src/tools/dispatch.ts +1 -1
- package/src/tools/harness-extensions.ts +169 -0
- package/src/tools/observation.ts +4 -0
- package/src/tools/policy.ts +7 -1
- package/src/tools/registry.ts +19 -1
- package/src/tools/worker-evidence.ts +5 -0
- package/src/worker/context-seed.ts +192 -0
- package/src/worker/entry.ts +1 -0
- package/src/worker/spec-contract.ts +8 -1
- package/dist/chunk-3UW3KU4A.js +0 -21
- package/dist/chunk-536HXRFE.js +0 -1257
- package/dist/chunk-B3MOMLJ4.js +0 -433
- package/dist/chunk-CXQ37WJH.js +0 -45
- package/dist/chunk-KTFSFCVN.js +0 -46
- package/dist/chunk-QCOV5DFY.js +0 -911
- package/dist/chunk-QRFXEO6Y.js +0 -17
- package/dist/chunk-VAHLPXPY.js +0 -399
- package/dist/interop-RVCAYECG.js +0 -115
- package/dist/library-CTKZA7K3.js +0 -226
- package/dist/skills-OXFEAWMT.js +0 -510
- package/skills/README.md +0 -418
- package/skills/meta/find-skills/SKILL.md +0 -78
- package/skills/meta/find-skills/evals.md +0 -47
- package/src/domains/extensions/resource-path.ts +0 -27
- package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +0 -27
- package/src/interactive/overlays/agents.ts +0 -70
- package/src/interactive/overlays/library-install-confirm.ts +0 -152
- package/src/interactive/overlays/prompts.ts +0 -89
- package/src/interactive/overlays/skills-hub.ts +0 -615
- /package/{skills → library/skills}/coding/ast-grep/references/rule_reference.md +0 -0
- /package/{skills → library/skills}/coding/prototype/references/LOGIC.md +0 -0
- /package/{skills → library/skills}/coding/prototype/references/UI.md +0 -0
- /package/{skills → library/skills}/coding/tdd/references/mocking.md +0 -0
- /package/{skills → library/skills}/coding/tdd/references/tests.md +0 -0
- /package/{skills → library/skills}/context/context-handoff/scripts/new-handoff.sh +0 -0
- /package/{skills → library/skills}/git/branch-closeout/evals.md +0 -0
- /package/{skills → library/skills}/git/branch-closeout/references/closeout-checklist.md +0 -0
- /package/{skills → library/skills}/git/file-ticket/assets/issue-template.md +0 -0
- /package/{skills → library/skills}/git/file-ticket/evals.md +0 -0
- /package/{skills → library/skills}/git/file-ticket/references/issue-discovery.md +0 -0
- /package/{skills → library/skills}/git/fix-issue/evals.md +0 -0
- /package/{skills → library/skills}/git/fix-issue/references/diagnosis-and-rca.md +0 -0
- /package/{skills → library/skills}/git/resolve-merge-conflicts/references/conflict-matrix.md +0 -0
- /package/{skills → library/skills}/git/ship/assets/pr-template.md +0 -0
- /package/{skills → library/skills}/git/ship/evals.md +0 -0
- /package/{skills → library/skills}/git/ship/references/remote-and-branch-policy.md +0 -0
- /package/{skills → library/skills}/git/worktree-create/evals.md +0 -0
- /package/{skills → library/skills}/git/worktree-create/references/worktree-setup.md +0 -0
- /package/{skills → library/skills}/git/worktree-merge/evals.md +0 -0
- /package/{skills → library/skills}/git/worktree-merge/references/merge-strategies.md +0 -0
- /package/{skills → library/skills}/meta/clio-coder-test/references/harness.md +0 -0
- /package/{skills → library/skills}/meta/clio-coder-test/references/test-map.md +0 -0
- /package/{skills → library/skills}/planning/archify/evals.md +0 -0
package/src/tools/bootstrap.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import { BusChannels } from "../core/bus-events.js";
|
|
1
2
|
import type { WorkerRosters } from "../core/defaults.js";
|
|
2
3
|
import type { SafeEventBus } from "../core/event-bus.js";
|
|
3
4
|
import type { AgentSpec } from "../domains/agents/spec.js";
|
|
5
|
+
import type { WorkerContextSnapshot } from "../domains/context/worker/contract.js";
|
|
4
6
|
import type { DispatchContract } from "../domains/dispatch/contract.js";
|
|
5
7
|
import type { AgentRoleFactsResolver } from "../domains/dispatch/execution-role.js";
|
|
6
8
|
import type { PanesOperations } from "../domains/mux/operations.js";
|
|
@@ -12,6 +14,7 @@ import { assertRegisteredBuiltinTools, type CoreToolBootstrapDeps, registerCoreT
|
|
|
12
14
|
import { createDispatchRunEventRegistry, createDispatchTool } from "./dispatch.js";
|
|
13
15
|
import type { DispatchBackgroundRegistry } from "./dispatch-background.js";
|
|
14
16
|
import type { DispatchSchemaComposition } from "./dispatch-schema.js";
|
|
17
|
+
import { registerHarnessExtensionTools } from "./harness-extensions.js";
|
|
15
18
|
import { lazyTool } from "./lazy-tool.js";
|
|
16
19
|
import { monitorToolSurface } from "./monitor-surface.js";
|
|
17
20
|
import { panesToolSurface } from "./panes-surface.js";
|
|
@@ -21,6 +24,7 @@ import { steerToolSurface } from "./steer-surface.js";
|
|
|
21
24
|
export { toolPromptHintsForNames };
|
|
22
25
|
|
|
23
26
|
export interface ToolBootstrapDeps extends CoreToolBootstrapDeps {
|
|
27
|
+
captureWorkerContext?: () => WorkerContextSnapshot | null;
|
|
24
28
|
dispatch?: DispatchContract;
|
|
25
29
|
bus?: SafeEventBus;
|
|
26
30
|
getAgentCatalog?: () => string;
|
|
@@ -59,6 +63,7 @@ export function registerAllTools(registry: ToolRegistry, deps: ToolBootstrapDeps
|
|
|
59
63
|
const dispatchRunEvents = createDispatchRunEventRegistry({ journal: null });
|
|
60
64
|
const dispatchToolDeps = {
|
|
61
65
|
dispatch,
|
|
66
|
+
...(deps.captureWorkerContext ? { captureWorkerContext: deps.captureWorkerContext } : {}),
|
|
62
67
|
runEvents: dispatchRunEvents,
|
|
63
68
|
getAgentSpecs: deps.getAgentSpecs ?? (() => []),
|
|
64
69
|
...(deps.bus ? { bus: deps.bus } : {}),
|
|
@@ -109,4 +114,7 @@ export function registerAllTools(registry: ToolRegistry, deps: ToolBootstrapDeps
|
|
|
109
114
|
});
|
|
110
115
|
}
|
|
111
116
|
assertRegisteredBuiltinTools(registry, registration, Boolean(deps.dispatch), Boolean(deps.panes));
|
|
117
|
+
for (const diagnostic of registerHarnessExtensionTools(registry, deps.session?.current()?.cwd ?? process.cwd())) {
|
|
118
|
+
deps.bus?.emit(BusChannels.ExtensionsLoadIssue, { message: diagnostic.message });
|
|
119
|
+
}
|
|
112
120
|
}
|
|
@@ -100,11 +100,16 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
|
|
|
100
100
|
"Use code_nav with source=workspace (default) for project code and source=clio for Clio's shipped code map; modes: symbol, path, entries, outline, deps, dependents, wiki (workspace only).",
|
|
101
101
|
},
|
|
102
102
|
[ToolNames.Context]: {
|
|
103
|
-
objective: "Return workspace, bundled-docs, or
|
|
103
|
+
objective: "Return workspace, bundled-docs, skill, or library-catalog context.",
|
|
104
104
|
uiLabel: "Context",
|
|
105
105
|
retrySafety: "idempotent",
|
|
106
106
|
resultSizePolicy: observePolicy(
|
|
107
|
-
Math.max(
|
|
107
|
+
Math.max(
|
|
108
|
+
OBSERVE_SELF_CAPS.contextDocs,
|
|
109
|
+
OBSERVE_SELF_CAPS.contextSkills,
|
|
110
|
+
OBSERVE_SELF_CAPS.contextWorkspace,
|
|
111
|
+
OBSERVE_SELF_CAPS.contextLibrary,
|
|
112
|
+
),
|
|
108
113
|
"Use a narrower query or scope to inspect omitted content.",
|
|
109
114
|
),
|
|
110
115
|
costLatency: "local_fast",
|
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
SKILL_SUGGESTION_ANCHOR,
|
|
10
10
|
} from "../../core/skill-activation.js";
|
|
11
11
|
import { ToolNames } from "../../core/tool-names.js";
|
|
12
|
+
import type { WorkerRecall } from "../../domains/context/worker/recall.js";
|
|
12
13
|
import { foldWorkingSet } from "../../domains/context/working-set/fold.js";
|
|
13
14
|
import {
|
|
14
15
|
buildRecallFields,
|
|
@@ -47,7 +48,8 @@ import { contextToolSurface } from "./surface.js";
|
|
|
47
48
|
* workspace snapshot, scope=docs retrieves cited sections from Clio's bundled
|
|
48
49
|
* documentation, scope=skills lists available skills or loads a requested
|
|
49
50
|
* skill body (the skill-activation and pending-request contracts are
|
|
50
|
-
* unchanged from the absorbed read_skill tool), scope=
|
|
51
|
+
* unchanged from the absorbed read_skill tool), scope=library reads the bounded
|
|
52
|
+
* body-free recipe catalog (see ./library.ts), scope=recall readmits an
|
|
51
53
|
* evicted tool-result body by ref and records the `contextRecall` entry.
|
|
52
54
|
*/
|
|
53
55
|
|
|
@@ -72,6 +74,8 @@ export interface ContextSessionDeps {
|
|
|
72
74
|
}
|
|
73
75
|
|
|
74
76
|
export interface ContextToolDeps {
|
|
77
|
+
/** Run-scoped evidence port; never reads or appends the parent session. */
|
|
78
|
+
workerRecall?: WorkerRecall;
|
|
75
79
|
getCwd?: () => string;
|
|
76
80
|
getSkillLoaderOptions?: () => Pick<
|
|
77
81
|
LoadSkillsInput,
|
|
@@ -479,6 +483,15 @@ function runSkillsScope(
|
|
|
479
483
|
visible.find((item) => item.name === name) ??
|
|
480
484
|
list.items.find((item) => item.name === name && operatorRequestedManualSkill(item, pendingRequest));
|
|
481
485
|
if (!skill) {
|
|
486
|
+
const unavailable = list.items.find((item) => item.name === name);
|
|
487
|
+
if (unavailable) {
|
|
488
|
+
return {
|
|
489
|
+
kind: "error",
|
|
490
|
+
message: unavailable.trusted
|
|
491
|
+
? `context: skill "${name}" requires explicit operator activation with /skill ${name}; it disables model invocation. Do not retry this load.`
|
|
492
|
+
: `context: skill "${name}" was discovered in an untrusted ${unavailable.source}/${unavailable.scope} source and cannot be activated. Open /library to inspect its source and trust or install a reviewed native package. Do not retry this load.`,
|
|
493
|
+
};
|
|
494
|
+
}
|
|
482
495
|
// A marketplace entry is a skill that exists and is not installed. Saying
|
|
483
496
|
// "unknown skill" about it denies the operator a thing the listing just
|
|
484
497
|
// offered; name the state and the one move that changes it.
|
|
@@ -575,6 +588,26 @@ function runRecallScope(
|
|
|
575
588
|
reservation: ObservationReservation,
|
|
576
589
|
options: ToolInvokeOptions | undefined,
|
|
577
590
|
): ToolResult {
|
|
591
|
+
if (deps.workerRecall) {
|
|
592
|
+
const result = deps.workerRecall(args);
|
|
593
|
+
if ("error" in result) return { kind: "error", message: `context: ${result.error}` };
|
|
594
|
+
const truncated = truncateHead(result.body, {
|
|
595
|
+
maxBytes: reservation.callCapBytes,
|
|
596
|
+
maxLines: Number.MAX_SAFE_INTEGER,
|
|
597
|
+
});
|
|
598
|
+
return finalizeObservation({
|
|
599
|
+
tool: ToolNames.Context,
|
|
600
|
+
unit: "results",
|
|
601
|
+
output: truncated.content,
|
|
602
|
+
...(truncated.truncated ? { fullOutput: result.body } : {}),
|
|
603
|
+
shownCount: result.shown,
|
|
604
|
+
totalCount: result.total,
|
|
605
|
+
truncated: truncated.truncated || result.nextOffset !== undefined,
|
|
606
|
+
details: { workerRecall: { ref: args.ref ?? null, nextOffset: result.nextOffset ?? null } },
|
|
607
|
+
reservation,
|
|
608
|
+
...(options ? { options } : {}),
|
|
609
|
+
});
|
|
610
|
+
}
|
|
578
611
|
const session = deps.session;
|
|
579
612
|
if (!session?.hasSession()) {
|
|
580
613
|
return { kind: "error", message: "context: recall scope requires a bound session; none is active here" };
|
|
@@ -665,20 +698,27 @@ export function createContextTool(deps: ContextToolDeps = {}): ToolSpec {
|
|
|
665
698
|
...contextToolSurface,
|
|
666
699
|
async run(args, options): Promise<ToolResult> {
|
|
667
700
|
const scope = typeof args.scope === "string" ? args.scope : "";
|
|
668
|
-
if (scope !== "workspace" && scope !== "docs" && scope !== "skills" && scope !== "recall") {
|
|
669
|
-
return {
|
|
701
|
+
if (scope !== "workspace" && scope !== "docs" && scope !== "skills" && scope !== "library" && scope !== "recall") {
|
|
702
|
+
return {
|
|
703
|
+
kind: "error",
|
|
704
|
+
message: `context: scope must be workspace, docs, skills, library, or recall; got '${scope}'`,
|
|
705
|
+
};
|
|
670
706
|
}
|
|
671
707
|
const selfCap =
|
|
672
708
|
scope === "docs"
|
|
673
709
|
? OBSERVE_SELF_CAPS.contextDocs
|
|
674
710
|
: scope === "skills"
|
|
675
711
|
? OBSERVE_SELF_CAPS.contextSkills
|
|
676
|
-
:
|
|
712
|
+
: scope === "library"
|
|
713
|
+
? OBSERVE_SELF_CAPS.contextLibrary
|
|
714
|
+
: OBSERVE_SELF_CAPS.contextWorkspace;
|
|
715
|
+
// Reserved before any scope handler runs, so an exhausted pool answers
|
|
716
|
+
// with the notice and the library inventory is never walked at all.
|
|
677
717
|
const reservation = reserveObservation(selfCap, options);
|
|
678
718
|
if (reservation.exhausted) {
|
|
679
719
|
return observationBudgetExhausted({
|
|
680
720
|
tool: ToolNames.Context,
|
|
681
|
-
unit: scope === "docs" ? "sections" : scope === "skills" ? "entries" : "results",
|
|
721
|
+
unit: scope === "docs" ? "sections" : scope === "skills" || scope === "library" ? "entries" : "results",
|
|
682
722
|
reservation,
|
|
683
723
|
subject: `scope=${scope}`,
|
|
684
724
|
hint: "Continue in a follow-up turn.",
|
|
@@ -687,6 +727,19 @@ export function createContextTool(deps: ContextToolDeps = {}): ToolSpec {
|
|
|
687
727
|
if (scope === "workspace") return runWorkspaceScope(deps, reservation, options);
|
|
688
728
|
if (scope === "docs") return runDocsScope(args, reservation, options);
|
|
689
729
|
if (scope === "recall") return runRecallScope(deps, args, reservation, options);
|
|
730
|
+
if (scope === "library") {
|
|
731
|
+
const { runLibraryScope } = await import("./library.js");
|
|
732
|
+
return runLibraryScope(
|
|
733
|
+
{
|
|
734
|
+
getCwd: () => cwdFromDeps(deps),
|
|
735
|
+
...(deps.skillMarketplace !== undefined ? { skillMarketplace: deps.skillMarketplace } : {}),
|
|
736
|
+
...(deps.getSkillLoaderOptions ? { skillLoaderOptions: deps.getSkillLoaderOptions() } : {}),
|
|
737
|
+
},
|
|
738
|
+
args,
|
|
739
|
+
reservation,
|
|
740
|
+
options,
|
|
741
|
+
);
|
|
742
|
+
}
|
|
690
743
|
return runSkillsScope(deps, args, reservation, options);
|
|
691
744
|
},
|
|
692
745
|
};
|
|
@@ -0,0 +1,465 @@
|
|
|
1
|
+
import { ToolNames } from "../../core/tool-names.js";
|
|
2
|
+
import type {
|
|
3
|
+
LibraryInventory,
|
|
4
|
+
LibraryInventoryOptions,
|
|
5
|
+
LibraryOrigin,
|
|
6
|
+
LibraryPackageRecord,
|
|
7
|
+
LibraryResource,
|
|
8
|
+
} from "../../domains/resources/library-inventory.js";
|
|
9
|
+
import { finalizeObservation, type ObservationReservation } from "../observation.js";
|
|
10
|
+
import type { ToolInvokeOptions, ToolResult } from "../registry.js";
|
|
11
|
+
import { byteLength } from "../truncate-utf8.js";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* scope=library: one bounded, body-free READ over the shared recipe inventory.
|
|
15
|
+
*
|
|
16
|
+
* It answers what recipes exist, who owns them, how they are actually invoked,
|
|
17
|
+
* and what an uninstalled package would provide. It activates, registers,
|
|
18
|
+
* installs and pins nothing, and it never returns an instruction body. Skill
|
|
19
|
+
* activation stays entirely under scope=skills.
|
|
20
|
+
*
|
|
21
|
+
* Three row types, never conflated. A `resource` is a recipe that loaded and is
|
|
22
|
+
* usable now. A `hint` is a catalog claim about a member of a package: it names
|
|
23
|
+
* its installable owner and that member's honest status, and it never carries
|
|
24
|
+
* an invocation, because nothing has loaded it. A `package` is the install
|
|
25
|
+
* target itself.
|
|
26
|
+
*
|
|
27
|
+
* The inventory module is reached by dynamic import so scope=workspace,
|
|
28
|
+
* scope=docs and scope=skills never pay for agent, prompt and fleet discovery.
|
|
29
|
+
* Only the types cross statically, and those are erased.
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
const DEFAULT_LIMIT = 20;
|
|
33
|
+
const MAX_LIMIT = 50;
|
|
34
|
+
/** Hint names listed on one package row before it reports a remainder instead. */
|
|
35
|
+
const MAX_PROVIDES = 12;
|
|
36
|
+
const MAX_DESCRIPTION = 160;
|
|
37
|
+
const MAX_REASON = 200;
|
|
38
|
+
const MAX_DIAGNOSTICS = 3;
|
|
39
|
+
const MAX_DIAGNOSTIC = 160;
|
|
40
|
+
const MAX_ORIGIN_VALUE = 240;
|
|
41
|
+
const MAX_REQUIRES = 8;
|
|
42
|
+
const MAX_INVOCATION = 200;
|
|
43
|
+
/** How much of an echoed argument comes back in the payload header. */
|
|
44
|
+
const MAX_ECHO = 120;
|
|
45
|
+
|
|
46
|
+
export type LibraryRowKind = "skill" | "agent" | "prompt" | "fleet" | "plugin";
|
|
47
|
+
|
|
48
|
+
export interface LibraryScopeDeps {
|
|
49
|
+
getCwd(): string;
|
|
50
|
+
/**
|
|
51
|
+
* False on every native worker registry. A worker has skill discovery
|
|
52
|
+
* disabled and no admitted library projection of its own, so this read
|
|
53
|
+
* refuses there rather than handing it the global library through a new
|
|
54
|
+
* endpoint. Read-only is not an argument for exposure.
|
|
55
|
+
*/
|
|
56
|
+
skillMarketplace?: boolean;
|
|
57
|
+
/** The run's skill-loader posture; `--no-skills` and compat-root trust both apply here. */
|
|
58
|
+
skillLoaderOptions?: { trustProjectCompatRoots?: boolean; disableDiscovery?: boolean };
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const WORKER_UNAVAILABLE =
|
|
62
|
+
'context: scope="library" is unavailable in this run; a worker has no library projection of its own and cannot install or activate anything. ' +
|
|
63
|
+
"Work from the resources your assignment already bound, and record the gap with the limitation tool if it blocks the task.";
|
|
64
|
+
|
|
65
|
+
const OPERATOR_NOTE =
|
|
66
|
+
"Read-only catalog: you cannot install or activate from here. Suggest /library to the operator for packages and /skill <name> for a skill. A hint row is a catalog claim, not a loaded recipe, and cannot be invoked.";
|
|
67
|
+
const NOTE_SKILLS_OFF = "Skill discovery is off for this run, so no skill rows are listed.";
|
|
68
|
+
const NOTE_INVENTORY_CAPPED =
|
|
69
|
+
"The inventory returned as many records as it carries, so this listing and its install evidence are incomplete; narrow with kind or query.";
|
|
70
|
+
const NOTE_AMBIGUOUS_REF = "This ref matched several records; select one by the key on its row.";
|
|
71
|
+
const NOTE_NO_MATCH = "Nothing matched; drop ref or query to list the catalog.";
|
|
72
|
+
const NOTE_NO_BUDGET = "The remaining observation budget cannot carry a row this turn; continue in a follow-up turn.";
|
|
73
|
+
/** Every clause at once, for measuring the envelope a page must fit inside. */
|
|
74
|
+
const ALL_NOTE_CLAUSES = [
|
|
75
|
+
OPERATOR_NOTE,
|
|
76
|
+
NOTE_SKILLS_OFF,
|
|
77
|
+
NOTE_INVENTORY_CAPPED,
|
|
78
|
+
NOTE_AMBIGUOUS_REF,
|
|
79
|
+
NOTE_NO_MATCH,
|
|
80
|
+
NOTE_NO_BUDGET,
|
|
81
|
+
].join(" ");
|
|
82
|
+
|
|
83
|
+
function clampLimit(value: unknown): number {
|
|
84
|
+
if (typeof value !== "number" || !Number.isFinite(value)) return DEFAULT_LIMIT;
|
|
85
|
+
return Math.max(1, Math.min(MAX_LIMIT, Math.floor(value)));
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function clampOffset(value: unknown): number {
|
|
89
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) return 0;
|
|
90
|
+
return Math.floor(value);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function bound(value: string, max: number): string {
|
|
94
|
+
return value.length <= max ? value : `${value.slice(0, max - 1)}…`;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function boundDiagnostics(diagnostics: ReadonlyArray<string>): string[] {
|
|
98
|
+
return diagnostics.slice(0, MAX_DIAGNOSTICS).map((entry) => bound(entry, MAX_DIAGNOSTIC));
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Origin is mandatory evidence, so it is passed through rather than summarized:
|
|
103
|
+
* source class, URL, catalog, original agent, original path and marketplace all
|
|
104
|
+
* stay distinct fields. Only the individual string values are bounded, because
|
|
105
|
+
* a pathological path must not be able to spend the whole page budget.
|
|
106
|
+
*/
|
|
107
|
+
function boundOrigin(origin: LibraryOrigin): Record<string, unknown> {
|
|
108
|
+
const out: Record<string, unknown> = {};
|
|
109
|
+
for (const [key, value] of Object.entries(origin)) {
|
|
110
|
+
out[key] = typeof value === "string" ? bound(value, MAX_ORIGIN_VALUE) : value;
|
|
111
|
+
}
|
|
112
|
+
return out;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Resource rows keep the origin evidence and the actual runtime name, and drop
|
|
117
|
+
* the absolute path: the model's move on a recipe is to invoke it or suggest
|
|
118
|
+
* it, never to open its file, and a body-free projection should not hand out
|
|
119
|
+
* the one field that routes around itself.
|
|
120
|
+
*
|
|
121
|
+
* `audience: "model"` already drops untrusted, invalid, shadowed, unavailable
|
|
122
|
+
* and manual-only rows, so availability, reason and diagnostics are emitted
|
|
123
|
+
* only if one ever survives that filter. They cost nothing when it does not,
|
|
124
|
+
* and a silently mislabelled row is worse than a redundant field.
|
|
125
|
+
*/
|
|
126
|
+
function projectResource(resource: LibraryResource, ambiguous: boolean): Record<string, unknown> {
|
|
127
|
+
return {
|
|
128
|
+
row: "resource",
|
|
129
|
+
kind: resource.kind,
|
|
130
|
+
name: resource.name,
|
|
131
|
+
// The stable inventory key is what disambiguates two same-named
|
|
132
|
+
// resources from different owners; it is spent only when there are two.
|
|
133
|
+
...(ambiguous ? { key: resource.key } : {}),
|
|
134
|
+
description: bound(resource.description, MAX_DESCRIPTION),
|
|
135
|
+
owner: resource.owner ? resource.owner.ref : resource.source.class,
|
|
136
|
+
scope: resource.source.scope,
|
|
137
|
+
origin: boundOrigin(resource.origin),
|
|
138
|
+
...(resource.format !== undefined ? { format: resource.format } : {}),
|
|
139
|
+
...(resource.availability !== "available" ? { availability: resource.availability } : {}),
|
|
140
|
+
...(resource.reason !== undefined ? { reason: bound(resource.reason, MAX_REASON) } : {}),
|
|
141
|
+
...(resource.invocation !== undefined ? { invocation: bound(resource.invocation, MAX_INVOCATION) } : {}),
|
|
142
|
+
...(resource.diagnostics.length > 0 ? { diagnostics: boundDiagnostics(resource.diagnostics) } : {}),
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* The identity of a record whose full projection does not fit the remaining
|
|
148
|
+
* budget. A page that could carry nothing would otherwise be replaced whole by
|
|
149
|
+
* the envelope's JSON stub, which tells the caller less than the name of the
|
|
150
|
+
* thing it could not show.
|
|
151
|
+
*/
|
|
152
|
+
function identityOnly(row: Record<string, unknown>): Record<string, unknown> {
|
|
153
|
+
return {
|
|
154
|
+
row: row.row,
|
|
155
|
+
kind: row.kind,
|
|
156
|
+
name: row.name,
|
|
157
|
+
...(row.key !== undefined ? { key: row.key } : {}),
|
|
158
|
+
...(row.ref !== undefined ? { ref: row.ref } : {}),
|
|
159
|
+
...(row.owner !== undefined ? { owner: row.owner } : {}),
|
|
160
|
+
truncatedRecord: true,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* A hint row is a catalog claim about one member of a package. It never has an
|
|
166
|
+
* invocation: nothing loaded it, and a hint that looked invocable would be an
|
|
167
|
+
* invitation to call something that does not exist.
|
|
168
|
+
*
|
|
169
|
+
* `member` is the honest state of that member here. When the owning package is
|
|
170
|
+
* not installed, the member is not installed either. When the package *is*
|
|
171
|
+
* installed and the member did not turn up as an actual resource, this read
|
|
172
|
+
* cannot tell whether it is absent, untrusted, or filtered from the model's
|
|
173
|
+
* view, so it says `unknown` and reports the owner's real copy states rather
|
|
174
|
+
* than claiming the member is merely uninstalled.
|
|
175
|
+
*
|
|
176
|
+
* `copiesCapped` collapses that first case into the second. When the inventory
|
|
177
|
+
* truncated its copy list, an empty `owner.copies` is no longer evidence that
|
|
178
|
+
* nothing is installed, only that this read did not see it, and calling that
|
|
179
|
+
* `not-installed` would invent a fact.
|
|
180
|
+
*/
|
|
181
|
+
function projectHint(
|
|
182
|
+
kind: string,
|
|
183
|
+
name: string,
|
|
184
|
+
description: string | undefined,
|
|
185
|
+
owner: LibraryPackageRecord,
|
|
186
|
+
copiesCapped: boolean,
|
|
187
|
+
): Record<string, unknown> {
|
|
188
|
+
const installed = owner.copies.map((copy) => ({ scope: copy.scope, state: copy.state }));
|
|
189
|
+
return {
|
|
190
|
+
row: "hint",
|
|
191
|
+
kind,
|
|
192
|
+
name,
|
|
193
|
+
...(description !== undefined ? { description: bound(description, MAX_DESCRIPTION) } : {}),
|
|
194
|
+
owner: owner.ref,
|
|
195
|
+
ownerInstalled: installed,
|
|
196
|
+
member: installed.length === 0 && !copiesCapped ? "not-installed" : "unknown",
|
|
197
|
+
origin: boundOrigin(owner.origin),
|
|
198
|
+
...(owner.format !== undefined ? { format: owner.format } : {}),
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Package rows are install targets. `provides` is a bounded hint list generated
|
|
204
|
+
* from validated payloads: it names what the package would contribute, never
|
|
205
|
+
* proves the package is usable, and never triggers a fetch. A row with no hints
|
|
206
|
+
* says so honestly instead of claiming empty contents.
|
|
207
|
+
*/
|
|
208
|
+
function projectPackage(record: LibraryPackageRecord, copiesCapped: boolean): Record<string, unknown> {
|
|
209
|
+
const provides = record.provides ?? [];
|
|
210
|
+
const shownProvides = provides.slice(0, MAX_PROVIDES);
|
|
211
|
+
const installed = record.copies.map((copy) => ({ scope: copy.scope, state: copy.state }));
|
|
212
|
+
return {
|
|
213
|
+
row: "package",
|
|
214
|
+
kind: record.kind,
|
|
215
|
+
name: record.name,
|
|
216
|
+
ref: record.ref,
|
|
217
|
+
description: bound(record.description, MAX_DESCRIPTION),
|
|
218
|
+
...(record.version !== undefined ? { version: record.version } : {}),
|
|
219
|
+
origin: boundOrigin(record.origin),
|
|
220
|
+
...(record.format !== undefined ? { format: record.format } : {}),
|
|
221
|
+
installed,
|
|
222
|
+
// An empty list under a capped copy read is silence, not absence.
|
|
223
|
+
...(installed.length === 0 && copiesCapped ? { installedUnknown: true } : {}),
|
|
224
|
+
...(record.provides === undefined
|
|
225
|
+
? { provides: "unknown until inspection" }
|
|
226
|
+
: {
|
|
227
|
+
provides: shownProvides.map((hint) => `${hint.kind}:${hint.name}`),
|
|
228
|
+
...(provides.length > shownProvides.length ? { providesOmitted: provides.length - shownProvides.length } : {}),
|
|
229
|
+
}),
|
|
230
|
+
...(record.requires !== undefined
|
|
231
|
+
? {
|
|
232
|
+
requires: record.requires.slice(0, MAX_REQUIRES),
|
|
233
|
+
...(record.requires.length > MAX_REQUIRES ? { requiresOmitted: record.requires.length - MAX_REQUIRES } : {}),
|
|
234
|
+
}
|
|
235
|
+
: {}),
|
|
236
|
+
...(record.refusal !== undefined ? { refusal: bound(record.refusal, MAX_REASON) } : {}),
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* `limit` is an upper bound on rows; the byte cap is the real one. A page that
|
|
242
|
+
* overruns the reservation is replaced wholesale by the envelope's JSON stub,
|
|
243
|
+
* which costs the caller a round trip and returns nothing readable, so the page
|
|
244
|
+
* is cut here instead and the remainder is offered as the next offset. The
|
|
245
|
+
* budget is the reservation's, so a partly spent turn pool narrows the page
|
|
246
|
+
* rather than voiding it.
|
|
247
|
+
*
|
|
248
|
+
* `envelopeBytes` is measured, not assumed: the header echoes, the note and the
|
|
249
|
+
* inventory diagnostics all vary, and a fixed reserve that four diagnostics can
|
|
250
|
+
* exceed is how a bounded page turns back into a stub.
|
|
251
|
+
*/
|
|
252
|
+
function fitPage(
|
|
253
|
+
candidate: ReadonlyArray<Record<string, unknown>>,
|
|
254
|
+
capBytes: number,
|
|
255
|
+
envelopeBytes: number,
|
|
256
|
+
): Record<string, unknown>[] {
|
|
257
|
+
const budget = capBytes - envelopeBytes;
|
|
258
|
+
let used = 0;
|
|
259
|
+
const page: Record<string, unknown>[] = [];
|
|
260
|
+
for (const row of candidate) {
|
|
261
|
+
const cost = byteLength(JSON.stringify(row)) + 1;
|
|
262
|
+
if (used + cost <= budget) {
|
|
263
|
+
used += cost;
|
|
264
|
+
page.push(row);
|
|
265
|
+
continue;
|
|
266
|
+
}
|
|
267
|
+
// Nothing has fitted yet and this record is too large on its own: return
|
|
268
|
+
// its identity so the caller learns what is there and can ask for it by
|
|
269
|
+
// ref, instead of getting a stub that names nothing.
|
|
270
|
+
if (page.length === 0) {
|
|
271
|
+
const identity = identityOnly(row);
|
|
272
|
+
if (byteLength(JSON.stringify(identity)) + 1 <= budget) page.push(identity);
|
|
273
|
+
}
|
|
274
|
+
break;
|
|
275
|
+
}
|
|
276
|
+
return page;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/** Same kind and name from two different sources: the row must carry its key. */
|
|
280
|
+
function ambiguousNames(resources: ReadonlyArray<LibraryResource>): Set<string> {
|
|
281
|
+
const seen = new Map<string, number>();
|
|
282
|
+
for (const resource of resources) {
|
|
283
|
+
const id = `${resource.kind}:${resource.name}`;
|
|
284
|
+
seen.set(id, (seen.get(id) ?? 0) + 1);
|
|
285
|
+
}
|
|
286
|
+
return new Set([...seen].filter(([, count]) => count > 1).map(([id]) => id));
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* Which hints a `ref` admits.
|
|
291
|
+
*
|
|
292
|
+
* An exact resource key identifies one loaded resource, so it admits no hints
|
|
293
|
+
* at all: a package's other members are not what was asked for. A package ref
|
|
294
|
+
* deliberately opens that package, so it admits every member of it. A bare
|
|
295
|
+
* runtime name admits only the hints of that name, wherever they are owned; it
|
|
296
|
+
* must not pull in an owner's unrelated siblings just because the owner matched.
|
|
297
|
+
*/
|
|
298
|
+
function hintSelection(
|
|
299
|
+
ref: string,
|
|
300
|
+
inventory: LibraryInventory,
|
|
301
|
+
): { mode: "all" } | { mode: "none" } | { mode: "owner"; ref: string } | { mode: "name"; name: string } {
|
|
302
|
+
if (ref.length === 0) return { mode: "all" };
|
|
303
|
+
if (ref.includes("@")) return { mode: "none" };
|
|
304
|
+
const owner = inventory.packages.find((record) => record.ref === ref);
|
|
305
|
+
if (owner) return { mode: "owner", ref: owner.ref };
|
|
306
|
+
const colon = ref.indexOf(":");
|
|
307
|
+
return { mode: "name", name: colon >= 0 ? ref.slice(colon + 1) : ref };
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
function hintRows(
|
|
311
|
+
inventory: LibraryInventory,
|
|
312
|
+
resources: ReadonlyArray<LibraryResource>,
|
|
313
|
+
kind: LibraryRowKind | undefined,
|
|
314
|
+
query: string,
|
|
315
|
+
ref: string,
|
|
316
|
+
copiesCapped: boolean,
|
|
317
|
+
): Record<string, unknown>[] {
|
|
318
|
+
if (kind === "plugin") return [];
|
|
319
|
+
const selection = hintSelection(ref, inventory);
|
|
320
|
+
if (selection.mode === "none") return [];
|
|
321
|
+
// A hint whose actual resource is already on the page is noise: the loaded
|
|
322
|
+
// row is strictly better evidence about the same member.
|
|
323
|
+
const actual = new Set(
|
|
324
|
+
resources
|
|
325
|
+
.filter((resource) => resource.owner)
|
|
326
|
+
.map((resource) => `${resource.owner?.ref}|${resource.kind}|${resource.name}`),
|
|
327
|
+
);
|
|
328
|
+
const needle = query.toLowerCase();
|
|
329
|
+
const rows: Record<string, unknown>[] = [];
|
|
330
|
+
for (const record of inventory.packages) {
|
|
331
|
+
if (selection.mode === "owner" && record.ref !== selection.ref) continue;
|
|
332
|
+
for (const hint of record.provides ?? []) {
|
|
333
|
+
if (kind !== undefined && hint.kind !== kind) continue;
|
|
334
|
+
if (selection.mode === "name" && hint.name !== selection.name) continue;
|
|
335
|
+
if (actual.has(`${record.ref}|${hint.kind}|${hint.name}`)) continue;
|
|
336
|
+
if (needle.length > 0 && !`${hint.kind}:${hint.name} ${hint.description ?? ""}`.toLowerCase().includes(needle))
|
|
337
|
+
continue;
|
|
338
|
+
rows.push(projectHint(hint.kind, hint.name, hint.description, record, copiesCapped));
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
return rows;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
export async function runLibraryScope(
|
|
345
|
+
deps: LibraryScopeDeps,
|
|
346
|
+
args: Record<string, unknown>,
|
|
347
|
+
reservation: ObservationReservation,
|
|
348
|
+
options: ToolInvokeOptions | undefined,
|
|
349
|
+
): Promise<ToolResult> {
|
|
350
|
+
if (deps.skillMarketplace === false) {
|
|
351
|
+
return { kind: "error", message: WORKER_UNAVAILABLE };
|
|
352
|
+
}
|
|
353
|
+
const kind = typeof args.kind === "string" ? (args.kind as LibraryRowKind) : undefined;
|
|
354
|
+
const query = typeof args.query === "string" ? args.query.trim() : "";
|
|
355
|
+
const ref = typeof args.ref === "string" ? args.ref.trim() : "";
|
|
356
|
+
const limit = clampLimit(args.limit);
|
|
357
|
+
const offset = clampOffset(args.offset);
|
|
358
|
+
// `--no-skills` is an explicit operator choice for this run. Listing skills
|
|
359
|
+
// as invocable afterwards would be a lie: nothing in this process can load
|
|
360
|
+
// one. Packages that provide skills stay visible; that is catalog metadata,
|
|
361
|
+
// not discovery.
|
|
362
|
+
const skillsDisabled = deps.skillLoaderOptions?.disableDiscovery === true;
|
|
363
|
+
// Packages are read at every kind: `kind=plugin` keeps its documented
|
|
364
|
+
// meaning (packages whose own kind is plugin) and a recipe kind still finds
|
|
365
|
+
// the installable owners that provide it.
|
|
366
|
+
const wantsResources = kind !== "plugin" && !(kind === "skill" && skillsDisabled);
|
|
367
|
+
|
|
368
|
+
let inventory: LibraryInventory;
|
|
369
|
+
try {
|
|
370
|
+
inventory = await loadInventory({
|
|
371
|
+
cwd: deps.getCwd(),
|
|
372
|
+
audience: "model",
|
|
373
|
+
include: { packages: true, copies: false, resources: wantsResources },
|
|
374
|
+
...(kind !== undefined ? { kinds: [kind] } : {}),
|
|
375
|
+
...(query.length > 0 ? { query } : {}),
|
|
376
|
+
...(ref.length > 0 ? { ref } : {}),
|
|
377
|
+
...(deps.skillLoaderOptions?.trustProjectCompatRoots !== undefined
|
|
378
|
+
? { trustProjectCompatRoots: deps.skillLoaderOptions.trustProjectCompatRoots }
|
|
379
|
+
: {}),
|
|
380
|
+
});
|
|
381
|
+
} catch (err) {
|
|
382
|
+
return {
|
|
383
|
+
kind: "error",
|
|
384
|
+
message: `context: library inventory unavailable: ${err instanceof Error ? err.message : String(err)}`,
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
const resources = wantsResources
|
|
389
|
+
? inventory.resources.filter((resource) => !(skillsDisabled && resource.kind === "skill"))
|
|
390
|
+
: [];
|
|
391
|
+
const ambiguous = ambiguousNames(resources);
|
|
392
|
+
// Usable now, then what a package claims it would add, then the install
|
|
393
|
+
// targets themselves. Each half arrives in the inventory's deterministic
|
|
394
|
+
// order, so the concatenation is a stable total order and paging it cannot
|
|
395
|
+
// repeat or skip a row between calls.
|
|
396
|
+
// Copies are reported as truncated even when this read did not ask for them,
|
|
397
|
+
// because they are the owner and install evidence behind package and hint
|
|
398
|
+
// rows: a capped copy list means those rows are incomplete too.
|
|
399
|
+
const copiesCapped = inventory.truncated.copies;
|
|
400
|
+
const rows: Record<string, unknown>[] = [
|
|
401
|
+
...resources.map((resource) => projectResource(resource, ambiguous.has(`${resource.kind}:${resource.name}`))),
|
|
402
|
+
...hintRows(inventory, resources, kind, query, ref, copiesCapped),
|
|
403
|
+
...inventory.packages.map((record) => projectPackage(record, copiesCapped)),
|
|
404
|
+
];
|
|
405
|
+
const total = rows.length;
|
|
406
|
+
// The inventory caps how many records it returns. When it did, `total` counts
|
|
407
|
+
// what came back rather than what exists, and the payload says so instead of
|
|
408
|
+
// implying the collection ends here.
|
|
409
|
+
const inventoryCapped = inventory.truncated.resources || inventory.truncated.packages || copiesCapped;
|
|
410
|
+
const diagnostics = boundDiagnostics(inventory.diagnostics);
|
|
411
|
+
|
|
412
|
+
const header = {
|
|
413
|
+
scope: "library",
|
|
414
|
+
...(kind !== undefined ? { kind } : {}),
|
|
415
|
+
...(query.length > 0 ? { query: bound(query, MAX_ECHO) } : {}),
|
|
416
|
+
...(ref.length > 0 ? { ref: bound(ref, MAX_ECHO) } : {}),
|
|
417
|
+
total,
|
|
418
|
+
...(inventoryCapped ? { totalIsLowerBound: true } : {}),
|
|
419
|
+
offset,
|
|
420
|
+
...(diagnostics.length > 0 ? { diagnostics } : {}),
|
|
421
|
+
};
|
|
422
|
+
// Measure the envelope with every optional clause present, so the page that
|
|
423
|
+
// fits inside it still fits once the real, shorter note is written.
|
|
424
|
+
const envelopeBytes = byteLength(
|
|
425
|
+
JSON.stringify({ ...header, shown: total, nextOffset: total, rows: [], note: ALL_NOTE_CLAUSES }),
|
|
426
|
+
);
|
|
427
|
+
const page = fitPage(rows.slice(offset, offset + limit), reservation.callCapBytes, envelopeBytes);
|
|
428
|
+
// A page that carried nothing must not hand back an offset equal to the one
|
|
429
|
+
// it was given: that is a loop, not a continuation.
|
|
430
|
+
const exhaustedPage = page.length === 0 && total > offset;
|
|
431
|
+
const nextOffset = !exhaustedPage && offset + page.length < total ? offset + page.length : undefined;
|
|
432
|
+
|
|
433
|
+
const payload = {
|
|
434
|
+
...header,
|
|
435
|
+
shown: page.length,
|
|
436
|
+
...(nextOffset !== undefined ? { nextOffset } : {}),
|
|
437
|
+
rows: page,
|
|
438
|
+
note: [
|
|
439
|
+
OPERATOR_NOTE,
|
|
440
|
+
...(skillsDisabled ? [NOTE_SKILLS_OFF] : []),
|
|
441
|
+
...(inventoryCapped ? [NOTE_INVENTORY_CAPPED] : []),
|
|
442
|
+
...(ref.length > 0 && total > 1 ? [NOTE_AMBIGUOUS_REF] : []),
|
|
443
|
+
...(total === 0 && (ref.length > 0 || query.length > 0) ? [NOTE_NO_MATCH] : []),
|
|
444
|
+
...(exhaustedPage ? [NOTE_NO_BUDGET] : []),
|
|
445
|
+
].join(" "),
|
|
446
|
+
};
|
|
447
|
+
|
|
448
|
+
return finalizeObservation({
|
|
449
|
+
tool: ToolNames.Context,
|
|
450
|
+
unit: "entries",
|
|
451
|
+
format: "json",
|
|
452
|
+
output: JSON.stringify(payload),
|
|
453
|
+
shownCount: page.length,
|
|
454
|
+
totalCount: total,
|
|
455
|
+
truncated: nextOffset !== undefined || inventoryCapped || exhaustedPage,
|
|
456
|
+
...(nextOffset !== undefined ? { next: `offset=${nextOffset}` } : {}),
|
|
457
|
+
reservation,
|
|
458
|
+
...(options ? { options } : {}),
|
|
459
|
+
});
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
async function loadInventory(options: LibraryInventoryOptions): Promise<LibraryInventory> {
|
|
463
|
+
const { readLibraryInventory } = await import("../../domains/resources/library-inventory.js");
|
|
464
|
+
return readLibraryInventory(options);
|
|
465
|
+
}
|