otacon 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -5
- package/dist/cli/browser.js +1 -1
- package/dist/cli/browser.js.map +1 -1
- package/dist/cli/client.js +13 -2
- package/dist/cli/client.js.map +1 -1
- package/dist/cli/commands/answer.js +1 -1
- package/dist/cli/commands/answer.js.map +1 -1
- package/dist/cli/commands/ask.js +3 -3
- package/dist/cli/commands/ask.js.map +1 -1
- package/dist/cli/commands/clean.js +14 -16
- package/dist/cli/commands/clean.js.map +1 -1
- package/dist/cli/commands/config.js +1 -1
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/doctor.js +4 -4
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/expose.js +7 -7
- package/dist/cli/commands/expose.js.map +1 -1
- package/dist/cli/commands/implement-done.js +1 -1
- package/dist/cli/commands/implement-done.js.map +1 -1
- package/dist/cli/commands/install.js +16 -10
- package/dist/cli/commands/install.js.map +1 -1
- package/dist/cli/commands/open.js +31 -7
- package/dist/cli/commands/open.js.map +1 -1
- package/dist/cli/commands/progress.js +1 -1
- package/dist/cli/commands/progress.js.map +1 -1
- package/dist/cli/commands/resume.js +67 -0
- package/dist/cli/commands/resume.js.map +1 -0
- package/dist/cli/commands/start.js +24 -3
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/status.js +15 -4
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/submit.js +5 -5
- package/dist/cli/commands/submit.js.map +1 -1
- package/dist/cli/commands/update.js +83 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/commands/wait.js +1 -1
- package/dist/cli/commands/wait.js.map +1 -1
- package/dist/cli/install/assets.js +123 -48
- package/dist/cli/install/assets.js.map +1 -1
- package/dist/cli/install/locations.js +1 -1
- package/dist/cli/install/locations.js.map +1 -1
- package/dist/cli/install/tailscale.js +2 -2
- package/dist/cli/install/tailscale.js.map +1 -1
- package/dist/cli/install/wrapper.js +202 -0
- package/dist/cli/install/wrapper.js.map +1 -0
- package/dist/cli/main.js +10 -3
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/output.js +2 -2
- package/dist/cli/output.js.map +1 -1
- package/dist/cli/session.js +18 -7
- package/dist/cli/session.js.map +1 -1
- package/dist/cli/update.js +236 -0
- package/dist/cli/update.js.map +1 -0
- package/dist/daemon/activity.js +1 -1
- package/dist/daemon/activity.js.map +1 -1
- package/dist/daemon/anchor.js +1 -1
- package/dist/daemon/anchor.js.map +1 -1
- package/dist/daemon/app.js +370 -82
- package/dist/daemon/app.js.map +1 -1
- package/dist/daemon/approve.js +3 -3
- package/dist/daemon/approve.js.map +1 -1
- package/dist/daemon/capture/adapter.js +23 -0
- package/dist/daemon/capture/adapter.js.map +1 -0
- package/dist/daemon/capture/claude.js +274 -0
- package/dist/daemon/capture/claude.js.map +1 -0
- package/dist/daemon/capture/codex.js +413 -0
- package/dist/daemon/capture/codex.js.map +1 -0
- package/dist/daemon/capture/normalize.js +89 -0
- package/dist/daemon/capture/normalize.js.map +1 -0
- package/dist/daemon/capture/opencode.js +330 -0
- package/dist/daemon/capture/opencode.js.map +1 -0
- package/dist/daemon/capture/registry.js +33 -0
- package/dist/daemon/capture/registry.js.map +1 -0
- package/dist/daemon/capture/stream-store.js +121 -0
- package/dist/daemon/capture/stream-store.js.map +1 -0
- package/dist/daemon/capture/tailer.js +108 -0
- package/dist/daemon/capture/tailer.js.map +1 -0
- package/dist/daemon/desktop-notify.js +11 -5
- package/dist/daemon/desktop-notify.js.map +1 -1
- package/dist/daemon/diagrams.js +90 -0
- package/dist/daemon/diagrams.js.map +1 -0
- package/dist/daemon/diff.js +1 -2
- package/dist/daemon/diff.js.map +1 -1
- package/dist/daemon/linter/parse.js +45 -12
- package/dist/daemon/linter/parse.js.map +1 -1
- package/dist/daemon/linter/rules.js +20 -17
- package/dist/daemon/linter/rules.js.map +1 -1
- package/dist/daemon/main.js +1 -1
- package/dist/daemon/main.js.map +1 -1
- package/dist/daemon/notify.js +1 -1
- package/dist/daemon/notify.js.map +1 -1
- package/dist/daemon/presence.js +1 -1
- package/dist/daemon/presence.js.map +1 -1
- package/dist/daemon/queue.js +7 -7
- package/dist/daemon/queue.js.map +1 -1
- package/dist/daemon/store.js +66 -79
- package/dist/daemon/store.js.map +1 -1
- package/dist/daemon/threads.js +111 -25
- package/dist/daemon/threads.js.map +1 -1
- package/dist/daemon/transcript.js +1 -1
- package/dist/daemon/transcript.js.map +1 -1
- package/dist/daemon/ui.js +13 -6
- package/dist/daemon/ui.js.map +1 -1
- package/dist/daemon/viewers.js +37 -0
- package/dist/daemon/viewers.js.map +1 -0
- package/dist/shared/config.js +52 -7
- package/dist/shared/config.js.map +1 -1
- package/dist/shared/gwt.js +1 -1
- package/dist/shared/gwt.js.map +1 -1
- package/dist/shared/paths.js +68 -33
- package/dist/shared/paths.js.map +1 -1
- package/dist/shared/question-spec.js +1 -1
- package/dist/shared/question-spec.js.map +1 -1
- package/dist/shared/types.js +7 -3
- package/dist/shared/types.js.map +1 -1
- package/dist/shared/version.js +1 -1
- package/dist/skills/otacon/SKILL.md +250 -0
- package/dist/ui/assets/{arc-KT3ZnaMp.js → arc-BUR2DxNA.js} +1 -1
- package/dist/ui/assets/architecture-7EHR7CIX-TTokq2IO.js +1 -0
- package/dist/ui/assets/{architectureDiagram-3BPJPVTR-DLu0UM7N.js → architectureDiagram-3BPJPVTR-unLnkDyM.js} +1 -1
- package/dist/ui/assets/{blockDiagram-GPEHLZMM-B8wApEWC.js → blockDiagram-GPEHLZMM-DHx8lNeL.js} +1 -1
- package/dist/ui/assets/{c4Diagram-AAUBKEIU-BNS5gmQS.js → c4Diagram-AAUBKEIU-BU9T562l.js} +1 -1
- package/dist/ui/assets/channel-BA6ChrT3.js +1 -0
- package/dist/ui/assets/{chunk-2J33WTMH-CTY2etwY.js → chunk-2J33WTMH-BEb0myVl.js} +1 -1
- package/dist/ui/assets/{chunk-3OPIFGDE-DZM4Sz84.js → chunk-3OPIFGDE-DESBG_RB.js} +1 -1
- package/dist/ui/assets/{chunk-4BX2VUAB-sGwrrXIO.js → chunk-4BX2VUAB-dt3F_E_5.js} +1 -1
- package/dist/ui/assets/{chunk-55IACEB6-CGlNp76o.js → chunk-55IACEB6-BcyuZM7U.js} +1 -1
- package/dist/ui/assets/{chunk-5ZQYHXKU-5zebJ3jW.js → chunk-5ZQYHXKU-DqdwSJlO.js} +1 -1
- package/dist/ui/assets/{chunk-727SXJPM-DelmUpvy.js → chunk-727SXJPM-B04SqNWj.js} +1 -1
- package/dist/ui/assets/{chunk-AQP2D5EJ-DMVzBf3M.js → chunk-AQP2D5EJ-DpjCPBWN.js} +1 -1
- package/dist/ui/assets/{chunk-BSJP7CBP-CZHrcpSu.js → chunk-BSJP7CBP-BNOU3k5G.js} +1 -1
- package/dist/ui/assets/{chunk-CSCIHK7Q-C1efTp0O.js → chunk-CSCIHK7Q-iWOtNZm_.js} +1 -1
- package/dist/ui/assets/{chunk-FMBD7UC4-B6axGwgn.js → chunk-FMBD7UC4-BHH_etky.js} +1 -1
- package/dist/ui/assets/{chunk-KSCS5N6A-DSaxbrm0.js → chunk-KSCS5N6A-DbRuazP3.js} +1 -1
- package/dist/ui/assets/{chunk-L5ZTLDWV-D9ZKdVGx.js → chunk-L5ZTLDWV-B2ZZFONi.js} +1 -1
- package/dist/ui/assets/{chunk-LZXEDZCA-DI5_1s00.js → chunk-LZXEDZCA-DryVpwAh.js} +2 -2
- package/dist/ui/assets/{chunk-ND2GUHAM-DQQ4RVLE.js → chunk-ND2GUHAM-2Bb1izqg.js} +1 -1
- package/dist/ui/assets/{chunk-NZK2D7GU-9zJJaDpb.js → chunk-NZK2D7GU-2DhvLbqL.js} +1 -1
- package/dist/ui/assets/{chunk-O5CBEL6O-DUOshAt2.js → chunk-O5CBEL6O-B5oigO7D.js} +1 -1
- package/dist/ui/assets/chunk-QZHKN3VN-BDHgdxoT.js +1 -0
- package/dist/ui/assets/chunk-WU5MYG2G-FDJTP_wT.js +1 -0
- package/dist/ui/assets/{chunk-XPW4576I-DQVL_GAl.js → chunk-XPW4576I-Dmq-O7bc.js} +1 -1
- package/dist/ui/assets/classDiagram-4FO5ZUOK-B5kZsiIt.js +1 -0
- package/dist/ui/assets/classDiagram-v2-Q7XG4LA2-B5kZsiIt.js +1 -0
- package/dist/ui/assets/{cose-bilkent-S5V4N54A-C7m3VlSW.js → cose-bilkent-S5V4N54A-oTsqU1DY.js} +1 -1
- package/dist/ui/assets/{dagre-BM42HDAG-CoU_T6EY.js → dagre-BM42HDAG-CZykCU6B.js} +1 -1
- package/dist/ui/assets/{diagram-2AECGRRQ-C_R7oNKE.js → diagram-2AECGRRQ-BY7clIlO.js} +1 -1
- package/dist/ui/assets/{diagram-5GNKFQAL-UhE2W3Yi.js → diagram-5GNKFQAL-BWdq4hV0.js} +1 -1
- package/dist/ui/assets/{diagram-KO2AKTUF-D4KZCRld.js → diagram-KO2AKTUF-CCGEaiZg.js} +1 -1
- package/dist/ui/assets/{diagram-LMA3HP47-CsOe8-S6.js → diagram-LMA3HP47-CVkepFYU.js} +1 -1
- package/dist/ui/assets/{diagram-OG6HWLK6-Bkbs2V54.js → diagram-OG6HWLK6-f-NjsfLG.js} +1 -1
- package/dist/ui/assets/{dist-BcowSnUl.js → dist-ZqsueX9_.js} +1 -1
- package/dist/ui/assets/{erDiagram-TEJ5UH35-DJXsykZz.js → erDiagram-TEJ5UH35-D8Wn6QP3.js} +1 -1
- package/dist/ui/assets/eventmodeling-FCH6USID-BODDoY6e.js +1 -0
- package/dist/ui/assets/{flowDiagram-I6XJVG4X-Chguj9Xz.js → flowDiagram-I6XJVG4X-BYnhla9k.js} +1 -1
- package/dist/ui/assets/{ganttDiagram-6RSMTGT7-DXdpFesp.js → ganttDiagram-6RSMTGT7-Dpu52ZRF.js} +1 -1
- package/dist/ui/assets/{gitGraph-WXDBUCRP-Doq1CcxB.js → gitGraph-WXDBUCRP-ou8xzQe1.js} +1 -1
- package/dist/ui/assets/{gitGraphDiagram-PVQCEYII-uxGwHEPv.js → gitGraphDiagram-PVQCEYII-BnTuFH7F.js} +1 -1
- package/dist/ui/assets/index-B2mL0c61.js +11 -0
- package/dist/ui/assets/index-sZ1TgAvb.css +1 -0
- package/dist/ui/assets/{info-J43DQDTF-CgWT_d3M.js → info-J43DQDTF-xgUHa7k0.js} +1 -1
- package/dist/ui/assets/{infoDiagram-5YYISTIA-B3oDA2Ct.js → infoDiagram-5YYISTIA-DJBudrwD.js} +1 -1
- package/dist/ui/assets/{ishikawaDiagram-YF4QCWOH-C6l0lvC3.js → ishikawaDiagram-YF4QCWOH-DpFHgERI.js} +1 -1
- package/dist/ui/assets/{journeyDiagram-JHISSGLW-COf53NwC.js → journeyDiagram-JHISSGLW-Cd32hdpY.js} +1 -1
- package/dist/ui/assets/{kanban-definition-UN3LZRKU-DaOPRBld.js → kanban-definition-UN3LZRKU-Dm1V8lr0.js} +1 -1
- package/dist/ui/assets/{line-new3jLu3.js → line-CZu6_PMX.js} +1 -1
- package/dist/ui/assets/{linear-yA22knFB.js → linear-2tkTX_U2.js} +1 -1
- package/dist/ui/assets/{mermaid-parser.core-D8JVCOKU.js → mermaid-parser.core-C4m04cRe.js} +2 -2
- package/dist/ui/assets/{mermaid.core-BCrPyVBK.js → mermaid.core-BPeg1ewg.js} +3 -3
- package/dist/ui/assets/{mindmap-definition-RKZ34NQL-CVcJTWsW.js → mindmap-definition-RKZ34NQL-BENqEkIK.js} +1 -1
- package/dist/ui/assets/{packet-YPE3B663-DlSwpK-G.js → packet-YPE3B663-DNO0oBLH.js} +1 -1
- package/dist/ui/assets/{pie-LRSECV5Y-CyMpbo4C.js → pie-LRSECV5Y-CWoz31oB.js} +1 -1
- package/dist/ui/assets/{pieDiagram-4H26LBE5-Dy7day5R.js → pieDiagram-4H26LBE5-CtmxhUGI.js} +1 -1
- package/dist/ui/assets/{plan-view-CE2ha0qY.js → plan-view-bZtdFbit.js} +4 -4
- package/dist/ui/assets/{quadrantDiagram-W4KKPZXB-CVjVgbaQ.js → quadrantDiagram-W4KKPZXB-BO3IZNbx.js} +1 -1
- package/dist/ui/assets/{radar-GUYGQ44K-DLPfv0jT.js → radar-GUYGQ44K-AEfROz99.js} +1 -1
- package/dist/ui/assets/{requirementDiagram-4Y6WPE33-y_0KOdN8.js → requirementDiagram-4Y6WPE33-D-wQ1szT.js} +1 -1
- package/dist/ui/assets/{sankeyDiagram-5OEKKPKP-8T3b7meL.js → sankeyDiagram-5OEKKPKP-Bj4kD_AJ.js} +1 -1
- package/dist/ui/assets/{sequenceDiagram-3UESZ5HK-Cn8DZiEr.js → sequenceDiagram-3UESZ5HK-M8QVVH74.js} +1 -1
- package/dist/ui/assets/{src-BieOuieI.js → src-DvptJAGq.js} +1 -1
- package/dist/ui/assets/{stateDiagram-AJRCARHV-nPEVGd3E.js → stateDiagram-AJRCARHV-BiPRs9rN.js} +1 -1
- package/dist/ui/assets/stateDiagram-v2-BHNVJYJU-BYjicZlC.js +1 -0
- package/dist/ui/assets/{timeline-definition-PNZ67QCA-Dj_qK0VJ.js → timeline-definition-PNZ67QCA-DS0AGRKw.js} +1 -1
- package/dist/ui/assets/{treeView-BLDUP644-G5Bsebqu.js → treeView-BLDUP644-DJakvUbF.js} +1 -1
- package/dist/ui/assets/{treemap-LRROVOQU-anUEJzTb.js → treemap-LRROVOQU-QXfc2Vwr.js} +1 -1
- package/dist/ui/assets/{vennDiagram-CIIHVFJN-D71ne3dS.js → vennDiagram-CIIHVFJN-CBdJA0hv.js} +1 -1
- package/dist/ui/assets/{wardley-L42UT6IY-DrJilmE_.js → wardley-L42UT6IY-DI9SdW45.js} +1 -1
- package/dist/ui/assets/{wardleyDiagram-YWT4CUSO-B66G4ayp.js → wardleyDiagram-YWT4CUSO-RMmsKLRe.js} +1 -1
- package/dist/ui/assets/{xychartDiagram-2RQKCTM6-CReSRxNG.js → xychartDiagram-2RQKCTM6-DFXccP8B.js} +1 -1
- package/dist/ui/index.html +2 -2
- package/package.json +7 -5
- package/dist/ui/assets/architecture-7EHR7CIX-Cw3I1lil.js +0 -1
- package/dist/ui/assets/channel-CkOta24Z.js +0 -1
- package/dist/ui/assets/chunk-QZHKN3VN-DqRxzBM_.js +0 -1
- package/dist/ui/assets/chunk-WU5MYG2G-B1Mk3aBp.js +0 -1
- package/dist/ui/assets/classDiagram-4FO5ZUOK-BH-5P4jH.js +0 -1
- package/dist/ui/assets/classDiagram-v2-Q7XG4LA2-BH-5P4jH.js +0 -1
- package/dist/ui/assets/eventmodeling-FCH6USID-DSDI1f5T.js +0 -1
- package/dist/ui/assets/index-BsTJ9Ul_.css +0 -1
- package/dist/ui/assets/index-D-TSanrw.js +0 -11
- package/dist/ui/assets/stateDiagram-v2-BHNVJYJU-CKrff-KJ.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../../src/daemon/capture/claude.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,gFAAgF;AAChF,gFAAgF;AAChF,wDAAwD;AACxD,6EAA6E;AAC7E,oDAAoD;AACpD,EAAE;AACF,yEAAyE;AACzE,8EAA8E;AAC9E,8EAA8E;AAC9E,0EAA0E;AAC1E,2EAA2E;AAC3E,8EAA8E;AAC9E,8EAA8E;AAC9E,yDAAyD;AAEzD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAG5D,MAAM,KAAK,GAAG,QAAQ,CAAC;AAEvB,8EAA8E;AAC9E,SAAS,YAAY;IACnB,yEAAyE;IACzE,0EAA0E;IAC1E,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IACxF,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;GAKG;AACH,SAAS,gBAAgB,CAAC,QAAgB;IACxC,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACtC,CAAC;AAED,8EAA8E;AAC9E,SAAS,WAAW,CAAC,IAAY;IAC/B,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,OAAO,KAAK,EAAE;YAAE,SAAS;QAC7B,IAAI,CAAC;YACH,MAAM,GAAG,GAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAuB,CAAC,GAAG,CAAC;YAC3D,IAAI,OAAO,GAAG,KAAK,QAAQ;gBAAE,OAAO,GAAG,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,2DAA2D;QAC7D,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACH,SAAS,MAAM,CAAC,QAAgB;IAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC7D,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,CAAC,sCAAsC;IACrD,CAAC;IACD,MAAM,UAAU,GAAwC,EAAE,CAAC;IAC3D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,SAAS;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC;YACH,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,mDAAmD;QACrD,CAAC;IACH,CAAC;IACD,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;IACjD,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,UAAU,EAAE,CAAC;QAClC,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,QAAQ;YAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACpE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAoBD,MAAM,cAAc,GAAG,EAAE,CAAC;AAE1B,gFAAgF;AAChF,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACvD,CAAC;AAED,iFAAiF;AACjF,SAAS,KAAK,CAAC,IAAY;IACzB,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAChC,OAAO,OAAO,CAAC,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;AAChG,CAAC;AAED,kFAAkF;AAClF,SAAS,OAAO,CAAC,CAAS,EAAE,QAAgB;IAC1C,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,EAAE;QAAE,OAAO,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9D,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAC7B,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAClC,6EAA6E;IAC7E,6EAA6E;IAC7E,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IACpE,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClC,CAAC;AAED,gFAAgF;AAChF,SAAS,SAAS,CAAC,IAAY,EAAE,KAA8B,EAAE,QAAgB;IAC/E,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;IACtE,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM;YACT,OAAO,QAAQ,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QACrC,KAAK,MAAM,CAAC;QACZ,KAAK,WAAW;YACd,OAAO,QAAQ,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QACrC,KAAK,OAAO;YACV,OAAO,SAAS,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QACtC,KAAK,MAAM;YACT,OAAO,SAAS,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QACvD,KAAK,MAAM;YACT,OAAO,QAAQ,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/C,KAAK,MAAM;YACT,OAAO,QAAQ,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/C,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO;YACV,OAAO,SAAS,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,CAAC;QACpD;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,SAAS,UAAU,CAAC,OAAgB;IAClC,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAChD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,OAAO;aACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAQ,CAAwB,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAE,CAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;aAClI,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;aACvB,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,oFAAoF;AACpF,SAAS,YAAY,CAAC,KAAmB,EAAE,QAAgB;IACzD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;gBAAE,OAAO,IAAI,CAAC;YACpC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACtE,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,QAAQ,GAAG,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1E,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE;gBAAE,OAAO,IAAI,CAAC;YACxC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QACpE,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;YAClE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAE,KAAK,CAAC,KAAiC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7G,OAAO;gBACL,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI;gBACV,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC;gBACvC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;gBAC7B,MAAM,EAAE,SAAS;aAClB,CAAC;QACJ,CAAC;QACD,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,2EAA2E;YAC3E,4DAA4D;YAC5D,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC;YACxC,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACzC,OAAO;gBACL,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;gBAChC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;gBACnC,MAAM,EAAE,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;aAC3C,CAAC;QACJ,CAAC;QACD;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,SAAS,YAAY,CAAC,IAAoB,EAAE,QAAgB;IAC1D,2EAA2E;IAC3E,uEAAuE;IACvE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC;IAChC,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,EAAE,CAAC;IACvD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC;IACtC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IACvC,MAAM,MAAM,GAAqB,EAAE,CAAC;IACpC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QAClD,MAAM,KAAK,GAAG,YAAY,CAAC,KAAqB,EAAE,QAAQ,CAAC,CAAC;QAC5D,IAAI,KAAK;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,SAAS,KAAK,CAAC,MAAwB,EAAE,MAAc;IACrD,MAAM,QAAQ,GAAI,MAAM,CAAC,QAA+B,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC3F,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,uCAAuC;IACxE,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3F,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAC5B,4EAA4E;QAC5E,yEAAyE;QACzE,MAAM,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACjD,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC;IACvE,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QAClB,4EAA4E;QAC5E,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC;IACjE,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,gCAAgC;IACzE,6EAA6E;IAC7E,2EAA2E;IAC3E,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAqB,EAAE,CAAC;IACpC,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QAC3B,IAAI,OAAO,KAAK,EAAE;YAAE,SAAS;QAC7B,IAAI,MAAsB,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAmB,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,CAAC,kCAAkC;QAC9C,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,EAAE,QAAQ,EAAE,EAAE,CAAC;AACrF,CAAC;AAED,iEAAiE;AACjE,MAAM,CAAC,MAAM,aAAa,GAAsB;IAC9C,KAAK,EAAE,KAAK;IACZ,MAAM;IACN,KAAK;CACN,CAAC;AAEF,oEAAoE;AACpE,MAAM,CAAC,MAAM,MAAM,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1,413 @@
|
|
|
1
|
+
// The Codex CLI transcript adapter. Codex writes a per-session "rollout" JSONL
|
|
2
|
+
// under `$CODEX_HOME/sessions/<YYYY>/<MM>/<DD>/rollout-<ts>-<uuid>.jsonl`
|
|
3
|
+
// (`$CODEX_HOME` overrides `~/.codex`). Each line is a JSON envelope
|
|
4
|
+
// `{ timestamp, type, payload }`. A leading `type:"session_meta"` record carries
|
|
5
|
+
// the session `cwd` (used by `locate`). Subsequent `type:"response_item"`
|
|
6
|
+
// records wrap the items we map: `reasoning` (model thinking),
|
|
7
|
+
// `message` (role assistant/user with content blocks), `function_call`
|
|
8
|
+
// (tool invocation with `name` + `arguments` JSON string + `call_id`), and
|
|
9
|
+
// `function_call_output` (the tool outcome). `event_msg`/`turn_context` and any
|
|
10
|
+
// payload we don't recognize are skipped.
|
|
11
|
+
//
|
|
12
|
+
// `locate` scans every rollout under the sessions tree (CODEX_HOME-aware),
|
|
13
|
+
// newest-first by mtime, and returns the first whose `session_meta.cwd` equals
|
|
14
|
+
// the repo root. `parse` reads new BYTES since the cursor offset, consumes only
|
|
15
|
+
// COMPLETE lines (leaving a trailing partial for the next poll), and maps each
|
|
16
|
+
// recognized payload to a `RawStreamEvent`. Everything is fail-soft: an
|
|
17
|
+
// unreadable file, a torn line, or an unexpected shape is skipped, never thrown
|
|
18
|
+
// — the worst case is the session running on the `otacon progress` floor.
|
|
19
|
+
//
|
|
20
|
+
// Codex versions vary, so the mappers are defensive: the shell tool may be
|
|
21
|
+
// `exec_command` (with a string `cmd`) on current builds or the older `shell`
|
|
22
|
+
// (with a `command` string array); both are handled. A tool's running event and
|
|
23
|
+
// its later outcome are emitted as TWO separate appended events (the store is
|
|
24
|
+
// append-only and never upserts).
|
|
25
|
+
import { closeSync, openSync, readSync, readdirSync, readFileSync, statSync } from "node:fs";
|
|
26
|
+
import { homedir } from "node:os";
|
|
27
|
+
import { isAbsolute, join, relative, sep } from "node:path";
|
|
28
|
+
const AGENT = "codex";
|
|
29
|
+
/** `$CODEX_HOME` (if set) else `~/.codex` — Codex's home dir. */
|
|
30
|
+
function codexHome() {
|
|
31
|
+
const override = process.env.CODEX_HOME;
|
|
32
|
+
if (typeof override === "string" && override !== "")
|
|
33
|
+
return override;
|
|
34
|
+
// Prefer $HOME (the standard override; what a test or a custom-home user
|
|
35
|
+
// expects) and fall back to os.homedir() — Bun's homedir() ignores $HOME.
|
|
36
|
+
const home = process.env.HOME && process.env.HOME !== "" ? process.env.HOME : homedir();
|
|
37
|
+
return join(home, ".codex");
|
|
38
|
+
}
|
|
39
|
+
/** `$CODEX_HOME/sessions` — the date-partitioned rollout tree. */
|
|
40
|
+
function sessionsRoot() {
|
|
41
|
+
return join(codexHome(), "sessions");
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Recursively collect every `rollout-*.jsonl` under `dir`, with its mtime. The
|
|
45
|
+
* tree is partitioned `<YYYY>/<MM>/<DD>/`, but we don't trust the layout — we
|
|
46
|
+
* just walk it. Never throws (an unreadable subdir is skipped).
|
|
47
|
+
*/
|
|
48
|
+
function collectRollouts(dir, out) {
|
|
49
|
+
let entries;
|
|
50
|
+
try {
|
|
51
|
+
entries = readdirSync(dir, { withFileTypes: true }).map((d) => ({ name: d.name, isDir: d.isDirectory() }));
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return; // missing/unreadable dir — skip it
|
|
55
|
+
}
|
|
56
|
+
for (const { name, isDir } of entries) {
|
|
57
|
+
const path = join(dir, name);
|
|
58
|
+
if (isDir) {
|
|
59
|
+
collectRollouts(path, out);
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
if (!name.startsWith("rollout-") || !name.endsWith(".jsonl"))
|
|
63
|
+
continue;
|
|
64
|
+
try {
|
|
65
|
+
out.push({ path, mtimeMs: statSync(path).mtimeMs });
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// file vanished between readdir and stat — skip it
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// `locate` reads only enough of each candidate to find the leading
|
|
73
|
+
// `session_meta` record — never the whole rollout. The meta is the first line;
|
|
74
|
+
// real rollouts top out around 27 KB for that line, so a 64 KB prefix covers it
|
|
75
|
+
// with headroom while keeping discovery cheap on a tree of 100s of multi-MB
|
|
76
|
+
// rollouts (the worst non-matching case would otherwise read every byte).
|
|
77
|
+
const META_PREFIX_BYTES = 64 * 1024;
|
|
78
|
+
/** Read up to `max` bytes from the start of `path` as UTF-8, or "" on error. */
|
|
79
|
+
function readPrefix(path, max) {
|
|
80
|
+
let fd;
|
|
81
|
+
try {
|
|
82
|
+
fd = openSync(path, "r");
|
|
83
|
+
const buf = Buffer.allocUnsafe(max);
|
|
84
|
+
const read = readSync(fd, buf, 0, max, 0);
|
|
85
|
+
return buf.toString("utf8", 0, read);
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return "";
|
|
89
|
+
}
|
|
90
|
+
finally {
|
|
91
|
+
if (fd !== undefined) {
|
|
92
|
+
try {
|
|
93
|
+
closeSync(fd);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
// best-effort close — never throw out of a fail-soft locate
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* The session `cwd` from a rollout's `session_meta` record (the meta is the
|
|
103
|
+
* first record, but we scan forward to tolerate a leading torn/other line).
|
|
104
|
+
* Reads only a bounded prefix — the meta is the leading line, so we never pull
|
|
105
|
+
* the whole (potentially multi-MB) rollout into memory just to discover its cwd.
|
|
106
|
+
* Returns undefined when the prefix is empty/corrupt or has no meta cwd.
|
|
107
|
+
*/
|
|
108
|
+
function sessionCwd(path) {
|
|
109
|
+
const prefix = readPrefix(path, META_PREFIX_BYTES);
|
|
110
|
+
if (prefix === "")
|
|
111
|
+
return undefined;
|
|
112
|
+
// Drop a trailing partial line: if the meta didn't fit in the prefix we'd
|
|
113
|
+
// rather miss it (and skip the candidate) than parse a truncated record.
|
|
114
|
+
const lastNl = prefix.lastIndexOf("\n");
|
|
115
|
+
const scannable = lastNl === -1 ? prefix : prefix.slice(0, lastNl);
|
|
116
|
+
for (const line of scannable.split("\n")) {
|
|
117
|
+
const trimmed = line.trim();
|
|
118
|
+
if (trimmed === "")
|
|
119
|
+
continue;
|
|
120
|
+
let env;
|
|
121
|
+
try {
|
|
122
|
+
env = JSON.parse(trimmed);
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
continue; // skip a corrupt line, keep looking for the meta
|
|
126
|
+
}
|
|
127
|
+
if (env.type === "session_meta") {
|
|
128
|
+
const cwd = env.payload?.cwd;
|
|
129
|
+
return typeof cwd === "string" ? cwd : undefined;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return undefined;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* The freshest rollout whose `session_meta.cwd` equals `repoRoot`. We walk the
|
|
136
|
+
* sessions tree, sort newest-first by mtime, and return the first match; null
|
|
137
|
+
* when the tree is missing or no rollout matches. Never throws.
|
|
138
|
+
*/
|
|
139
|
+
function locate(repoRoot) {
|
|
140
|
+
const candidates = [];
|
|
141
|
+
collectRollouts(sessionsRoot(), candidates);
|
|
142
|
+
candidates.sort((a, b) => b.mtimeMs - a.mtimeMs);
|
|
143
|
+
for (const { path } of candidates) {
|
|
144
|
+
if (sessionCwd(path) === repoRoot)
|
|
145
|
+
return { agent: AGENT, path };
|
|
146
|
+
}
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
const TOOL_LABEL_MAX = 80;
|
|
150
|
+
/** First line of `text`, trimmed; the one-line label for a text/reasoning body. */
|
|
151
|
+
function firstLine(text) {
|
|
152
|
+
const nl = text.indexOf("\n");
|
|
153
|
+
return (nl === -1 ? text : text.slice(0, nl)).trim();
|
|
154
|
+
}
|
|
155
|
+
/** Make `p` repo-relative when it sits under `repoRoot`; else return it as-is. */
|
|
156
|
+
function relPath(p, repoRoot) {
|
|
157
|
+
if (typeof p !== "string" || p === "")
|
|
158
|
+
return String(p ?? "");
|
|
159
|
+
if (!isAbsolute(p))
|
|
160
|
+
return p;
|
|
161
|
+
const rel = relative(repoRoot, p);
|
|
162
|
+
// `relative` of a path outside the repo starts with ".." or is absolute on a
|
|
163
|
+
// different drive — keep the absolute path then (it is genuinely elsewhere).
|
|
164
|
+
if (rel === "" || rel.startsWith("..") || isAbsolute(rel))
|
|
165
|
+
return p;
|
|
166
|
+
return rel.split(sep).join("/");
|
|
167
|
+
}
|
|
168
|
+
/** Cap a one-line command/string to the label width with a trailing ellipsis. */
|
|
169
|
+
function clamp(text) {
|
|
170
|
+
const oneLine = firstLine(text);
|
|
171
|
+
return oneLine.length > TOOL_LABEL_MAX ? `${oneLine.slice(0, TOOL_LABEL_MAX - 1)}…` : oneLine;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Pull a human shell command out of a tool's parsed arguments. Codex shells
|
|
175
|
+
* appear in a few shapes across versions:
|
|
176
|
+
* - `{ cmd: "git status" }` (current `exec_command`)
|
|
177
|
+
* - `{ command: ["bash","-lc","…"] }` (older OpenAI `shell`)
|
|
178
|
+
* - `{ command: "git status" }` (string fallback)
|
|
179
|
+
* For the `bash -lc <script>` form we surface the script, not the wrapper.
|
|
180
|
+
*/
|
|
181
|
+
function shellCommand(args) {
|
|
182
|
+
const cmd = args.cmd ?? args.command;
|
|
183
|
+
if (typeof cmd === "string")
|
|
184
|
+
return cmd;
|
|
185
|
+
if (Array.isArray(cmd)) {
|
|
186
|
+
const parts = cmd.map((c) => (typeof c === "string" ? c : String(c)));
|
|
187
|
+
// `bash -lc "<script>"` / `sh -c "<script>"` → show the script itself.
|
|
188
|
+
const flagIdx = parts.findIndex((p) => p === "-lc" || p === "-c" || p === "-lic");
|
|
189
|
+
const script = flagIdx === -1 ? undefined : parts[flagIdx + 1];
|
|
190
|
+
if (script !== undefined)
|
|
191
|
+
return script;
|
|
192
|
+
return parts.join(" ");
|
|
193
|
+
}
|
|
194
|
+
return "";
|
|
195
|
+
}
|
|
196
|
+
/** A recoverable file path from an `apply_patch` argument, or "" if none. */
|
|
197
|
+
function patchPath(args, raw) {
|
|
198
|
+
// Structured form: `{ path: "src/x.ts" }` or `{ file_path: "…" }`.
|
|
199
|
+
for (const k of ["path", "file_path", "filename"]) {
|
|
200
|
+
const v = args[k];
|
|
201
|
+
if (typeof v === "string" && v !== "")
|
|
202
|
+
return v;
|
|
203
|
+
}
|
|
204
|
+
// Heredoc form: `*** Update File: src/x.ts` / `*** Add File: …` inside the
|
|
205
|
+
// patch body, which may be a string field or the raw arguments themselves.
|
|
206
|
+
const body = typeof args.input === "string" ? args.input : typeof args.patch === "string" ? args.patch : raw;
|
|
207
|
+
const m = /\*\*\* (?:Add|Update|Delete) File: (.+)/.exec(body);
|
|
208
|
+
const captured = m?.[1];
|
|
209
|
+
return captured ? captured.trim() : "";
|
|
210
|
+
}
|
|
211
|
+
const SHELL_TOOLS = new Set(["exec_command", "shell", "local_shell", "exec", "bash", "container.exec"]);
|
|
212
|
+
/** Concise label for a function_call, e.g. "Bash: git status" / "Edit src/x.ts". */
|
|
213
|
+
function toolLabel(name, args, rawArgs, repoRoot) {
|
|
214
|
+
if (SHELL_TOOLS.has(name)) {
|
|
215
|
+
const cmd = shellCommand(args);
|
|
216
|
+
return cmd === "" ? "Bash" : `Bash: ${clamp(cmd)}`;
|
|
217
|
+
}
|
|
218
|
+
if (name === "apply_patch" || name === "edit_file" || name === "str_replace_editor") {
|
|
219
|
+
const file = patchPath(args, rawArgs);
|
|
220
|
+
return file === "" ? "apply_patch" : `Edit ${relPath(file, repoRoot)}`;
|
|
221
|
+
}
|
|
222
|
+
return name;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Flatten a reasoning payload's `summary` (list of `{ type, text }`) into one
|
|
226
|
+
* string. Newer Codex builds keep the plaintext in `summary`; the
|
|
227
|
+
* `encrypted_content`-only case yields "" (nothing to show — skipped upstream).
|
|
228
|
+
*/
|
|
229
|
+
function reasoningText(payload) {
|
|
230
|
+
const summary = payload.summary;
|
|
231
|
+
if (Array.isArray(summary)) {
|
|
232
|
+
const parts = summary
|
|
233
|
+
.map((s) => (s && typeof s === "object" && typeof s.text === "string" ? s.text : ""))
|
|
234
|
+
.filter((t) => t !== "");
|
|
235
|
+
if (parts.length > 0)
|
|
236
|
+
return parts.join("\n");
|
|
237
|
+
}
|
|
238
|
+
// Some builds carry plaintext directly on `content` / `text`.
|
|
239
|
+
if (typeof payload.content === "string")
|
|
240
|
+
return payload.content;
|
|
241
|
+
if (typeof payload.text === "string")
|
|
242
|
+
return payload.text;
|
|
243
|
+
return "";
|
|
244
|
+
}
|
|
245
|
+
/** Flatten a message payload's `content` (list of `{ type, text }`) to text. */
|
|
246
|
+
function messageText(payload) {
|
|
247
|
+
const content = payload.content;
|
|
248
|
+
if (typeof content === "string")
|
|
249
|
+
return content;
|
|
250
|
+
if (Array.isArray(content)) {
|
|
251
|
+
return content
|
|
252
|
+
.map((b) => (b && typeof b === "object" && typeof b.text === "string" ? b.text : ""))
|
|
253
|
+
.filter((t) => t !== "")
|
|
254
|
+
.join("\n");
|
|
255
|
+
}
|
|
256
|
+
return "";
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Whether a function_call_output signals an error. The output is usually plain
|
|
260
|
+
* text, but some tools emit a JSON object carrying an exit code / metadata; a
|
|
261
|
+
* non-zero `exit_code`/`exitCode`, or an explicit `success:false`, is an error.
|
|
262
|
+
* Default (plain text, or no metadata) is "ok".
|
|
263
|
+
*/
|
|
264
|
+
function outputIsError(output) {
|
|
265
|
+
const trimmed = output.trim();
|
|
266
|
+
if (trimmed === "" || (trimmed[0] !== "{" && trimmed[0] !== "["))
|
|
267
|
+
return false;
|
|
268
|
+
let parsed;
|
|
269
|
+
try {
|
|
270
|
+
parsed = JSON.parse(trimmed);
|
|
271
|
+
}
|
|
272
|
+
catch {
|
|
273
|
+
return false;
|
|
274
|
+
}
|
|
275
|
+
if (!parsed || typeof parsed !== "object")
|
|
276
|
+
return false;
|
|
277
|
+
const obj = parsed;
|
|
278
|
+
const meta = (obj.metadata && typeof obj.metadata === "object" ? obj.metadata : obj);
|
|
279
|
+
const code = meta.exit_code ?? meta.exitCode ?? meta.exit ?? obj.exit_code ?? obj.exitCode;
|
|
280
|
+
if (typeof code === "number" && code !== 0)
|
|
281
|
+
return true;
|
|
282
|
+
if (obj.success === false || meta.success === false)
|
|
283
|
+
return true;
|
|
284
|
+
return false;
|
|
285
|
+
}
|
|
286
|
+
/** Map one `response_item` payload to a RawStreamEvent, or null to skip it. */
|
|
287
|
+
function payloadToEvent(payload, repoRoot) {
|
|
288
|
+
switch (payload.type) {
|
|
289
|
+
case "reasoning": {
|
|
290
|
+
const text = reasoningText(payload);
|
|
291
|
+
if (text.trim() === "")
|
|
292
|
+
return null; // encrypted-only reasoning → nothing to show
|
|
293
|
+
return { kind: "thinking", label: "thinking…", detail: text };
|
|
294
|
+
}
|
|
295
|
+
case "message": {
|
|
296
|
+
// Skip user prompts the way Claude keeps only model output meaningful here;
|
|
297
|
+
// an assistant message is the model's text.
|
|
298
|
+
if (payload.role !== "assistant")
|
|
299
|
+
return null;
|
|
300
|
+
const text = messageText(payload);
|
|
301
|
+
if (text.trim() === "")
|
|
302
|
+
return null;
|
|
303
|
+
return { kind: "text", label: clamp(text) || "text", detail: text };
|
|
304
|
+
}
|
|
305
|
+
case "function_call":
|
|
306
|
+
case "custom_tool_call": {
|
|
307
|
+
const name = typeof payload.name === "string" ? payload.name : "tool";
|
|
308
|
+
const rawArgs = typeof payload.arguments === "string" ? payload.arguments : typeof payload.input === "string" ? payload.input : "";
|
|
309
|
+
let args = {};
|
|
310
|
+
try {
|
|
311
|
+
const a = JSON.parse(rawArgs);
|
|
312
|
+
if (a && typeof a === "object")
|
|
313
|
+
args = a;
|
|
314
|
+
}
|
|
315
|
+
catch {
|
|
316
|
+
// unparseable arguments → label by tool name, detail is the raw string
|
|
317
|
+
}
|
|
318
|
+
return {
|
|
319
|
+
kind: "tool",
|
|
320
|
+
tool: name,
|
|
321
|
+
label: toolLabel(name, args, rawArgs, repoRoot),
|
|
322
|
+
detail: rawArgs === "" ? undefined : rawArgs,
|
|
323
|
+
status: "running",
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
case "function_call_output":
|
|
327
|
+
case "custom_tool_call_output": {
|
|
328
|
+
// A follow-on outcome — the store is append-only, so we never upsert the
|
|
329
|
+
// running event; we append the result as its own event.
|
|
330
|
+
const output = typeof payload.output === "string" ? payload.output : "";
|
|
331
|
+
const isError = outputIsError(output);
|
|
332
|
+
return {
|
|
333
|
+
kind: "tool",
|
|
334
|
+
status: isError ? "error" : "ok",
|
|
335
|
+
label: isError ? "→ error" : "→ ok",
|
|
336
|
+
detail: output === "" ? undefined : output,
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
default:
|
|
340
|
+
return null;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
/** Every recognized event from one parsed rollout envelope, in record order. */
|
|
344
|
+
function lineToEvents(env, repoRoot) {
|
|
345
|
+
// Only `response_item` envelopes wrap the items we map; `session_meta`,
|
|
346
|
+
// `turn_context`, `event_msg`, and anything else are skipped.
|
|
347
|
+
if (env.type !== "response_item")
|
|
348
|
+
return [];
|
|
349
|
+
const payload = env.payload;
|
|
350
|
+
if (!payload || typeof payload !== "object")
|
|
351
|
+
return [];
|
|
352
|
+
const event = payloadToEvent(payload, repoRoot);
|
|
353
|
+
return event ? [event] : [];
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Read new bytes from `cursor.offset` to EOF, consume only COMPLETE lines, and
|
|
357
|
+
* emit their events. A trailing partial line (no terminating newline) is left
|
|
358
|
+
* unconsumed — the offset stays before it so the next poll completes it. The
|
|
359
|
+
* advanced offset is the byte position just past the last complete line. Every
|
|
360
|
+
* step is fail-soft.
|
|
361
|
+
*/
|
|
362
|
+
function parse(handle, cursor) {
|
|
363
|
+
const repoRoot = cursor.repoRoot ?? sessionCwd(handle.path) ?? "";
|
|
364
|
+
let buffer;
|
|
365
|
+
try {
|
|
366
|
+
buffer = readFileSync(handle.path);
|
|
367
|
+
}
|
|
368
|
+
catch {
|
|
369
|
+
return { events: [], cursor }; // file vanished — leave the cursor put
|
|
370
|
+
}
|
|
371
|
+
const offset = typeof cursor.offset === "number" && cursor.offset >= 0 ? cursor.offset : 0;
|
|
372
|
+
if (offset >= buffer.length) {
|
|
373
|
+
// No new bytes, or the file was truncated/rotated below our offset. When it
|
|
374
|
+
// shrank, reset so we don't read past the end forever (a rare rotation).
|
|
375
|
+
const next = offset > buffer.length ? 0 : offset;
|
|
376
|
+
return { events: [], cursor: { ...cursor, offset: next, repoRoot } };
|
|
377
|
+
}
|
|
378
|
+
const slice = buffer.toString("utf8", offset);
|
|
379
|
+
const lastNl = slice.lastIndexOf("\n");
|
|
380
|
+
if (lastNl === -1) {
|
|
381
|
+
// The whole new chunk is one partial line — consume nothing, wait for more.
|
|
382
|
+
return { events: [], cursor: { ...cursor, offset, repoRoot } };
|
|
383
|
+
}
|
|
384
|
+
const complete = slice.slice(0, lastNl); // excludes the trailing partial
|
|
385
|
+
// Advance by the BYTE length of the consumed text (incl. its final newline),
|
|
386
|
+
// not the char count — multibyte content would otherwise drift the offset.
|
|
387
|
+
const consumedBytes = Buffer.byteLength(complete, "utf8") + 1;
|
|
388
|
+
const events = [];
|
|
389
|
+
for (const raw of complete.split("\n")) {
|
|
390
|
+
const trimmed = raw.trim();
|
|
391
|
+
if (trimmed === "")
|
|
392
|
+
continue;
|
|
393
|
+
let env;
|
|
394
|
+
try {
|
|
395
|
+
env = JSON.parse(trimmed);
|
|
396
|
+
}
|
|
397
|
+
catch {
|
|
398
|
+
continue; // skip a corrupt line, keep going
|
|
399
|
+
}
|
|
400
|
+
for (const event of lineToEvents(env, repoRoot))
|
|
401
|
+
events.push(event);
|
|
402
|
+
}
|
|
403
|
+
return { events, cursor: { ...cursor, offset: offset + consumedBytes, repoRoot } };
|
|
404
|
+
}
|
|
405
|
+
/** The Codex CLI rollout adapter (read-only, fail-soft). */
|
|
406
|
+
export const codexAdapter = {
|
|
407
|
+
agent: AGENT,
|
|
408
|
+
locate,
|
|
409
|
+
parse,
|
|
410
|
+
};
|
|
411
|
+
// Test-only exports — the pure mappers are worth covering directly.
|
|
412
|
+
export const __test = { toolLabel, shellCommand, patchPath, relPath, reasoningText, messageText, outputIsError, lineToEvents };
|
|
413
|
+
//# sourceMappingURL=codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/daemon/capture/codex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
// Turning a raw capture (a tool call, a text/thinking chunk, an `otacon
|
|
2
|
+
// progress` highlight) into a normalized StreamEvent the UI can safely render:
|
|
3
|
+
// secrets redacted out of the detail, detail and label truncated to the
|
|
4
|
+
// configured caps. Pure functions — the daemon stamps `seq` and `at` and calls
|
|
5
|
+
// `normalize`; future transcript adapters emit `RawStreamEvent` and reuse this
|
|
6
|
+
// exact path, so redaction and truncation can never be skipped on a capture
|
|
7
|
+
// source. Redaction is best-effort, never a security boundary: it catches the
|
|
8
|
+
// obvious shapes (a leaked key in a printed env, a bearer header) so they don't
|
|
9
|
+
// land in a review screen, but a determined exfiltration is out of scope.
|
|
10
|
+
export const REDACTED = "[redacted]";
|
|
11
|
+
// Best-effort secret shapes. Each pattern targets one well-known leak form;
|
|
12
|
+
// order is irrelevant (they don't overlap destructively). Anchored loosely so a
|
|
13
|
+
// secret embedded in a larger line (a printed env, a curl command) still
|
|
14
|
+
// matches.
|
|
15
|
+
const SECRET_PATTERNS = [
|
|
16
|
+
// PEM private-key blocks (multi-line). Must run first conceptually, but the
|
|
17
|
+
// global replace order is fine since the block boundaries are unambiguous.
|
|
18
|
+
/-----BEGIN (?:[A-Z ]+ )?PRIVATE KEY-----[\s\S]*?-----END (?:[A-Z ]+ )?PRIVATE KEY-----/g,
|
|
19
|
+
// AWS access key ids.
|
|
20
|
+
/\bAKIA[0-9A-Z]{16}\b/g,
|
|
21
|
+
// Bearer tokens in an Authorization header / log line.
|
|
22
|
+
/\bBearer\s+[A-Za-z0-9._\-+/=]+/gi,
|
|
23
|
+
// `token=...`, `password=...`, `secret=...`, `api[_-]?key=...` (env/query/CLI
|
|
24
|
+
// shapes), the value running to a quote, whitespace, comma, or semicolon.
|
|
25
|
+
/\b(?:api[_-]?key|api[_-]?token|access[_-]?token|auth[_-]?token|token|password|passwd|pwd|secret|client[_-]?secret)\s*[=:]\s*["']?[^\s"',;]+/gi,
|
|
26
|
+
// Provider-style key prefixes (OpenAI `sk-`, GitHub `ghp_`/`gho_`/`ghs_`,
|
|
27
|
+
// Slack `xox.-`, Google `AIza`) carrying a long opaque tail.
|
|
28
|
+
/\b(?:sk|pk|rk)-[A-Za-z0-9]{16,}\b/g,
|
|
29
|
+
/\bgh[posu]_[A-Za-z0-9]{20,}\b/g,
|
|
30
|
+
/\bxox[baprs]-[A-Za-z0-9-]{10,}\b/g,
|
|
31
|
+
/\bAIza[0-9A-Za-z_\-]{20,}\b/g,
|
|
32
|
+
// `.env`-style `KEY=secret`: an UPPER_SNAKE name whose value looks
|
|
33
|
+
// secret-ish (long, or mixed case+digits). Conservative on the value so a
|
|
34
|
+
// plain `PORT=3000` or `NODE_ENV=production` is left alone.
|
|
35
|
+
/\b[A-Z][A-Z0-9_]{2,}=(?=[^\s]*[A-Za-z])(?=[^\s]*\d)[A-Za-z0-9._\-+/=]{12,}/g,
|
|
36
|
+
];
|
|
37
|
+
/**
|
|
38
|
+
* Strip obvious secrets, replacing each match with `[redacted]`. Best-effort:
|
|
39
|
+
* covers API keys, bearer/`token=`/`password=` pairs, AWS `AKIA…` ids, PEM
|
|
40
|
+
* private-key blocks, and `.env`-style `KEY=secret`. Leaves ordinary config
|
|
41
|
+
* (`PORT=3000`, `Bearer`-less prose) untouched.
|
|
42
|
+
*/
|
|
43
|
+
export function redactSecrets(text) {
|
|
44
|
+
let out = text;
|
|
45
|
+
for (const pattern of SECRET_PATTERNS)
|
|
46
|
+
out = out.replace(pattern, REDACTED);
|
|
47
|
+
return out;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Cap `text` to `max` characters, marking a cut with a single trailing ellipsis
|
|
51
|
+
* (so the last visible char is `…`, total length stays `max`). `max <= 0`
|
|
52
|
+
* yields the empty string; text within the cap is returned unchanged.
|
|
53
|
+
*/
|
|
54
|
+
export function truncate(text, max) {
|
|
55
|
+
if (max <= 0)
|
|
56
|
+
return "";
|
|
57
|
+
if (text.length <= max)
|
|
58
|
+
return text;
|
|
59
|
+
if (max === 1)
|
|
60
|
+
return "…";
|
|
61
|
+
return text.slice(0, max - 1).trimEnd() + "…";
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Produce the final StreamEvent: `detail` is redacted then truncated to
|
|
65
|
+
* `cfg.detailMaxChars`; `label` is truncated to `cfg.labelMaxChars`. `seq` and
|
|
66
|
+
* `at` are the daemon's (it owns the monotonic counter and the clock). An empty
|
|
67
|
+
* `detail` after redaction/truncation is dropped (no key kept on the event).
|
|
68
|
+
* `tool` is preserved as-is (a tool name is short and not a secret); `status`
|
|
69
|
+
* passes through.
|
|
70
|
+
*/
|
|
71
|
+
export function normalize(raw, cfg, seq, at) {
|
|
72
|
+
const event = {
|
|
73
|
+
seq,
|
|
74
|
+
at,
|
|
75
|
+
kind: raw.kind,
|
|
76
|
+
label: truncate(raw.label, cfg.labelMaxChars),
|
|
77
|
+
};
|
|
78
|
+
if (raw.detail !== undefined) {
|
|
79
|
+
const detail = truncate(redactSecrets(raw.detail), cfg.detailMaxChars);
|
|
80
|
+
if (detail !== "")
|
|
81
|
+
event.detail = detail;
|
|
82
|
+
}
|
|
83
|
+
if (raw.tool !== undefined)
|
|
84
|
+
event.tool = raw.tool;
|
|
85
|
+
if (raw.status !== undefined)
|
|
86
|
+
event.status = raw.status;
|
|
87
|
+
return event;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=normalize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../../src/daemon/capture/normalize.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,+EAA+E;AAC/E,wEAAwE;AACxE,+EAA+E;AAC/E,+EAA+E;AAC/E,4EAA4E;AAC5E,8EAA8E;AAC9E,gFAAgF;AAChF,0EAA0E;AAK1E,MAAM,CAAC,MAAM,QAAQ,GAAG,YAAY,CAAC;AAiBrC,4EAA4E;AAC5E,gFAAgF;AAChF,yEAAyE;AACzE,WAAW;AACX,MAAM,eAAe,GAAsB;IACzC,4EAA4E;IAC5E,2EAA2E;IAC3E,yFAAyF;IACzF,sBAAsB;IACtB,uBAAuB;IACvB,uDAAuD;IACvD,kCAAkC;IAClC,8EAA8E;IAC9E,0EAA0E;IAC1E,+IAA+I;IAC/I,0EAA0E;IAC1E,6DAA6D;IAC7D,oCAAoC;IACpC,gCAAgC;IAChC,mCAAmC;IACnC,8BAA8B;IAC9B,mEAAmE;IACnE,0EAA0E;IAC1E,4DAA4D;IAC5D,6EAA6E;CAC9E,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,GAAG,GAAG,IAAI,CAAC;IACf,KAAK,MAAM,OAAO,IAAI,eAAe;QAAE,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC5E,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,GAAW;IAChD,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACxB,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,IAAI,CAAC;IACpC,IAAI,GAAG,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC;AAChD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,SAAS,CACvB,GAAmB,EACnB,GAAiB,EACjB,GAAW,EACX,EAAU;IAEV,MAAM,KAAK,GAAgB;QACzB,GAAG;QACH,EAAE;QACF,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,aAAa,CAAC;KAC9C,CAAC;IACF,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;QACvE,IAAI,MAAM,KAAK,EAAE;YAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;IAC3C,CAAC;IACD,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;IAClD,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS;QAAE,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IACxD,OAAO,KAAK,CAAC;AACf,CAAC"}
|