agor-live 0.16.2 → 0.16.3
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/dist/cli/commands/board/add-session.js +4 -8
- package/dist/cli/commands/board/list.js +2 -4
- package/dist/cli/commands/mcp/list.js +1 -2
- package/dist/cli/commands/mcp/remove.js +1 -2
- package/dist/cli/commands/mcp/show.js +1 -2
- package/dist/cli/commands/repo/rm.js +1 -2
- package/dist/cli/commands/session/load-claude.js +1 -2
- package/dist/cli/commands/user/delete.js +1 -2
- package/dist/cli/commands/user/update.js +1 -2
- package/dist/cli/commands/worktree/add.js +1 -2
- package/dist/cli/commands/worktree/archive.js +1 -2
- package/dist/cli/commands/worktree/list.js +3 -6
- package/dist/cli/commands/worktree/rm.js +1 -2
- package/dist/cli/commands/worktree/show.js +1 -2
- package/dist/cli/commands/worktree/unarchive.js +1 -2
- package/dist/core/api/index.cjs +87 -2
- package/dist/core/api/index.d.cts +53 -10
- package/dist/core/api/index.d.ts +53 -10
- package/dist/core/api/index.js +85 -1
- package/dist/core/{feathers-CzuSOZgY.d.ts → feathers-CKfl55ut.d.ts} +10 -2
- package/dist/core/{feathers-CYAHFZ05.d.cts → feathers-NY8lH6YZ.d.cts} +10 -2
- package/dist/core/index.cjs +85 -0
- package/dist/core/index.d.cts +2 -2
- package/dist/core/index.d.ts +2 -2
- package/dist/core/index.js +84 -0
- package/dist/core/types/index.d.cts +1 -1
- package/dist/core/types/index.d.ts +1 -1
- package/dist/daemon/index.js +18 -1
- package/dist/daemon/register-routes.js +15 -0
- package/dist/daemon/register-services.js +3 -1
- package/dist/daemon/services/mcp-servers.d.ts +7 -2
- package/dist/executor/db/feathers-repositories.d.ts +1 -0
- package/dist/executor/db/feathers-repositories.d.ts.map +1 -1
- package/dist/executor/db/feathers-repositories.js +1 -0
- package/dist/executor/handlers/sdk/claude.d.ts.map +1 -1
- package/dist/executor/handlers/sdk/claude.js +1 -1
- package/dist/executor/handlers/sdk/codex.d.ts.map +1 -1
- package/dist/executor/handlers/sdk/codex.js +1 -1
- package/dist/executor/sdk-handlers/base/diff-enrichment.d.ts +4 -1
- package/dist/executor/sdk-handlers/base/diff-enrichment.d.ts.map +1 -1
- package/dist/executor/sdk-handlers/base/diff-enrichment.js +97 -24
- package/dist/executor/sdk-handlers/claude/claude-tool.d.ts +9 -1
- package/dist/executor/sdk-handlers/claude/claude-tool.d.ts.map +1 -1
- package/dist/executor/sdk-handlers/claude/claude-tool.js +17 -7
- package/dist/executor/sdk-handlers/codex/codex-tool.d.ts +5 -2
- package/dist/executor/sdk-handlers/codex/codex-tool.d.ts.map +1 -1
- package/dist/executor/sdk-handlers/codex/codex-tool.js +122 -24
- package/dist/executor/sdk-handlers/codex/prompt-service.d.ts +7 -1
- package/dist/executor/sdk-handlers/codex/prompt-service.d.ts.map +1 -1
- package/dist/executor/sdk-handlers/codex/prompt-service.js +111 -17
- package/dist/ui/assets/{_basePickBy-By_woBZB.js → _basePickBy-CM6p9_3C.js} +1 -1
- package/dist/ui/assets/_basePickBy-CM6p9_3C.js.gz +0 -0
- package/dist/ui/assets/{_baseUniq-C2jLj-Al.js → _baseUniq-CHMdQkaA.js} +1 -1
- package/dist/ui/assets/_baseUniq-CHMdQkaA.js.gz +0 -0
- package/dist/ui/assets/{arc-DADMFVbt.js → arc-Czp_Gn_m.js} +1 -1
- package/dist/ui/assets/arc-Czp_Gn_m.js.gz +0 -0
- package/dist/ui/assets/{architectureDiagram-VXUJARFQ-rNJ5lYJQ.js → architectureDiagram-VXUJARFQ-Cz-z2R4z.js} +1 -1
- package/dist/ui/assets/architectureDiagram-VXUJARFQ-Cz-z2R4z.js.gz +0 -0
- package/dist/ui/assets/{base-80a1f760-BVsv_T1S.js → base-80a1f760-DL2sFXEh.js} +1 -1
- package/dist/ui/assets/{blockDiagram-VD42YOAC-CezN66iB.js → blockDiagram-VD42YOAC-C62DfRc6.js} +1 -1
- package/dist/ui/assets/blockDiagram-VD42YOAC-C62DfRc6.js.gz +0 -0
- package/dist/ui/assets/{c4Diagram-YG6GDRKO-Dze59YuK.js → c4Diagram-YG6GDRKO-DGSWKqxL.js} +1 -1
- package/dist/ui/assets/c4Diagram-YG6GDRKO-DGSWKqxL.js.gz +0 -0
- package/dist/ui/assets/channel-CmfC29hp.js +1 -0
- package/dist/ui/assets/{chunk-4BX2VUAB-CXL-V_XA.js → chunk-4BX2VUAB-CuJEBfIh.js} +1 -1
- package/dist/ui/assets/{chunk-55IACEB6-CI3h0xTl.js → chunk-55IACEB6-DYgjRl-z.js} +1 -1
- package/dist/ui/assets/{chunk-B4BG7PRW-CFohiEqO.js → chunk-B4BG7PRW-rqPu7wjt.js} +1 -1
- package/dist/ui/assets/chunk-B4BG7PRW-rqPu7wjt.js.gz +0 -0
- package/dist/ui/assets/{chunk-DI55MBZ5-BbF4fGKj.js → chunk-DI55MBZ5-D7PtpA49.js} +1 -1
- package/dist/ui/assets/chunk-DI55MBZ5-D7PtpA49.js.gz +0 -0
- package/dist/ui/assets/{chunk-FMBD7UC4-C5x6cpDg.js → chunk-FMBD7UC4-1R4kh4IH.js} +1 -1
- package/dist/ui/assets/{chunk-QN33PNHL-CEDiC29y.js → chunk-QN33PNHL-qNBgj7JQ.js} +1 -1
- package/dist/ui/assets/{chunk-QZHKN3VN-DPo28cCF.js → chunk-QZHKN3VN-JUwZqL5s.js} +1 -1
- package/dist/ui/assets/{chunk-TZMSLE5B-C94jSlIG.js → chunk-TZMSLE5B-Bk4l2qq1.js} +1 -1
- package/dist/ui/assets/chunk-TZMSLE5B-Bk4l2qq1.js.gz +0 -0
- package/dist/ui/assets/classDiagram-2ON5EDUG-LD317OSr.js +1 -0
- package/dist/ui/assets/classDiagram-v2-WZHVMYZB-LD317OSr.js +1 -0
- package/dist/ui/assets/clone-iT69LzXk.js +1 -0
- package/dist/ui/assets/{consoleHook-59e792cb-cpS6JVM4.js → consoleHook-59e792cb-BjB_4eqO.js} +1 -1
- package/dist/ui/assets/consoleHook-59e792cb-BjB_4eqO.js.gz +0 -0
- package/dist/ui/assets/{cose-bilkent-S5V4N54A-CcoEg_Ct.js → cose-bilkent-S5V4N54A-Db3GpSRP.js} +1 -1
- package/dist/ui/assets/cose-bilkent-S5V4N54A-Db3GpSRP.js.gz +0 -0
- package/dist/ui/assets/{dagre-6UL2VRFP-DWAyqs2B.js → dagre-6UL2VRFP-D9RUH_36.js} +1 -1
- package/dist/ui/assets/dagre-6UL2VRFP-D9RUH_36.js.gz +0 -0
- package/dist/ui/assets/{diagram-PSM6KHXK-C7J2MNfc.js → diagram-PSM6KHXK-C51S0t1m.js} +1 -1
- package/dist/ui/assets/diagram-PSM6KHXK-C51S0t1m.js.gz +0 -0
- package/dist/ui/assets/{diagram-QEK2KX5R-6KZjqziN.js → diagram-QEK2KX5R-Bl99kj4s.js} +1 -1
- package/dist/ui/assets/diagram-QEK2KX5R-Bl99kj4s.js.gz +0 -0
- package/dist/ui/assets/{diagram-S2PKOQOG-DIL01325.js → diagram-S2PKOQOG-Dm52PeWx.js} +1 -1
- package/dist/ui/assets/diagram-S2PKOQOG-Dm52PeWx.js.gz +0 -0
- package/dist/ui/assets/{erDiagram-Q2GNP2WA-D5j4CetG.js → erDiagram-Q2GNP2WA-K5D_GKDZ.js} +1 -1
- package/dist/ui/assets/erDiagram-Q2GNP2WA-K5D_GKDZ.js.gz +0 -0
- package/dist/ui/assets/{flowDiagram-NV44I4VS-Bxx2iEi-.js → flowDiagram-NV44I4VS-D7fCREXV.js} +1 -1
- package/dist/ui/assets/flowDiagram-NV44I4VS-D7fCREXV.js.gz +0 -0
- package/dist/ui/assets/{ganttDiagram-LVOFAZNH-BtBi1ZfT.js → ganttDiagram-LVOFAZNH-CNW9D2UF.js} +1 -1
- package/dist/ui/assets/ganttDiagram-LVOFAZNH-CNW9D2UF.js.gz +0 -0
- package/dist/ui/assets/{gitGraphDiagram-NY62KEGX-CY1TKvzA.js → gitGraphDiagram-NY62KEGX-CzSHwK4S.js} +1 -1
- package/dist/ui/assets/gitGraphDiagram-NY62KEGX-CzSHwK4S.js.gz +0 -0
- package/dist/ui/assets/{graph-DC6eH7AX.js → graph-iZG1PujV.js} +1 -1
- package/dist/ui/assets/graph-iZG1PujV.js.gz +0 -0
- package/dist/ui/assets/{index-599aeaf7-Dh_oObwY.js → index-599aeaf7-BSVvtdOR.js} +1 -1
- package/dist/ui/assets/index-599aeaf7-BSVvtdOR.js.gz +0 -0
- package/dist/ui/assets/{index-CxWOjjRu.js → index-Bv9iC_mb.js} +1 -1
- package/dist/ui/assets/index-Bv9iC_mb.js.gz +0 -0
- package/dist/ui/assets/{index-DJLnZ-9H.js → index-CmhCTwYo.js} +255 -257
- package/dist/ui/assets/index-CmhCTwYo.js.gz +0 -0
- package/dist/ui/assets/{index-DQn7RJ8z.js → index-DX9HbDkF.js} +1 -1
- package/dist/ui/assets/index-DX9HbDkF.js.gz +0 -0
- package/dist/ui/assets/{infoDiagram-ER5ION4S-COpJ37pc.js → infoDiagram-ER5ION4S-7UpJXgGv.js} +1 -1
- package/dist/ui/assets/{journeyDiagram-XKPGCS4Q-CpODBkng.js → journeyDiagram-XKPGCS4Q-B_u-rXxp.js} +1 -1
- package/dist/ui/assets/journeyDiagram-XKPGCS4Q-B_u-rXxp.js.gz +0 -0
- package/dist/ui/assets/{kanban-definition-3W4ZIXB7-DWShJ5Su.js → kanban-definition-3W4ZIXB7-C60Ys_tG.js} +1 -1
- package/dist/ui/assets/kanban-definition-3W4ZIXB7-C60Ys_tG.js.gz +0 -0
- package/dist/ui/assets/{layout-ttMTfXMb.js → layout-2nOBwYEK.js} +1 -1
- package/dist/ui/assets/layout-2nOBwYEK.js.gz +0 -0
- package/dist/ui/assets/{linear-DD8VTncp.js → linear-BBfmsNEf.js} +1 -1
- package/dist/ui/assets/linear-BBfmsNEf.js.gz +0 -0
- package/dist/ui/assets/{mermaid.core-BlvxruUX.js → mermaid.core-BMmc28YS.js} +5 -5
- package/dist/ui/assets/mermaid.core-BMmc28YS.js.gz +0 -0
- package/dist/ui/assets/{mindmap-definition-VGOIOE7T-CR0ESdqM.js → mindmap-definition-VGOIOE7T-CUOfncA2.js} +1 -1
- package/dist/ui/assets/mindmap-definition-VGOIOE7T-CUOfncA2.js.gz +0 -0
- package/dist/ui/assets/{pieDiagram-ADFJNKIX-B94eVYhY.js → pieDiagram-ADFJNKIX-CYt5K7tI.js} +1 -1
- package/dist/ui/assets/pieDiagram-ADFJNKIX-CYt5K7tI.js.gz +0 -0
- package/dist/ui/assets/{quadrantDiagram-AYHSOK5B-C4tNKfCm.js → quadrantDiagram-AYHSOK5B-D3z7FGdo.js} +1 -1
- package/dist/ui/assets/quadrantDiagram-AYHSOK5B-D3z7FGdo.js.gz +0 -0
- package/dist/ui/assets/{requirementDiagram-UZGBJVZJ-CuG3A95Q.js → requirementDiagram-UZGBJVZJ-DSmK1rXj.js} +1 -1
- package/dist/ui/assets/requirementDiagram-UZGBJVZJ-DSmK1rXj.js.gz +0 -0
- package/dist/ui/assets/{sankeyDiagram-TZEHDZUN-BCfc7mLC.js → sankeyDiagram-TZEHDZUN-BVudlnpo.js} +1 -1
- package/dist/ui/assets/sankeyDiagram-TZEHDZUN-BVudlnpo.js.gz +0 -0
- package/dist/ui/assets/{sequenceDiagram-WL72ISMW-D8tVuIkx.js → sequenceDiagram-WL72ISMW-DShMajjv.js} +1 -1
- package/dist/ui/assets/sequenceDiagram-WL72ISMW-DShMajjv.js.gz +0 -0
- package/dist/ui/assets/{stateDiagram-FKZM4ZOC-DvM8so2A.js → stateDiagram-FKZM4ZOC-9zK0uo4t.js} +1 -1
- package/dist/ui/assets/stateDiagram-FKZM4ZOC-9zK0uo4t.js.gz +0 -0
- package/dist/ui/assets/stateDiagram-v2-4FDKWEC3-BZEgBfav.js +1 -0
- package/dist/ui/assets/{timeline-definition-IT6M3QCI-CP2O8vqw.js → timeline-definition-IT6M3QCI-DQ4HYAMD.js} +1 -1
- package/dist/ui/assets/timeline-definition-IT6M3QCI-DQ4HYAMD.js.gz +0 -0
- package/dist/ui/assets/{treemap-KMMF4GRG-SGJAEegj.js → treemap-KMMF4GRG-Curv75AA.js} +1 -1
- package/dist/ui/assets/treemap-KMMF4GRG-Curv75AA.js.gz +0 -0
- package/dist/ui/assets/{xychartDiagram-PRI3JC2R-CpwYBSmP.js → xychartDiagram-PRI3JC2R-BJdTipk8.js} +1 -1
- package/dist/ui/assets/xychartDiagram-PRI3JC2R-BJdTipk8.js.gz +0 -0
- package/dist/ui/index.html +1 -1
- package/package.json +1 -1
- package/dist/ui/assets/_basePickBy-By_woBZB.js.gz +0 -0
- package/dist/ui/assets/_baseUniq-C2jLj-Al.js.gz +0 -0
- package/dist/ui/assets/arc-DADMFVbt.js.gz +0 -0
- package/dist/ui/assets/architectureDiagram-VXUJARFQ-rNJ5lYJQ.js.gz +0 -0
- package/dist/ui/assets/blockDiagram-VD42YOAC-CezN66iB.js.gz +0 -0
- package/dist/ui/assets/c4Diagram-YG6GDRKO-Dze59YuK.js.gz +0 -0
- package/dist/ui/assets/channel-B2nSdT47.js +0 -1
- package/dist/ui/assets/chunk-B4BG7PRW-CFohiEqO.js.gz +0 -0
- package/dist/ui/assets/chunk-DI55MBZ5-BbF4fGKj.js.gz +0 -0
- package/dist/ui/assets/chunk-TZMSLE5B-C94jSlIG.js.gz +0 -0
- package/dist/ui/assets/classDiagram-2ON5EDUG-lwQJA5v0.js +0 -1
- package/dist/ui/assets/classDiagram-v2-WZHVMYZB-lwQJA5v0.js +0 -1
- package/dist/ui/assets/clone-DmZ98vg9.js +0 -1
- package/dist/ui/assets/consoleHook-59e792cb-cpS6JVM4.js.gz +0 -0
- package/dist/ui/assets/cose-bilkent-S5V4N54A-CcoEg_Ct.js.gz +0 -0
- package/dist/ui/assets/dagre-6UL2VRFP-DWAyqs2B.js.gz +0 -0
- package/dist/ui/assets/diagram-PSM6KHXK-C7J2MNfc.js.gz +0 -0
- package/dist/ui/assets/diagram-QEK2KX5R-6KZjqziN.js.gz +0 -0
- package/dist/ui/assets/diagram-S2PKOQOG-DIL01325.js.gz +0 -0
- package/dist/ui/assets/erDiagram-Q2GNP2WA-D5j4CetG.js.gz +0 -0
- package/dist/ui/assets/flowDiagram-NV44I4VS-Bxx2iEi-.js.gz +0 -0
- package/dist/ui/assets/ganttDiagram-LVOFAZNH-BtBi1ZfT.js.gz +0 -0
- package/dist/ui/assets/gitGraphDiagram-NY62KEGX-CY1TKvzA.js.gz +0 -0
- package/dist/ui/assets/graph-DC6eH7AX.js.gz +0 -0
- package/dist/ui/assets/index-599aeaf7-Dh_oObwY.js.gz +0 -0
- package/dist/ui/assets/index-CxWOjjRu.js.gz +0 -0
- package/dist/ui/assets/index-DJLnZ-9H.js.gz +0 -0
- package/dist/ui/assets/index-DQn7RJ8z.js.gz +0 -0
- package/dist/ui/assets/journeyDiagram-XKPGCS4Q-CpODBkng.js.gz +0 -0
- package/dist/ui/assets/kanban-definition-3W4ZIXB7-DWShJ5Su.js.gz +0 -0
- package/dist/ui/assets/layout-ttMTfXMb.js.gz +0 -0
- package/dist/ui/assets/linear-DD8VTncp.js.gz +0 -0
- package/dist/ui/assets/mermaid.core-BlvxruUX.js.gz +0 -0
- package/dist/ui/assets/mindmap-definition-VGOIOE7T-CR0ESdqM.js.gz +0 -0
- package/dist/ui/assets/pieDiagram-ADFJNKIX-B94eVYhY.js.gz +0 -0
- package/dist/ui/assets/quadrantDiagram-AYHSOK5B-C4tNKfCm.js.gz +0 -0
- package/dist/ui/assets/requirementDiagram-UZGBJVZJ-CuG3A95Q.js.gz +0 -0
- package/dist/ui/assets/sankeyDiagram-TZEHDZUN-BCfc7mLC.js.gz +0 -0
- package/dist/ui/assets/sequenceDiagram-WL72ISMW-D8tVuIkx.js.gz +0 -0
- package/dist/ui/assets/stateDiagram-FKZM4ZOC-DvM8so2A.js.gz +0 -0
- package/dist/ui/assets/stateDiagram-v2-4FDKWEC3-kQ-gZX7K.js +0 -1
- package/dist/ui/assets/timeline-definition-IT6M3QCI-CP2O8vqw.js.gz +0 -0
- package/dist/ui/assets/treemap-KMMF4GRG-SGJAEegj.js.gz +0 -0
- package/dist/ui/assets/xychartDiagram-PRI3JC2R-CpwYBSmP.js.gz +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff-enrichment.d.ts","sourceRoot":"","sources":["../../../src/sdk-handlers/base/diff-enrichment.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAQH,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAa5D,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;
|
|
1
|
+
{"version":3,"file":"diff-enrichment.d.ts","sourceRoot":"","sources":["../../../src/sdk-handlers/base/diff-enrichment.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAQH,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAa5D,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AA4ED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC,GAC5E,IAAI,CAIN;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,YAAY,EAAE,GAAG,IAAI,CAoBrE;AAMD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,aAAa,EAAE,YAAY,EAAE,EAC7B,OAAO,CAAC,EAAE,qBAAqB,GAC9B,IAAI,CAuBN"}
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* Call `enrichContentBlocks()` which finds tool_use blocks and uses their input
|
|
18
18
|
* to enrich adjacent tool_result blocks in one pass.
|
|
19
19
|
*/
|
|
20
|
-
import { execSync } from 'node:child_process';
|
|
20
|
+
import { execFileSync, execSync } from 'node:child_process';
|
|
21
21
|
import * as fs from 'node:fs';
|
|
22
22
|
import * as path from 'node:path';
|
|
23
23
|
import { structuredPatch } from 'diff';
|
|
@@ -25,6 +25,60 @@ import { structuredPatch } from 'diff';
|
|
|
25
25
|
const MAX_FILE_SIZE_BYTES = 1_048_576;
|
|
26
26
|
/** Context lines around changes (same as Claude Code CLI) */
|
|
27
27
|
const CONTEXT_LINES = 3;
|
|
28
|
+
function isSafeRepoRelativePath(relativePath) {
|
|
29
|
+
const normalized = path.posix.normalize(relativePath.split(path.sep).join('/'));
|
|
30
|
+
return !(!normalized ||
|
|
31
|
+
normalized.startsWith('/') ||
|
|
32
|
+
normalized === '..' ||
|
|
33
|
+
normalized.startsWith('../') ||
|
|
34
|
+
normalized.includes('\0') ||
|
|
35
|
+
normalized.includes('\n') ||
|
|
36
|
+
normalized.includes('\r'));
|
|
37
|
+
}
|
|
38
|
+
function tryRealpath(p) {
|
|
39
|
+
try {
|
|
40
|
+
return fs.realpathSync(p);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Resolve a path to a git-repo-relative path, tolerating symlink prefix drift.
|
|
48
|
+
*
|
|
49
|
+
* In production we may receive absolute tool paths under a symlinked mount
|
|
50
|
+
* while git reports a canonical root under a different prefix. This helper
|
|
51
|
+
* tries lexical and canonicalized candidates and returns a safe repo-relative path.
|
|
52
|
+
*/
|
|
53
|
+
function resolveRepoRelativePath(gitRoot, absolutePath) {
|
|
54
|
+
const lexicalRelative = path.relative(gitRoot, absolutePath);
|
|
55
|
+
if (isSafeRepoRelativePath(lexicalRelative)) {
|
|
56
|
+
return lexicalRelative;
|
|
57
|
+
}
|
|
58
|
+
const gitRootReal = tryRealpath(gitRoot);
|
|
59
|
+
if (!gitRootReal)
|
|
60
|
+
return null;
|
|
61
|
+
const candidates = new Set();
|
|
62
|
+
candidates.add(absolutePath);
|
|
63
|
+
const absoluteReal = tryRealpath(absolutePath);
|
|
64
|
+
if (absoluteReal) {
|
|
65
|
+
candidates.add(absoluteReal);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
// File may not exist (e.g., delete). Resolve through parent directory.
|
|
69
|
+
const parentReal = tryRealpath(path.dirname(absolutePath));
|
|
70
|
+
if (parentReal) {
|
|
71
|
+
candidates.add(path.join(parentReal, path.basename(absolutePath)));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
for (const candidate of candidates) {
|
|
75
|
+
const relativePath = path.relative(gitRootReal, candidate);
|
|
76
|
+
if (isSafeRepoRelativePath(relativePath)) {
|
|
77
|
+
return relativePath;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
28
82
|
// ---------------------------------------------------------------------------
|
|
29
83
|
// Pattern 1: Split messages (Claude)
|
|
30
84
|
// ---------------------------------------------------------------------------
|
|
@@ -81,7 +135,7 @@ export function enrichToolResults(contentBlocks) {
|
|
|
81
135
|
* Used by Codex, OpenCode, and Gemini handlers.
|
|
82
136
|
* Mutates content blocks in-place. Best-effort.
|
|
83
137
|
*/
|
|
84
|
-
export function enrichContentBlocks(contentBlocks) {
|
|
138
|
+
export function enrichContentBlocks(contentBlocks, context) {
|
|
85
139
|
// Build local map from tool_use blocks in this array
|
|
86
140
|
const localToolUses = new Map();
|
|
87
141
|
for (const block of contentBlocks) {
|
|
@@ -101,7 +155,7 @@ export function enrichContentBlocks(contentBlocks) {
|
|
|
101
155
|
const toolUse = localToolUses.get(toolUseId);
|
|
102
156
|
if (!toolUse)
|
|
103
157
|
continue;
|
|
104
|
-
enrichBlock(block, toolUse.name, toolUse.input);
|
|
158
|
+
enrichBlock(block, toolUse.name, toolUse.input, context);
|
|
105
159
|
}
|
|
106
160
|
}
|
|
107
161
|
// ---------------------------------------------------------------------------
|
|
@@ -111,7 +165,7 @@ export function enrichContentBlocks(contentBlocks) {
|
|
|
111
165
|
* Enrich a single tool_result block with diff data.
|
|
112
166
|
* Best-effort — swallows all errors.
|
|
113
167
|
*/
|
|
114
|
-
function enrichBlock(block, toolName, toolInput) {
|
|
168
|
+
function enrichBlock(block, toolName, toolInput, context) {
|
|
115
169
|
try {
|
|
116
170
|
// Normalize tool names across SDKs (Claude: "Edit", Codex: "edit", etc.)
|
|
117
171
|
const normalized = toolName.toLowerCase();
|
|
@@ -122,7 +176,7 @@ function enrichBlock(block, toolName, toolInput) {
|
|
|
122
176
|
enrichWriteResult(block, toolInput);
|
|
123
177
|
}
|
|
124
178
|
else if (normalized === 'edit_files') {
|
|
125
|
-
enrichEditFilesResult(block, toolInput);
|
|
179
|
+
enrichEditFilesResult(block, toolInput, context);
|
|
126
180
|
}
|
|
127
181
|
}
|
|
128
182
|
catch {
|
|
@@ -234,16 +288,18 @@ function enrichWriteResult(block, input) {
|
|
|
234
288
|
* No old/new content is provided — we reconstruct diffs by comparing
|
|
235
289
|
* the current file (post-edit) against git HEAD.
|
|
236
290
|
*/
|
|
237
|
-
function enrichEditFilesResult(block, input) {
|
|
291
|
+
function enrichEditFilesResult(block, input, context) {
|
|
238
292
|
const changes = input.changes;
|
|
239
293
|
if (!changes || changes.length === 0)
|
|
240
294
|
return;
|
|
295
|
+
const workingDirectory = context?.workingDirectory;
|
|
241
296
|
// Find git root once for relative path resolution
|
|
242
297
|
let gitRoot;
|
|
243
298
|
try {
|
|
244
299
|
gitRoot = execSync('git rev-parse --show-toplevel', {
|
|
245
300
|
encoding: 'utf-8',
|
|
246
301
|
timeout: 5000,
|
|
302
|
+
...(workingDirectory ? { cwd: workingDirectory } : {}),
|
|
247
303
|
}).trim();
|
|
248
304
|
}
|
|
249
305
|
catch {
|
|
@@ -255,13 +311,16 @@ function enrichEditFilesResult(block, input) {
|
|
|
255
311
|
continue;
|
|
256
312
|
const kind = (change.kind || 'update');
|
|
257
313
|
const filePath = change.path;
|
|
314
|
+
const resolvedPath = path.isAbsolute(filePath)
|
|
315
|
+
? filePath
|
|
316
|
+
: path.resolve(workingDirectory || gitRoot, filePath);
|
|
258
317
|
try {
|
|
259
318
|
if (kind === 'add') {
|
|
260
319
|
// New file — all additions
|
|
261
|
-
const stat = fs.statSync(
|
|
320
|
+
const stat = fs.statSync(resolvedPath);
|
|
262
321
|
if (stat.size > MAX_FILE_SIZE_BYTES)
|
|
263
322
|
continue;
|
|
264
|
-
const content = fs.readFileSync(
|
|
323
|
+
const content = fs.readFileSync(resolvedPath, 'utf-8');
|
|
265
324
|
const patch = structuredPatch(filePath, filePath, '', content, '', '', {
|
|
266
325
|
context: 0,
|
|
267
326
|
});
|
|
@@ -271,11 +330,12 @@ function enrichEditFilesResult(block, input) {
|
|
|
271
330
|
}
|
|
272
331
|
else if (kind === 'delete') {
|
|
273
332
|
// Deleted file — get old content from git
|
|
274
|
-
const relativePath =
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
333
|
+
const relativePath = resolveRepoRelativePath(gitRoot, resolvedPath);
|
|
334
|
+
if (!relativePath)
|
|
335
|
+
continue;
|
|
336
|
+
const oldContent = gitShowHeadFile(gitRoot, relativePath);
|
|
337
|
+
if (oldContent === null)
|
|
338
|
+
continue;
|
|
279
339
|
const patch = structuredPatch(filePath, filePath, oldContent, '', '', '', {
|
|
280
340
|
context: CONTEXT_LINES,
|
|
281
341
|
});
|
|
@@ -285,19 +345,15 @@ function enrichEditFilesResult(block, input) {
|
|
|
285
345
|
}
|
|
286
346
|
else {
|
|
287
347
|
// Update — diff git HEAD vs current file
|
|
288
|
-
const stat = fs.statSync(
|
|
348
|
+
const stat = fs.statSync(resolvedPath);
|
|
289
349
|
if (stat.size > MAX_FILE_SIZE_BYTES)
|
|
290
350
|
continue;
|
|
291
|
-
const currentContent = fs.readFileSync(
|
|
292
|
-
const relativePath =
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
timeout: 5000,
|
|
298
|
-
});
|
|
299
|
-
}
|
|
300
|
-
catch {
|
|
351
|
+
const currentContent = fs.readFileSync(resolvedPath, 'utf-8');
|
|
352
|
+
const relativePath = resolveRepoRelativePath(gitRoot, resolvedPath);
|
|
353
|
+
if (!relativePath)
|
|
354
|
+
continue;
|
|
355
|
+
const oldContent = gitShowHeadFile(gitRoot, relativePath);
|
|
356
|
+
if (oldContent === null) {
|
|
301
357
|
// File may be new (not in HEAD) — treat as addition
|
|
302
358
|
const patch = structuredPatch(filePath, filePath, '', currentContent, '', '', {
|
|
303
359
|
context: 0,
|
|
@@ -327,3 +383,20 @@ function enrichEditFilesResult(block, input) {
|
|
|
327
383
|
};
|
|
328
384
|
}
|
|
329
385
|
}
|
|
386
|
+
function gitShowHeadFile(gitRoot, relativePath) {
|
|
387
|
+
// Ensure the ref path is safe and uses git's forward-slash separator.
|
|
388
|
+
const normalized = path.posix.normalize(relativePath.split(path.sep).join('/'));
|
|
389
|
+
if (!isSafeRepoRelativePath(normalized)) {
|
|
390
|
+
return null;
|
|
391
|
+
}
|
|
392
|
+
try {
|
|
393
|
+
return execFileSync('git', ['show', `HEAD:${normalized}`], {
|
|
394
|
+
encoding: 'utf-8',
|
|
395
|
+
timeout: 5000,
|
|
396
|
+
cwd: gitRoot,
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
catch {
|
|
400
|
+
return null;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
@@ -30,6 +30,12 @@ export interface TasksService {
|
|
|
30
30
|
patch(id: string, data: Partial<any>): Promise<any>;
|
|
31
31
|
emit(event: string, data: unknown): void;
|
|
32
32
|
}
|
|
33
|
+
export interface TasksStreamingService {
|
|
34
|
+
create(data: {
|
|
35
|
+
event: 'tool:start' | 'tool:complete' | 'thinking:chunk';
|
|
36
|
+
data: Record<string, unknown>;
|
|
37
|
+
}): Promise<unknown>;
|
|
38
|
+
}
|
|
33
39
|
/**
|
|
34
40
|
* Service interface for updating sessions via FeathersJS
|
|
35
41
|
* This ensures WebSocket events are emitted when sessions are updated (e.g., permission config)
|
|
@@ -42,13 +48,15 @@ export declare class ClaudeTool implements ITool {
|
|
|
42
48
|
private sessionsRepo?;
|
|
43
49
|
private messagesService?;
|
|
44
50
|
private tasksService?;
|
|
51
|
+
private tasksStreamingService?;
|
|
45
52
|
readonly toolType: "claude-code";
|
|
46
53
|
readonly name = "Claude Code";
|
|
47
54
|
private promptService?;
|
|
48
|
-
constructor(messagesRepo?: MessagesRepository | undefined, sessionsRepo?: SessionRepository | undefined, apiKey?: string, messagesService?: MessagesService | undefined, sessionMCPRepo?: SessionMCPServerRepository, mcpServerRepo?: MCPServerRepository, permissionService?: PermissionService, tasksService?: TasksService | undefined, sessionsService?: SessionsService, worktreesRepo?: WorktreeRepository, reposRepo?: RepoRepository, mcpEnabled?: boolean, _useNativeAuth?: boolean, // Claude supports `claude login` OAuth, but no special handling needed in tool
|
|
55
|
+
constructor(messagesRepo?: MessagesRepository | undefined, sessionsRepo?: SessionRepository | undefined, apiKey?: string, messagesService?: MessagesService | undefined, sessionMCPRepo?: SessionMCPServerRepository, mcpServerRepo?: MCPServerRepository, permissionService?: PermissionService, tasksService?: TasksService | undefined, tasksStreamingService?: TasksStreamingService | undefined, sessionsService?: SessionsService, worktreesRepo?: WorktreeRepository, reposRepo?: RepoRepository, mcpEnabled?: boolean, _useNativeAuth?: boolean, // Claude supports `claude login` OAuth, but no special handling needed in tool
|
|
49
56
|
inputRequestService?: import('../../input-requests/input-request-service').InputRequestService, usersRepo?: import('../../db/feathers-repositories').UsersRepository);
|
|
50
57
|
getCapabilities(): ToolCapabilities;
|
|
51
58
|
checkInstalled(): Promise<boolean>;
|
|
59
|
+
private emitTaskEvent;
|
|
52
60
|
importSession(sessionId: string, options?: ImportOptions): Promise<SessionData>;
|
|
53
61
|
/**
|
|
54
62
|
* Execute a prompt against a session WITH real-time streaming
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-tool.d.ts","sourceRoot":"","sources":["../../../src/sdk-handlers/claude/claude-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,OAAO,KAAK,EACV,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,EACd,0BAA0B,EAC1B,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AACjF,OAAO,KAAK,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAEzF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,SAAS,EAEd,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,MAAM,EAEZ,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AA0E5F;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7D;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAE3B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAE9B,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACpD,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;CAC1C;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAE9B,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;CACrD;AAED,qBAAa,UAAW,YAAW,KAAK;IAOpC,OAAO,CAAC,YAAY,CAAC;IACrB,OAAO,CAAC,YAAY,CAAC;IAErB,OAAO,CAAC,eAAe,CAAC;IAIxB,OAAO,CAAC,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"claude-tool.d.ts","sourceRoot":"","sources":["../../../src/sdk-handlers/claude/claude-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -70,15 +70,17 @@ export class ClaudeTool {
|
|
|
70
70
|
sessionsRepo;
|
|
71
71
|
messagesService;
|
|
72
72
|
tasksService;
|
|
73
|
+
tasksStreamingService;
|
|
73
74
|
toolType = 'claude-code';
|
|
74
75
|
name = 'Claude Code';
|
|
75
76
|
promptService;
|
|
76
|
-
constructor(messagesRepo, sessionsRepo, apiKey, messagesService, sessionMCPRepo, mcpServerRepo, permissionService, tasksService, sessionsService, worktreesRepo, reposRepo, mcpEnabled, _useNativeAuth, // Claude supports `claude login` OAuth, but no special handling needed in tool
|
|
77
|
+
constructor(messagesRepo, sessionsRepo, apiKey, messagesService, sessionMCPRepo, mcpServerRepo, permissionService, tasksService, tasksStreamingService, sessionsService, worktreesRepo, reposRepo, mcpEnabled, _useNativeAuth, // Claude supports `claude login` OAuth, but no special handling needed in tool
|
|
77
78
|
inputRequestService, usersRepo) {
|
|
78
79
|
this.messagesRepo = messagesRepo;
|
|
79
80
|
this.sessionsRepo = sessionsRepo;
|
|
80
81
|
this.messagesService = messagesService;
|
|
81
82
|
this.tasksService = tasksService;
|
|
83
|
+
this.tasksStreamingService = tasksStreamingService;
|
|
82
84
|
if (messagesRepo && sessionsRepo) {
|
|
83
85
|
this.promptService = new ClaudePromptService(messagesRepo, sessionsRepo, apiKey, sessionMCPRepo, mcpServerRepo, permissionService, tasksService, sessionsService, worktreesRepo, reposRepo, messagesService, mcpEnabled, inputRequestService, usersRepo);
|
|
84
86
|
}
|
|
@@ -105,6 +107,14 @@ export class ClaudeTool {
|
|
|
105
107
|
return false;
|
|
106
108
|
}
|
|
107
109
|
}
|
|
110
|
+
async emitTaskEvent(event, data) {
|
|
111
|
+
if (this.tasksStreamingService) {
|
|
112
|
+
await this.tasksStreamingService.create({ event, data });
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
// Fallback for environments that don't expose /tasks/streaming.
|
|
116
|
+
this.tasksService?.emit(event, data);
|
|
117
|
+
}
|
|
108
118
|
async importSession(sessionId, options) {
|
|
109
119
|
// Load session using existing transcript parser
|
|
110
120
|
const session = await loadClaudeSession(sessionId, options?.projectDir);
|
|
@@ -240,8 +250,8 @@ export class ClaudeTool {
|
|
|
240
250
|
}
|
|
241
251
|
// Handle tool execution start
|
|
242
252
|
if (event.type === 'tool_start') {
|
|
243
|
-
if (
|
|
244
|
-
this.
|
|
253
|
+
if (taskId) {
|
|
254
|
+
await this.emitTaskEvent('tool:start', {
|
|
245
255
|
task_id: taskId,
|
|
246
256
|
session_id: sessionId,
|
|
247
257
|
tool_use_id: event.toolUseId,
|
|
@@ -251,8 +261,8 @@ export class ClaudeTool {
|
|
|
251
261
|
}
|
|
252
262
|
// Handle tool execution complete
|
|
253
263
|
if (event.type === 'tool_complete') {
|
|
254
|
-
if (
|
|
255
|
-
this.
|
|
264
|
+
if (taskId) {
|
|
265
|
+
await this.emitTaskEvent('tool:complete', {
|
|
256
266
|
task_id: taskId,
|
|
257
267
|
session_id: sessionId,
|
|
258
268
|
tool_use_id: event.toolUseId,
|
|
@@ -305,8 +315,8 @@ export class ClaudeTool {
|
|
|
305
315
|
// Handle thinking partial (streaming)
|
|
306
316
|
if (event.type === 'thinking_partial') {
|
|
307
317
|
// Emit to tasks service for task-level tracking
|
|
308
|
-
if (
|
|
309
|
-
this.
|
|
318
|
+
if (taskId) {
|
|
319
|
+
await this.emitTaskEvent('thinking:chunk', {
|
|
310
320
|
task_id: taskId,
|
|
311
321
|
session_id: sessionId,
|
|
312
322
|
chunk: event.thinkingChunk,
|
|
@@ -11,7 +11,7 @@ import type { NormalizedSdkResponse, RawSdkResponse } from '../../types/sdk-resp
|
|
|
11
11
|
import type { TokenUsage } from '../../types/token-usage.js';
|
|
12
12
|
import { type MessageID, type MessageSource, type PermissionMode, type SessionID, type TaskID } from '../../types.js';
|
|
13
13
|
import type { ITool, StreamingCallbacks, ToolCapabilities } from '../base/index.js';
|
|
14
|
-
import type { MessagesService, TasksService } from '../claude/claude-tool.js';
|
|
14
|
+
import type { MessagesService, TasksService, TasksStreamingService } from '../claude/claude-tool.js';
|
|
15
15
|
interface CodexExecutionResult {
|
|
16
16
|
userMessageId: MessageID;
|
|
17
17
|
assistantMessageIds: MessageID[];
|
|
@@ -28,12 +28,15 @@ export declare class CodexTool implements ITool {
|
|
|
28
28
|
private promptService?;
|
|
29
29
|
private messagesRepo?;
|
|
30
30
|
private sessionsRepo?;
|
|
31
|
+
private worktreesRepo?;
|
|
31
32
|
private messagesService?;
|
|
32
33
|
private tasksService?;
|
|
33
|
-
|
|
34
|
+
private tasksStreamingService?;
|
|
35
|
+
constructor(messagesRepo?: MessagesRepository, sessionsRepo?: SessionRepository, sessionMCPServerRepo?: SessionMCPServerRepository, worktreesRepo?: WorktreeRepository, reposRepo?: RepoRepository, apiKey?: string, messagesService?: MessagesService, tasksService?: TasksService, tasksStreamingService?: TasksStreamingService, _useNativeAuth?: boolean, // Codex doesn't have OAuth fallback, but accept for interface consistency
|
|
34
36
|
mcpServerRepo?: MCPServerRepository, usersRepo?: UsersRepository);
|
|
35
37
|
getCapabilities(): ToolCapabilities;
|
|
36
38
|
checkInstalled(): Promise<boolean>;
|
|
39
|
+
private emitTaskEvent;
|
|
37
40
|
/**
|
|
38
41
|
* Execute a prompt against a session WITH real-time streaming
|
|
39
42
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-tool.d.ts","sourceRoot":"","sources":["../../../src/sdk-handlers/codex/codex-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EACV,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,EACd,0BAA0B,EAC1B,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EACnB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AACzF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAEL,KAAK,SAAS,EAEd,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,MAAM,EACZ,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpF,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"codex-tool.d.ts","sourceRoot":"","sources":["../../../src/sdk-handlers/codex/codex-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,14 +18,18 @@ export class CodexTool {
|
|
|
18
18
|
promptService;
|
|
19
19
|
messagesRepo;
|
|
20
20
|
sessionsRepo;
|
|
21
|
+
worktreesRepo;
|
|
21
22
|
messagesService;
|
|
22
23
|
tasksService;
|
|
23
|
-
|
|
24
|
+
tasksStreamingService;
|
|
25
|
+
constructor(messagesRepo, sessionsRepo, sessionMCPServerRepo, worktreesRepo, reposRepo, apiKey, messagesService, tasksService, tasksStreamingService, _useNativeAuth, // Codex doesn't have OAuth fallback, but accept for interface consistency
|
|
24
26
|
mcpServerRepo, usersRepo) {
|
|
25
27
|
this.messagesRepo = messagesRepo;
|
|
26
28
|
this.sessionsRepo = sessionsRepo;
|
|
29
|
+
this.worktreesRepo = worktreesRepo;
|
|
27
30
|
this.messagesService = messagesService;
|
|
28
31
|
this.tasksService = tasksService;
|
|
32
|
+
this.tasksStreamingService = tasksStreamingService;
|
|
29
33
|
if (messagesRepo && sessionsRepo) {
|
|
30
34
|
this.promptService = new CodexPromptService(messagesRepo, sessionsRepo, sessionMCPServerRepo, worktreesRepo, reposRepo, apiKey, mcpServerRepo, usersRepo);
|
|
31
35
|
}
|
|
@@ -51,6 +55,14 @@ export class CodexTool {
|
|
|
51
55
|
return false;
|
|
52
56
|
}
|
|
53
57
|
}
|
|
58
|
+
async emitTaskEvent(event, data) {
|
|
59
|
+
if (this.tasksStreamingService) {
|
|
60
|
+
await this.tasksStreamingService.create({ event, data });
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
// Fallback for environments that don't expose /tasks/streaming.
|
|
64
|
+
this.tasksService?.emit(event, data);
|
|
65
|
+
}
|
|
54
66
|
/**
|
|
55
67
|
* Execute a prompt against a session WITH real-time streaming
|
|
56
68
|
*
|
|
@@ -88,6 +100,15 @@ export class CodexTool {
|
|
|
88
100
|
let rawSdkResponse;
|
|
89
101
|
let streamStarted = false; // tracks whether onStreamStart succeeded (for safe onStreamEnd)
|
|
90
102
|
let wasStopped = false;
|
|
103
|
+
let workingDirectory;
|
|
104
|
+
const pendingToolMessageIds = new Map();
|
|
105
|
+
if (this.sessionsRepo && this.worktreesRepo) {
|
|
106
|
+
const session = await this.sessionsRepo.findById(sessionId);
|
|
107
|
+
if (session) {
|
|
108
|
+
const worktree = await this.worktreesRepo.findById(session.worktree_id);
|
|
109
|
+
workingDirectory = worktree?.path;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
91
112
|
for await (const event of this.promptService.promptSessionStreaming(sessionId, prompt, taskId, permissionMode, abortController)) {
|
|
92
113
|
// Detect if execution was stopped early
|
|
93
114
|
if (event.type === 'stopped') {
|
|
@@ -104,6 +125,35 @@ export class CodexTool {
|
|
|
104
125
|
resolvedModel = event.resolvedModel;
|
|
105
126
|
}
|
|
106
127
|
}
|
|
128
|
+
// Handle tool execution start (live UI indicator)
|
|
129
|
+
if (event.type === 'tool_start') {
|
|
130
|
+
if (taskId) {
|
|
131
|
+
await this.emitTaskEvent('tool:start', {
|
|
132
|
+
task_id: taskId,
|
|
133
|
+
session_id: sessionId,
|
|
134
|
+
tool_use_id: event.toolUse.id,
|
|
135
|
+
tool_name: event.toolUse.name,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
// Create tool row immediately so UI shows "running" state.
|
|
139
|
+
const toolMessageId = generateId();
|
|
140
|
+
await this.createAssistantMessage(sessionId, toolMessageId, [
|
|
141
|
+
{
|
|
142
|
+
type: 'tool_use',
|
|
143
|
+
id: event.toolUse.id,
|
|
144
|
+
name: event.toolUse.name,
|
|
145
|
+
input: event.toolUse.input,
|
|
146
|
+
},
|
|
147
|
+
], [
|
|
148
|
+
{
|
|
149
|
+
id: event.toolUse.id,
|
|
150
|
+
name: event.toolUse.name,
|
|
151
|
+
input: event.toolUse.input,
|
|
152
|
+
},
|
|
153
|
+
], taskId, nextIndex++, resolvedModel);
|
|
154
|
+
assistantMessageIds.push(toolMessageId);
|
|
155
|
+
pendingToolMessageIds.set(event.toolUse.id, toolMessageId);
|
|
156
|
+
}
|
|
107
157
|
if (event.type === 'complete' && event.usage) {
|
|
108
158
|
tokenUsage = event.usage;
|
|
109
159
|
}
|
|
@@ -169,8 +219,18 @@ export class CodexTool {
|
|
|
169
219
|
}
|
|
170
220
|
// Handle tool completion (create message immediately for live updates)
|
|
171
221
|
else if (event.type === 'tool_complete') {
|
|
172
|
-
|
|
173
|
-
|
|
222
|
+
if (taskId) {
|
|
223
|
+
await this.emitTaskEvent('tool:complete', {
|
|
224
|
+
task_id: taskId,
|
|
225
|
+
session_id: sessionId,
|
|
226
|
+
tool_use_id: event.toolUse.id,
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
const toolResultContent = event.toolUse.output !== undefined
|
|
230
|
+
? event.toolUse.output
|
|
231
|
+
: event.toolUse.status
|
|
232
|
+
? `[${event.toolUse.status}]`
|
|
233
|
+
: '';
|
|
174
234
|
const toolContent = [
|
|
175
235
|
{
|
|
176
236
|
type: 'tool_use',
|
|
@@ -183,34 +243,50 @@ export class CodexTool {
|
|
|
183
243
|
{
|
|
184
244
|
type: 'tool_result',
|
|
185
245
|
tool_use_id: event.toolUse.id,
|
|
186
|
-
content:
|
|
246
|
+
content: toolResultContent,
|
|
187
247
|
is_error: event.toolUse.status === 'failed' || event.toolUse.status === 'error',
|
|
188
248
|
},
|
|
189
249
|
]
|
|
190
250
|
: []),
|
|
191
251
|
];
|
|
192
252
|
// Best-effort diff enrichment for Edit/Write tool results
|
|
193
|
-
enrichContentBlocks(toolContent);
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
|
|
253
|
+
enrichContentBlocks(toolContent, { workingDirectory });
|
|
254
|
+
const existingToolMessageId = pendingToolMessageIds.get(event.toolUse.id);
|
|
255
|
+
if (existingToolMessageId) {
|
|
256
|
+
await this.messagesService?.patch(existingToolMessageId, {
|
|
257
|
+
content: toolContent,
|
|
258
|
+
content_preview: typeof toolResultContent === 'string' ? toolResultContent.substring(0, 200) : '',
|
|
259
|
+
});
|
|
260
|
+
pendingToolMessageIds.delete(event.toolUse.id);
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
// Fallback path if start event wasn't observed.
|
|
264
|
+
const toolMessageId = generateId();
|
|
265
|
+
await this.createAssistantMessage(sessionId, toolMessageId, toolContent, [
|
|
266
|
+
{
|
|
267
|
+
id: event.toolUse.id,
|
|
268
|
+
name: event.toolUse.name,
|
|
269
|
+
input: event.toolUse.input,
|
|
270
|
+
},
|
|
271
|
+
], taskId, nextIndex++, resolvedModel);
|
|
272
|
+
assistantMessageIds.push(toolMessageId);
|
|
273
|
+
}
|
|
202
274
|
}
|
|
203
275
|
// Handle complete message (save to database)
|
|
204
276
|
else if (event.type === 'complete' && event.content) {
|
|
205
277
|
const usageForMessage = event.usage ?? tokenUsage;
|
|
206
|
-
// Filter out tool_use and tool_result blocks (already saved via tool_complete events)
|
|
207
|
-
//
|
|
208
|
-
const
|
|
209
|
-
)
|
|
210
|
-
|
|
211
|
-
if (textOnlyContent.length > 0) {
|
|
278
|
+
// Filter out tool_use and tool_result blocks (already saved via tool_complete events),
|
|
279
|
+
// but keep text + thinking blocks so Codex reasoning is visible in the UI.
|
|
280
|
+
const nonToolContent = event.content.filter((block) => block.type === 'text' || block.type === 'thinking');
|
|
281
|
+
// Only create message if there's non-tool content (not just tools)
|
|
282
|
+
if (nonToolContent.length > 0) {
|
|
212
283
|
// Extract full text for streaming callback
|
|
213
|
-
const fullText =
|
|
284
|
+
const fullText = nonToolContent
|
|
285
|
+
.filter((block) => block.type === 'text')
|
|
286
|
+
.map((block) => block.text || '')
|
|
287
|
+
.join('');
|
|
288
|
+
const fullThinking = nonToolContent
|
|
289
|
+
.filter((block) => block.type === 'thinking')
|
|
214
290
|
.map((block) => block.text || '')
|
|
215
291
|
.join('');
|
|
216
292
|
// Use existing message ID from streaming (if any) or generate new
|
|
@@ -247,8 +323,26 @@ export class CodexTool {
|
|
|
247
323
|
}
|
|
248
324
|
}
|
|
249
325
|
}
|
|
250
|
-
//
|
|
251
|
-
|
|
326
|
+
// Codex reasoning is not token-streamed by SDK. Emit a synthetic single
|
|
327
|
+
// thinking chunk so users see reasoning activity in real time.
|
|
328
|
+
if (streamingCallbacks && fullThinking && !fullText) {
|
|
329
|
+
try {
|
|
330
|
+
if (streamingCallbacks.onThinkingStart) {
|
|
331
|
+
await streamingCallbacks.onThinkingStart(assistantMessageId, {});
|
|
332
|
+
}
|
|
333
|
+
if (streamingCallbacks.onThinkingChunk) {
|
|
334
|
+
await streamingCallbacks.onThinkingChunk(assistantMessageId, fullThinking);
|
|
335
|
+
}
|
|
336
|
+
if (streamingCallbacks.onThinkingEnd) {
|
|
337
|
+
await streamingCallbacks.onThinkingEnd(assistantMessageId);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
catch (err) {
|
|
341
|
+
console.error(`[Codex] Thinking callback failed for ${assistantMessageId}:`, err);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
// Create complete message in DB (non-tool content only, tools already saved)
|
|
345
|
+
await this.createAssistantMessage(sessionId, assistantMessageId, nonToolContent, undefined, // No tool uses in this message (already saved separately)
|
|
252
346
|
taskId, nextIndex++, resolvedModel, usageForMessage);
|
|
253
347
|
assistantMessageIds.push(assistantMessageId);
|
|
254
348
|
// Reset for next message
|
|
@@ -321,10 +415,14 @@ export class CodexTool {
|
|
|
321
415
|
* @private
|
|
322
416
|
*/
|
|
323
417
|
async createAssistantMessage(sessionId, messageId, content, toolUses, taskId, nextIndex, resolvedModel, tokenUsage) {
|
|
324
|
-
// Extract text
|
|
418
|
+
// Extract preview text (prefer normal text, then thinking text)
|
|
325
419
|
const textBlocks = content.filter((b) => b.type === 'text').map((b) => b.text || '');
|
|
326
420
|
const fullTextContent = textBlocks.join('');
|
|
327
|
-
const
|
|
421
|
+
const fallbackThinking = content
|
|
422
|
+
.filter((b) => b.type === 'thinking')
|
|
423
|
+
.map((b) => b.text || '')
|
|
424
|
+
.join('');
|
|
425
|
+
const contentPreview = (fullTextContent || fallbackThinking).substring(0, 200);
|
|
328
426
|
const message = {
|
|
329
427
|
message_id: messageId,
|
|
330
428
|
session_id: sessionId,
|
|
@@ -61,7 +61,7 @@ export type CodexStreamEvent = {
|
|
|
61
61
|
id: string;
|
|
62
62
|
name: string;
|
|
63
63
|
input: Record<string, unknown>;
|
|
64
|
-
output?: string
|
|
64
|
+
output?: string | Array<Record<string, unknown>>;
|
|
65
65
|
status?: string;
|
|
66
66
|
};
|
|
67
67
|
threadId?: string;
|
|
@@ -151,6 +151,12 @@ export declare class CodexPromptService {
|
|
|
151
151
|
* @returns Number of MCP servers configured
|
|
152
152
|
*/
|
|
153
153
|
private ensureCodexConfig;
|
|
154
|
+
/**
|
|
155
|
+
* Convert Codex todo_list items to TodoWrite-compatible payload.
|
|
156
|
+
* Codex only provides completed:boolean, so we infer a single in_progress
|
|
157
|
+
* item as the first remaining incomplete step for better UI parity.
|
|
158
|
+
*/
|
|
159
|
+
private codexTodosToTodoWriteInput;
|
|
154
160
|
/**
|
|
155
161
|
* Convert Codex item to ToolUse format
|
|
156
162
|
* Maps different Codex item types to Agor tool use schema
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-service.d.ts","sourceRoot":"","sources":["../../../src/sdk-handlers/codex/prompt-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAUH,OAAO,KAAK,EACV,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,EACd,0BAA0B,EAC1B,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EACnB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAKxE,MAAM,WAAW,iBAAiB;IAChC,6CAA6C;IAC7C,QAAQ,EAAE,KAAK,CAAC;QACd,OAAO,EAAE,KAAK,CAAC;YACb,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,EAAE,CAAC,EAAE,MAAM,CAAC;YACZ,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;SACjC,CAAC,CAAC;QACH,QAAQ,CAAC,EAAE,KAAK,CAAC;YACf,EAAE,EAAE,MAAM,CAAC;YACX,IAAI,EAAE,MAAM,CAAC;YACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;SAChC,CAAC,CAAC;KACJ,CAAC,CAAC;IACH,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,8BAA8B;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,sDAAsD;IACtD,QAAQ,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,kCAAkC;IAClC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,MAAM,gBAAgB,GACxB;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GACD;IACE,IAAI,EAAE,YAAY,CAAC;IACnB,OAAO,EAAE;QACP,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAChC,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GACD;IACE,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE;QACP,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"prompt-service.d.ts","sourceRoot":"","sources":["../../../src/sdk-handlers/codex/prompt-service.ts"],"names":[],"mappings":"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"}
|