@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
|
@@ -0,0 +1,557 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Library's review and outcome surface.
|
|
3
|
+
*
|
|
4
|
+
* One overlay covers both halves of a managed change, because they are the same
|
|
5
|
+
* question asked twice: what would this do, and then what did it actually do.
|
|
6
|
+
* Nothing is written before the operator accepts the reviewed plan, and the
|
|
7
|
+
* outcome separates the three facts that a single "done" would have blurred:
|
|
8
|
+
* what the writer committed, what the resources now admit, and whether the
|
|
9
|
+
* session refreshed.
|
|
10
|
+
*
|
|
11
|
+
* The bodies are pure functions of the plan and the result, so the wording is
|
|
12
|
+
* testable without a terminal.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import type { LibraryImportApplyResult, LibraryImportPlan } from "../../domains/interop/index.js";
|
|
16
|
+
import type {
|
|
17
|
+
LibraryApplyResult,
|
|
18
|
+
LibraryLifecyclePlan,
|
|
19
|
+
LibraryPlanStep,
|
|
20
|
+
LibraryRefreshResult,
|
|
21
|
+
LibraryStepOutcome,
|
|
22
|
+
} from "../../domains/resources/index.js";
|
|
23
|
+
import {
|
|
24
|
+
type Component,
|
|
25
|
+
isKeyRelease,
|
|
26
|
+
matchesKey,
|
|
27
|
+
type OverlayHandle,
|
|
28
|
+
type TUI,
|
|
29
|
+
wrapTextWithAnsi,
|
|
30
|
+
} from "../../engine/tui.js";
|
|
31
|
+
import { buildResponsiveHint, FocusBox, showClioOverlayFrame } from "../overlay-frame.js";
|
|
32
|
+
import { clioTheme, rule } from "../theme/index.js";
|
|
33
|
+
|
|
34
|
+
const MIN_WIDTH = 48;
|
|
35
|
+
const MAX_WIDTH = 110;
|
|
36
|
+
|
|
37
|
+
function libraryReviewWidth(columns: number): number {
|
|
38
|
+
return Math.max(MIN_WIDTH, Math.min(MAX_WIDTH, columns - 4));
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function wrap(text: string, width: number): string[] {
|
|
42
|
+
return wrapTextWithAnsi(text, Math.max(1, Math.floor(width)));
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function stepHeadline(step: LibraryPlanStep): string {
|
|
46
|
+
return `${step.operation} ${step.identity.ref} in ${step.identity.scope} scope`;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* The reviewed plan, in the order the questions matter: what changes, what it
|
|
51
|
+
* depends on, what depends on it, what becomes effective afterwards, and how a
|
|
52
|
+
* changed tree is recovered.
|
|
53
|
+
*
|
|
54
|
+
* `detail` adds the destination path and the source digest. They are the facts
|
|
55
|
+
* an operator verifies against `library install --dry-run`, and they are also
|
|
56
|
+
* the two longest lines on the screen, so they expand rather than crowd out the
|
|
57
|
+
* dependency story.
|
|
58
|
+
*/
|
|
59
|
+
export function formatLibraryPlanReview(
|
|
60
|
+
plan: LibraryLifecyclePlan,
|
|
61
|
+
width: number,
|
|
62
|
+
options: { detail?: boolean } = {},
|
|
63
|
+
): string[] {
|
|
64
|
+
const theme = clioTheme();
|
|
65
|
+
const rows: string[] = [];
|
|
66
|
+
const target = plan.steps.at(-1);
|
|
67
|
+
rows.push(
|
|
68
|
+
...wrap(theme.fg("accent", target ? stepHeadline(target) : `${plan.request.operation} ${plan.request.ref}`), width),
|
|
69
|
+
);
|
|
70
|
+
if (plan.steps.length > 1)
|
|
71
|
+
rows.push(...wrap(theme.fg("dim", `${plan.steps.length} steps, requirements first`), width));
|
|
72
|
+
rows.push(rule(theme, width));
|
|
73
|
+
|
|
74
|
+
for (const step of plan.steps) {
|
|
75
|
+
rows.push(...wrap(theme.fg("muted", stepHeadline(step)), width));
|
|
76
|
+
if (step.refusal) rows.push(...wrap(theme.fg("error", `refused: ${step.refusal}`), width));
|
|
77
|
+
if (step.content && !step.content.valid)
|
|
78
|
+
rows.push(...wrap(theme.fg("warning", `content invalid: ${step.content.diagnostics.join("; ")}`), width));
|
|
79
|
+
if (step.content?.resources.length)
|
|
80
|
+
rows.push(
|
|
81
|
+
...wrap(
|
|
82
|
+
theme.fg(
|
|
83
|
+
"dim",
|
|
84
|
+
`projects ${step.content.resources.map((item) => `${item.kind}:${item.name}${item.valid ? "" : " (invalid)"}`).join(", ")}`,
|
|
85
|
+
),
|
|
86
|
+
width,
|
|
87
|
+
),
|
|
88
|
+
);
|
|
89
|
+
if (step.dependencies.missing.length)
|
|
90
|
+
rows.push(...wrap(theme.fg("warning", `missing requirements: ${step.dependencies.missing.join(", ")}`), width));
|
|
91
|
+
if (step.dependencies.inactive.length)
|
|
92
|
+
rows.push(...wrap(theme.fg("warning", `inactive requirements: ${step.dependencies.inactive.join(", ")}`), width));
|
|
93
|
+
for (const dependent of step.dependents.newlyBroken)
|
|
94
|
+
rows.push(
|
|
95
|
+
...wrap(
|
|
96
|
+
theme.fg("error", `would break ${dependent.ref} (${dependent.scope}): needs ${dependent.missing.join(", ")}`),
|
|
97
|
+
width,
|
|
98
|
+
),
|
|
99
|
+
);
|
|
100
|
+
for (const dependent of step.dependents.preexisting)
|
|
101
|
+
rows.push(
|
|
102
|
+
...wrap(
|
|
103
|
+
theme.fg("dim", `already broken ${dependent.ref} (${dependent.scope}): needs ${dependent.missing.join(", ")}`),
|
|
104
|
+
width,
|
|
105
|
+
),
|
|
106
|
+
);
|
|
107
|
+
if (step.effectiveAfter)
|
|
108
|
+
rows.push(
|
|
109
|
+
...wrap(
|
|
110
|
+
theme.fg(
|
|
111
|
+
"info",
|
|
112
|
+
`effective afterwards: ${step.effectiveAfter.scope} copy, ${step.effectiveAfter.loadable ? "loadable" : "not loadable"} (${step.effectiveAfter.state})`,
|
|
113
|
+
),
|
|
114
|
+
width,
|
|
115
|
+
),
|
|
116
|
+
);
|
|
117
|
+
rows.push(...wrap(theme.fg("dim", step.fallbackNote), width));
|
|
118
|
+
rows.push(...wrap(theme.fg("dim", step.recovery), width));
|
|
119
|
+
if (options.detail) {
|
|
120
|
+
rows.push(...wrap(theme.fg("dim", `destination ${step.destination}`), width));
|
|
121
|
+
if (step.source)
|
|
122
|
+
rows.push(
|
|
123
|
+
...wrap(theme.fg("dim", `source ${step.source.sourceUrl}`), width),
|
|
124
|
+
...wrap(theme.fg("dim", ` sha256 ${step.source.sha256}`), width),
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
rows.push(rule(theme, width));
|
|
130
|
+
for (const diagnostic of plan.diagnostics) rows.push(...wrap(theme.fg("warning", diagnostic), width));
|
|
131
|
+
rows.push(
|
|
132
|
+
...wrap(
|
|
133
|
+
theme.fg(
|
|
134
|
+
"dim",
|
|
135
|
+
plan.applicable
|
|
136
|
+
? "Verification after the change reads the copy back from disk and reports which resources the loaders actually admit. Enter applies it; Esc writes nothing and releases the staged source."
|
|
137
|
+
: "This plan cannot be applied as reviewed. Esc writes nothing and releases the staged source.",
|
|
138
|
+
),
|
|
139
|
+
width,
|
|
140
|
+
),
|
|
141
|
+
);
|
|
142
|
+
rows.push(...wrap(theme.fg("dim", options.detail ? "d hides paths and digests" : "d shows paths and digests"), width));
|
|
143
|
+
return rows;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function refreshLine(refresh: LibraryRefreshResult): string {
|
|
147
|
+
const theme = clioTheme();
|
|
148
|
+
if (refresh.status === "refreshed")
|
|
149
|
+
return theme.fg(
|
|
150
|
+
"success",
|
|
151
|
+
`session resources refreshed (generation ${refresh.generation}${refresh.changed ? ", changed" : ", unchanged"})`,
|
|
152
|
+
);
|
|
153
|
+
if (refresh.status === "failed")
|
|
154
|
+
return theme.fg("error", `session refresh failed: ${refresh.error}; press R to retry`);
|
|
155
|
+
return theme.fg("dim", `session refresh not applicable: ${refresh.reason}`);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* When the resource evidence was read, said explicitly.
|
|
160
|
+
*
|
|
161
|
+
* Verification reads the copy back from disk as soon as the writer returns,
|
|
162
|
+
* which is before the session refreshes. Those are different moments and an
|
|
163
|
+
* unlabelled list of resources blurred them: after a failed refresh the disk
|
|
164
|
+
* can be correct while this session still serves the previous generation, and
|
|
165
|
+
* an operator reading "available" deserves to know which of the two it means.
|
|
166
|
+
*/
|
|
167
|
+
function evidenceLabel(evidence: "pre-refresh" | "post-refresh", refresh: LibraryRefreshResult): string {
|
|
168
|
+
if (evidence === "post-refresh") return "resources verified after the session refresh";
|
|
169
|
+
if (refresh.status === "refreshed")
|
|
170
|
+
return "resource evidence from before refresh; session refreshed, reopen the Library for current admission";
|
|
171
|
+
if (refresh.status === "failed")
|
|
172
|
+
return "resource evidence from before refresh; current session admission is unverified because refresh failed";
|
|
173
|
+
return "resource evidence from before refresh; no session refresh applied";
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function outcomeLines(outcome: LibraryStepOutcome, width: number, refresh: LibraryRefreshResult): string[] {
|
|
177
|
+
const theme = clioTheme();
|
|
178
|
+
const token = outcome.status === "committed" ? "success" : outcome.status === "failed" ? "error" : ("dim" as const);
|
|
179
|
+
const rows = wrap(
|
|
180
|
+
theme.fg(token, `${outcome.status}: ${outcome.operation} ${outcome.identity.ref} (${outcome.identity.scope})`),
|
|
181
|
+
width,
|
|
182
|
+
);
|
|
183
|
+
if (outcome.error) {
|
|
184
|
+
rows.push(...wrap(theme.fg("error", `${outcome.error.code}: ${outcome.error.message}`), width));
|
|
185
|
+
if (outcome.error.changed)
|
|
186
|
+
rows.push(
|
|
187
|
+
...wrap(
|
|
188
|
+
theme.fg(
|
|
189
|
+
"dim",
|
|
190
|
+
`changed fact ${outcome.error.changed.fact}: reviewed ${JSON.stringify(outcome.error.changed.expected)}, observed ${JSON.stringify(outcome.error.changed.observed)}`,
|
|
191
|
+
),
|
|
192
|
+
width,
|
|
193
|
+
),
|
|
194
|
+
);
|
|
195
|
+
rows.push(...wrap(theme.fg("info", outcome.error.next), width));
|
|
196
|
+
}
|
|
197
|
+
const verification = outcome.verification;
|
|
198
|
+
if (verification) {
|
|
199
|
+
rows.push(...wrap(theme.fg("dim", `disk: tree ${verification.tree}, record ${verification.record}`), width));
|
|
200
|
+
rows.push(
|
|
201
|
+
...wrap(
|
|
202
|
+
theme.fg(
|
|
203
|
+
"dim",
|
|
204
|
+
`${evidenceLabel(verification.evidence, refresh)}: ${
|
|
205
|
+
verification.resources.length === 0
|
|
206
|
+
? "none admitted"
|
|
207
|
+
: verification.resources
|
|
208
|
+
.map(
|
|
209
|
+
(item) =>
|
|
210
|
+
`${item.kind}:${item.name} ${item.available ? "available" : `unavailable (${item.reason ?? "no reason recorded"})`}`,
|
|
211
|
+
)
|
|
212
|
+
.join(", ")
|
|
213
|
+
}`,
|
|
214
|
+
),
|
|
215
|
+
width,
|
|
216
|
+
),
|
|
217
|
+
);
|
|
218
|
+
rows.push(
|
|
219
|
+
...wrap(
|
|
220
|
+
theme.fg(
|
|
221
|
+
"dim",
|
|
222
|
+
verification.effective
|
|
223
|
+
? `effective copy: ${verification.effective.scope}, ${verification.effective.loadable ? "loadable" : "not loadable"}`
|
|
224
|
+
: "effective copy: none remains",
|
|
225
|
+
),
|
|
226
|
+
width,
|
|
227
|
+
),
|
|
228
|
+
);
|
|
229
|
+
}
|
|
230
|
+
if (outcome.recovery?.packageBackup)
|
|
231
|
+
rows.push(...wrap(theme.fg("info", `recovered content: ${outcome.recovery.packageBackup}`), width));
|
|
232
|
+
if (outcome.recovery?.stateBackup)
|
|
233
|
+
rows.push(...wrap(theme.fg("dim", `state backup: ${outcome.recovery.stateBackup}`), width));
|
|
234
|
+
for (const diagnostic of outcome.diagnostics) rows.push(...wrap(theme.fg("dim", diagnostic), width));
|
|
235
|
+
return rows;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* What actually happened.
|
|
240
|
+
*
|
|
241
|
+
* The three counts lead, because a batch that committed two of three writes is
|
|
242
|
+
* a different situation from one that committed none, and the older single
|
|
243
|
+
* "installed" line could describe both. Disk state, resource admission and
|
|
244
|
+
* session refresh are then separate lines: a package can be on disk with one
|
|
245
|
+
* resource still unavailable, and that is not a failed write.
|
|
246
|
+
*/
|
|
247
|
+
export function formatLibraryOutcome(result: LibraryApplyResult, width: number): string[] {
|
|
248
|
+
const theme = clioTheme();
|
|
249
|
+
const rows = wrap(
|
|
250
|
+
theme.fg(
|
|
251
|
+
result.failed > 0 ? "error" : "success",
|
|
252
|
+
`${result.committed} committed · ${result.failed} failed · ${result.unattempted} unattempted`,
|
|
253
|
+
),
|
|
254
|
+
width,
|
|
255
|
+
);
|
|
256
|
+
rows.push(rule(theme, width));
|
|
257
|
+
for (const outcome of result.outcomes) rows.push(...outcomeLines(outcome, width, result.refresh));
|
|
258
|
+
rows.push(rule(theme, width));
|
|
259
|
+
rows.push(...wrap(refreshLine(result.refresh), width));
|
|
260
|
+
if (result.unattempted > 0)
|
|
261
|
+
rows.push(
|
|
262
|
+
...wrap(
|
|
263
|
+
theme.fg(
|
|
264
|
+
"dim",
|
|
265
|
+
"Unattempted steps were never started; the committed ones stand. Review a fresh plan for the rest.",
|
|
266
|
+
),
|
|
267
|
+
width,
|
|
268
|
+
),
|
|
269
|
+
);
|
|
270
|
+
rows.push(
|
|
271
|
+
...wrap(theme.fg("dim", "R retries the session refresh only; it never repeats a write. Esc closes."), width),
|
|
272
|
+
);
|
|
273
|
+
return rows;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* The reviewed foreign import, before anything is written.
|
|
278
|
+
*
|
|
279
|
+
* An import is the one operation whose losses matter as much as its writes, so
|
|
280
|
+
* the projected resources, the unsupported host features and the omitted files
|
|
281
|
+
* are all on this screen. A plan that would install something while silently
|
|
282
|
+
* dropping a companion the instructions need is the failure this wording
|
|
283
|
+
* exists to prevent.
|
|
284
|
+
*/
|
|
285
|
+
function formatLibraryImportReview(
|
|
286
|
+
plan: LibraryImportPlan,
|
|
287
|
+
width: number,
|
|
288
|
+
options: { detail?: boolean } = {},
|
|
289
|
+
): string[] {
|
|
290
|
+
const theme = clioTheme();
|
|
291
|
+
const rows = wrap(
|
|
292
|
+
theme.fg(
|
|
293
|
+
plan.action === "install" ? "accent" : "error",
|
|
294
|
+
`${plan.action === "install" ? "import" : "blocked"} ${plan.id ?? plan.source.input} into ${plan.scope} scope`,
|
|
295
|
+
),
|
|
296
|
+
width,
|
|
297
|
+
);
|
|
298
|
+
rows.push(rule(theme, width));
|
|
299
|
+
rows.push(...wrap(theme.fg("muted", `source: ${plan.source.input} (${plan.source.transport})`), width));
|
|
300
|
+
if (plan.format) rows.push(...wrap(theme.fg("dim", `format: ${plan.format}`), width));
|
|
301
|
+
if (plan.version) rows.push(...wrap(theme.fg("dim", `version: ${plan.version}`), width));
|
|
302
|
+
if (plan.destination) rows.push(...wrap(theme.fg("dim", `destination: ${plan.destination}`), width));
|
|
303
|
+
rows.push(
|
|
304
|
+
...wrap(
|
|
305
|
+
theme.fg(
|
|
306
|
+
"info",
|
|
307
|
+
`projects ${plan.outcomes.length} resource${plan.outcomes.length === 1 ? "" : "s"}${
|
|
308
|
+
plan.outcomes.length > 0
|
|
309
|
+
? `: ${plan.outcomes.map((outcome) => `${outcome.kind}:${outcome.name} (${outcome.status})`).join(", ")}`
|
|
310
|
+
: ""
|
|
311
|
+
}`,
|
|
312
|
+
),
|
|
313
|
+
width,
|
|
314
|
+
),
|
|
315
|
+
);
|
|
316
|
+
for (const item of plan.unsupported)
|
|
317
|
+
rows.push(...wrap(theme.fg("warning", `unsupported host feature, not imported: ${item}`), width));
|
|
318
|
+
for (const item of plan.omitted) rows.push(...wrap(theme.fg("warning", `omitted file: ${item}`), width));
|
|
319
|
+
if (plan.requirements.length)
|
|
320
|
+
rows.push(...wrap(theme.fg("warning", `requires installed packages: ${plan.requirements.join(", ")}`), width));
|
|
321
|
+
for (const reason of plan.reasons)
|
|
322
|
+
rows.push(...wrap(theme.fg(plan.action === "install" ? "dim" : "error", reason), width));
|
|
323
|
+
rows.push(rule(theme, width));
|
|
324
|
+
rows.push(
|
|
325
|
+
...wrap(
|
|
326
|
+
theme.fg(
|
|
327
|
+
"dim",
|
|
328
|
+
"Imported content stays foreign: it keeps its original provenance and needs the project-import trust gate before the model may use it. The vendor's own directory is never modified.",
|
|
329
|
+
),
|
|
330
|
+
width,
|
|
331
|
+
),
|
|
332
|
+
);
|
|
333
|
+
if (options.detail) {
|
|
334
|
+
rows.push(...wrap(theme.fg("dim", `review fingerprint ${plan.reviewFingerprint}`), width));
|
|
335
|
+
if (plan.digest) rows.push(...wrap(theme.fg("dim", `projected digest ${plan.digest}`), width));
|
|
336
|
+
rows.push(...wrap(theme.fg("dim", `source root ${plan.source.root}`), width));
|
|
337
|
+
}
|
|
338
|
+
rows.push(
|
|
339
|
+
...wrap(
|
|
340
|
+
theme.fg(
|
|
341
|
+
"dim",
|
|
342
|
+
plan.action === "install"
|
|
343
|
+
? "Enter imports exactly this projection; Esc writes nothing."
|
|
344
|
+
: "This source cannot be imported as reviewed. Esc writes nothing.",
|
|
345
|
+
),
|
|
346
|
+
width,
|
|
347
|
+
),
|
|
348
|
+
);
|
|
349
|
+
rows.push(...wrap(theme.fg("dim", options.detail ? "d hides paths and digests" : "d shows paths and digests"), width));
|
|
350
|
+
return rows;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/** One scrollable body that shows a reviewed plan, then the outcome that replaced it. */
|
|
354
|
+
class LibraryReviewBody implements Component {
|
|
355
|
+
private scroll = 0;
|
|
356
|
+
private maxScroll = 0;
|
|
357
|
+
private rows = 12;
|
|
358
|
+
detail = false;
|
|
359
|
+
outcome: (() => string[]) | null = null;
|
|
360
|
+
|
|
361
|
+
constructor(private readonly review: (width: number, detail: boolean) => string[]) {}
|
|
362
|
+
|
|
363
|
+
scrollBy(delta: number): void {
|
|
364
|
+
this.scroll = Math.max(0, Math.min(this.maxScroll, this.scroll + delta * this.rows));
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
reset(): void {
|
|
368
|
+
this.scroll = 0;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
render(width: number): string[] {
|
|
372
|
+
const body = this.outcome ? this.outcome() : this.review(width, this.detail);
|
|
373
|
+
this.rows = Math.max(4, (process.stdout.rows || 30) - 10);
|
|
374
|
+
this.maxScroll = Math.max(0, body.length - this.rows);
|
|
375
|
+
this.scroll = Math.min(this.scroll, this.maxScroll);
|
|
376
|
+
const shown = body.slice(this.scroll, this.scroll + this.rows);
|
|
377
|
+
if (this.maxScroll) shown.push(`(${this.scroll + 1}-${this.scroll + shown.length}/${body.length}) PgUp/PgDn`);
|
|
378
|
+
return shown;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
invalidate(): void {}
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
interface ReviewOverlaySpec {
|
|
385
|
+
title: string;
|
|
386
|
+
verb: string;
|
|
387
|
+
columns: number;
|
|
388
|
+
applicable: boolean;
|
|
389
|
+
review: (width: number, detail: boolean) => string[];
|
|
390
|
+
/** Apply, and return the body the outcome half renders. Called only after Enter. */
|
|
391
|
+
commit: () => (width: number) => string[];
|
|
392
|
+
/** Refresh only; returns the replacement outcome body. Never repeats a write. */
|
|
393
|
+
retryRefresh: () => (width: number) => string[];
|
|
394
|
+
onCancel: () => void;
|
|
395
|
+
onDone: () => void;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
function openReviewOverlay(tui: TUI, spec: ReviewOverlaySpec): OverlayHandle {
|
|
399
|
+
let settled = false;
|
|
400
|
+
let width = libraryReviewWidth(spec.columns);
|
|
401
|
+
const body = new LibraryReviewBody(spec.review);
|
|
402
|
+
|
|
403
|
+
const cancel = (): void => {
|
|
404
|
+
if (settled) return;
|
|
405
|
+
settled = true;
|
|
406
|
+
spec.onCancel();
|
|
407
|
+
};
|
|
408
|
+
|
|
409
|
+
const focus = new FocusBox(body, {
|
|
410
|
+
// Keys are matched by name rather than by raw bytes: under the kitty
|
|
411
|
+
// keyboard protocol Esc arrives as CSI 27 u, and a byte comparison left
|
|
412
|
+
// this overlay unanswerable.
|
|
413
|
+
onInput: (data: string): void => {
|
|
414
|
+
if (isKeyRelease(data)) return;
|
|
415
|
+
if (body.outcome) {
|
|
416
|
+
if (data === "R") {
|
|
417
|
+
// Refresh only. The writes already committed and are never repeated.
|
|
418
|
+
const next = spec.retryRefresh();
|
|
419
|
+
body.outcome = () => next(width);
|
|
420
|
+
tui.requestRender();
|
|
421
|
+
return;
|
|
422
|
+
}
|
|
423
|
+
if (matchesKey(data, "escape") || matchesKey(data, "enter")) {
|
|
424
|
+
settled = true;
|
|
425
|
+
spec.onDone();
|
|
426
|
+
return;
|
|
427
|
+
}
|
|
428
|
+
} else {
|
|
429
|
+
if (matchesKey(data, "enter")) {
|
|
430
|
+
if (!spec.applicable) return;
|
|
431
|
+
settled = true;
|
|
432
|
+
const outcome = spec.commit();
|
|
433
|
+
body.outcome = () => outcome(width);
|
|
434
|
+
body.reset();
|
|
435
|
+
tui.requestRender();
|
|
436
|
+
return;
|
|
437
|
+
}
|
|
438
|
+
if (matchesKey(data, "escape")) {
|
|
439
|
+
cancel();
|
|
440
|
+
return;
|
|
441
|
+
}
|
|
442
|
+
if (data === "d") {
|
|
443
|
+
body.detail = !body.detail;
|
|
444
|
+
tui.requestRender();
|
|
445
|
+
return;
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
if (matchesKey(data, "pageDown") || matchesKey(data, "down")) body.scrollBy(1);
|
|
449
|
+
else if (matchesKey(data, "pageUp") || matchesKey(data, "up")) body.scrollBy(-1);
|
|
450
|
+
tui.requestRender();
|
|
451
|
+
},
|
|
452
|
+
});
|
|
453
|
+
|
|
454
|
+
const handle = showClioOverlayFrame(tui, focus, {
|
|
455
|
+
anchor: "center",
|
|
456
|
+
width,
|
|
457
|
+
markerId: "library-review",
|
|
458
|
+
title: () => (body.outcome ? "Library outcome" : spec.title),
|
|
459
|
+
footerHint: (innerWidth: number) => {
|
|
460
|
+
width = innerWidth;
|
|
461
|
+
return body.outcome
|
|
462
|
+
? buildResponsiveHint([{ key: "R", verb: "retry refresh" }], { key: "Esc", verb: "close" })(innerWidth)
|
|
463
|
+
: buildResponsiveHint(
|
|
464
|
+
[...(spec.applicable ? [{ key: "Enter", verb: spec.verb }] : []), { key: "d", verb: "paths" }],
|
|
465
|
+
{ key: "Esc", verb: "cancel" },
|
|
466
|
+
)(innerWidth);
|
|
467
|
+
},
|
|
468
|
+
});
|
|
469
|
+
|
|
470
|
+
return {
|
|
471
|
+
...handle,
|
|
472
|
+
hide(): void {
|
|
473
|
+
cancel();
|
|
474
|
+
handle.hide();
|
|
475
|
+
},
|
|
476
|
+
};
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
export interface OpenLibraryReviewOptions {
|
|
480
|
+
plan: LibraryLifecyclePlan;
|
|
481
|
+
columns: number;
|
|
482
|
+
/** Apply the reviewed plan. Called only after the operator accepts. */
|
|
483
|
+
commit: (plan: LibraryLifecyclePlan) => LibraryApplyResult;
|
|
484
|
+
/** Refresh only, for a failed or skipped session refresh. */
|
|
485
|
+
retryRefresh: () => LibraryRefreshResult;
|
|
486
|
+
/** Cancel before commit: nothing was written; the caller releases the staged source. */
|
|
487
|
+
onCancel: () => void;
|
|
488
|
+
/** Closed after an outcome was shown; carries what happened so the list can redraw. */
|
|
489
|
+
onDone: (result: LibraryApplyResult) => void;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
export function openLibraryReviewOverlay(tui: TUI, options: OpenLibraryReviewOptions): OverlayHandle {
|
|
493
|
+
let applied: LibraryApplyResult | null = null;
|
|
494
|
+
return openReviewOverlay(tui, {
|
|
495
|
+
title: `Library ${options.plan.request.operation}`,
|
|
496
|
+
verb: options.plan.request.operation,
|
|
497
|
+
columns: options.columns,
|
|
498
|
+
applicable: options.plan.applicable,
|
|
499
|
+
review: (width, detail) => formatLibraryPlanReview(options.plan, width, { detail }),
|
|
500
|
+
commit: () => {
|
|
501
|
+
applied = options.commit(options.plan);
|
|
502
|
+
return (width) => formatLibraryOutcome(applied as LibraryApplyResult, width);
|
|
503
|
+
},
|
|
504
|
+
retryRefresh: () => {
|
|
505
|
+
const refresh = options.retryRefresh();
|
|
506
|
+
applied = applied ? { ...applied, refresh } : applied;
|
|
507
|
+
return (width) => formatLibraryOutcome(applied as LibraryApplyResult, width);
|
|
508
|
+
},
|
|
509
|
+
onCancel: options.onCancel,
|
|
510
|
+
onDone: () => {
|
|
511
|
+
if (applied) options.onDone(applied);
|
|
512
|
+
},
|
|
513
|
+
});
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
export interface OpenLibraryImportOptions {
|
|
517
|
+
plan: LibraryImportPlan;
|
|
518
|
+
columns: number;
|
|
519
|
+
/** Apply the reviewed import. Called only after the operator accepts. */
|
|
520
|
+
commit: (plan: LibraryImportPlan) => LibraryImportApplyResult;
|
|
521
|
+
/** Project the applied import into the shared outcome shape. */
|
|
522
|
+
outcome: (plan: LibraryImportPlan, result: LibraryImportApplyResult) => LibraryApplyResult;
|
|
523
|
+
retryRefresh: () => LibraryRefreshResult;
|
|
524
|
+
onCancel: () => void;
|
|
525
|
+
onDone: (result: LibraryApplyResult) => void;
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
/**
|
|
529
|
+
* Review one explicit import, then show it in the same outcome widget.
|
|
530
|
+
*
|
|
531
|
+
* `/library import <path-or-url>` names a source, and that exact source is what
|
|
532
|
+
* gets planned and reported. The local-agent discovery surface is a separate
|
|
533
|
+
* way in, not a substitute for the one the operator typed.
|
|
534
|
+
*/
|
|
535
|
+
export function openLibraryImportOverlay(tui: TUI, options: OpenLibraryImportOptions): OverlayHandle {
|
|
536
|
+
let applied: LibraryApplyResult | null = null;
|
|
537
|
+
return openReviewOverlay(tui, {
|
|
538
|
+
title: "Library import",
|
|
539
|
+
verb: "import",
|
|
540
|
+
columns: options.columns,
|
|
541
|
+
applicable: options.plan.action === "install",
|
|
542
|
+
review: (width, detail) => formatLibraryImportReview(options.plan, width, { detail }),
|
|
543
|
+
commit: () => {
|
|
544
|
+
applied = options.outcome(options.plan, options.commit(options.plan));
|
|
545
|
+
return (width) => formatLibraryOutcome(applied as LibraryApplyResult, width);
|
|
546
|
+
},
|
|
547
|
+
retryRefresh: () => {
|
|
548
|
+
const refresh = options.retryRefresh();
|
|
549
|
+
applied = applied ? { ...applied, refresh } : applied;
|
|
550
|
+
return (width) => formatLibraryOutcome(applied as LibraryApplyResult, width);
|
|
551
|
+
},
|
|
552
|
+
onCancel: options.onCancel,
|
|
553
|
+
onDone: () => {
|
|
554
|
+
if (applied) options.onDone(applied);
|
|
555
|
+
},
|
|
556
|
+
});
|
|
557
|
+
}
|
|
@@ -1,26 +1,14 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The Skills Hub's tab table.
|
|
3
|
-
*
|
|
4
|
-
* It sits in its own module rather than inside `skills-hub.ts` because the slash
|
|
5
|
-
* registry parses `/library <kind>` against it, and the registry has to stay off
|
|
6
|
-
* the render module graph. Pulling the whole hub overlay in for four ids made
|
|
7
|
-
* `src/cli/run.ts` a second, disjoint reacher of the interactive theme and
|
|
8
|
-
* `src/engine/tui.ts`, which splits the merged chunk the Stage 0 instant shell
|
|
9
|
-
* depends on. See `tests/contracts/instant-shell-import-graph.test.ts`.
|
|
10
|
-
*
|
|
11
|
-
* Pure data plus its membership test: no rendering, no overlay state.
|
|
12
|
-
* `skills-hub.ts` re-exports both symbols, so every existing importer keeps the
|
|
13
|
-
* path it had.
|
|
14
|
-
*/
|
|
1
|
+
/** Pure library tab metadata; keep this outside the render graph. */
|
|
15
2
|
|
|
16
3
|
import type { LibraryEntryKind } from "../../domains/resources/index.js";
|
|
17
4
|
|
|
18
|
-
/**
|
|
5
|
+
/** Library kinds in keyboard traversal order. */
|
|
19
6
|
export const LIBRARY_TABS: ReadonlyArray<{ id: LibraryEntryKind; label: string }> = [
|
|
20
7
|
{ id: "skill", label: "Skills" },
|
|
21
8
|
{ id: "agent", label: "Agents" },
|
|
22
9
|
{ id: "prompt", label: "Prompts" },
|
|
23
10
|
{ id: "fleet", label: "Fleets" },
|
|
11
|
+
{ id: "plugin", label: "Plugins" },
|
|
24
12
|
];
|
|
25
13
|
|
|
26
14
|
export function isLibraryTab(value: string): value is LibraryEntryKind {
|