@iowarp/clio-coder 0.5.0 → 0.5.2
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 +4 -4
- package/CHANGELOG.md +35 -0
- package/CONTRIBUTING.md +9 -0
- package/README.md +12 -9
- package/ROADMAP.md +30 -5
- package/dist/{acp-KS7ARGV6.js → acp-F6PGOFZ4.js} +2 -2
- package/dist/{agents-YOGJ2YEJ.js → agents-ZHP4R6EX.js} +22 -21
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-CEDCO6O6.js → auth-N75U2H3Z.js} +4 -4
- package/dist/{chunk-D3KWFOUT.js → chunk-23UIXH6Z.js} +3 -3
- package/dist/{chunk-ZR5YA6ZF.js → chunk-36XVK5P5.js} +5 -5
- package/dist/{chunk-AVSR2HKI.js → chunk-3DZ4LPLS.js} +6 -6
- package/dist/{chunk-LYJJ6546.js → chunk-3GSPCWFX.js} +12 -12
- package/dist/{chunk-CRHPCPZP.js → chunk-4KC4CHKJ.js} +2 -2
- package/dist/{chunk-4VDHLCF5.js → chunk-4WJBWKMI.js} +2 -2
- package/dist/{chunk-KBUTSJSR.js → chunk-4XBYHXGK.js} +2 -2
- package/dist/{chunk-6W75D37F.js → chunk-53P775GE.js} +6 -3
- package/dist/{chunk-XZWSP67B.js → chunk-5APYAXCB.js} +2 -2
- package/dist/{chunk-D65E25JG.js → chunk-67HPYNTJ.js} +2 -2
- package/dist/{chunk-5JQR5B4D.js → chunk-6KV4KCQZ.js} +4 -4
- package/dist/{chunk-V4XJWDHR.js → chunk-6UKFRTXI.js} +2 -1
- package/dist/{chunk-NDPF2N2L.js → chunk-7DW7CJW2.js} +2 -2
- package/dist/{chunk-5KQEUIWM.js → chunk-7LUEQODV.js} +4 -4
- package/dist/{chunk-LNOXCGN2.js → chunk-7UFDIOBT.js} +3 -3
- package/dist/{chunk-DXSETN72.js → chunk-7WUGNN43.js} +2 -2
- package/dist/{chunk-V35KZDUZ.js → chunk-AA3GRZWS.js} +2 -2
- package/dist/{chunk-X4CEFOSG.js → chunk-ADO3OQIC.js} +4 -4
- package/dist/{chunk-UX2L5CUD.js → chunk-AI36V3ON.js} +3 -3
- package/dist/{chunk-B7GY6QER.js → chunk-B26OUMJW.js} +2 -2
- package/dist/{chunk-LAR7DX5E.js → chunk-B5TASTCK.js} +153 -62
- package/dist/{chunk-TGWZXJ7L.js → chunk-BEMQK5Q7.js} +92 -84
- package/dist/{chunk-RNDCROSG.js → chunk-CNXU7TR2.js} +3 -3
- package/dist/{chunk-3JLTRPN7.js → chunk-CVMUXT64.js} +35 -66
- package/dist/{chunk-733ZBT5P.js → chunk-E74MJF6G.js} +4 -4
- package/dist/{chunk-T2MDZES3.js → chunk-EBMTBE76.js} +3 -3
- package/dist/{chunk-OZ76TLGU.js → chunk-EEITU7S6.js} +2 -2
- package/dist/{chunk-GRHOXDKB.js → chunk-ELDJWJKM.js} +97 -14
- package/dist/{chunk-GCQFN7YI.js → chunk-EMYEQLWO.js} +2 -2
- package/dist/{chunk-LTWH2ACR.js → chunk-EQPFEDFV.js} +222 -127
- package/dist/{chunk-TDGYTWM6.js → chunk-F4I3H56H.js} +2 -2
- package/dist/chunk-F6KCJO3U.js +523 -0
- package/dist/{chunk-FGSQHUCK.js → chunk-F6VKWTTY.js} +5 -5
- package/dist/{chunk-UJD5MPP6.js → chunk-FLNXQQ5B.js} +2 -2
- package/dist/{chunk-EX57VVWW.js → chunk-FOSRJ2VZ.js} +4 -4
- package/dist/{chunk-ZARZ4POR.js → chunk-G5ZDQQE3.js} +3 -3
- package/dist/{chunk-HQVN7G4F.js → chunk-G62JBPXN.js} +7 -7
- package/dist/{chunk-ZJPORZTC.js → chunk-GIAI7A2K.js} +2 -2
- package/dist/chunk-GPTR6OTU.js +2551 -0
- package/dist/{chunk-EZD2BXGP.js → chunk-GUFQPTQK.js} +2 -2
- package/dist/{chunk-OPD7GL6F.js → chunk-H6FQVNZC.js} +8 -7
- package/dist/chunk-H7REJ7L5.js +80 -0
- package/dist/{chunk-EYTLV3W3.js → chunk-HTWTORF7.js} +2 -2
- package/dist/{chunk-DF6PI6GN.js → chunk-I6UKQPGS.js} +3 -3
- package/dist/{chunk-ISHUS7HC.js → chunk-JRW236JT.js} +3 -3
- package/dist/{chunk-DE2LU267.js → chunk-KKAJGT3B.js} +3 -2
- package/dist/{chunk-OV62D6KO.js → chunk-KQMYL5GR.js} +3 -3
- package/dist/{chunk-QDUUOZ3S.js → chunk-KWMFC7FN.js} +3 -3
- package/dist/{chunk-R7FGRZNF.js → chunk-LXYHCCIZ.js} +9 -9
- package/dist/{chunk-NFSK2VNU.js → chunk-LZMTVVN4.js} +2 -2
- package/dist/{chunk-62UK7AGW.js → chunk-M5PMRZSR.js} +397 -44
- package/dist/chunk-MMZMM6SW.js +131 -0
- package/dist/{chunk-FFYTC2KQ.js → chunk-MNABNEBX.js} +2 -2
- package/dist/{chunk-XMDBTYCH.js → chunk-N3CWOGVF.js} +3 -3
- package/dist/{chunk-VYRQHORQ.js → chunk-NMQSO6Z6.js} +4 -3
- package/dist/{chunk-R2UUNSNQ.js → chunk-O3ZAF7UY.js} +18 -5
- package/dist/{chunk-4SYHGVDE.js → chunk-OQNCLZI4.js} +4 -4
- package/dist/{chunk-EG4ARXPC.js → chunk-OX6QTA4N.js} +3 -3
- package/dist/{chunk-P4GNZPXO.js → chunk-OYUS3UZP.js} +2 -2
- package/dist/{chunk-OQ2EOAHA.js → chunk-PF36KOGI.js} +291 -112
- package/dist/{chunk-55RMDDFM.js → chunk-PGQG7ZMW.js} +2 -2
- package/dist/{chunk-CBAQPTDU.js → chunk-PIU6BXXW.js} +2 -2
- package/dist/{chunk-EKV4UBCM.js → chunk-PZBQUJ2F.js} +2 -2
- package/dist/{chunk-7RET77VB.js → chunk-Q2HKY32Y.js} +2 -2
- package/dist/{chunk-U6YTUVOX.js → chunk-Q4RMNWMZ.js} +4 -4
- package/dist/chunk-Q6FRR3AQ.js +48 -0
- package/dist/{chunk-6RJMYYIE.js → chunk-QJSIAJBY.js} +3 -3
- package/dist/{chunk-DOUISWEE.js → chunk-QOJ4ERMU.js} +5 -5
- package/dist/{chunk-IFPDAD7R.js → chunk-RWSRKXLT.js} +3 -3
- package/dist/{chunk-T33IYTZM.js → chunk-SAASVMIY.js} +3 -3
- package/dist/{chunk-2DTIWSAW.js → chunk-SEQDH6JC.js} +3 -3
- package/dist/{chunk-BRCOSE7O.js → chunk-SZUO5BSE.js} +2 -2
- package/dist/{chunk-HOEDA42N.js → chunk-T7HZ7KJF.js} +2 -2
- package/dist/{chunk-OJXOA6YU.js → chunk-TL6LNERH.js} +2 -2
- package/dist/{chunk-UCINIRHW.js → chunk-TPCZXWLT.js} +3 -3
- package/dist/{chunk-ZUKUCZYZ.js → chunk-TQ2KTH4A.js} +2 -2
- package/dist/{chunk-4WOOTKFD.js → chunk-U3FETNQB.js} +341 -20
- package/dist/{chunk-5B3RTYAK.js → chunk-UGDSB4AN.js} +2 -2
- package/dist/{chunk-VKHLUZNO.js → chunk-UZ7YBL43.js} +3 -3
- package/dist/{chunk-QNUQ7K7D.js → chunk-VKMSEO7Y.js} +4 -4
- package/dist/{chunk-IN7DGBVS.js → chunk-VLX5VZ35.js} +5 -5
- package/dist/{chunk-SJGS3GDI.js → chunk-WAGBMMNX.js} +5 -5
- package/dist/{chunk-BFOSV5EZ.js → chunk-WX2YCH7F.js} +2 -2
- package/dist/{chunk-3LT34CAM.js → chunk-XBIGUILU.js} +32 -17
- package/dist/{chunk-XDHUDE5K.js → chunk-XKYBFRWR.js} +5 -5
- package/dist/{chunk-U5QU5ZOD.js → chunk-XYPWFSU5.js} +3 -3
- package/dist/{chunk-YBUECLAF.js → chunk-YEJQDODA.js} +2 -2
- package/dist/{chunk-YQ6XEFVK.js → chunk-Z74OGONW.js} +39 -7
- package/dist/{chunk-I4ELN5BX.js → chunk-ZTNOEJRI.js} +2 -2
- package/dist/cli/index.js +26 -26
- package/dist/{clio-K2PBVCEM.js → clio-4IKFE25F.js} +2 -2
- package/dist/{clio-context-tools-GR4OHFSO.js → clio-context-tools-OHJXYX4R.js} +25 -23
- package/dist/{code-nav-4X3OI6DK.js → code-nav-XPM3MY5I.js} +7 -7
- package/dist/{config-Q5J7UBAB.js → config-343YS25T.js} +43 -41
- package/dist/{config-graph-P3555574.js → config-graph-WI263KDX.js} +43 -41
- package/dist/{configure-KIJ32ZO6.js → configure-GZDG4HER.js} +21 -21
- package/dist/{context-LFBQOSXT.js → context-4OFO7N7Y.js} +12 -12
- package/dist/{context-WBH3KSVR.js → context-JLK2RLOG.js} +42 -40
- package/dist/{context-NNLBES2Y.js → context-O6DIWCF6.js} +23 -21
- package/dist/{context-clear-YOHMQ6SQ.js → context-clear-MR7KOGQI.js} +42 -40
- package/dist/{context-working-set-MRAEVDNV.js → context-working-set-YZAD3KWO.js} +14 -13
- package/dist/{data-tool-JJPBGMQJ.js → data-tool-EKD7DFHG.js} +7 -7
- package/dist/{detail-RHJOTGN4.js → detail-YZPHFEVJ.js} +43 -41
- package/dist/{dispatch-runner-NC7PYNIO.js → dispatch-runner-VKVXVTWJ.js} +44 -42
- package/dist/{doctor-S5KZ2GTN.js → doctor-53AVQXAO.js} +17 -16
- package/dist/{doctor-deep-2EJQSHIZ.js → doctor-deep-BLRB2NCG.js} +5 -5
- package/dist/{eval-3D6M36N7.js → eval-P3BQSLQE.js} +21 -20
- package/dist/{evidence-XNVPPLVK.js → evidence-6LLI6SZH.js} +44 -42
- package/dist/{evidence-6IYN52ET.js → evidence-HTN3JLUO.js} +42 -40
- package/dist/{evidence-JVECPI3F.js → evidence-NJRE3R5H.js} +42 -40
- package/dist/{evolve-TLPUDJDM.js → evolve-WWZHJVJP.js} +42 -40
- package/dist/{fleet-WKVBF5SZ.js → fleet-GGZ4BVJE.js} +64 -62
- package/dist/{fleet-6RJWIOEO.js → fleet-QG3IIWWM.js} +44 -42
- package/dist/{fleet-commands-L6WFT7KZ.js → fleet-commands-J2ZIKISQ.js} +7 -7
- package/dist/{fleet-decisions-BTQMWU5A.js → fleet-decisions-Y2Q7375Q.js} +8 -8
- package/dist/{fleet-graph-553DZ67Q.js → fleet-graph-TCBCCCBP.js} +11 -11
- package/dist/{fleet-inspect-236FZPRB.js → fleet-inspect-KOLKBC56.js} +44 -42
- package/dist/{fleet-preflight-NZQHABWO.js → fleet-preflight-44UNCC4Y.js} +27 -25
- package/dist/{fleet-validate-7NLAE26R.js → fleet-validate-K2FXRZVA.js} +13 -13
- package/dist/{fleet-verify-E3RO6A5W.js → fleet-verify-AS444WDW.js} +42 -40
- package/dist/{fleet-view-KMZQY7YJ.js → fleet-view-X4JU4J6O.js} +43 -41
- package/dist/gui/ops-worker.js +9 -9
- package/dist/gui/reads-worker.js +9 -8
- package/dist/{init-DV5B6HQG.js → init-VSOWFHVL.js} +54 -52
- package/dist/{interactive-OXGYZYAS.js → interactive-JRCBENLZ.js} +1733 -577
- package/dist/{interop-J7UOBOSF.js → interop-JR6BCY7R.js} +10 -10
- package/dist/{inventory-OEGIL6PY.js → inventory-3JUGLVJI.js} +43 -41
- package/dist/{library-ROZAMUIL.js → library-7BOH3Y7N.js} +15 -15
- package/dist/{library-B3UPGY4V.js → library-7PFONXUI.js} +9 -9
- package/dist/{library-MXQA5DLT.js → library-TUYZMFIA.js} +7 -7
- package/dist/{library-import-2LTWOVBD.js → library-import-TJVXKLDK.js} +10 -10
- package/dist/{library-inventory-LJ3XHLWO.js → library-inventory-MD3AYTP4.js} +9 -9
- package/dist/{library-validation-DARHHUNW.js → library-validation-ZDLITEA3.js} +7 -7
- package/dist/{mcp-2GSPYQ54.js → mcp-EFCWUPUR.js} +3 -3
- package/dist/{memory-J3STUUIK.js → memory-Q2YVOKK5.js} +42 -40
- package/dist/{models-Y3GMFJ2V.js → models-M7BOCW7F.js} +17 -16
- package/dist/{monitor-LHNH577J.js → monitor-2HD3MC67.js} +47 -45
- package/dist/{orchestrator-DTAPXULA.js → orchestrator-OUW3ZN6Y.js} +1894 -226
- package/dist/{panes-A743ONZ5.js → panes-TTPPSYCL.js} +3 -3
- package/dist/{preload-OJBMAIXF.js → preload-A47C2NUF.js} +42 -40
- package/dist/{providers-CMETPZNS.js → providers-T43W7EL4.js} +4 -4
- package/dist/{resources-FY6XYFN2.js → resources-TP6X2V6W.js} +20 -11
- package/dist/{run-H64MEVTA.js → run-LDSBPMCS.js} +61 -59
- package/dist/{share-CAFMMQLM.js → share-URHKKMHR.js} +9 -9
- package/dist/{skills-ERKQUC7L.js → skills-E477MOOO.js} +13 -11
- package/dist/{skills-eval-CQ23MYQK.js → skills-eval-AIBR2L7H.js} +583 -93
- package/dist/{skills-inventory-TVUYJDVN.js → skills-inventory-HLMKY3R5.js} +13 -11
- package/dist/{slash-commands-ROG3KIFJ.js → slash-commands-LIIZKA5Y.js} +28 -26
- package/dist/{startup-background-KDWCQMWT.js → startup-background-JR2KDK6R.js} +43 -41
- package/dist/{steer-KKYXJSH4.js → steer-D7RTAPCM.js} +3 -3
- package/dist/{system-ZDW44ZGX.js → system-X2P5N4IY.js} +14 -13
- package/dist/{targets-AJWA6E7Z.js → targets-VFFAKUFM.js} +25 -24
- package/dist/{tasks-6L2JJRC5.js → tasks-ERAWZA22.js} +6 -6
- package/dist/{terminal-lease-YFUSDPAD.js → terminal-lease-V2N2BIKQ.js} +2 -2
- package/dist/{trace-LA5MVR4Y.js → trace-MA5BT7XY.js} +3 -3
- package/dist/{usage-XSILDHKF.js → usage-WYFY2L6M.js} +50 -48
- package/dist/{verifiers-ECA5GIHL.js → verifiers-TYIW2XKF.js} +7 -7
- package/dist/{verify-R6QQCCEB.js → verify-242UFYTP.js} +6 -6
- package/dist/{web-fetch-PVZNMBOB.js → web-fetch-LRAGYU6Y.js} +3 -3
- package/dist/{wiki-generate-RP22WP5K.js → wiki-generate-OFKOX2T6.js} +53 -51
- package/dist/worker/entry.js +31 -29
- package/docs/architecture/architecture.md +1 -0
- package/docs/architecture/context-engine.md +4 -2
- package/docs/architecture/observability.md +6 -4
- package/docs/architecture/prompt-envelope-and-tools.md +1 -1
- package/docs/architecture/session-lifecycle.md +1 -1
- package/docs/architecture/tui-design.md +12 -9
- package/docs/gui/parity/02-slash-and-surfaces.md +1 -1
- package/docs/guide/commands-and-modes.md +91 -5
- package/docs/guide/configuration-and-targets.md +2 -2
- package/docs/guide/context-continuity.md +49 -0
- package/docs/guide/proactive-memory.md +6 -3
- package/library/registry.yaml +292 -32
- package/library/skills/README.md +27 -2
- package/library/skills/context/context-handoff/SKILL.md +10 -4
- package/library/skills/meta/clio-coder-dev/SKILL.md +92 -88
- package/library/skills/meta/clio-coder-dev/evals.md +51 -46
- package/library/skills/meta/clio-coder-dev/plugin.json +2 -2
- package/library/skills/meta/clio-coder-dev/references/change-map.md +49 -0
- package/library/skills/meta/clio-coder-test/SKILL.md +89 -142
- package/library/skills/meta/clio-coder-test/evals.md +58 -62
- package/library/skills/meta/clio-coder-test/plugin.json +2 -2
- package/library/skills/meta/clio-coder-test/references/harness.md +3 -3
- package/library/skills/meta/clio-coder-test/references/lifecycle-validation.md +30 -0
- package/library/skills/meta/clio-coder-test/references/test-map.md +60 -89
- package/library/skills/registry.yaml +5 -5
- package/library/skills/skill-marketplace.json +12 -14
- package/package.json +1 -1
- package/src/cli/skills-eval.ts +1064 -54
- package/src/cli/usage.ts +2 -2
- package/src/core/clio-repo.ts +3 -0
- package/src/core/tool-names.ts +1 -0
- package/src/domains/context/budget/inspection.ts +9 -0
- package/src/domains/context/budget/live-view.ts +418 -0
- package/src/domains/context/budget/pressure.ts +393 -0
- package/src/domains/context/budget/request-fit.ts +15 -0
- package/src/domains/evidence/build.ts +24 -0
- package/src/domains/gateway/mcp/client.ts +1 -1
- package/src/domains/memory/commit-state.ts +160 -0
- package/src/domains/memory/operations.ts +18 -10
- package/src/domains/memory/prompt-cache.ts +95 -0
- package/src/domains/memory/prompt-section.ts +50 -7
- package/src/domains/memory/relevance.ts +93 -0
- package/src/domains/memory/restoration.ts +78 -0
- package/src/domains/memory/store.ts +39 -1
- package/src/domains/middleware/memory-intervention.ts +116 -24
- package/src/domains/observability/background-memory-usage.ts +1 -1
- package/src/domains/observability/cost.ts +3 -3
- package/src/domains/observability/extension.ts +1 -1
- package/src/domains/observability/metrics.ts +1 -1
- package/src/domains/prompts/compiler.ts +1 -1
- package/src/domains/prompts/extension.ts +38 -1
- package/src/domains/quota/anthropic-max-provider.ts +134 -0
- package/src/domains/quota/anthropic-usage.ts +220 -0
- package/src/domains/quota/antigravity-provider.ts +339 -0
- package/src/domains/quota/cache.ts +87 -0
- package/src/domains/quota/claude-code-provider.ts +169 -0
- package/src/domains/quota/codex-provider.ts +237 -0
- package/src/domains/quota/presentation.ts +240 -0
- package/src/domains/quota/registry.ts +23 -0
- package/src/domains/quota/service.ts +93 -0
- package/src/domains/quota/summary-feed.ts +86 -0
- package/src/domains/quota/types.ts +84 -0
- package/src/domains/resources/index.ts +11 -0
- package/src/domains/resources/skills/catalog-view.ts +571 -0
- package/src/domains/resources/skills/lexical-match.ts +136 -0
- package/src/domains/resources/skills/loader.ts +38 -0
- package/src/domains/resources/skills/promotion.ts +1 -55
- package/src/domains/resources/skills/provenance-pin.ts +50 -20
- package/src/domains/safety/action-classifier.ts +1 -0
- package/src/domains/session/compaction/branch-summary.ts +4 -1
- package/src/domains/session/compaction/compact.ts +18 -2
- package/src/domains/session/compaction/cut-point.ts +20 -1
- package/src/domains/session/compaction/tokens.ts +48 -3
- package/src/domains/session/context-accounting.ts +8 -1
- package/src/domains/session/continuity/carry.ts +59 -0
- package/src/domains/session/continuity/contract.ts +592 -0
- package/src/domains/session/continuity/evidence.ts +290 -0
- package/src/domains/session/continuity/fold.ts +1075 -0
- package/src/domains/session/continuity/note.ts +79 -0
- package/src/domains/session/continuity/operator-request.ts +104 -0
- package/src/domains/session/continuity/persistence.ts +408 -0
- package/src/domains/session/continuity/ports.ts +231 -0
- package/src/domains/session/continuity/projection.ts +538 -0
- package/src/domains/session/continuity/validate.ts +352 -0
- package/src/domains/session/entries.ts +50 -3
- package/src/domains/session/index.ts +48 -0
- package/src/domains/session/migrations/index.ts +7 -3
- package/src/domains/session/tree/fork.ts +15 -1
- package/src/domains/session/usage.ts +2 -2
- package/src/engine/acp/commands.ts +1 -1
- package/src/engine/agent.ts +133 -9
- package/src/engine/session.ts +13 -6
- package/src/entry/orchestrator.ts +116 -33
- package/src/interactive/chat-loop-messages.ts +2 -2
- package/src/interactive/chat-loop.ts +219 -63
- package/src/interactive/chat-renderer.ts +99 -8
- package/src/interactive/context-overlay.ts +24 -3
- package/src/interactive/continuity-controller.ts +526 -0
- package/src/interactive/dispatch-board.ts +21 -3
- package/src/interactive/footer/dashboard.ts +25 -1
- package/src/interactive/footer/key-hints.ts +2 -2
- package/src/interactive/footer/pages.ts +70 -27
- package/src/interactive/footer/widgets.ts +32 -7
- package/src/interactive/footer-panel.ts +1 -1
- package/src/interactive/interactive-application.ts +7 -2
- package/src/interactive/interactive-input-runtime.ts +2 -2
- package/src/interactive/interactive-presentation.ts +15 -0
- package/src/interactive/interactive-slash-runtime.ts +45 -8
- package/src/interactive/interactive-tickers.ts +7 -1
- package/src/interactive/model-session-replay.ts +130 -3
- package/src/interactive/output-reserve.ts +35 -0
- package/src/interactive/overlay-general-openers.ts +12 -8
- package/src/interactive/overlay-key-routing.ts +6 -9
- package/src/interactive/overlay-lifecycle.ts +10 -6
- package/src/interactive/overlay-session-lifecycle.ts +21 -14
- package/src/interactive/quota-view.ts +229 -0
- package/src/interactive/session-last-turn.ts +1 -1
- package/src/interactive/session-transcript.ts +2 -1
- package/src/interactive/session-usage-reseed.ts +2 -2
- package/src/interactive/side-question.ts +2 -2
- package/src/interactive/slash-commands.ts +28 -9
- package/src/interactive/turn-context.ts +686 -63
- package/src/interactive/turn-middleware.ts +39 -6
- package/src/interactive/turn-persistence.ts +15 -2
- package/src/interactive/turn-prewarm.ts +1 -1
- package/src/interactive/turn-runtime.ts +48 -5
- package/src/interactive/{cost-overlay.ts → usage-overlay.ts} +121 -33
- package/src/interactive/welcome-dashboard.ts +26 -3
- package/src/tools/agent-tools.ts +3 -1
- package/src/tools/bootstrap.ts +6 -0
- package/src/tools/builtin-tool-catalog.ts +9 -0
- package/src/tools/context/index.ts +148 -113
- package/src/tools/context/surface.ts +11 -7
- package/src/tools/core-bootstrap.ts +4 -0
- package/src/tools/observation.ts +8 -2
- package/src/tools/policy.ts +3 -0
- package/src/tools/self-compact.ts +31 -0
- package/src/tools/surface.ts +1 -0
- package/src/tools/tasks.ts +1 -1
- package/dist/chunk-CTFPFW3H.js +0 -44
- package/dist/chunk-EOJPDNUP.js +0 -1325
- package/dist/chunk-I4Y4WKZR.js +0 -386
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Building `ContinuityFoldEvidence` from an actual session ledger.
|
|
3
|
+
*
|
|
4
|
+
* `contract.ts` states what a caller's resolver must have proven before the
|
|
5
|
+
* fold will treat a reference as authority. This module is that resolver for
|
|
6
|
+
* Clio's ledger. It reads one ordered array, the full applicable ledger before
|
|
7
|
+
* the replay cut, and every `position` it emits is an index into that same
|
|
8
|
+
* array, because that is the only coordinate system the fold accepts.
|
|
9
|
+
*
|
|
10
|
+
* It resolves nothing it cannot prove. A control request whose timestamp does
|
|
11
|
+
* not parse establishes no renewal base, so it is dropped rather than emitted
|
|
12
|
+
* with a guessed time; an eviction that two commits both claim is ambiguous, so
|
|
13
|
+
* neither claim becomes evidence. Dropping is the safe direction: missing
|
|
14
|
+
* evidence leaves a transaction recall-only, while a fabricated row would
|
|
15
|
+
* license execution.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import type { MessageEntry, SessionEntry } from "../entries.js";
|
|
19
|
+
import type {
|
|
20
|
+
ContinuityFoldEvidence,
|
|
21
|
+
ContinuityOutcomeEvidence,
|
|
22
|
+
OperatorResumeAuthorityEvidence,
|
|
23
|
+
TerminalResponseEvidence,
|
|
24
|
+
} from "./contract.js";
|
|
25
|
+
import { isHandoffRecoveryRequestEntry } from "./operator-request.js";
|
|
26
|
+
|
|
27
|
+
export interface ContinuityEvidenceInput {
|
|
28
|
+
/** The full applicable ledger before the replay cut, in ledger order. */
|
|
29
|
+
entries: ReadonlyArray<SessionEntry>;
|
|
30
|
+
/**
|
|
31
|
+
* Turn ids on the selected path. An operator control request whose claimed
|
|
32
|
+
* leaf is not on it was made on another branch and authorizes nothing here.
|
|
33
|
+
* Defaults to the message turns in `entries`.
|
|
34
|
+
*/
|
|
35
|
+
pathTurnIds?: ReadonlyArray<string>;
|
|
36
|
+
/**
|
|
37
|
+
* Records the reader could not parse. A torn fragment must not become
|
|
38
|
+
* permission, so this count travels into the fold rather than being dropped
|
|
39
|
+
* by the collector that already skipped the line (§6).
|
|
40
|
+
*/
|
|
41
|
+
unreadableRecords: number;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Classify one assistant response for acknowledgement.
|
|
46
|
+
*
|
|
47
|
+
* `success` is affirmative, not a default. The producer
|
|
48
|
+
* (`interactive/chat-loop-messages.ts:assistantSessionPayload`) writes
|
|
49
|
+
* `stopReason` **only** for a terminal failure, so a successful turn carries no
|
|
50
|
+
* stop reason at all and demanding a canonical success value would reject every
|
|
51
|
+
* real success. What can be required is everything else: no failure marker, no
|
|
52
|
+
* error message, visible nonempty text, and no tool call still outstanding.
|
|
53
|
+
*
|
|
54
|
+
* That last condition is the one that matters most here. A turn whose content
|
|
55
|
+
* holds a tool call has not terminated, whatever text it also produced: the host
|
|
56
|
+
* reads those structured calls to decide the run continues. Treating it as a
|
|
57
|
+
* terminal success would let an acknowledgement cite a turn that was still
|
|
58
|
+
* working.
|
|
59
|
+
*/
|
|
60
|
+
function terminalStatus(entry: MessageEntry): TerminalResponseEvidence["status"] {
|
|
61
|
+
const payload = entry.payload;
|
|
62
|
+
if (!payload || typeof payload !== "object") return "empty";
|
|
63
|
+
const record = payload as Record<string, unknown>;
|
|
64
|
+
const stop = record.stopReason;
|
|
65
|
+
if (stop === "error") return "error";
|
|
66
|
+
if (stop === "aborted") return "aborted";
|
|
67
|
+
if (stop === "interrupted") return "interrupted";
|
|
68
|
+
if (typeof record.errorMessage === "string" && record.errorMessage.length > 0) return "error";
|
|
69
|
+
// Any other recorded stop reason is a recorded failure or a non-terminal
|
|
70
|
+
// stop (`toolUse`, `length`); neither acknowledges a delivery.
|
|
71
|
+
if (stop !== undefined && stop !== "stop") return "empty";
|
|
72
|
+
if (record.continuityDeliveryId !== undefined && stop !== "stop") return "empty";
|
|
73
|
+
const content = Array.isArray(record.content) ? record.content : [];
|
|
74
|
+
for (const block of content) {
|
|
75
|
+
if (!block || typeof block !== "object") continue;
|
|
76
|
+
if ((block as Record<string, unknown>).type === "toolCall") return "empty";
|
|
77
|
+
}
|
|
78
|
+
if (typeof record.text === "string" && record.text.trim().length > 0) return "success";
|
|
79
|
+
for (const block of content) {
|
|
80
|
+
if (!block || typeof block !== "object") continue;
|
|
81
|
+
const typed = block as Record<string, unknown>;
|
|
82
|
+
if (typed.type === "text" && typeof typed.text === "string" && typed.text.trim().length > 0) return "success";
|
|
83
|
+
}
|
|
84
|
+
return "empty";
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Assistant responses, classified for acknowledgement.
|
|
89
|
+
*
|
|
90
|
+
* The continuation turn is the turn the response answers, which is the response
|
|
91
|
+
* entry's structural parent. Packet 03 mints `delivered.continuationTurnId` as
|
|
92
|
+
* that same turn id when it hands the replacement context over, so the two ends
|
|
93
|
+
* of the binding meet on one ledger pointer rather than on a runtime handle.
|
|
94
|
+
* A response with no parent answers nothing and is skipped.
|
|
95
|
+
*/
|
|
96
|
+
function terminalResponses(entries: ReadonlyArray<SessionEntry>): TerminalResponseEvidence[] {
|
|
97
|
+
const rows: TerminalResponseEvidence[] = [];
|
|
98
|
+
const messages = new Map(
|
|
99
|
+
entries.filter((entry): entry is MessageEntry => entry.kind === "message").map((entry) => [entry.turnId, entry]),
|
|
100
|
+
);
|
|
101
|
+
for (let position = 0; position < entries.length; position += 1) {
|
|
102
|
+
const entry = entries[position];
|
|
103
|
+
if (entry?.kind !== "message" || entry.role !== "assistant" || entry.parentTurnId === null) continue;
|
|
104
|
+
let continuationTurnId = entry.parentTurnId;
|
|
105
|
+
const payload = entry.payload as { continuityDeliveryId?: unknown } | null;
|
|
106
|
+
if (typeof payload?.continuityDeliveryId === "string") {
|
|
107
|
+
const delivery = entries
|
|
108
|
+
.slice(0, position)
|
|
109
|
+
.filter(
|
|
110
|
+
(candidate) =>
|
|
111
|
+
candidate.kind === "handoffTransaction" &&
|
|
112
|
+
candidate.event.phase === "delivered" &&
|
|
113
|
+
candidate.event.deliveryId === payload.continuityDeliveryId,
|
|
114
|
+
);
|
|
115
|
+
if (delivery.length !== 1) continue;
|
|
116
|
+
const intent = delivery[0];
|
|
117
|
+
if (intent?.kind !== "handoffTransaction" || intent.event.phase !== "delivered") continue;
|
|
118
|
+
const visited = new Set<string>();
|
|
119
|
+
let ancestor: string | null = entry.parentTurnId;
|
|
120
|
+
while (ancestor && ancestor !== intent.event.continuationTurnId && !visited.has(ancestor)) {
|
|
121
|
+
visited.add(ancestor);
|
|
122
|
+
const parent = messages.get(ancestor);
|
|
123
|
+
// New operator input ends this delivery's authority, even on the same branch.
|
|
124
|
+
if (parent?.role === "user") break;
|
|
125
|
+
ancestor = parent?.parentTurnId ?? null;
|
|
126
|
+
}
|
|
127
|
+
if (ancestor !== intent.event.continuationTurnId) continue;
|
|
128
|
+
continuationTurnId = ancestor;
|
|
129
|
+
}
|
|
130
|
+
rows.push({ entryId: entry.turnId, continuationTurnId, status: terminalStatus(entry), position });
|
|
131
|
+
}
|
|
132
|
+
return rows;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Operator control requests, from the reserved typed subtype only.
|
|
137
|
+
*
|
|
138
|
+
* A display echo of `/context compact` and the text of a user turn are not
|
|
139
|
+
* authority and never reach this list: the only carrier is the validated
|
|
140
|
+
* `contextHandoffRecoveryRequest` record (§3.1). `acceptedAtMs` comes from the
|
|
141
|
+
* record's own durable timestamp, which is the one base a renewed deadline may
|
|
142
|
+
* be measured from.
|
|
143
|
+
*/
|
|
144
|
+
function resumeAuthorities(
|
|
145
|
+
entries: ReadonlyArray<SessionEntry>,
|
|
146
|
+
pathTurnIds: ReadonlySet<string>,
|
|
147
|
+
): OperatorResumeAuthorityEvidence[] {
|
|
148
|
+
const rows: OperatorResumeAuthorityEvidence[] = [];
|
|
149
|
+
// The immutable branch anchor each handoff actually recorded. A request has
|
|
150
|
+
// to agree with it, and the only place that fact exists is the transaction's
|
|
151
|
+
// own records.
|
|
152
|
+
const anchorByHandoff = new Map<string, string | null>();
|
|
153
|
+
for (const entry of entries) {
|
|
154
|
+
const identity =
|
|
155
|
+
entry.kind === "handoffTransaction"
|
|
156
|
+
? entry.identity
|
|
157
|
+
: entry.kind === "continuityCommit"
|
|
158
|
+
? entry.continuity.identity
|
|
159
|
+
: entry.kind === "compactionSummary"
|
|
160
|
+
? entry.continuity?.identity
|
|
161
|
+
: undefined;
|
|
162
|
+
if (identity === undefined) continue;
|
|
163
|
+
if (!anchorByHandoff.has(identity.handoffId)) anchorByHandoff.set(identity.handoffId, identity.branchAnchorTurnId);
|
|
164
|
+
}
|
|
165
|
+
for (let position = 0; position < entries.length; position += 1) {
|
|
166
|
+
const entry = entries[position];
|
|
167
|
+
if (!isHandoffRecoveryRequestEntry(entry)) continue;
|
|
168
|
+
const acceptedAtMs = Date.parse(entry.timestamp);
|
|
169
|
+
if (!Number.isFinite(acceptedAtMs)) continue;
|
|
170
|
+
const data = entry.data;
|
|
171
|
+
if (data === undefined) continue;
|
|
172
|
+
// 02A matches handoff, action, answered head, session and order, and
|
|
173
|
+
// explicitly leaves these bindings to the resolver. They cannot be
|
|
174
|
+
// recovered later either: `OperatorResumeAuthorityEvidence` does not carry
|
|
175
|
+
// the branch fields, so an unbound request checked here is unbound
|
|
176
|
+
// forever. A request naming a sibling branch or an unrelated leaf is
|
|
177
|
+
// dropped rather than emitted with its bindings discarded.
|
|
178
|
+
if (!anchorByHandoff.has(data.handoffId)) continue;
|
|
179
|
+
if (anchorByHandoff.get(data.handoffId) !== data.branchAnchorTurnId) continue;
|
|
180
|
+
// The envelope's structural parent is the leaf the request claims it was
|
|
181
|
+
// made at. §3.1 requires `parentTurnId` to equal the selected message leaf,
|
|
182
|
+
// so a record whose envelope and payload disagree is not the adopted shape.
|
|
183
|
+
if (entry.parentTurnId !== data.selectedLeafTurnId) continue;
|
|
184
|
+
// And that leaf has to be on the path this projection is about. A request
|
|
185
|
+
// made on a branch the reader is not standing on grants nothing here.
|
|
186
|
+
if (data.selectedLeafTurnId !== null && !pathTurnIds.has(data.selectedLeafTurnId)) continue;
|
|
187
|
+
rows.push({
|
|
188
|
+
operatorRequestEntryId: entry.turnId,
|
|
189
|
+
handoffId: data.handoffId,
|
|
190
|
+
action: data.action,
|
|
191
|
+
pausedOrFailedEntryId: data.pausedOrFailedEntryId,
|
|
192
|
+
originSessionId: data.sessionId,
|
|
193
|
+
position,
|
|
194
|
+
acceptedAtMs,
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
return rows;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Summary and eviction records bound to the commit that produced them.
|
|
202
|
+
*
|
|
203
|
+
* The two outcomes carry different strengths of binding and this resolver does
|
|
204
|
+
* not pretend otherwise. A `summarized` outcome is self-declaring: the summary
|
|
205
|
+
* carries the continuity payload, so it names its own handoff and commit, and a
|
|
206
|
+
* summary belonging to another transaction can never be mistaken for it. An
|
|
207
|
+
* `evicted` outcome has no such field, because `contextEviction` is a
|
|
208
|
+
* working-set record that predates continuity and gains nothing from carrying a
|
|
209
|
+
* handoff payload. Its binding is therefore the commit's own `evictionRef`,
|
|
210
|
+
* qualified two ways: exactly one commit in this input may claim the eviction,
|
|
211
|
+
* and the eviction must be positioned before the commit that claims it, which
|
|
212
|
+
* is the order §5's write group produces. An eviction two commits both claim is
|
|
213
|
+
* ambiguous and yields no evidence for either.
|
|
214
|
+
*/
|
|
215
|
+
function outcomeRefs(entries: ReadonlyArray<SessionEntry>): ContinuityOutcomeEvidence[] {
|
|
216
|
+
const rows: ContinuityOutcomeEvidence[] = [];
|
|
217
|
+
const positions = new Map<string, number>();
|
|
218
|
+
for (let position = 0; position < entries.length; position += 1) {
|
|
219
|
+
const entry = entries[position];
|
|
220
|
+
if (entry === undefined) continue;
|
|
221
|
+
if (!positions.has(entry.turnId)) positions.set(entry.turnId, position);
|
|
222
|
+
if (entry.kind === "compactionSummary" && entry.continuity !== undefined) {
|
|
223
|
+
rows.push({
|
|
224
|
+
entryId: entry.turnId,
|
|
225
|
+
outcome: "summarized",
|
|
226
|
+
handoffId: entry.continuity.identity.handoffId,
|
|
227
|
+
commitId: entry.continuity.identity.commitId,
|
|
228
|
+
position,
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
// Eviction claims come from a commit row **and** from a summary carrying that
|
|
233
|
+
// commit. Reading only commit rows would withhold the binding in precisely
|
|
234
|
+
// the situation reconstruction exists for: the commit row is the thing that
|
|
235
|
+
// went missing, and the validated carry is what proves it existed. The carry
|
|
236
|
+
// names the same immutable identity and the same original outcome, so it is
|
|
237
|
+
// the same claim, not a different one; a carry never turns an evicted outcome
|
|
238
|
+
// into a summarized one, because the outcome is read off the carried commit.
|
|
239
|
+
const claims = new Map<string, { handoffId: string; commitId: string; claimedAt: number } | null>();
|
|
240
|
+
for (let position = 0; position < entries.length; position += 1) {
|
|
241
|
+
const entry = entries[position];
|
|
242
|
+
const payload =
|
|
243
|
+
entry?.kind === "continuityCommit"
|
|
244
|
+
? entry.continuity
|
|
245
|
+
: entry?.kind === "compactionSummary"
|
|
246
|
+
? entry.continuity
|
|
247
|
+
: undefined;
|
|
248
|
+
if (payload === undefined) continue;
|
|
249
|
+
const ref = payload.commit.evictionRef;
|
|
250
|
+
if (ref === undefined || payload.commit.outcome !== "evicted") continue;
|
|
251
|
+
const identity = payload.identity;
|
|
252
|
+
// The ordering bound is the commit's own recorded position when the row is
|
|
253
|
+
// present, and the carrying record's position otherwise. Both are real
|
|
254
|
+
// positions of real records in this one array.
|
|
255
|
+
const claimedAt = positions.get(payload.commit.entry.turnId) ?? position;
|
|
256
|
+
const existing = claims.get(ref);
|
|
257
|
+
if (existing === undefined) {
|
|
258
|
+
claims.set(ref, { handoffId: identity.handoffId, commitId: identity.commitId, claimedAt });
|
|
259
|
+
continue;
|
|
260
|
+
}
|
|
261
|
+
// A second claim only conflicts when it is a different transaction. An
|
|
262
|
+
// identical duplicate, a commit row and the summary that carries it
|
|
263
|
+
// included, is idempotent, here as in the fold.
|
|
264
|
+
if (existing !== null && (existing.handoffId !== identity.handoffId || existing.commitId !== identity.commitId)) {
|
|
265
|
+
claims.set(ref, null);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
for (const [ref, claim] of claims) {
|
|
269
|
+
if (claim === null) continue;
|
|
270
|
+
const position = positions.get(ref);
|
|
271
|
+
if (position === undefined || position >= claim.claimedAt) continue;
|
|
272
|
+
if (entries[position]?.kind !== "contextEviction") continue;
|
|
273
|
+
rows.push({ entryId: ref, outcome: "evicted", handoffId: claim.handoffId, commitId: claim.commitId, position });
|
|
274
|
+
}
|
|
275
|
+
return rows;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/** Resolve every evidence list the fold needs from one ordered ledger. */
|
|
279
|
+
export function resolveContinuityEvidence(input: ContinuityEvidenceInput): ContinuityFoldEvidence {
|
|
280
|
+
const pathTurnIds = new Set(
|
|
281
|
+
input.pathTurnIds ??
|
|
282
|
+
input.entries.filter((entry): entry is MessageEntry => entry.kind === "message").map((entry) => entry.turnId),
|
|
283
|
+
);
|
|
284
|
+
return {
|
|
285
|
+
resumeAuthorities: resumeAuthorities(input.entries, pathTurnIds),
|
|
286
|
+
terminalResponses: terminalResponses(input.entries),
|
|
287
|
+
outcomeRefs: outcomeRefs(input.entries),
|
|
288
|
+
unreadableRecords: input.unreadableRecords,
|
|
289
|
+
};
|
|
290
|
+
}
|