@zythum02/fello-server 0.1.48 → 0.1.49
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/out/renderer/assets/{_baseUniq-D023PlQD.js → _baseUniq-jsNn2Q0s.js} +1 -1
- package/out/renderer/assets/_baseUniq-jsNn2Q0s.js.br +0 -0
- package/out/renderer/assets/_baseUniq-jsNn2Q0s.js.gz +0 -0
- package/out/renderer/assets/{arc-Bgp6YWjh.js → arc-CZMdjunT.js} +1 -1
- package/out/renderer/assets/arc-CZMdjunT.js.br +0 -0
- package/out/renderer/assets/arc-CZMdjunT.js.gz +0 -0
- package/out/renderer/assets/{architectureDiagram-Q4EWVU46-B40mk-XJ.js → architectureDiagram-Q4EWVU46-BNFtPc1v.js} +5 -5
- package/out/renderer/assets/architectureDiagram-Q4EWVU46-BNFtPc1v.js.br +0 -0
- package/out/renderer/assets/architectureDiagram-Q4EWVU46-BNFtPc1v.js.gz +0 -0
- package/out/renderer/assets/{blockDiagram-DXYQGD6D-BBdankH4.js → blockDiagram-DXYQGD6D-CPK2QuaJ.js} +6 -6
- package/out/renderer/assets/blockDiagram-DXYQGD6D-CPK2QuaJ.js.br +0 -0
- package/out/renderer/assets/blockDiagram-DXYQGD6D-CPK2QuaJ.js.gz +0 -0
- package/out/renderer/assets/{c4Diagram-AHTNJAMY-BfRmGEJy.js → c4Diagram-AHTNJAMY-DLQf0xBh.js} +2 -2
- package/out/renderer/assets/c4Diagram-AHTNJAMY-DLQf0xBh.js.br +0 -0
- package/out/renderer/assets/c4Diagram-AHTNJAMY-DLQf0xBh.js.gz +0 -0
- package/out/renderer/assets/{channel-CHGPt1xL.js → channel-sFWrTS52.js} +1 -1
- package/out/renderer/assets/{chunk-4BX2VUAB-Dbg5pk8D.js → chunk-4BX2VUAB-CUoBhtu2.js} +1 -1
- package/out/renderer/assets/{chunk-4TB4RGXK-CBjV8oAS.js → chunk-4TB4RGXK-CRjlV65P.js} +5 -5
- package/out/renderer/assets/chunk-4TB4RGXK-CRjlV65P.js.br +0 -0
- package/out/renderer/assets/chunk-4TB4RGXK-CRjlV65P.js.gz +0 -0
- package/out/renderer/assets/{chunk-55IACEB6-_eYsto3b.js → chunk-55IACEB6-zrgWErN1.js} +1 -1
- package/out/renderer/assets/{chunk-EDXVE4YY-DaXCRd0a.js → chunk-EDXVE4YY-B5b9dJFI.js} +1 -1
- package/out/renderer/assets/chunk-EDXVE4YY-B5b9dJFI.js.br +0 -0
- package/out/renderer/assets/chunk-EDXVE4YY-B5b9dJFI.js.gz +0 -0
- package/out/renderer/assets/{chunk-FMBD7UC4-BwtLRaQu.js → chunk-FMBD7UC4-Bb0FhBnd.js} +1 -1
- package/out/renderer/assets/{chunk-OYMX7WX6-h3hRYV_y.js → chunk-OYMX7WX6-CkUp0SL9.js} +3 -3
- package/out/renderer/assets/chunk-OYMX7WX6-CkUp0SL9.js.br +0 -0
- package/out/renderer/assets/chunk-OYMX7WX6-CkUp0SL9.js.gz +0 -0
- package/out/renderer/assets/{chunk-QZHKN3VN-DUU1c_qe.js → chunk-QZHKN3VN-Bqt7zsAR.js} +1 -1
- package/out/renderer/assets/{chunk-YZCP3GAM-fw4tpwlW.js → chunk-YZCP3GAM-Crg82fz2.js} +1 -1
- package/out/renderer/assets/chunk-YZCP3GAM-Crg82fz2.js.br +0 -0
- package/out/renderer/assets/chunk-YZCP3GAM-Crg82fz2.js.gz +0 -0
- package/out/renderer/assets/{classDiagram-6PBFFD2Q-ql_64jJs.js → classDiagram-6PBFFD2Q-BInpfZnW.js} +6 -6
- package/out/renderer/assets/{classDiagram-v2-HSJHXN6E-ql_64jJs.js → classDiagram-v2-HSJHXN6E-BInpfZnW.js} +6 -6
- package/out/renderer/assets/{clone-DZQhm3qm.js → clone-Brsdp_jq.js} +1 -1
- package/out/renderer/assets/{cose-bilkent-S5V4N54A-Bjtibz95.js → cose-bilkent-S5V4N54A-CH_2zOJR.js} +1 -1
- package/out/renderer/assets/cose-bilkent-S5V4N54A-CH_2zOJR.js.br +0 -0
- package/out/renderer/assets/cose-bilkent-S5V4N54A-CH_2zOJR.js.gz +0 -0
- package/out/renderer/assets/{dagre-KV5264BT-DW9CSFRI.js → dagre-KV5264BT-H1wB7v-Q.js} +6 -6
- package/out/renderer/assets/dagre-KV5264BT-H1wB7v-Q.js.br +0 -0
- package/out/renderer/assets/dagre-KV5264BT-H1wB7v-Q.js.gz +0 -0
- package/out/renderer/assets/{diagram-5BDNPKRD-Dptg-C7O.js → diagram-5BDNPKRD-D9VV_-Xi.js} +6 -6
- package/out/renderer/assets/diagram-5BDNPKRD-D9VV_-Xi.js.br +0 -0
- package/out/renderer/assets/diagram-5BDNPKRD-D9VV_-Xi.js.gz +0 -0
- package/out/renderer/assets/{diagram-G4DWMVQ6-CX-JVWk7.js → diagram-G4DWMVQ6-CfRglPBg.js} +6 -6
- package/out/renderer/assets/diagram-G4DWMVQ6-CfRglPBg.js.br +0 -0
- package/out/renderer/assets/diagram-G4DWMVQ6-CfRglPBg.js.gz +0 -0
- package/out/renderer/assets/{diagram-MMDJMWI5-DUDbXS-d.js → diagram-MMDJMWI5-BnwRyNpR.js} +5 -5
- package/out/renderer/assets/diagram-MMDJMWI5-BnwRyNpR.js.br +0 -0
- package/out/renderer/assets/diagram-MMDJMWI5-BnwRyNpR.js.gz +0 -0
- package/out/renderer/assets/{diagram-TYMM5635-9K0cZf20.js → diagram-TYMM5635-BKn_5Ga7.js} +5 -5
- package/out/renderer/assets/diagram-TYMM5635-BKn_5Ga7.js.br +0 -0
- package/out/renderer/assets/diagram-TYMM5635-BKn_5Ga7.js.gz +0 -0
- package/out/renderer/assets/{erDiagram-SMLLAGMA-DaVqqCcL.js → erDiagram-SMLLAGMA-B35CLzqQ.js} +4 -4
- package/out/renderer/assets/erDiagram-SMLLAGMA-B35CLzqQ.js.br +0 -0
- package/out/renderer/assets/erDiagram-SMLLAGMA-B35CLzqQ.js.gz +0 -0
- package/out/renderer/assets/{flowDiagram-DWJPFMVM-BrHGujcg.js → flowDiagram-DWJPFMVM-BidIy8zc.js} +6 -6
- package/out/renderer/assets/flowDiagram-DWJPFMVM-BidIy8zc.js.br +0 -0
- package/out/renderer/assets/flowDiagram-DWJPFMVM-BidIy8zc.js.gz +0 -0
- package/out/renderer/assets/{ganttDiagram-T4ZO3ILL-D9tlSXpr.js → ganttDiagram-T4ZO3ILL-CqV1ei6S.js} +2 -2
- package/out/renderer/assets/ganttDiagram-T4ZO3ILL-CqV1ei6S.js.br +0 -0
- package/out/renderer/assets/ganttDiagram-T4ZO3ILL-CqV1ei6S.js.gz +0 -0
- package/out/renderer/assets/{gitGraphDiagram-UUTBAWPF-dFtBMZmH.js → gitGraphDiagram-UUTBAWPF-7wQ8gKPV.js} +6 -6
- package/out/renderer/assets/gitGraphDiagram-UUTBAWPF-7wQ8gKPV.js.br +0 -0
- package/out/renderer/assets/gitGraphDiagram-UUTBAWPF-7wQ8gKPV.js.gz +0 -0
- package/out/renderer/assets/{graph-CNmSjTZd.js → graph-Ck9_bXv5.js} +2 -2
- package/out/renderer/assets/graph-Ck9_bXv5.js.br +0 -0
- package/out/renderer/assets/graph-Ck9_bXv5.js.gz +0 -0
- package/out/renderer/assets/{highlighted-body-OFNGDK62-EglK-D82.js → highlighted-body-OFNGDK62-gS-2OBX1.js} +1 -1
- package/out/renderer/assets/{index-BwSaFLCv.css → index-BtjFxpR5.css} +1 -1
- package/out/renderer/assets/index-BtjFxpR5.css.br +0 -0
- package/out/renderer/assets/index-BtjFxpR5.css.gz +0 -0
- package/out/renderer/assets/{index-BuO0MTa-.js → index-Cy_TZSUE.js} +811 -801
- package/out/renderer/assets/index-Cy_TZSUE.js.br +0 -0
- package/out/renderer/assets/index-Cy_TZSUE.js.gz +0 -0
- package/out/renderer/assets/{infoDiagram-42DDH7IO-CwoWvadJ.js → infoDiagram-42DDH7IO-DlKxzT4w.js} +4 -4
- package/out/renderer/assets/{ishikawaDiagram-UXIWVN3A-9MhN_EF5.js → ishikawaDiagram-UXIWVN3A-DmOMlIE8.js} +1 -1
- package/out/renderer/assets/ishikawaDiagram-UXIWVN3A-DmOMlIE8.js.br +0 -0
- package/out/renderer/assets/ishikawaDiagram-UXIWVN3A-DmOMlIE8.js.gz +0 -0
- package/out/renderer/assets/{journeyDiagram-VCZTEJTY-BwKJh5pl.js → journeyDiagram-VCZTEJTY-CYRPGJN7.js} +4 -4
- package/out/renderer/assets/journeyDiagram-VCZTEJTY-CYRPGJN7.js.br +0 -0
- package/out/renderer/assets/journeyDiagram-VCZTEJTY-CYRPGJN7.js.gz +0 -0
- package/out/renderer/assets/{kanban-definition-6JOO6SKY-uDhuFOXv.js → kanban-definition-6JOO6SKY-Dovb_i6Z.js} +2 -2
- package/out/renderer/assets/kanban-definition-6JOO6SKY-Dovb_i6Z.js.br +0 -0
- package/out/renderer/assets/kanban-definition-6JOO6SKY-Dovb_i6Z.js.gz +0 -0
- package/out/renderer/assets/{layout-C7Mg2ajy.js → layout-BUs47sjz.js} +4 -4
- package/out/renderer/assets/layout-BUs47sjz.js.br +0 -0
- package/out/renderer/assets/layout-BUs47sjz.js.gz +0 -0
- package/out/renderer/assets/{linear-CkQXAw4A.js → linear-CO24wS_v.js} +1 -1
- package/out/renderer/assets/linear-CO24wS_v.js.br +0 -0
- package/out/renderer/assets/linear-CO24wS_v.js.gz +0 -0
- package/out/renderer/assets/{min-DRTvcNIL.js → min-Dd_ATNHv.js} +2 -2
- package/out/renderer/assets/min-Dd_ATNHv.js.br +0 -0
- package/out/renderer/assets/min-Dd_ATNHv.js.gz +0 -0
- package/out/renderer/assets/{mindmap-definition-QFDTVHPH-_8DjK16S.js → mindmap-definition-QFDTVHPH-CC3W7LA-.js} +3 -3
- package/out/renderer/assets/mindmap-definition-QFDTVHPH-CC3W7LA-.js.br +0 -0
- package/out/renderer/assets/mindmap-definition-QFDTVHPH-CC3W7LA-.js.gz +0 -0
- package/out/renderer/assets/{pieDiagram-DEJITSTG-owvRXepN.js → pieDiagram-DEJITSTG-BN6Ummnw.js} +6 -6
- package/out/renderer/assets/pieDiagram-DEJITSTG-BN6Ummnw.js.br +0 -0
- package/out/renderer/assets/pieDiagram-DEJITSTG-BN6Ummnw.js.gz +0 -0
- package/out/renderer/assets/{quadrantDiagram-34T5L4WZ-C9LRroTe.js → quadrantDiagram-34T5L4WZ-DTE_dLJv.js} +2 -2
- package/out/renderer/assets/quadrantDiagram-34T5L4WZ-DTE_dLJv.js.br +0 -0
- package/out/renderer/assets/quadrantDiagram-34T5L4WZ-DTE_dLJv.js.gz +0 -0
- package/out/renderer/assets/{requirementDiagram-MS252O5E-Ds_36REQ.js → requirementDiagram-MS252O5E-DVDS2RYN.js} +3 -3
- package/out/renderer/assets/requirementDiagram-MS252O5E-DVDS2RYN.js.br +0 -0
- package/out/renderer/assets/requirementDiagram-MS252O5E-DVDS2RYN.js.gz +0 -0
- package/out/renderer/assets/{sankeyDiagram-XADWPNL6-6HuBoz3Q.js → sankeyDiagram-XADWPNL6-D4_LywJM.js} +1 -1
- package/out/renderer/assets/sankeyDiagram-XADWPNL6-D4_LywJM.js.br +0 -0
- package/out/renderer/assets/sankeyDiagram-XADWPNL6-D4_LywJM.js.gz +0 -0
- package/out/renderer/assets/{sequenceDiagram-FGHM5R23-BdGUPHNX.js → sequenceDiagram-FGHM5R23-89GBJZmd.js} +3 -3
- package/out/renderer/assets/sequenceDiagram-FGHM5R23-89GBJZmd.js.br +0 -0
- package/out/renderer/assets/sequenceDiagram-FGHM5R23-89GBJZmd.js.gz +0 -0
- package/out/renderer/assets/{stateDiagram-FHFEXIEX-CruNLY-0.js → stateDiagram-FHFEXIEX-YKrUbogP.js} +8 -8
- package/out/renderer/assets/stateDiagram-FHFEXIEX-YKrUbogP.js.br +0 -0
- package/out/renderer/assets/stateDiagram-FHFEXIEX-YKrUbogP.js.gz +0 -0
- package/out/renderer/assets/{stateDiagram-v2-QKLJ7IA2-CfBaNTRC.js → stateDiagram-v2-QKLJ7IA2-CO0pZRqI.js} +4 -4
- package/out/renderer/assets/{timeline-definition-GMOUNBTQ-CHPlJ2ZI.js → timeline-definition-GMOUNBTQ-BW2oxhj-.js} +2 -2
- package/out/renderer/assets/timeline-definition-GMOUNBTQ-BW2oxhj-.js.br +0 -0
- package/out/renderer/assets/timeline-definition-GMOUNBTQ-BW2oxhj-.js.gz +0 -0
- package/out/renderer/assets/{vennDiagram-DHZGUBPP-DMdQtt7i.js → vennDiagram-DHZGUBPP-DSy9zL6k.js} +1 -1
- package/out/renderer/assets/vennDiagram-DHZGUBPP-DSy9zL6k.js.br +0 -0
- package/out/renderer/assets/vennDiagram-DHZGUBPP-DSy9zL6k.js.gz +0 -0
- package/out/renderer/assets/{wardley-RL74JXVD-HjjY3yRY.js → wardley-RL74JXVD-DFRGDO55.js} +3 -3
- package/out/renderer/assets/wardley-RL74JXVD-DFRGDO55.js.br +0 -0
- package/out/renderer/assets/wardley-RL74JXVD-DFRGDO55.js.gz +0 -0
- package/out/renderer/assets/{wardleyDiagram-NUSXRM2D-BI-3rQpv.js → wardleyDiagram-NUSXRM2D-CJUPdnii.js} +5 -5
- package/out/renderer/assets/wardleyDiagram-NUSXRM2D-CJUPdnii.js.br +0 -0
- package/out/renderer/assets/wardleyDiagram-NUSXRM2D-CJUPdnii.js.gz +0 -0
- package/out/renderer/assets/{xychartDiagram-5P7HB3ND-Bzj4rKGX.js → xychartDiagram-5P7HB3ND-UGlSGsDE.js} +2 -2
- package/out/renderer/assets/xychartDiagram-5P7HB3ND-UGlSGsDE.js.br +0 -0
- package/out/renderer/assets/xychartDiagram-5P7HB3ND-UGlSGsDE.js.gz +0 -0
- package/out/renderer/index.html +2 -2
- package/out/renderer/index.html.br +0 -0
- package/out/renderer/index.html.gz +0 -0
- package/out/scripts/mcp-search/server.mjs +46 -46
- package/out/server/main.js +226 -125
- package/package.json +2 -1
- package/out/renderer/assets/_baseUniq-D023PlQD.js.br +0 -0
- package/out/renderer/assets/_baseUniq-D023PlQD.js.gz +0 -0
- package/out/renderer/assets/arc-Bgp6YWjh.js.br +0 -0
- package/out/renderer/assets/arc-Bgp6YWjh.js.gz +0 -0
- package/out/renderer/assets/architectureDiagram-Q4EWVU46-B40mk-XJ.js.br +0 -0
- package/out/renderer/assets/architectureDiagram-Q4EWVU46-B40mk-XJ.js.gz +0 -0
- package/out/renderer/assets/blockDiagram-DXYQGD6D-BBdankH4.js.br +0 -0
- package/out/renderer/assets/blockDiagram-DXYQGD6D-BBdankH4.js.gz +0 -0
- package/out/renderer/assets/c4Diagram-AHTNJAMY-BfRmGEJy.js.br +0 -0
- package/out/renderer/assets/c4Diagram-AHTNJAMY-BfRmGEJy.js.gz +0 -0
- package/out/renderer/assets/chunk-4TB4RGXK-CBjV8oAS.js.br +0 -0
- package/out/renderer/assets/chunk-4TB4RGXK-CBjV8oAS.js.gz +0 -0
- package/out/renderer/assets/chunk-EDXVE4YY-DaXCRd0a.js.br +0 -0
- package/out/renderer/assets/chunk-EDXVE4YY-DaXCRd0a.js.gz +0 -0
- package/out/renderer/assets/chunk-OYMX7WX6-h3hRYV_y.js.br +0 -0
- package/out/renderer/assets/chunk-OYMX7WX6-h3hRYV_y.js.gz +0 -0
- package/out/renderer/assets/chunk-YZCP3GAM-fw4tpwlW.js.br +0 -0
- package/out/renderer/assets/chunk-YZCP3GAM-fw4tpwlW.js.gz +0 -0
- package/out/renderer/assets/cose-bilkent-S5V4N54A-Bjtibz95.js.br +0 -0
- package/out/renderer/assets/cose-bilkent-S5V4N54A-Bjtibz95.js.gz +0 -0
- package/out/renderer/assets/dagre-KV5264BT-DW9CSFRI.js.br +0 -0
- package/out/renderer/assets/dagre-KV5264BT-DW9CSFRI.js.gz +0 -0
- package/out/renderer/assets/diagram-5BDNPKRD-Dptg-C7O.js.br +0 -0
- package/out/renderer/assets/diagram-5BDNPKRD-Dptg-C7O.js.gz +0 -0
- package/out/renderer/assets/diagram-G4DWMVQ6-CX-JVWk7.js.br +0 -0
- package/out/renderer/assets/diagram-G4DWMVQ6-CX-JVWk7.js.gz +0 -0
- package/out/renderer/assets/diagram-MMDJMWI5-DUDbXS-d.js.br +0 -0
- package/out/renderer/assets/diagram-MMDJMWI5-DUDbXS-d.js.gz +0 -0
- package/out/renderer/assets/diagram-TYMM5635-9K0cZf20.js.br +0 -0
- package/out/renderer/assets/diagram-TYMM5635-9K0cZf20.js.gz +0 -0
- package/out/renderer/assets/erDiagram-SMLLAGMA-DaVqqCcL.js.br +0 -0
- package/out/renderer/assets/erDiagram-SMLLAGMA-DaVqqCcL.js.gz +0 -0
- package/out/renderer/assets/flowDiagram-DWJPFMVM-BrHGujcg.js.br +0 -0
- package/out/renderer/assets/flowDiagram-DWJPFMVM-BrHGujcg.js.gz +0 -0
- package/out/renderer/assets/ganttDiagram-T4ZO3ILL-D9tlSXpr.js.br +0 -0
- package/out/renderer/assets/ganttDiagram-T4ZO3ILL-D9tlSXpr.js.gz +0 -0
- package/out/renderer/assets/gitGraphDiagram-UUTBAWPF-dFtBMZmH.js.br +0 -0
- package/out/renderer/assets/gitGraphDiagram-UUTBAWPF-dFtBMZmH.js.gz +0 -0
- package/out/renderer/assets/graph-CNmSjTZd.js.br +0 -0
- package/out/renderer/assets/graph-CNmSjTZd.js.gz +0 -0
- package/out/renderer/assets/index-BuO0MTa-.js.br +0 -0
- package/out/renderer/assets/index-BuO0MTa-.js.gz +0 -0
- package/out/renderer/assets/index-BwSaFLCv.css.br +0 -0
- package/out/renderer/assets/index-BwSaFLCv.css.gz +0 -0
- package/out/renderer/assets/ishikawaDiagram-UXIWVN3A-9MhN_EF5.js.br +0 -0
- package/out/renderer/assets/ishikawaDiagram-UXIWVN3A-9MhN_EF5.js.gz +0 -0
- package/out/renderer/assets/journeyDiagram-VCZTEJTY-BwKJh5pl.js.br +0 -0
- package/out/renderer/assets/journeyDiagram-VCZTEJTY-BwKJh5pl.js.gz +0 -0
- package/out/renderer/assets/kanban-definition-6JOO6SKY-uDhuFOXv.js.br +0 -0
- package/out/renderer/assets/kanban-definition-6JOO6SKY-uDhuFOXv.js.gz +0 -0
- package/out/renderer/assets/layout-C7Mg2ajy.js.br +0 -0
- package/out/renderer/assets/layout-C7Mg2ajy.js.gz +0 -0
- package/out/renderer/assets/linear-CkQXAw4A.js.br +0 -0
- package/out/renderer/assets/linear-CkQXAw4A.js.gz +0 -0
- package/out/renderer/assets/min-DRTvcNIL.js.br +0 -0
- package/out/renderer/assets/min-DRTvcNIL.js.gz +0 -0
- package/out/renderer/assets/mindmap-definition-QFDTVHPH-_8DjK16S.js.br +0 -0
- package/out/renderer/assets/mindmap-definition-QFDTVHPH-_8DjK16S.js.gz +0 -0
- package/out/renderer/assets/pieDiagram-DEJITSTG-owvRXepN.js.br +0 -0
- package/out/renderer/assets/pieDiagram-DEJITSTG-owvRXepN.js.gz +0 -0
- package/out/renderer/assets/quadrantDiagram-34T5L4WZ-C9LRroTe.js.br +0 -0
- package/out/renderer/assets/quadrantDiagram-34T5L4WZ-C9LRroTe.js.gz +0 -0
- package/out/renderer/assets/requirementDiagram-MS252O5E-Ds_36REQ.js.br +0 -0
- package/out/renderer/assets/requirementDiagram-MS252O5E-Ds_36REQ.js.gz +0 -0
- package/out/renderer/assets/sankeyDiagram-XADWPNL6-6HuBoz3Q.js.br +0 -0
- package/out/renderer/assets/sankeyDiagram-XADWPNL6-6HuBoz3Q.js.gz +0 -0
- package/out/renderer/assets/sequenceDiagram-FGHM5R23-BdGUPHNX.js.br +0 -0
- package/out/renderer/assets/sequenceDiagram-FGHM5R23-BdGUPHNX.js.gz +0 -0
- package/out/renderer/assets/stateDiagram-FHFEXIEX-CruNLY-0.js.br +0 -0
- package/out/renderer/assets/stateDiagram-FHFEXIEX-CruNLY-0.js.gz +0 -0
- package/out/renderer/assets/timeline-definition-GMOUNBTQ-CHPlJ2ZI.js.br +0 -0
- package/out/renderer/assets/timeline-definition-GMOUNBTQ-CHPlJ2ZI.js.gz +0 -0
- package/out/renderer/assets/vennDiagram-DHZGUBPP-DMdQtt7i.js.br +0 -0
- package/out/renderer/assets/vennDiagram-DHZGUBPP-DMdQtt7i.js.gz +0 -0
- package/out/renderer/assets/wardley-RL74JXVD-HjjY3yRY.js.br +0 -0
- package/out/renderer/assets/wardley-RL74JXVD-HjjY3yRY.js.gz +0 -0
- package/out/renderer/assets/wardleyDiagram-NUSXRM2D-BI-3rQpv.js.br +0 -0
- package/out/renderer/assets/wardleyDiagram-NUSXRM2D-BI-3rQpv.js.gz +0 -0
- package/out/renderer/assets/xychartDiagram-5P7HB3ND-Bzj4rKGX.js.br +0 -0
- package/out/renderer/assets/xychartDiagram-5P7HB3ND-Bzj4rKGX.js.gz +0 -0
package/out/server/main.js
CHANGED
|
@@ -1800,11 +1800,11 @@ function createWebUIModule() {
|
|
|
1800
1800
|
}
|
|
1801
1801
|
});
|
|
1802
1802
|
});
|
|
1803
|
-
return new Promise((
|
|
1803
|
+
return new Promise((resolve9, reject) => {
|
|
1804
1804
|
const listenPort = options?.port && options.port > 0 ? options.port : 0;
|
|
1805
1805
|
httpServer.listen(listenPort, "0.0.0.0", () => {
|
|
1806
1806
|
isEnabled = true;
|
|
1807
|
-
|
|
1807
|
+
resolve9({ url: getWebUIUrl(httpServer.address()) });
|
|
1808
1808
|
});
|
|
1809
1809
|
httpServer.on("error", reject);
|
|
1810
1810
|
});
|
|
@@ -2189,7 +2189,7 @@ import { join as join12 } from "path";
|
|
|
2189
2189
|
|
|
2190
2190
|
// src/shared/zod/mcp-search-schema.ts
|
|
2191
2191
|
import { z } from "zod";
|
|
2192
|
-
var
|
|
2192
|
+
var grepRequestSchema = z.object({
|
|
2193
2193
|
pattern: z.string().describe("Search pattern (literal text by default, set regex=true for regex)."),
|
|
2194
2194
|
path: z.string().describe(
|
|
2195
2195
|
"Directory or file(s) to search. Accepts: relative path (relative to project root), absolute path (POSIX or Windows), or file:// URI."
|
|
@@ -2204,20 +2204,10 @@ var searchRequestSchema = z.object({
|
|
|
2204
2204
|
invertMatch: z.boolean().optional().describe("Show lines that do NOT match the pattern (-v)."),
|
|
2205
2205
|
wordMatch: z.boolean().optional().describe("Only match whole words (-w).")
|
|
2206
2206
|
});
|
|
2207
|
-
var
|
|
2207
|
+
var grepRespondSchema = z.object({
|
|
2208
2208
|
output: z.string(),
|
|
2209
2209
|
code: z.number()
|
|
2210
2210
|
});
|
|
2211
|
-
var rgRequestSchema = z.object({
|
|
2212
|
-
args: z.array(z.string()).describe(
|
|
2213
|
-
"Raw ripgrep CLI arguments (e.g. ['-i', 'pattern', 'src/']). The pattern and path are included in this array."
|
|
2214
|
-
)
|
|
2215
|
-
});
|
|
2216
|
-
var rgRespondSchema = z.object({
|
|
2217
|
-
output: z.string(),
|
|
2218
|
-
code: z.number(),
|
|
2219
|
-
stderr: z.string().optional()
|
|
2220
|
-
});
|
|
2221
2211
|
var fileOutlineRequestSchema = z.object({
|
|
2222
2212
|
path: z.string().describe(
|
|
2223
2213
|
"File path to analyze. Accepts: relative path (relative to project root), absolute path (POSIX or Windows), or file:// URI."
|
|
@@ -2226,6 +2216,20 @@ var fileOutlineRequestSchema = z.object({
|
|
|
2226
2216
|
var fileOutlineRespondSchema = z.object({
|
|
2227
2217
|
outline: z.string().describe("Structural outline of the file in text format.")
|
|
2228
2218
|
});
|
|
2219
|
+
var globRequestSchema = z.object({
|
|
2220
|
+
pattern: z.string().describe("Glob pattern, e.g. '**/*.rs', 'src/**/*.{ts,tsx}'."),
|
|
2221
|
+
path: z.string().optional().describe("Root directory to search from. Defaults to project root."),
|
|
2222
|
+
limit: z.number().int().positive().optional().describe("Maximum number of results to return."),
|
|
2223
|
+
maxDepth: z.number().int().positive().optional().describe("Maximum directory depth to traverse."),
|
|
2224
|
+
dot: z.boolean().optional().describe("Include dotfiles (hidden files/directories). Default: false."),
|
|
2225
|
+
onlyFiles: z.boolean().optional().describe("Only match files, not directories. Default: false (includes directories)."),
|
|
2226
|
+
gitignore: z.boolean().optional().describe("Respect .gitignore patterns. Default: true.")
|
|
2227
|
+
});
|
|
2228
|
+
var globRespondSchema = z.object({
|
|
2229
|
+
filePaths: z.array(z.string()),
|
|
2230
|
+
totalFiles: z.number(),
|
|
2231
|
+
truncated: z.boolean()
|
|
2232
|
+
});
|
|
2229
2233
|
|
|
2230
2234
|
// src/backend/search/file-outline.ts
|
|
2231
2235
|
import { extname, join as join10, isAbsolute as isAbsolute4, resolve as resolve3, relative as relative5 } from "path";
|
|
@@ -2648,7 +2652,7 @@ var LANGUAGES = [
|
|
|
2648
2652
|
}
|
|
2649
2653
|
];
|
|
2650
2654
|
async function parseInChild(filePath, config, cwd, timeout = 3e4) {
|
|
2651
|
-
return new Promise((
|
|
2655
|
+
return new Promise((resolve9, reject) => {
|
|
2652
2656
|
const modulePath = join10(process.scriptsPath, "/worker-file-outline/worker.mjs");
|
|
2653
2657
|
const child = fork(modulePath, [], { execArgv: [], cwd });
|
|
2654
2658
|
const timer = setTimeout(() => {
|
|
@@ -2657,7 +2661,7 @@ async function parseInChild(filePath, config, cwd, timeout = 3e4) {
|
|
|
2657
2661
|
}, timeout);
|
|
2658
2662
|
child.on("message", (msg) => {
|
|
2659
2663
|
clearTimeout(timer);
|
|
2660
|
-
if (msg.type === "result")
|
|
2664
|
+
if (msg.type === "result") resolve9({ symbols: msg.symbols, totalLines: msg.totalLines });
|
|
2661
2665
|
else reject(new Error(msg.error));
|
|
2662
2666
|
});
|
|
2663
2667
|
child.on("error", (err) => {
|
|
@@ -2820,7 +2824,7 @@ import { join as join11, isAbsolute as isAbsolute5, resolve as resolve4, relativ
|
|
|
2820
2824
|
import { fileURLToPath as fileURLToPath4 } from "url";
|
|
2821
2825
|
import { fork as fork2 } from "child_process";
|
|
2822
2826
|
function ripgrepInChild(args2, cwd, timeout = 3e4) {
|
|
2823
|
-
return new Promise((
|
|
2827
|
+
return new Promise((resolve9, reject) => {
|
|
2824
2828
|
const child = fork2(join11(process.scriptsPath, "worker-ripgrep/worker.mjs"), [], { cwd });
|
|
2825
2829
|
const timer = setTimeout(() => {
|
|
2826
2830
|
child.kill();
|
|
@@ -2829,7 +2833,7 @@ function ripgrepInChild(args2, cwd, timeout = 3e4) {
|
|
|
2829
2833
|
child.on("message", (msg) => {
|
|
2830
2834
|
clearTimeout(timer);
|
|
2831
2835
|
if (msg.type === "error") reject(new Error(msg.error));
|
|
2832
|
-
else
|
|
2836
|
+
else resolve9({ code: msg.code, stdout: msg.stdout, stderr: msg.stderr });
|
|
2833
2837
|
});
|
|
2834
2838
|
child.on("error", (err) => {
|
|
2835
2839
|
clearTimeout(timer);
|
|
@@ -2852,7 +2856,7 @@ function normalizePath2(inputPath, cwd) {
|
|
|
2852
2856
|
}
|
|
2853
2857
|
return resolve4(cwd ?? process.cwd(), inputPath);
|
|
2854
2858
|
}
|
|
2855
|
-
async function
|
|
2859
|
+
async function grep(options) {
|
|
2856
2860
|
const args2 = [];
|
|
2857
2861
|
args2.push("--heading");
|
|
2858
2862
|
args2.push("--line-number");
|
|
@@ -2874,16 +2878,38 @@ async function search(options) {
|
|
|
2874
2878
|
const { code, stdout } = await ripgrepInChild(args2, options.projectDir, options.timeout);
|
|
2875
2879
|
return { output: stdout || "", code };
|
|
2876
2880
|
}
|
|
2877
|
-
|
|
2878
|
-
|
|
2879
|
-
|
|
2880
|
-
|
|
2881
|
-
|
|
2882
|
-
|
|
2881
|
+
|
|
2882
|
+
// src/backend/search/glob.ts
|
|
2883
|
+
import { globby } from "globby";
|
|
2884
|
+
import { isAbsolute as isAbsolute6, resolve as resolve5 } from "path";
|
|
2885
|
+
import { fileURLToPath as fileURLToPath5 } from "url";
|
|
2886
|
+
function normalizePath3(inputPath, cwd) {
|
|
2887
|
+
if (inputPath.startsWith("file://")) {
|
|
2888
|
+
return fileURLToPath5(inputPath);
|
|
2889
|
+
}
|
|
2890
|
+
if (isAbsolute6(inputPath)) {
|
|
2891
|
+
return inputPath;
|
|
2892
|
+
}
|
|
2893
|
+
return resolve5(cwd ?? process.cwd(), inputPath);
|
|
2894
|
+
}
|
|
2895
|
+
async function glob(options) {
|
|
2896
|
+
const cwd = options.path ? normalizePath3(options.path, options.projectDir) : options.projectDir;
|
|
2897
|
+
const entries = await globby(options.pattern, {
|
|
2898
|
+
cwd,
|
|
2899
|
+
dot: options.dot ?? false,
|
|
2900
|
+
onlyFiles: options.onlyFiles ?? false,
|
|
2901
|
+
markDirectories: true,
|
|
2902
|
+
gitignore: options.gitignore ?? true,
|
|
2903
|
+
deep: options.maxDepth
|
|
2904
|
+
});
|
|
2905
|
+
entries.sort();
|
|
2906
|
+
const limit = options.limit ?? 500;
|
|
2907
|
+
const truncated = entries.length > limit;
|
|
2908
|
+
const filePaths = truncated ? entries.slice(0, limit) : entries;
|
|
2883
2909
|
return {
|
|
2884
|
-
|
|
2885
|
-
|
|
2886
|
-
|
|
2910
|
+
filePaths,
|
|
2911
|
+
totalFiles: entries.length,
|
|
2912
|
+
truncated
|
|
2887
2913
|
};
|
|
2888
2914
|
}
|
|
2889
2915
|
|
|
@@ -2892,21 +2918,21 @@ function createSearchModule(_ctx) {
|
|
|
2892
2918
|
return { registerSearchRoute, buildSearchMcpServer };
|
|
2893
2919
|
}
|
|
2894
2920
|
function registerSearchRoute(server, projectDir) {
|
|
2895
|
-
server.registry("search/
|
|
2896
|
-
const params =
|
|
2897
|
-
const result = await
|
|
2898
|
-
return
|
|
2899
|
-
});
|
|
2900
|
-
server.registry("search/rg", async (payload) => {
|
|
2901
|
-
const params = rgRequestSchema.parse(payload);
|
|
2902
|
-
const result = await rg({ projectDir, ...params });
|
|
2903
|
-
return rgRespondSchema.parse(result);
|
|
2921
|
+
server.registry("search/grep", async (payload) => {
|
|
2922
|
+
const params = grepRequestSchema.parse(payload);
|
|
2923
|
+
const result = await grep({ projectDir, ...params });
|
|
2924
|
+
return grepRespondSchema.parse(result);
|
|
2904
2925
|
});
|
|
2905
2926
|
server.registry("search/file_outline", async (payload) => {
|
|
2906
2927
|
const params = fileOutlineRequestSchema.parse(payload);
|
|
2907
2928
|
const result = await fileOutline({ projectDir, ...params });
|
|
2908
2929
|
return fileOutlineRespondSchema.parse(result);
|
|
2909
2930
|
});
|
|
2931
|
+
server.registry("search/glob", async (payload) => {
|
|
2932
|
+
const params = globRequestSchema.parse(payload);
|
|
2933
|
+
const result = await glob({ projectDir, ...params });
|
|
2934
|
+
return globRespondSchema.parse(result);
|
|
2935
|
+
});
|
|
2910
2936
|
}
|
|
2911
2937
|
function buildSearchMcpServer(options) {
|
|
2912
2938
|
return {
|
|
@@ -2988,13 +3014,13 @@ function createAskUserModule(ctx, deps) {
|
|
|
2988
3014
|
});
|
|
2989
3015
|
}
|
|
2990
3016
|
}
|
|
2991
|
-
return new Promise((
|
|
3017
|
+
return new Promise((resolve9) => {
|
|
2992
3018
|
const timeoutId = setTimeout(() => {
|
|
2993
3019
|
const pending = pendingRequests.get(askUserId);
|
|
2994
3020
|
if (pending) {
|
|
2995
3021
|
pendingRequests.delete(askUserId);
|
|
2996
3022
|
const response = { value: null, reason: "timeout" };
|
|
2997
|
-
|
|
3023
|
+
resolve9(response);
|
|
2998
3024
|
sendEvent("ask-user-response", {
|
|
2999
3025
|
sessionId,
|
|
3000
3026
|
askUserId,
|
|
@@ -3005,7 +3031,7 @@ function createAskUserModule(ctx, deps) {
|
|
|
3005
3031
|
console.warn(`[askUser] timeout fired but no pending request found for ${askUserId}`);
|
|
3006
3032
|
}
|
|
3007
3033
|
}, USER_REQUEST_TIMEOUT_MS);
|
|
3008
|
-
pendingRequests.set(askUserId, { resolve:
|
|
3034
|
+
pendingRequests.set(askUserId, { resolve: resolve9, timeoutId, sessionId, request });
|
|
3009
3035
|
});
|
|
3010
3036
|
}
|
|
3011
3037
|
async function getPendingAskUserRequests({ sessionId }) {
|
|
@@ -3073,8 +3099,8 @@ function createAskUserModule(ctx, deps) {
|
|
|
3073
3099
|
|
|
3074
3100
|
// src/backend/share-to-user.ts
|
|
3075
3101
|
import { randomUUID as randomUUID3 } from "crypto";
|
|
3076
|
-
import { join as join14 } from "path";
|
|
3077
|
-
import { fileURLToPath as
|
|
3102
|
+
import { join as join14, relative as relative7, isAbsolute as isAbsolute7 } from "path";
|
|
3103
|
+
import { fileURLToPath as fileURLToPath6 } from "url";
|
|
3078
3104
|
import { readFile as readFile5, writeFile } from "fs/promises";
|
|
3079
3105
|
import { existsSync as existsSync6, mkdirSync as mkdirSync6 } from "fs";
|
|
3080
3106
|
import * as mimeTypes3 from "mime-types";
|
|
@@ -3123,23 +3149,29 @@ function createShareToUserModule(ctx, deps) {
|
|
|
3123
3149
|
const { sessionId, type, uri, data, name, mimeType } = options;
|
|
3124
3150
|
const resolvedMimeType = resolveMimeType(name, mimeType);
|
|
3125
3151
|
if (type === "project" && uri) {
|
|
3152
|
+
const session = storage.getSession(sessionId);
|
|
3153
|
+
if (!session) throw new Error(`Session not found: ${sessionId}`);
|
|
3154
|
+
let projectPath = uri.startsWith("file://") ? fileURLToPath6(uri) : uri;
|
|
3155
|
+
if (isAbsolute7(projectPath)) {
|
|
3156
|
+
const rel = relative7(session.cwd, projectPath);
|
|
3157
|
+
if (!rel.startsWith("..") && !isAbsolute7(rel)) {
|
|
3158
|
+
projectPath = rel;
|
|
3159
|
+
}
|
|
3160
|
+
}
|
|
3126
3161
|
const ilinkBridge2 = deps.ilink.getBridge();
|
|
3127
3162
|
const ilinkActiveSessionId2 = deps.ilink.getActiveSessionId();
|
|
3128
3163
|
if (ilinkBridge2?.isConnected && sessionId === ilinkActiveSessionId2) {
|
|
3129
3164
|
const toUserId = ilinkBridge2.userId;
|
|
3130
3165
|
if (toUserId) {
|
|
3131
|
-
|
|
3132
|
-
|
|
3133
|
-
|
|
3134
|
-
|
|
3135
|
-
|
|
3136
|
-
|
|
3137
|
-
mimeType: resolvedMimeType
|
|
3138
|
-
});
|
|
3139
|
-
}
|
|
3166
|
+
deps.ilink.appendMediaBuffer({
|
|
3167
|
+
filePath: join14(session.cwd, projectPath),
|
|
3168
|
+
name,
|
|
3169
|
+
toUserId,
|
|
3170
|
+
mimeType: resolvedMimeType
|
|
3171
|
+
});
|
|
3140
3172
|
}
|
|
3141
3173
|
}
|
|
3142
|
-
return { name, projectPath
|
|
3174
|
+
return { name, projectPath, mimeType: resolvedMimeType };
|
|
3143
3175
|
}
|
|
3144
3176
|
const shareId = randomUUID3();
|
|
3145
3177
|
const shareDir = storage.sessionShareDir(sessionId);
|
|
@@ -3157,7 +3189,7 @@ function createShareToUserModule(ctx, deps) {
|
|
|
3157
3189
|
if (!response.ok) throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
3158
3190
|
buffer = Buffer.from(await response.arrayBuffer());
|
|
3159
3191
|
} else {
|
|
3160
|
-
const sourcePath = uri.startsWith("file://") ?
|
|
3192
|
+
const sourcePath = uri.startsWith("file://") ? fileURLToPath6(uri) : uri;
|
|
3161
3193
|
buffer = await readFile5(sourcePath);
|
|
3162
3194
|
}
|
|
3163
3195
|
} catch (err) {
|
|
@@ -3249,9 +3281,9 @@ function spawnStdioAgent(options) {
|
|
|
3249
3281
|
proc.stdin.end();
|
|
3250
3282
|
} catch {
|
|
3251
3283
|
}
|
|
3252
|
-
await new Promise((
|
|
3284
|
+
await new Promise((resolve9) => {
|
|
3253
3285
|
if (proc.exitCode !== null) {
|
|
3254
|
-
|
|
3286
|
+
resolve9();
|
|
3255
3287
|
return;
|
|
3256
3288
|
}
|
|
3257
3289
|
let killTimer = null;
|
|
@@ -3259,13 +3291,13 @@ function spawnStdioAgent(options) {
|
|
|
3259
3291
|
if (killTimer) {
|
|
3260
3292
|
clearTimeout(killTimer);
|
|
3261
3293
|
}
|
|
3262
|
-
|
|
3294
|
+
resolve9();
|
|
3263
3295
|
};
|
|
3264
3296
|
proc.once("exit", onExit);
|
|
3265
3297
|
killProcessGroup(proc, "SIGTERM");
|
|
3266
3298
|
killTimer = setTimeout(() => {
|
|
3267
3299
|
killProcessGroup(proc, "SIGKILL");
|
|
3268
|
-
|
|
3300
|
+
resolve9();
|
|
3269
3301
|
}, 2e3);
|
|
3270
3302
|
});
|
|
3271
3303
|
}
|
|
@@ -3381,7 +3413,7 @@ var AgentClientProxy = class {
|
|
|
3381
3413
|
};
|
|
3382
3414
|
|
|
3383
3415
|
// src/agents/acp-client-tools.ts
|
|
3384
|
-
import { resolve as
|
|
3416
|
+
import { resolve as resolve6 } from "path";
|
|
3385
3417
|
import { tool } from "ai";
|
|
3386
3418
|
import { z as z4 } from "zod";
|
|
3387
3419
|
|
|
@@ -3574,7 +3606,7 @@ Always prefer using line/limit to read specific sections, or use the Search MCP'
|
|
|
3574
3606
|
if (!connection) {
|
|
3575
3607
|
throw new Error("ACP connection is not available.");
|
|
3576
3608
|
}
|
|
3577
|
-
const filename =
|
|
3609
|
+
const filename = resolve6(cwd ?? params.cwd, path2);
|
|
3578
3610
|
let title = `ReadFile ${filename}`;
|
|
3579
3611
|
if (line || limit) {
|
|
3580
3612
|
title += `:${line ?? 0}`;
|
|
@@ -3681,7 +3713,7 @@ Always prefer using line/limit to read specific sections, or use the Search MCP'
|
|
|
3681
3713
|
if (!connection) {
|
|
3682
3714
|
throw new Error("ACP connection is not available.");
|
|
3683
3715
|
}
|
|
3684
|
-
const filename =
|
|
3716
|
+
const filename = resolve6(cwd ?? params.cwd, path2);
|
|
3685
3717
|
let title = `WriteFile ${filename}`;
|
|
3686
3718
|
const toolCall = {
|
|
3687
3719
|
toolCallId,
|
|
@@ -3766,7 +3798,7 @@ Use exact string matching for oldText and set replaceAll=true when needed.`,
|
|
|
3766
3798
|
if (!connection) {
|
|
3767
3799
|
throw new Error("ACP connection is not available.");
|
|
3768
3800
|
}
|
|
3769
|
-
const filename =
|
|
3801
|
+
const filename = resolve6(cwd ?? params.cwd, path2);
|
|
3770
3802
|
const title = `EditFile ${filename}`;
|
|
3771
3803
|
const toolCall = {
|
|
3772
3804
|
toolCallId,
|
|
@@ -3946,8 +3978,8 @@ Avoid destructive commands and prefer deterministic, non-interactive commands.`,
|
|
|
3946
3978
|
try {
|
|
3947
3979
|
const waitPromise = terminal.waitForExit();
|
|
3948
3980
|
if (timeoutMs) {
|
|
3949
|
-
const timeoutPromise = new Promise((
|
|
3950
|
-
setTimeout(() =>
|
|
3981
|
+
const timeoutPromise = new Promise((resolve9) => {
|
|
3982
|
+
setTimeout(() => resolve9(null), timeoutMs);
|
|
3951
3983
|
});
|
|
3952
3984
|
const waitResult = await Promise.race([waitPromise, timeoutPromise]);
|
|
3953
3985
|
if (waitResult === null) {
|
|
@@ -4287,7 +4319,7 @@ function toEnvRecord(env) {
|
|
|
4287
4319
|
}
|
|
4288
4320
|
function inferToolKind(name) {
|
|
4289
4321
|
const normalized = name.toLowerCase();
|
|
4290
|
-
if (normalized.includes("read") || normalized.includes("list") || normalized.includes("search")) {
|
|
4322
|
+
if (normalized.includes("read") || normalized.includes("list") || normalized.includes("search") || normalized.includes("grep") || normalized.includes("glob")) {
|
|
4291
4323
|
return "read";
|
|
4292
4324
|
}
|
|
4293
4325
|
if (normalized.includes("write") || normalized.includes("edit") || normalized.includes("update")) {
|
|
@@ -4568,7 +4600,7 @@ Working style:
|
|
|
4568
4600
|
File reading & editing strategy:
|
|
4569
4601
|
- ReadFile will REJECT full reads of files over 100KB. Use line/limit to read specific sections, or set force=true if you genuinely need the full file content (rare).
|
|
4570
4602
|
- Use the Search MCP's file_outline tool to preview file structure before reading (function/class/interface names with line ranges). Supports TypeScript, JavaScript, TSX, Python, Go, C, C++, Swift, Kotlin, Dart.
|
|
4571
|
-
- Use the Search MCP's
|
|
4603
|
+
- Use the Search MCP's grep tool (structured pattern search) or glob tool (file finder) to search file contents instead of reading entire files.
|
|
4572
4604
|
- EditFile uses exact string matching (StrReplace style). Use unique surrounding code context in oldText to make matches precise. Set replaceAll=true when you intend to replace all occurrences.
|
|
4573
4605
|
- You do NOT need to re-read a file after editing it \u2014 the changes are already saved.
|
|
4574
4606
|
|
|
@@ -4592,7 +4624,7 @@ import { tool as tool3 } from "ai";
|
|
|
4592
4624
|
import { z as z6 } from "zod";
|
|
4593
4625
|
|
|
4594
4626
|
// src/agents/image-tools.ts
|
|
4595
|
-
import { resolve as
|
|
4627
|
+
import { resolve as resolve7 } from "path";
|
|
4596
4628
|
import { readFile as readFile6 } from "fs/promises";
|
|
4597
4629
|
import mime from "mime-types";
|
|
4598
4630
|
import { tool as tool2, generateText } from "ai";
|
|
@@ -4629,7 +4661,7 @@ Provide a specific query describing what you want to know about the image \u2014
|
|
|
4629
4661
|
});
|
|
4630
4662
|
}
|
|
4631
4663
|
try {
|
|
4632
|
-
const absPath =
|
|
4664
|
+
const absPath = resolve7(params.cwd, imgPath);
|
|
4633
4665
|
const buffer = await readFile6(absPath);
|
|
4634
4666
|
const base64 = buffer.toString("base64");
|
|
4635
4667
|
const mimeType = mime.lookup(absPath) || "image/png";
|
|
@@ -5832,11 +5864,11 @@ var AgentTerminalManager = class {
|
|
|
5832
5864
|
if (terminal.isFinished) {
|
|
5833
5865
|
return { exitCode: terminal.exitCode, signal: terminal.signal };
|
|
5834
5866
|
}
|
|
5835
|
-
return new Promise((
|
|
5867
|
+
return new Promise((resolve9) => {
|
|
5836
5868
|
const originalOnExit = terminal.onExit;
|
|
5837
5869
|
terminal.onExit = (code, signal) => {
|
|
5838
5870
|
originalOnExit(code, signal);
|
|
5839
|
-
|
|
5871
|
+
resolve9({ exitCode: code, signal });
|
|
5840
5872
|
};
|
|
5841
5873
|
});
|
|
5842
5874
|
}
|
|
@@ -6004,7 +6036,14 @@ var ACPBridge = class {
|
|
|
6004
6036
|
}
|
|
6005
6037
|
async connect() {
|
|
6006
6038
|
const acpId = this.id;
|
|
6007
|
-
const proc = this.options.agentInfo.type === "stdio" ? spawnStdioAgent({
|
|
6039
|
+
const proc = this.options.agentInfo.type === "stdio" ? spawnStdioAgent({
|
|
6040
|
+
...this.options.agentInfo,
|
|
6041
|
+
cwd: this.options.cwd,
|
|
6042
|
+
env: {
|
|
6043
|
+
...this.options.agentEnv,
|
|
6044
|
+
...this.options.agentInfo.env
|
|
6045
|
+
}
|
|
6046
|
+
}) : this.options.agentInfo.provider === "openai-compatible" ? spawnOpenaiCompatibleApiAgent(this.options.agentInfo) : (() => {
|
|
6008
6047
|
throw new Error(`Unsupported api provider: ${this.options.agentInfo.provider}`);
|
|
6009
6048
|
})();
|
|
6010
6049
|
this.process = proc;
|
|
@@ -6319,7 +6358,9 @@ var ACPBridge = class {
|
|
|
6319
6358
|
}
|
|
6320
6359
|
async sendPrompt(params) {
|
|
6321
6360
|
if (!this.connection) throw new Error("Not connected");
|
|
6322
|
-
|
|
6361
|
+
const res = await this.connection.agent.request(methods3.agent.session.prompt, params);
|
|
6362
|
+
this.options.onPromptCompleted?.(params.sessionId, res);
|
|
6363
|
+
return res;
|
|
6323
6364
|
}
|
|
6324
6365
|
async cancel(params) {
|
|
6325
6366
|
if (!this.connection) return;
|
|
@@ -6378,6 +6419,27 @@ var AcpAdapter = class {
|
|
|
6378
6419
|
handleExtNotification(_method, _params, _currentSessionId, _agentId) {
|
|
6379
6420
|
return [];
|
|
6380
6421
|
}
|
|
6422
|
+
/**
|
|
6423
|
+
* Agent process env vars to inject when spawning the agent. Protocol-
|
|
6424
|
+
* specific environment needed by the agent process (e.g.
|
|
6425
|
+
* CODEBUDDY_DEFER_TOOL_LOADING for CodeBuddy). Aggregated by
|
|
6426
|
+
* adapters.ts and applied by ACPBridge when spawning a stdio agent;
|
|
6427
|
+
* agent-specific agentInfo.env still takes precedence.
|
|
6428
|
+
*/
|
|
6429
|
+
getAgentEnv() {
|
|
6430
|
+
return {};
|
|
6431
|
+
}
|
|
6432
|
+
/**
|
|
6433
|
+
* Called by the bridge when a prompt round completes, with the full
|
|
6434
|
+
* PromptResponse in hand. Adapters that do turn-boundary / replay detection
|
|
6435
|
+
* override this to extract the agent's own protocol-clock timestamp and
|
|
6436
|
+
* freeze the boundary. Default no-op — only protocol-specific adapters
|
|
6437
|
+
* (e.g. CodeBuddy, which stamps PromptResponse._meta with
|
|
6438
|
+
* codebuddy.ai/requestId + timestamp) need it; generic adapters have no
|
|
6439
|
+
* protocol timestamp to work from.
|
|
6440
|
+
*/
|
|
6441
|
+
handlePromptCompleted(_sessionId, _res) {
|
|
6442
|
+
}
|
|
6381
6443
|
// ── State lifecycle (default no-ops) ───────────────────────────────
|
|
6382
6444
|
rekey(_oldKey, _newKey) {
|
|
6383
6445
|
}
|
|
@@ -6398,22 +6460,46 @@ var CODEBUDDY_STATUS_MAP = {
|
|
|
6398
6460
|
var CodebuddyAdapter = class extends AcpAdapter {
|
|
6399
6461
|
stateMap = /* @__PURE__ */ new Map();
|
|
6400
6462
|
/**
|
|
6401
|
-
* Per-session
|
|
6402
|
-
*
|
|
6403
|
-
*
|
|
6404
|
-
*
|
|
6405
|
-
*
|
|
6406
|
-
|
|
6463
|
+
* Per-session turn-boundary timestamp (epoch ms, from the agent's own
|
|
6464
|
+
* protocol clock). Frozen when a prompt completes (via handlePromptCompleted),
|
|
6465
|
+
* so content chunks emitted afterwards with an earlier protocol timestamp
|
|
6466
|
+
* are previous-turn replays. Only CodeBuddy stamps PromptResponse._meta
|
|
6467
|
+
* with a protocol timestamp, so this stays here rather than in the base.
|
|
6468
|
+
*/
|
|
6469
|
+
turnBoundaryTs = /* @__PURE__ */ new Map();
|
|
6470
|
+
/**
|
|
6471
|
+
* CodeBuddy spawn env.
|
|
6472
|
+
*/
|
|
6473
|
+
getAgentEnv() {
|
|
6474
|
+
return {
|
|
6475
|
+
CODEBUDDY_DEFER_TOOL_LOADING: "0",
|
|
6476
|
+
CODEBUDDY_DISABLE_AUTO_MEMORY: "1"
|
|
6477
|
+
};
|
|
6478
|
+
}
|
|
6479
|
+
/**
|
|
6480
|
+
* Freeze the turn-boundary on prompt completion. Only CodeBuddy stamps the
|
|
6481
|
+
* PromptResponse._meta with codebuddy.ai/requestId + a protocol timestamp,
|
|
6482
|
+
* so this stays here rather than in the generic bridge — the agent's own
|
|
6483
|
+
* clock is the boundary used to drop replayed prior-turn chunks (avoids
|
|
6484
|
+
* timezone / clock-skew issues that wall-clock Date.now() would introduce).
|
|
6407
6485
|
*/
|
|
6408
|
-
|
|
6486
|
+
handlePromptCompleted(sessionId, res) {
|
|
6487
|
+
const meta = res._meta;
|
|
6488
|
+
if (meta && typeof meta["codebuddy.ai/requestId"] === "string") {
|
|
6489
|
+
const ts = Date.parse(typeof meta["timestamp"] === "string" ? meta["timestamp"] : "");
|
|
6490
|
+
if (!isNaN(ts)) this.turnBoundaryTs.set(sessionId, ts);
|
|
6491
|
+
}
|
|
6492
|
+
}
|
|
6409
6493
|
/**
|
|
6410
6494
|
* One unified hook for all notification processing:
|
|
6411
6495
|
*
|
|
6412
|
-
* 1. Replay detection —
|
|
6413
|
-
*
|
|
6414
|
-
*
|
|
6415
|
-
*
|
|
6416
|
-
*
|
|
6496
|
+
* 1. Replay detection — the adapter freezes a turn-boundary timestamp in
|
|
6497
|
+
* handlePromptCompleted() when a prompt completes (using the agent's own
|
|
6498
|
+
* protocol clock). Drop agent_message_chunk / agent_thought_chunk whose
|
|
6499
|
+
* _meta.timestamp is earlier than that boundary: CodeBuddy re-broadcasts
|
|
6500
|
+
* the previous turn's messages when a new prompt begins, and those
|
|
6501
|
+
* re-emitted chunks carry the previous turn's (earlier) timestamps. Only
|
|
6502
|
+
* applies to chunks that carry codebuddy.ai/requestId.
|
|
6417
6503
|
* 2. memberEvent chunk routing — rewrite notification.sessionId from
|
|
6418
6504
|
* parent to member sessionId (CodeBuddy stamps all member chunks
|
|
6419
6505
|
* with the parent session).
|
|
@@ -6434,13 +6520,10 @@ var CodebuddyAdapter = class extends AcpAdapter {
|
|
|
6434
6520
|
if (typeof requestId === "string" && typeof metaTimestamp === "string" && (sessionUpdate === "agent_message_chunk" || sessionUpdate === "agent_thought_chunk")) {
|
|
6435
6521
|
const ts = Date.parse(metaTimestamp);
|
|
6436
6522
|
if (!isNaN(ts)) {
|
|
6437
|
-
const
|
|
6438
|
-
if (
|
|
6523
|
+
const boundary = this.turnBoundaryTs.get(currentSessionId);
|
|
6524
|
+
if (boundary !== void 0 && ts < boundary) {
|
|
6439
6525
|
return null;
|
|
6440
6526
|
}
|
|
6441
|
-
if (maxTs === void 0 || ts > maxTs) {
|
|
6442
|
-
this.sessionUpdateTimestamp.set(currentSessionId, ts);
|
|
6443
|
-
}
|
|
6444
6527
|
}
|
|
6445
6528
|
}
|
|
6446
6529
|
const memberEvent = meta?.["codebuddy.ai/memberEvent"];
|
|
@@ -6560,14 +6643,19 @@ var CodebuddyAdapter = class extends AcpAdapter {
|
|
|
6560
6643
|
this.stateMap.delete(oldKey);
|
|
6561
6644
|
this.stateMap.set(newKey, state);
|
|
6562
6645
|
}
|
|
6646
|
+
const boundary = this.turnBoundaryTs.get(oldKey);
|
|
6647
|
+
if (boundary !== void 0) {
|
|
6648
|
+
this.turnBoundaryTs.delete(oldKey);
|
|
6649
|
+
this.turnBoundaryTs.set(newKey, boundary);
|
|
6650
|
+
}
|
|
6563
6651
|
}
|
|
6564
6652
|
cleanup(sessionKey) {
|
|
6565
6653
|
this.stateMap.delete(sessionKey);
|
|
6566
|
-
this.
|
|
6654
|
+
this.turnBoundaryTs.delete(sessionKey);
|
|
6567
6655
|
}
|
|
6568
6656
|
clearAll() {
|
|
6569
6657
|
this.stateMap.clear();
|
|
6570
|
-
this.
|
|
6658
|
+
this.turnBoundaryTs.clear();
|
|
6571
6659
|
}
|
|
6572
6660
|
};
|
|
6573
6661
|
|
|
@@ -6675,6 +6763,10 @@ var codebuddyAdapter = new CodebuddyAdapter();
|
|
|
6675
6763
|
var kiroAdapter = new KiroAdapter();
|
|
6676
6764
|
var adapters = [codebuddyAdapter, kiroAdapter];
|
|
6677
6765
|
var extNotificationSpecs = adapters.flatMap((a) => a.extNotificationSpecs);
|
|
6766
|
+
var agentEnv = Object.assign(
|
|
6767
|
+
{},
|
|
6768
|
+
...adapters.map((a) => a.getAgentEnv())
|
|
6769
|
+
);
|
|
6678
6770
|
|
|
6679
6771
|
// src/backend/agent/resolve-agent-info.ts
|
|
6680
6772
|
function resolveAgentInfo(agentId) {
|
|
@@ -6789,6 +6881,7 @@ function createBridgeConnectModule(ctx, deps) {
|
|
|
6789
6881
|
agentInfo,
|
|
6790
6882
|
cwd,
|
|
6791
6883
|
extNotificationSpecs,
|
|
6884
|
+
agentEnv,
|
|
6792
6885
|
onSessionConnect: (connection) => {
|
|
6793
6886
|
currentSessionId = `${agentId}:${connection.sessionId}`;
|
|
6794
6887
|
storage.updateSession(currentSessionId, { connectionStatus: "connected" }, false);
|
|
@@ -6863,6 +6956,13 @@ function createBridgeConnectModule(ctx, deps) {
|
|
|
6863
6956
|
console.error("write terminal output error: ", { sessionId, terminalId, err });
|
|
6864
6957
|
}
|
|
6865
6958
|
sendEvent("agent-terminal-output", { sessionId, terminalId, data });
|
|
6959
|
+
},
|
|
6960
|
+
// On prompt completion, hand the full PromptResponse to each adapter so
|
|
6961
|
+
// it can freeze its own turn-boundary (CodeBuddy extracts its protocol
|
|
6962
|
+
// timestamp; other adapters are no-ops).
|
|
6963
|
+
onPromptCompleted: (sessionId, res) => {
|
|
6964
|
+
const key = `${agentId}:${sessionId}`;
|
|
6965
|
+
for (const a of adapters) a.handlePromptCompleted(key, res);
|
|
6866
6966
|
}
|
|
6867
6967
|
});
|
|
6868
6968
|
let newConnectPromise;
|
|
@@ -7186,16 +7286,16 @@ import {
|
|
|
7186
7286
|
copyFile
|
|
7187
7287
|
} from "fs/promises";
|
|
7188
7288
|
import * as mimeTypes4 from "mime-types";
|
|
7189
|
-
import { dirname as dirname7, join as join17, relative as
|
|
7289
|
+
import { dirname as dirname7, join as join17, relative as relative9, extname as extname2, basename as basename3 } from "path";
|
|
7190
7290
|
|
|
7191
7291
|
// src/backend/project/git-utils.ts
|
|
7192
7292
|
import { execFile, spawn as spawn3 } from "child_process";
|
|
7193
|
-
import { dirname as dirname6, relative as
|
|
7293
|
+
import { dirname as dirname6, relative as relative8 } from "path";
|
|
7194
7294
|
import { promisify } from "util";
|
|
7195
7295
|
var execFileAsync = promisify(execFile);
|
|
7196
7296
|
async function getGitIgnoredPaths(cwd, relPaths) {
|
|
7197
7297
|
if (relPaths.length === 0) return /* @__PURE__ */ new Set();
|
|
7198
|
-
return new Promise((
|
|
7298
|
+
return new Promise((resolve9) => {
|
|
7199
7299
|
const child = spawn3("git", ["check-ignore", "-z", "--stdin"], {
|
|
7200
7300
|
cwd,
|
|
7201
7301
|
timeout: 3e3,
|
|
@@ -7205,19 +7305,19 @@ async function getGitIgnoredPaths(cwd, relPaths) {
|
|
|
7205
7305
|
});
|
|
7206
7306
|
const chunks = [];
|
|
7207
7307
|
child.stdout.on("data", (chunk) => chunks.push(chunk));
|
|
7208
|
-
child.on("error", () =>
|
|
7308
|
+
child.on("error", () => resolve9(/* @__PURE__ */ new Set()));
|
|
7209
7309
|
child.on("close", () => {
|
|
7210
7310
|
const ignored = /* @__PURE__ */ new Set();
|
|
7211
7311
|
for (const p of Buffer.concat(chunks).toString("utf8").split("\0")) {
|
|
7212
7312
|
if (p) ignored.add(toPosixPath(p));
|
|
7213
7313
|
}
|
|
7214
|
-
|
|
7314
|
+
resolve9(ignored);
|
|
7215
7315
|
});
|
|
7216
7316
|
try {
|
|
7217
7317
|
child.stdin.write(relPaths.join("\0") + "\0");
|
|
7218
7318
|
child.stdin.end();
|
|
7219
7319
|
} catch {
|
|
7220
|
-
|
|
7320
|
+
resolve9(/* @__PURE__ */ new Set());
|
|
7221
7321
|
}
|
|
7222
7322
|
});
|
|
7223
7323
|
}
|
|
@@ -7259,7 +7359,7 @@ async function getGitStatus(cwd) {
|
|
|
7259
7359
|
async function readGitHeadFile(targetPath, encoding) {
|
|
7260
7360
|
try {
|
|
7261
7361
|
const cwd = dirname6(targetPath);
|
|
7262
|
-
const relPath =
|
|
7362
|
+
const relPath = relative8(cwd, targetPath);
|
|
7263
7363
|
const { stdout } = await execFileAsync("git", ["show", `HEAD:./${relPath}`], {
|
|
7264
7364
|
cwd,
|
|
7265
7365
|
maxBuffer: 10 * 1024 * 1024,
|
|
@@ -7279,7 +7379,7 @@ var IGNORE_NAME_SET = /* @__PURE__ */ new Set([".git", ".svn", ".hg"]);
|
|
|
7279
7379
|
var SEARCH_IGNORE_NAME_SET = /* @__PURE__ */ new Set(["node_modules", "vendor", "__pycache__"]);
|
|
7280
7380
|
function hasForbiddenSegment(fullPath, cwd, ...nameSets) {
|
|
7281
7381
|
if (fullPath === cwd) return false;
|
|
7282
|
-
const relPath =
|
|
7382
|
+
const relPath = relative9(cwd, fullPath);
|
|
7283
7383
|
if (!relPath) return false;
|
|
7284
7384
|
const segments = relPath.split(/[\\/]+/);
|
|
7285
7385
|
for (let i = 0; i < segments.length; i++) {
|
|
@@ -7323,7 +7423,7 @@ function createFilesystemState(ctx) {
|
|
|
7323
7423
|
if (!s) continue;
|
|
7324
7424
|
if (hasForbiddenSegment(full, cwd, IGNORE_NAME_SET, SEARCH_IGNORE_NAME_SET)) continue;
|
|
7325
7425
|
if (fileScene.has(full)) continue;
|
|
7326
|
-
const rel =
|
|
7426
|
+
const rel = relative9(cwd, full);
|
|
7327
7427
|
const posixRel = toPosixPath(rel);
|
|
7328
7428
|
allFiles.push({ id: posixRel, filename: rel, isFolder: s.isDirectory() });
|
|
7329
7429
|
if (s.isDirectory()) await collect(full);
|
|
@@ -7335,12 +7435,12 @@ function createFilesystemState(ctx) {
|
|
|
7335
7435
|
async function getSystemFilePath({
|
|
7336
7436
|
projectId,
|
|
7337
7437
|
path: inputPath,
|
|
7338
|
-
isAbsolute:
|
|
7438
|
+
isAbsolute: isAbsolute8
|
|
7339
7439
|
}) {
|
|
7340
7440
|
const project = storage.getProject(projectId);
|
|
7341
7441
|
if (!project) throw new Error("Project not found");
|
|
7342
|
-
if (
|
|
7343
|
-
return
|
|
7442
|
+
if (isAbsolute8) return resolveSafePath(project.cwd, inputPath);
|
|
7443
|
+
return relative9(project.cwd, resolveSafePath(project.cwd, inputPath));
|
|
7344
7444
|
}
|
|
7345
7445
|
async function copyFileToWorkspace({
|
|
7346
7446
|
projectId,
|
|
@@ -7363,7 +7463,7 @@ function createFilesystemState(ctx) {
|
|
|
7363
7463
|
}
|
|
7364
7464
|
await copyFile(sourcePath, destPath);
|
|
7365
7465
|
markProjectFsDirty(projectId);
|
|
7366
|
-
return { success: true, destPath: toPosixPath(
|
|
7466
|
+
return { success: true, destPath: toPosixPath(relative9(cwd, destPath)) };
|
|
7367
7467
|
}
|
|
7368
7468
|
async function readUrlAsDataUrl({ url: inputUrl, mimeType }) {
|
|
7369
7469
|
const MAX_FILE_SIZE = 20 * 1024 * 1024;
|
|
@@ -7418,7 +7518,7 @@ function createFilesystemState(ctx) {
|
|
|
7418
7518
|
fileScene.add(full);
|
|
7419
7519
|
const s = await stat4(full).catch(() => null);
|
|
7420
7520
|
if (!s) continue;
|
|
7421
|
-
const rel =
|
|
7521
|
+
const rel = relative9(cwd, full);
|
|
7422
7522
|
results.push({ id: toPosixPath(rel), filename: rel, isFolder: s.isDirectory() });
|
|
7423
7523
|
if (results.length >= SEARCH_MAX_RESULTS) break;
|
|
7424
7524
|
}
|
|
@@ -7458,7 +7558,7 @@ function createFilesystemState(ctx) {
|
|
|
7458
7558
|
const s = await stat4(full).catch(() => null);
|
|
7459
7559
|
if (!s) continue;
|
|
7460
7560
|
if (hasForbiddenSegment(full, cwd, IGNORE_NAME_SET)) continue;
|
|
7461
|
-
const relId = toPosixPath(
|
|
7561
|
+
const relId = toPosixPath(relative9(cwd, full));
|
|
7462
7562
|
results.push({ id: relId, name, isFolder: s.isDirectory(), ignored: false });
|
|
7463
7563
|
}
|
|
7464
7564
|
results.sort((a, b) => {
|
|
@@ -7737,7 +7837,7 @@ async function startSocketServer(socketPath) {
|
|
|
7737
7837
|
res.writeHead(404, { "Content-Type": "application/json" });
|
|
7738
7838
|
res.end(JSON.stringify({ error: "Not found" }));
|
|
7739
7839
|
});
|
|
7740
|
-
return new Promise((
|
|
7840
|
+
return new Promise((resolve9, reject) => {
|
|
7741
7841
|
server.listen(socketPath, () => {
|
|
7742
7842
|
const serverRef = {
|
|
7743
7843
|
stop: () => {
|
|
@@ -7757,7 +7857,7 @@ async function startSocketServer(socketPath) {
|
|
|
7757
7857
|
},
|
|
7758
7858
|
socketPath
|
|
7759
7859
|
};
|
|
7760
|
-
|
|
7860
|
+
resolve9(serverRef);
|
|
7761
7861
|
});
|
|
7762
7862
|
server.on("error", (err) => {
|
|
7763
7863
|
console.error("[socket-server] Failed to start:", err);
|
|
@@ -8826,7 +8926,7 @@ function createSessionModule(ctx, deps) {
|
|
|
8826
8926
|
askUser,
|
|
8827
8927
|
shareToUser,
|
|
8828
8928
|
skills,
|
|
8829
|
-
search
|
|
8929
|
+
search,
|
|
8830
8930
|
memory,
|
|
8831
8931
|
imageGeneration,
|
|
8832
8932
|
toolbox,
|
|
@@ -8836,7 +8936,7 @@ function createSessionModule(ctx, deps) {
|
|
|
8836
8936
|
skills,
|
|
8837
8937
|
askUser,
|
|
8838
8938
|
shareToUser,
|
|
8839
|
-
search
|
|
8939
|
+
search,
|
|
8840
8940
|
memory,
|
|
8841
8941
|
imageGeneration,
|
|
8842
8942
|
toolbox
|
|
@@ -8854,7 +8954,7 @@ function createSessionModule(ctx, deps) {
|
|
|
8854
8954
|
const server = await startSocketServer(options.socketPath);
|
|
8855
8955
|
toolbox.registerToolboxRoute(server, options.project.cwd);
|
|
8856
8956
|
skills.registerSkillsRoute(server, options.project.cwd);
|
|
8857
|
-
|
|
8957
|
+
search.registerSearchRoute(server, options.project.cwd);
|
|
8858
8958
|
imageGeneration.registerImageGenerationRoute(server, sessionId);
|
|
8859
8959
|
memory.registerMemoryRoute(server, options.project.id, sessionId);
|
|
8860
8960
|
askUser.registerAskUserRoute(server, sessionId);
|
|
@@ -9113,7 +9213,7 @@ function createSessionModule(ctx, deps) {
|
|
|
9113
9213
|
`[SendPrompt] Killed ${killed} agent terminal(s) from previous generation for session ${sessionId}`
|
|
9114
9214
|
);
|
|
9115
9215
|
}
|
|
9116
|
-
await new Promise((
|
|
9216
|
+
await new Promise((resolve9) => setTimeout(resolve9, 30));
|
|
9117
9217
|
}
|
|
9118
9218
|
if (!session.title) {
|
|
9119
9219
|
const firstTextContent = contents.find((c) => c.type === "text");
|
|
@@ -10016,6 +10116,7 @@ function createInferenceModule(_ctx, deps) {
|
|
|
10016
10116
|
agentInfo,
|
|
10017
10117
|
cwd,
|
|
10018
10118
|
extNotificationSpecs,
|
|
10119
|
+
agentEnv,
|
|
10019
10120
|
onSessionConnect: (connection) => {
|
|
10020
10121
|
currentSessionId = `${agentId}:${connection.sessionId}`;
|
|
10021
10122
|
},
|
|
@@ -10985,7 +11086,7 @@ function createImageGenerationModule(ctx, deps) {
|
|
|
10985
11086
|
}
|
|
10986
11087
|
|
|
10987
11088
|
// src/backend/toolbox.ts
|
|
10988
|
-
import { join as join23, resolve as
|
|
11089
|
+
import { join as join23, resolve as resolve8, dirname as dirname9, basename as basename4, extname as extname3 } from "path";
|
|
10989
11090
|
import { writeFile as writeFile6 } from "fs/promises";
|
|
10990
11091
|
import { createHash as createHash6, randomUUID as randomUUID13, randomInt } from "crypto";
|
|
10991
11092
|
import * as qr from "qr-image";
|
|
@@ -11232,15 +11333,15 @@ function createToolboxModule(_ctx) {
|
|
|
11232
11333
|
});
|
|
11233
11334
|
server.registry("toolbox/image-metadata", async (payload) => {
|
|
11234
11335
|
const { path: imgPath } = imageMetadataRequestSchema.parse(payload);
|
|
11235
|
-
const absPath =
|
|
11336
|
+
const absPath = resolve8(projectDir, imgPath);
|
|
11236
11337
|
const sharp = await getSharp();
|
|
11237
11338
|
const metadata = await sharp(absPath).metadata();
|
|
11238
11339
|
return { result: extractMetadata(metadata) };
|
|
11239
11340
|
});
|
|
11240
11341
|
server.registry("toolbox/image-thumbnail", async (payload) => {
|
|
11241
11342
|
const { path: imgPath, width, output } = imageThumbnailRequestSchema.parse(payload);
|
|
11242
|
-
const absPath =
|
|
11243
|
-
const outputPath = output ?
|
|
11343
|
+
const absPath = resolve8(projectDir, imgPath);
|
|
11344
|
+
const outputPath = output ? resolve8(projectDir, output) : join23(
|
|
11244
11345
|
dirname9(absPath),
|
|
11245
11346
|
`${basename4(absPath, extname3(absPath))}.thumb${width}${extname3(absPath)}`
|
|
11246
11347
|
);
|
|
@@ -11251,7 +11352,7 @@ function createToolboxModule(_ctx) {
|
|
|
11251
11352
|
});
|
|
11252
11353
|
server.registry("toolbox/image-resize", async (payload) => {
|
|
11253
11354
|
const { path: imgPath, width, height, fit, output } = imageResizeRequestSchema.parse(payload);
|
|
11254
|
-
const absPath =
|
|
11355
|
+
const absPath = resolve8(projectDir, imgPath);
|
|
11255
11356
|
const sharp = await getSharp();
|
|
11256
11357
|
const resized = await sharp(absPath).resize({ width, height, fit }).toBuffer();
|
|
11257
11358
|
const resizedMeta = await sharp(resized).metadata();
|
|
@@ -11259,15 +11360,15 @@ function createToolboxModule(_ctx) {
|
|
|
11259
11360
|
const actualHeight = resizedMeta.height ?? height ?? 0;
|
|
11260
11361
|
const ext = extname3(absPath);
|
|
11261
11362
|
const base = basename4(absPath, ext);
|
|
11262
|
-
const outputPath = output ?
|
|
11363
|
+
const outputPath = output ? resolve8(projectDir, output) : join23(dirname9(absPath), `${base}.${actualWidth}x${actualHeight}${ext}`);
|
|
11263
11364
|
await writeFile6(outputPath, resized);
|
|
11264
11365
|
const metadata = await sharp(outputPath).metadata();
|
|
11265
11366
|
return { result: { output: outputPath, metadata: extractMetadata(metadata) } };
|
|
11266
11367
|
});
|
|
11267
11368
|
server.registry("toolbox/image-convert", async (payload) => {
|
|
11268
11369
|
const { path: imgPath, format, quality, output } = imageConvertRequestSchema.parse(payload);
|
|
11269
|
-
const absPath =
|
|
11270
|
-
const outputPath = output ?
|
|
11370
|
+
const absPath = resolve8(projectDir, imgPath);
|
|
11371
|
+
const outputPath = output ? resolve8(projectDir, output) : join23(dirname9(absPath), `${basename4(absPath, extname3(absPath))}.${format}`);
|
|
11271
11372
|
const sharp = await getSharp();
|
|
11272
11373
|
let pipeline = sharp(absPath);
|
|
11273
11374
|
const opts = {};
|
|
@@ -11279,7 +11380,7 @@ function createToolboxModule(_ctx) {
|
|
|
11279
11380
|
});
|
|
11280
11381
|
server.registry("toolbox/image-qrcode", async (payload) => {
|
|
11281
11382
|
const { text, output, size, margin, errorCorrection } = qrCodeRequestSchema.parse(payload);
|
|
11282
|
-
const outputPath =
|
|
11383
|
+
const outputPath = resolve8(projectDir, output ?? "qrcode.png");
|
|
11283
11384
|
const png = qr.imageSync(text, {
|
|
11284
11385
|
type: "png",
|
|
11285
11386
|
size,
|
|
@@ -11328,11 +11429,11 @@ function initBackend(emitter) {
|
|
|
11328
11429
|
const askUser = createAskUserModule(ctx, { ilink: ilink.state });
|
|
11329
11430
|
const shareToUser = createShareToUserModule(ctx, { ilink: ilink.state });
|
|
11330
11431
|
const skills = createSkillsModule(ctx);
|
|
11331
|
-
const
|
|
11432
|
+
const search = createSearchModule(ctx);
|
|
11332
11433
|
const watcher2 = createWatcherModule(ctx);
|
|
11333
11434
|
const toolbox = createToolboxModule(ctx);
|
|
11334
11435
|
const bridgeConnect = createBridgeConnectModule(ctx, { askUser });
|
|
11335
|
-
const _inference = createInferenceModule(ctx, { skills, search
|
|
11436
|
+
const _inference = createInferenceModule(ctx, { skills, search, toolbox });
|
|
11336
11437
|
const memory = createMemoryModule(ctx, { inference: _inference });
|
|
11337
11438
|
const imageGeneration = createImageGenerationModule(ctx, { ilink: ilink.state });
|
|
11338
11439
|
const session = createSessionModule(ctx, {
|
|
@@ -11340,7 +11441,7 @@ function initBackend(emitter) {
|
|
|
11340
11441
|
askUser,
|
|
11341
11442
|
shareToUser,
|
|
11342
11443
|
skills,
|
|
11343
|
-
search
|
|
11444
|
+
search,
|
|
11344
11445
|
memory,
|
|
11345
11446
|
imageGeneration,
|
|
11346
11447
|
toolbox,
|
|
@@ -11725,7 +11826,7 @@ function initBackend(emitter) {
|
|
|
11725
11826
|
await ilink.stopIlink({ logout: false });
|
|
11726
11827
|
session.clearSession();
|
|
11727
11828
|
await bridgeConnect.clearAll();
|
|
11728
|
-
await new Promise((
|
|
11829
|
+
await new Promise((resolve9) => setTimeout(resolve9, 100));
|
|
11729
11830
|
terminal.killAllTerminals();
|
|
11730
11831
|
await watcher2.stopAll();
|
|
11731
11832
|
for (const file of await readdir2(TEMP_DIR)) {
|
|
@@ -11736,7 +11837,7 @@ function initBackend(emitter) {
|
|
|
11736
11837
|
}
|
|
11737
11838
|
|
|
11738
11839
|
// package.json
|
|
11739
|
-
var version = "0.1.
|
|
11840
|
+
var version = "0.1.49";
|
|
11740
11841
|
|
|
11741
11842
|
// src/server/main.ts
|
|
11742
11843
|
var port;
|