spiracha 1.3.3 → 1.5.0
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/AGENTS.md +55 -6
- package/README.md +46 -5
- package/apps/ui/AGENTS.md +31 -4
- package/apps/ui/README.md +59 -5
- package/apps/ui/dist/client/assets/analytics-DOy1b6Sh.js +1 -0
- package/apps/ui/dist/client/assets/antigravity-conversations._conversationId-DqySVO2K.js +7 -0
- package/apps/ui/dist/client/assets/antigravity-conversations._conversationId-KAcXtNxI.js +1 -0
- package/apps/ui/dist/client/assets/antigravity-keychain-panel-B77qJz6f.js +1 -0
- package/apps/ui/dist/client/assets/antigravity._workspaceKey-B3NM6gRH.js +1 -0
- package/apps/ui/dist/client/assets/antigravity._workspaceKey-ByitGWki.js +1 -0
- package/apps/ui/dist/client/assets/antigravity.index-DP9JC2P9.js +1 -0
- package/apps/ui/dist/client/assets/antigravity.index-DgW25FEV.js +1 -0
- package/apps/ui/dist/client/assets/badge-C3i4OKs8.js +1 -0
- package/apps/ui/dist/client/assets/checkbox-CdHitXWQ.js +1 -0
- package/apps/ui/dist/client/assets/claude-code-sessions._sessionId-8pQ55ci2.js +1 -0
- package/apps/ui/dist/client/assets/claude-code-sessions._sessionId-DVz5UmtU.js +1 -0
- package/apps/ui/dist/client/assets/claude-code._workspaceKey-BBKskSum.js +1 -0
- package/apps/ui/dist/client/assets/claude-code._workspaceKey-OkikMUFs.js +1 -0
- package/apps/ui/dist/client/assets/claude-code.index-Cwu76dbb.js +1 -0
- package/apps/ui/dist/client/assets/claude-code.index-D6eMd08t.js +1 -0
- package/apps/ui/dist/client/assets/createServerFn-B-KkwmHU.js +3 -0
- package/apps/ui/dist/client/assets/cursor-threads._composerId-CmBFclK8.js +1 -0
- package/apps/ui/dist/client/assets/cursor-threads._composerId-hBWlP1D-.js +1 -0
- package/apps/ui/dist/client/assets/cursor._workspaceKey-BFPkIRi-.js +1 -0
- package/apps/ui/dist/client/assets/cursor._workspaceKey-CaAZjGmm.js +1 -0
- package/apps/ui/dist/client/assets/cursor.index-8y4o20kb.js +2 -0
- package/apps/ui/dist/client/assets/cursor.index-CrnMwDCi.js +1 -0
- package/apps/ui/dist/client/assets/{data-table-DeQq8xdt.js → data-table-Br78_dk3.js} +2 -2
- package/apps/ui/dist/client/assets/delete-confirm-dialog-Bxs07u-j.js +7 -0
- package/apps/ui/dist/client/assets/dist-B9pyYCVU.js +1 -0
- package/apps/ui/dist/client/assets/dist-BrJhN2A0.js +5 -0
- package/apps/ui/dist/client/assets/dist-Cmd3AIfD.js +1 -0
- package/apps/ui/dist/client/assets/dist-DvMS2965.js +1 -0
- package/apps/ui/dist/client/assets/download-Bf0QJKD3.js +1 -0
- package/apps/ui/dist/client/assets/dropdown-menu-D5cvPaZt.js +1 -0
- package/apps/ui/dist/client/assets/es2015-ad6040dw.js +41 -0
- package/apps/ui/dist/client/assets/export-dialog-Dr8d2MqD.js +1 -0
- package/apps/ui/dist/client/assets/formatters-BtqyrX_c.js +1 -0
- package/apps/ui/dist/client/assets/index-C-STgIH4.js +166 -0
- package/apps/ui/dist/client/assets/jsx-runtime-DGeXAQPT.js +1 -0
- package/apps/ui/dist/client/assets/kiro-sessions._sessionId-CKgfJ7GR.js +1 -0
- package/apps/ui/dist/client/assets/kiro-sessions._sessionId-zvIJHtQF.js +1 -0
- package/apps/ui/dist/client/assets/kiro._workspaceKey-DhVuJuZB.js +1 -0
- package/apps/ui/dist/client/assets/kiro._workspaceKey-QArsjkTY.js +1 -0
- package/apps/ui/dist/client/assets/kiro.index-C-fr4m7i.js +1 -0
- package/apps/ui/dist/client/assets/kiro.index-OYgAdtZd.js +1 -0
- package/apps/ui/dist/client/assets/metric-card-Dplm0ZiM.js +1 -0
- package/apps/ui/dist/client/assets/opencode-sessions._sessionId-DLjiTst-.js +1 -0
- package/apps/ui/dist/client/assets/opencode-sessions._sessionId-biBwrRbt.js +8 -0
- package/apps/ui/dist/client/assets/opencode._workspaceKey-C7OIzMOJ.js +1 -0
- package/apps/ui/dist/client/assets/opencode._workspaceKey-sBakX0oI.js +1 -0
- package/apps/ui/dist/client/assets/opencode.index-Bl_kNs9N.js +1 -0
- package/apps/ui/dist/client/assets/opencode.index-CN53bVmb.js +1 -0
- package/apps/ui/dist/client/assets/page-header-Cwa3p6Tl.js +1 -0
- package/apps/ui/dist/client/assets/preload-helper-B8fFrdxC.js +1 -0
- package/apps/ui/dist/client/assets/projects._project-D8WloxQN.js +1 -0
- package/apps/ui/dist/client/assets/projects._project-DSDwH4NF.js +1 -0
- package/apps/ui/dist/client/assets/projects.index-5xRtuJdX.js +3 -0
- package/apps/ui/dist/client/assets/projects.index-DEfhWqa8.js +1 -0
- package/apps/ui/dist/client/assets/react-dom-DL96Jor4.js +1 -0
- package/apps/ui/dist/client/assets/refresh-ccw-BgKjOiA6.js +1 -0
- package/apps/ui/dist/client/assets/reload-error-panel-AHqu0akK.js +1 -0
- package/apps/ui/dist/client/assets/routes-DnzF_9CX.js +1 -0
- package/apps/ui/dist/client/assets/scroll-text-fM0sMOB3.js +1 -0
- package/apps/ui/dist/client/assets/select-CYF6pF37.js +1 -0
- package/apps/ui/dist/client/assets/settings-Dx70jgP_.js +1 -0
- package/apps/ui/dist/client/assets/sqlite-error-B6uZjUe8.js +1 -0
- package/apps/ui/dist/client/assets/styles-B7Zi9EFA.css +1 -0
- package/apps/ui/dist/client/assets/tabs-CmuhkT-c.js +7 -0
- package/apps/ui/dist/client/assets/text-filter-DVAZySUS.js +2 -0
- package/apps/ui/dist/client/assets/thread-transcript-stats-BUNz6u7F.js +1 -0
- package/apps/ui/dist/client/assets/threads._threadId-BB9tTsV4.js +1 -0
- package/apps/ui/dist/client/assets/threads._threadId-BMRSFow3.js +1 -0
- package/apps/ui/dist/client/assets/useMutation-BSFult2i.js +1 -0
- package/apps/ui/dist/client/assets/useQuery-CjINKZf1.js +1 -0
- package/apps/ui/dist/client/icon.svg +2 -1
- package/apps/ui/dist/server/assets/_tanstack-start-manifest_v-CQ8Jjs3B.js +387 -0
- package/apps/ui/dist/server/assets/analytics-CYP_LT5Y.js +16 -0
- package/apps/ui/dist/server/assets/{analytics-Dc_QDZZC.js → analytics-CtpOMVMO.js} +13 -6
- package/apps/ui/dist/server/assets/antigravity-conversations._conversationId-BKOyL2T6.js +613 -0
- package/apps/ui/dist/server/assets/{antigravity-conversations._conversationId-C9z4AeN-.js → antigravity-conversations._conversationId-eS87Dx7g.js} +2 -2
- package/apps/ui/dist/server/assets/{antigravity-db-D9gW1D8G.js → antigravity-db-Bh8_U9uw.js} +11 -7
- package/apps/ui/dist/server/assets/{antigravity-keychain-panel-bpPoxhyp.js → antigravity-keychain-panel-CC7FLmAK.js} +1 -1
- package/apps/ui/dist/server/assets/{antigravity-queries-DVIKyOXi.js → antigravity-queries-CGrJO9Vr.js} +5 -5
- package/apps/ui/dist/server/assets/{antigravity-server-Cp1lc8fp.js → antigravity-server-CHRjVFqN.js} +11 -11
- package/apps/ui/dist/server/assets/{antigravity._workspaceKey-Dl8o1ptg.js → antigravity._workspaceKey-B0QeYUOh.js} +2 -2
- package/apps/ui/dist/server/assets/{antigravity._workspaceKey-BAoa4izU.js → antigravity._workspaceKey-C3kP-qyN.js} +4 -4
- package/apps/ui/dist/server/assets/{antigravity.index-BOlrJasZ.js → antigravity.index-CPCYkqCi.js} +2 -2
- package/apps/ui/dist/server/assets/claude-code-db-Ik3VStKZ.js +361 -0
- package/apps/ui/dist/server/assets/claude-code-queries-Cgzi4K-e.js +37 -0
- package/apps/ui/dist/server/assets/claude-code-server-PfraClXS.js +72 -0
- package/apps/ui/dist/server/assets/claude-code-sessions._sessionId-C55oe6zj.js +18 -0
- package/apps/ui/dist/server/assets/claude-code-sessions._sessionId-D1RYYi3j.js +473 -0
- package/apps/ui/dist/server/assets/claude-code-sessions._sessionId-DSvPLEUL.js +11 -0
- package/apps/ui/dist/server/assets/claude-code-transcript-C-bxh3cS.js +139 -0
- package/apps/ui/dist/server/assets/claude-code-transcript-phase-DmUMc8VU.js +10 -0
- package/apps/ui/dist/server/assets/claude-code._workspaceKey-B5Xg_-tE.js +28 -0
- package/apps/ui/dist/server/assets/claude-code._workspaceKey-BPlzyXPa.js +11 -0
- package/apps/ui/dist/server/assets/claude-code._workspaceKey-DqDve2wl.js +191 -0
- package/apps/ui/dist/server/assets/claude-code.index-B7yYR7dD.js +92 -0
- package/apps/ui/dist/server/assets/claude-code.index-BUHThG1W.js +11 -0
- package/apps/ui/dist/server/assets/{codex-queries-ev_mRUzr.js → codex-queries-CtgeZ7VL.js} +15 -13
- package/apps/ui/dist/server/assets/{codex-server-DIYFLozB.js → codex-server-CGXU4H8-.js} +421 -146
- package/apps/ui/dist/server/assets/concurrency-VXtYvlGh.js +18 -0
- package/apps/ui/dist/server/assets/{createServerRpc-Cg-Zr1rq.js → createServerRpc-CF_DEwnm.js} +1 -1
- package/apps/ui/dist/server/assets/{createSsrRpc-DVnVQhGx.js → createSsrRpc-C754NPki.js} +1 -1
- package/apps/ui/dist/server/assets/{cursor-db-B7agkAvM.js → cursor-db-CZnYy7aT.js} +196 -9
- package/apps/ui/dist/server/assets/{cursor-queries-f7DjBKSD.js → cursor-queries-NCIM0Nat.js} +12 -10
- package/apps/ui/dist/server/assets/{cursor-recovery-9bJLs7vG.js → cursor-recovery-CXpO8KcD.js} +2 -2
- package/apps/ui/dist/server/assets/{cursor-server-nPzojHN3.js → cursor-server-DNu52A3K.js} +71 -42
- package/apps/ui/dist/server/assets/cursor-threads._composerId-Ckn6ItHI.js +582 -0
- package/apps/ui/dist/server/assets/{cursor-threads._composerId-B3qcsh9C.js → cursor-threads._composerId-p9-ARAzc.js} +2 -2
- package/apps/ui/dist/server/assets/{cursor-transcript-2iL3KFSK.js → cursor-transcript-B7tGnqtn.js} +1 -1
- package/apps/ui/dist/server/assets/{cursor._workspaceKey-BL_CQyHQ.js → cursor._workspaceKey-CZuohIUL.js} +2 -2
- package/apps/ui/dist/server/assets/{cursor._workspaceKey-BhQeepXB.js → cursor._workspaceKey-DPp5JSjy.js} +11 -9
- package/apps/ui/dist/server/assets/{cursor.index-CsrdckZD.js → cursor.index-DkWT-mxw.js} +2 -2
- package/apps/ui/dist/server/assets/{delete-confirm-dialog-PCD7S0_M.js → delete-confirm-dialog-BcBNCxWB.js} +5 -1
- package/apps/ui/dist/server/assets/{empty-plugin-adapters-D3qLMPfC.js → empty-plugin-adapters-B3lHh1La.js} +1 -1
- package/apps/ui/dist/server/assets/{export-dialog-DaPlOGFT.js → export-dialog-D88ze9Gy.js} +54 -12
- package/apps/ui/dist/server/assets/kiro-db--fXrED_-.js +552 -0
- package/apps/ui/dist/server/assets/kiro-queries-CzNlM2ok.js +37 -0
- package/apps/ui/dist/server/assets/kiro-server-9WRxg2Au.js +72 -0
- package/apps/ui/dist/server/assets/kiro-sessions._sessionId-CRY2c7YO.js +11 -0
- package/apps/ui/dist/server/assets/kiro-sessions._sessionId-F1UlwxmR.js +449 -0
- package/apps/ui/dist/server/assets/kiro-sessions._sessionId-bvTulT7C.js +18 -0
- package/apps/ui/dist/server/assets/kiro-transcript-DoekQBaH.js +112 -0
- package/apps/ui/dist/server/assets/kiro-transcript-phase-CJG40nQg.js +27 -0
- package/apps/ui/dist/server/assets/kiro._workspaceKey-BDe9sQwo.js +11 -0
- package/apps/ui/dist/server/assets/kiro._workspaceKey-CJsjgNwO.js +28 -0
- package/apps/ui/dist/server/assets/kiro._workspaceKey-D_-4Qb7y.js +193 -0
- package/apps/ui/dist/server/assets/kiro.index-C__-UROk.js +11 -0
- package/apps/ui/dist/server/assets/kiro.index-CmTbqeYj.js +93 -0
- package/apps/ui/dist/server/assets/opencode-db-BM7KjOzc.js +397 -0
- package/apps/ui/dist/server/assets/opencode-queries-BeNYXnQv.js +50 -0
- package/apps/ui/dist/server/assets/opencode-server-BpQ_kRze.js +72 -0
- package/apps/ui/dist/server/assets/opencode-sessions._sessionId-CGQ-t0vD.js +518 -0
- package/apps/ui/dist/server/assets/opencode-sessions._sessionId-D8Q7in_Z.js +18 -0
- package/apps/ui/dist/server/assets/opencode-sessions._sessionId-DKOvi0lV.js +11 -0
- package/apps/ui/dist/server/assets/opencode-think-tags-CAoD-EcZ.js +87 -0
- package/apps/ui/dist/server/assets/opencode-transcript-BNTcGNym.js +141 -0
- package/apps/ui/dist/server/assets/opencode-transcript-phase-OqLkiQD0.js +32 -0
- package/apps/ui/dist/server/assets/opencode._workspaceKey-BdqcWHw1.js +11 -0
- package/apps/ui/dist/server/assets/opencode._workspaceKey-CfH96HTT.js +28 -0
- package/apps/ui/dist/server/assets/opencode._workspaceKey-DdbHPDrO.js +207 -0
- package/apps/ui/dist/server/assets/opencode.index-BbVzkJXP.js +11 -0
- package/apps/ui/dist/server/assets/opencode.index-Vh_Gq_1L.js +93 -0
- package/apps/ui/dist/server/assets/{projects._project-CqqUFr4l.js → projects._project-4io5LO0E.js} +5 -3
- package/apps/ui/dist/server/assets/{projects._project-DahGqNYS.js → projects._project-D6ZoGhJ8.js} +42 -12
- package/apps/ui/dist/server/assets/{projects.index-CkTeFWNU.js → projects.index-BkLiF2FF.js} +21 -7
- package/apps/ui/dist/server/assets/projects.index-DesYXwfi.js +14 -0
- package/apps/ui/dist/server/assets/route-search-ts4W9MJ9.js +38 -0
- package/apps/ui/dist/server/assets/router-Sac2DGk6.js +518 -0
- package/apps/ui/dist/server/assets/{routes-Xix3ZeSo.js → routes-Bsact1uB.js} +2 -2
- package/apps/ui/dist/server/assets/{routes-0x1U0IHq.js → routes-BzkJgq4W.js} +2 -2
- package/apps/ui/dist/server/assets/{shared-CPRNYIql.js → shared-DyhChtHf.js} +4 -1
- package/apps/ui/dist/server/assets/source-session-export-server-DNutCawb.js +38 -0
- package/apps/ui/dist/server/assets/start-B_HFwkkk.js +4 -0
- package/apps/ui/dist/server/assets/tabs-DkaChNVg.js +501 -0
- package/apps/ui/dist/server/assets/thread-transcript-stats-Dh34mt2u.js +45 -0
- package/apps/ui/dist/server/assets/threads._threadId-BeXEc4Lo.js +648 -0
- package/apps/ui/dist/server/assets/{threads._threadId-BLCkGW--.js → threads._threadId-Ci0S4mKU.js} +2 -2
- package/apps/ui/dist/server/assets/ui-export-files-BHLX9bhN.js +83 -0
- package/apps/ui/dist/server/server.js +141 -83
- package/package.json +28 -11
- package/src/lib/antigravity-db.ts +20 -13
- package/src/lib/claude-code-db.ts +655 -0
- package/src/lib/claude-code-exporter-types.ts +110 -0
- package/src/lib/claude-code-transcript-phase.ts +25 -0
- package/src/lib/claude-code-transcript.ts +180 -0
- package/src/lib/codex-analytics.ts +118 -18
- package/src/lib/codex-browser-db.ts +491 -56
- package/src/lib/codex-browser-export.ts +27 -71
- package/src/lib/codex-thread-cache.ts +17 -1
- package/src/lib/concurrency.ts +25 -0
- package/src/lib/cursor-db.ts +318 -7
- package/src/lib/cursor-exporter.ts +2 -2
- package/src/lib/kiro-db.ts +949 -0
- package/src/lib/kiro-exporter-types.ts +100 -0
- package/src/lib/kiro-transcript-phase.ts +41 -0
- package/src/lib/kiro-transcript.ts +115 -0
- package/src/lib/opencode-db.ts +610 -0
- package/src/lib/opencode-exporter-types.ts +129 -0
- package/src/lib/opencode-think-tags.ts +126 -0
- package/src/lib/opencode-transcript-phase.ts +50 -0
- package/src/lib/opencode-transcript.ts +194 -0
- package/src/lib/shared.ts +25 -0
- package/src/lib/ui-cache.ts +14 -1
- package/src/lib/ui-export-archive.ts +61 -0
- package/apps/ui/dist/client/assets/analytics-C83LcWNb.js +0 -1
- package/apps/ui/dist/client/assets/antigravity-conversations._conversationId-DkY8EEpK.js +0 -1
- package/apps/ui/dist/client/assets/antigravity-conversations._conversationId-OraHuz8j.js +0 -1
- package/apps/ui/dist/client/assets/antigravity-keychain-panel-DnDcq1ge.js +0 -1
- package/apps/ui/dist/client/assets/antigravity._workspaceKey-CQaZscA5.js +0 -1
- package/apps/ui/dist/client/assets/antigravity._workspaceKey-DTs99obU.js +0 -1
- package/apps/ui/dist/client/assets/antigravity.index-DbJa715k.js +0 -1
- package/apps/ui/dist/client/assets/antigravity.index-P-rs6w5X.js +0 -1
- package/apps/ui/dist/client/assets/badge-wgTVp-aq.js +0 -1
- package/apps/ui/dist/client/assets/checkbox-BUx0Gkuf.js +0 -1
- package/apps/ui/dist/client/assets/cursor-threads._composerId-D0DFXt8t.js +0 -1
- package/apps/ui/dist/client/assets/cursor-threads._composerId-tFa6Cf6A.js +0 -1
- package/apps/ui/dist/client/assets/cursor._workspaceKey-Df4PfA2k.js +0 -1
- package/apps/ui/dist/client/assets/cursor._workspaceKey-DwrzEtnV.js +0 -1
- package/apps/ui/dist/client/assets/cursor.index-CNBf4ZiR.js +0 -1
- package/apps/ui/dist/client/assets/cursor.index-DP9Hy8X6.js +0 -2
- package/apps/ui/dist/client/assets/delete-confirm-dialog-CPlNsLhM.js +0 -11
- package/apps/ui/dist/client/assets/dist-Ds3kS91l.js +0 -1
- package/apps/ui/dist/client/assets/download-DLuPnxpV.js +0 -1
- package/apps/ui/dist/client/assets/dropdown-menu-lFk6zjoL.js +0 -1
- package/apps/ui/dist/client/assets/es2015-D-H_iZF6.js +0 -41
- package/apps/ui/dist/client/assets/export-dialog-CyqyvwiP.js +0 -1
- package/apps/ui/dist/client/assets/formatters-DbCKP02D.js +0 -1
- package/apps/ui/dist/client/assets/index-C-ZPpKJ0.js +0 -22
- package/apps/ui/dist/client/assets/json-panel-BsngvucB.js +0 -1
- package/apps/ui/dist/client/assets/metadata-section-Dtl8dNag.js +0 -1
- package/apps/ui/dist/client/assets/metric-card-DNzR1Rne.js +0 -1
- package/apps/ui/dist/client/assets/page-header-dha_O7ZL.js +0 -1
- package/apps/ui/dist/client/assets/projects._project-B7HBhbXv.js +0 -1
- package/apps/ui/dist/client/assets/projects._project-DHVvuT7A.js +0 -1
- package/apps/ui/dist/client/assets/projects.index-BUUtx2AZ.js +0 -1
- package/apps/ui/dist/client/assets/projects.index-BojAe1Y4.js +0 -3
- package/apps/ui/dist/client/assets/refresh-ccw-B-ASKHtx.js +0 -1
- package/apps/ui/dist/client/assets/reload-error-panel-DD8M1BIY.js +0 -1
- package/apps/ui/dist/client/assets/routes-q7bzFp35.js +0 -1
- package/apps/ui/dist/client/assets/scroll-text-TvHyiJ_N.js +0 -1
- package/apps/ui/dist/client/assets/select-BFv1HMiT.js +0 -1
- package/apps/ui/dist/client/assets/settings-CvegTo4F.js +0 -1
- package/apps/ui/dist/client/assets/styles-Ch0r3kMZ.css +0 -1
- package/apps/ui/dist/client/assets/text-document-panel-D7Rws41o.js +0 -1
- package/apps/ui/dist/client/assets/text-filter-2q5pEoZh.js +0 -2
- package/apps/ui/dist/client/assets/threads._threadId-LpZVUlPq.js +0 -7
- package/apps/ui/dist/client/assets/threads._threadId-MSmNIBkq.js +0 -1
- package/apps/ui/dist/client/assets/useMutation-BOPJU9e0.js +0 -1
- package/apps/ui/dist/client/assets/useQuery-CbxZiVGF.js +0 -1
- package/apps/ui/dist/server/assets/_tanstack-start-manifest_v-zvGzK-Yx.js +0 -229
- package/apps/ui/dist/server/assets/antigravity-conversations._conversationId-JEhx-f2R.js +0 -212
- package/apps/ui/dist/server/assets/cursor-threads._composerId-BK3iW-3e.js +0 -218
- package/apps/ui/dist/server/assets/json-panel-RYsxWFae.js +0 -16
- package/apps/ui/dist/server/assets/metadata-section-D6Lbc7D6.js +0 -54
- package/apps/ui/dist/server/assets/router-K0m7dK4T.js +0 -394
- package/apps/ui/dist/server/assets/start-bX7bXjzw.js +0 -4
- package/apps/ui/dist/server/assets/text-document-panel-D8JbQWAn.js +0 -23
- package/apps/ui/dist/server/assets/threads._threadId-LjgsGUh-.js +0 -1052
|
@@ -0,0 +1,552 @@
|
|
|
1
|
+
import { a as cleanExtractedText, d as getPortablePathBasename, i as asString, o as cleanInlineTitle, r as asObject } from "./shared-DyhChtHf.js";
|
|
2
|
+
import { t as mapWithConcurrency } from "./concurrency-VXtYvlGh.js";
|
|
3
|
+
import { createHash } from "node:crypto";
|
|
4
|
+
import { readdir, stat } from "node:fs/promises";
|
|
5
|
+
import os from "node:os";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
//#region ../../src/lib/kiro-exporter-types.ts
|
|
8
|
+
var getDefaultKiroDataDir = (_env = process.env, homeDir = os.homedir()) => {
|
|
9
|
+
return path.join(homeDir, "Library", "Application Support", "Kiro", "User", "globalStorage", "kiro.kiroagent");
|
|
10
|
+
};
|
|
11
|
+
var DEFAULT_KIRO_DATA_DIR = getDefaultKiroDataDir();
|
|
12
|
+
var resolveKiroDataDir = () => {
|
|
13
|
+
const configured = process.env.SPIRACHA_KIRO_DATA_DIR?.trim() || process.env.SPIRACHA_KIRO_AGENT_DIR?.trim() || process.env.SPIRACHA_KIRO_DIR?.trim();
|
|
14
|
+
return configured ? configured : DEFAULT_KIRO_DATA_DIR;
|
|
15
|
+
};
|
|
16
|
+
var resolveKiroWorkspaceSessionsDir = () => {
|
|
17
|
+
const configured = process.env.SPIRACHA_KIRO_WORKSPACE_SESSIONS_DIR?.trim();
|
|
18
|
+
return configured ? configured : path.join(resolveKiroDataDir(), "workspace-sessions");
|
|
19
|
+
};
|
|
20
|
+
//#endregion
|
|
21
|
+
//#region ../../src/lib/kiro-db.ts
|
|
22
|
+
var READ_CONCURRENCY = 8;
|
|
23
|
+
var WORKSPACE_KEY_PREFIX = "workspace:";
|
|
24
|
+
var pathExists = async (target) => {
|
|
25
|
+
return await stat(target).then(() => true).catch(() => false);
|
|
26
|
+
};
|
|
27
|
+
var toIso = (value) => {
|
|
28
|
+
return value === null ? null : new Date(value).toISOString();
|
|
29
|
+
};
|
|
30
|
+
var parseTimestampMs = (value) => {
|
|
31
|
+
if (typeof value === "number" && Number.isFinite(value)) return value > 0 && value < 1e10 ? value * 1e3 : value;
|
|
32
|
+
if (typeof value === "string") {
|
|
33
|
+
const numeric = Number(value);
|
|
34
|
+
if (Number.isFinite(numeric)) return numeric > 0 && numeric < 1e10 ? numeric * 1e3 : numeric;
|
|
35
|
+
const parsed = Date.parse(value);
|
|
36
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
};
|
|
40
|
+
var getWorkspaceKey = (directoryName) => `${WORKSPACE_KEY_PREFIX}${directoryName}`;
|
|
41
|
+
var getDirectoryNameFromWorkspaceKey = (workspaceKey) => {
|
|
42
|
+
return workspaceKey.startsWith(WORKSPACE_KEY_PREFIX) ? workspaceKey.slice(10) : null;
|
|
43
|
+
};
|
|
44
|
+
var isPlausibleWorkspacePath = (value) => {
|
|
45
|
+
return Boolean(value.trim()) && !value.includes("�") && !value.includes("\0");
|
|
46
|
+
};
|
|
47
|
+
var decodeBase64WorkspacePath = (value, encoding) => {
|
|
48
|
+
try {
|
|
49
|
+
const decoded = Buffer.from(value, encoding).toString("utf8");
|
|
50
|
+
return isPlausibleWorkspacePath(decoded) ? decoded : null;
|
|
51
|
+
} catch {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
var decodeWorkspaceDirectoryName = (directoryName) => {
|
|
56
|
+
return decodeBase64WorkspacePath(directoryName.replace(/_+$/u, (match) => "=".repeat(match.length)), "base64") ?? decodeBase64WorkspacePath(directoryName, "base64url") ?? directoryName;
|
|
57
|
+
};
|
|
58
|
+
var getWorkspaceLabel = (worktree) => {
|
|
59
|
+
return getPortablePathBasename(worktree) || worktree;
|
|
60
|
+
};
|
|
61
|
+
var getWorkspaceUri = (worktree) => {
|
|
62
|
+
return worktree.startsWith(path.sep) ? `file://${worktree}` : worktree;
|
|
63
|
+
};
|
|
64
|
+
var cleanLabel = (value) => {
|
|
65
|
+
const cleaned = value?.replace(/\s+/g, " ").trim();
|
|
66
|
+
return cleaned ? cleaned : null;
|
|
67
|
+
};
|
|
68
|
+
var readJsonObject = async (filePath) => {
|
|
69
|
+
return asObject(await Bun.file(filePath).json().catch(() => null));
|
|
70
|
+
};
|
|
71
|
+
var readSessionIndex = async (workspaceDir) => {
|
|
72
|
+
const indexPath = path.join(workspaceDir, "sessions.json");
|
|
73
|
+
const value = await Bun.file(indexPath).json().catch(() => null);
|
|
74
|
+
const items = Array.isArray(value) ? value : [];
|
|
75
|
+
const entries = /* @__PURE__ */ new Map();
|
|
76
|
+
for (const item of items) {
|
|
77
|
+
const object = asObject(item);
|
|
78
|
+
const sessionId = asString(object?.sessionId ?? null);
|
|
79
|
+
if (!object || !sessionId) continue;
|
|
80
|
+
entries.set(sessionId, {
|
|
81
|
+
createdAtMs: parseTimestampMs(object.dateCreated),
|
|
82
|
+
sessionId,
|
|
83
|
+
title: cleanLabel(asString(object.title ?? null)),
|
|
84
|
+
workspaceDirectory: asString(object.workspaceDirectory ?? null)
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
return entries;
|
|
88
|
+
};
|
|
89
|
+
var parseTextPart = (raw, text) => ({
|
|
90
|
+
raw,
|
|
91
|
+
text,
|
|
92
|
+
type: "text"
|
|
93
|
+
});
|
|
94
|
+
var parseImagePart = (raw) => {
|
|
95
|
+
return {
|
|
96
|
+
imageUrl: asString(asObject(raw.imageUrl ?? null)?.url ?? null) ?? asString(raw.url ?? null),
|
|
97
|
+
raw,
|
|
98
|
+
text: "Image attachment",
|
|
99
|
+
type: "image"
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
var parseObjectContentPart = (raw) => {
|
|
103
|
+
if (asString(raw.type ?? null) === "imageUrl") return parseImagePart(raw);
|
|
104
|
+
const text = asString(raw.text ?? null);
|
|
105
|
+
if (text !== null) return parseTextPart(raw, text);
|
|
106
|
+
return {
|
|
107
|
+
raw,
|
|
108
|
+
type: "unknown"
|
|
109
|
+
};
|
|
110
|
+
};
|
|
111
|
+
var parseMessageContentPart = (item) => {
|
|
112
|
+
if (typeof item === "string") return parseTextPart({ text: item }, item);
|
|
113
|
+
const object = asObject(item);
|
|
114
|
+
return object ? parseObjectContentPart(object) : null;
|
|
115
|
+
};
|
|
116
|
+
var getTextJoiner = (left, right) => {
|
|
117
|
+
const leftTrimmed = left.trim();
|
|
118
|
+
const rightTrimmed = right.trim();
|
|
119
|
+
return leftTrimmed.startsWith("|") && rightTrimmed.startsWith("|") ? "\n" : "\n\n";
|
|
120
|
+
};
|
|
121
|
+
var mergeTextParts = (left, right) => {
|
|
122
|
+
const text = `${left.text ?? ""}${getTextJoiner(left.text ?? "", right.text ?? "")}${right.text ?? ""}`;
|
|
123
|
+
return {
|
|
124
|
+
raw: {
|
|
125
|
+
sourceParts: [left.raw, right.raw],
|
|
126
|
+
text,
|
|
127
|
+
type: "text"
|
|
128
|
+
},
|
|
129
|
+
text,
|
|
130
|
+
type: "text"
|
|
131
|
+
};
|
|
132
|
+
};
|
|
133
|
+
var mergeAdjacentTextParts = (parts) => {
|
|
134
|
+
const merged = [];
|
|
135
|
+
for (const part of parts) {
|
|
136
|
+
const previous = merged.at(-1);
|
|
137
|
+
if (previous?.type === "text" && part.type === "text") {
|
|
138
|
+
merged[merged.length - 1] = mergeTextParts(previous, part);
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
merged.push(part);
|
|
142
|
+
}
|
|
143
|
+
return merged;
|
|
144
|
+
};
|
|
145
|
+
var parseMessageParts = (message) => {
|
|
146
|
+
const content = message.content;
|
|
147
|
+
return mergeAdjacentTextParts((Array.isArray(content) ? content : [content]).map(parseMessageContentPart).filter((part) => part !== null && part.type !== "unknown"));
|
|
148
|
+
};
|
|
149
|
+
var getPromptLogCount = (raw) => {
|
|
150
|
+
return Array.isArray(raw.promptLogs) ? raw.promptLogs.length : 0;
|
|
151
|
+
};
|
|
152
|
+
var parseHistoryEntry = (raw, index) => {
|
|
153
|
+
const message = asObject(raw.message ?? null);
|
|
154
|
+
if (!message) return null;
|
|
155
|
+
const parts = parseMessageParts(message);
|
|
156
|
+
if (parts.length === 0) return null;
|
|
157
|
+
return {
|
|
158
|
+
entryId: asString(message.id ?? null) ?? `entry:${index}`,
|
|
159
|
+
entryType: "message",
|
|
160
|
+
executionId: asString(raw.executionId ?? null),
|
|
161
|
+
parts,
|
|
162
|
+
promptLogCount: getPromptLogCount(raw),
|
|
163
|
+
raw,
|
|
164
|
+
role: asString(message.role ?? null) ?? "message",
|
|
165
|
+
timestamp: null
|
|
166
|
+
};
|
|
167
|
+
};
|
|
168
|
+
var createEmptyStats = () => ({
|
|
169
|
+
assistantMessageCount: 0,
|
|
170
|
+
imageCount: 0,
|
|
171
|
+
messageCount: 0,
|
|
172
|
+
promptLogCount: 0,
|
|
173
|
+
renderablePartCount: 0,
|
|
174
|
+
userMessageCount: 0
|
|
175
|
+
});
|
|
176
|
+
var updateStatsFromEntry = (stats, entry) => {
|
|
177
|
+
if (entry.role === "assistant" || entry.role === "user") stats.messageCount += 1;
|
|
178
|
+
if (entry.role === "assistant") stats.assistantMessageCount += 1;
|
|
179
|
+
if (entry.role === "user") stats.userMessageCount += 1;
|
|
180
|
+
stats.imageCount += entry.parts.filter((part) => part.type === "image").length;
|
|
181
|
+
stats.promptLogCount += entry.promptLogCount;
|
|
182
|
+
stats.renderablePartCount += entry.parts.filter(isRenderablePart).length;
|
|
183
|
+
};
|
|
184
|
+
var updateIdentityFromRaw = (identity, raw) => {
|
|
185
|
+
const rawString = (key) => asString(raw[key] ?? null);
|
|
186
|
+
const rawValues = {
|
|
187
|
+
autonomyMode: rawString("autonomyMode"),
|
|
188
|
+
defaultModelTitle: rawString("defaultModelTitle"),
|
|
189
|
+
selectedModel: rawString("selectedModel"),
|
|
190
|
+
selectedProfileId: rawString("selectedProfileId"),
|
|
191
|
+
sessionId: rawString("sessionId"),
|
|
192
|
+
sessionType: rawString("sessionType"),
|
|
193
|
+
title: cleanLabel(rawString("title")),
|
|
194
|
+
workspaceDirectory: rawString("workspaceDirectory"),
|
|
195
|
+
workspacePath: rawString("workspacePath")
|
|
196
|
+
};
|
|
197
|
+
identity.autonomyMode = rawValues.autonomyMode ?? identity.autonomyMode;
|
|
198
|
+
identity.defaultModelTitle = rawValues.defaultModelTitle ?? identity.defaultModelTitle;
|
|
199
|
+
identity.selectedModel = rawValues.selectedModel ?? identity.selectedModel;
|
|
200
|
+
identity.selectedProfileId = rawValues.selectedProfileId ?? identity.selectedProfileId;
|
|
201
|
+
identity.sessionId = rawValues.sessionId ?? identity.sessionId;
|
|
202
|
+
identity.sessionType = rawValues.sessionType ?? identity.sessionType;
|
|
203
|
+
identity.title = rawValues.title ?? identity.title;
|
|
204
|
+
identity.workspaceDirectory = rawValues.workspaceDirectory ?? identity.workspaceDirectory;
|
|
205
|
+
identity.workspacePath = rawValues.workspacePath ?? identity.workspacePath;
|
|
206
|
+
};
|
|
207
|
+
var updateIdentityFromEntry = (identity, entry) => {
|
|
208
|
+
if (entry.role !== "user" || identity.firstUserText) return;
|
|
209
|
+
identity.firstUserText = cleanExtractedText(entry.parts.find((part) => part.type === "text" && part.text?.trim())?.text ?? "").trim() || null;
|
|
210
|
+
};
|
|
211
|
+
var getEntryText = (entry) => {
|
|
212
|
+
return entry.parts.filter((part) => part.type === "text").map((part) => cleanExtractedText(part.text ?? "").trim()).filter(Boolean).join("\n\n").trim();
|
|
213
|
+
};
|
|
214
|
+
var KIRO_ASSISTANT_PLACEHOLDER_PATTERN = /^on it[.!]?$/iu;
|
|
215
|
+
var isAssistantPlaceholderEntry = (entry) => {
|
|
216
|
+
return entry.role === "assistant" && KIRO_ASSISTANT_PLACEHOLDER_PATTERN.test(getEntryText(entry));
|
|
217
|
+
};
|
|
218
|
+
var isRenderablePart = (part) => {
|
|
219
|
+
if (part.type === "image") return true;
|
|
220
|
+
if (part.type === "text") return Boolean(part.text?.trim());
|
|
221
|
+
return false;
|
|
222
|
+
};
|
|
223
|
+
var getTitle = (identity, indexEntry) => {
|
|
224
|
+
return cleanInlineTitle(identity.title ?? indexEntry?.title ?? identity.firstUserText ?? identity.sessionId);
|
|
225
|
+
};
|
|
226
|
+
var getCreatedAtMs = (indexEntry, fileStats) => {
|
|
227
|
+
return indexEntry?.createdAtMs ?? fileStats?.birthtimeMs ?? fileStats?.mtimeMs ?? null;
|
|
228
|
+
};
|
|
229
|
+
var getLastActiveAtMs = (indexEntry, fileStats) => {
|
|
230
|
+
return fileStats?.mtimeMs ?? indexEntry?.createdAtMs ?? null;
|
|
231
|
+
};
|
|
232
|
+
var toSessionSummary = (file, identity, stats, fileStats) => {
|
|
233
|
+
const worktree = identity.workspaceDirectory ?? identity.workspacePath ?? file.indexEntry?.workspaceDirectory ?? decodeWorkspaceDirectoryName(file.directoryName);
|
|
234
|
+
const workspaceLabel = getWorkspaceLabel(worktree);
|
|
235
|
+
const createdAtMs = getCreatedAtMs(file.indexEntry, fileStats);
|
|
236
|
+
const lastActiveAtMs = getLastActiveAtMs(file.indexEntry, fileStats);
|
|
237
|
+
return {
|
|
238
|
+
...stats,
|
|
239
|
+
autonomyMode: identity.autonomyMode,
|
|
240
|
+
createdAtIso: toIso(createdAtMs),
|
|
241
|
+
createdAtMs,
|
|
242
|
+
defaultModelTitle: identity.defaultModelTitle,
|
|
243
|
+
filePath: file.filePath,
|
|
244
|
+
lastActiveAtIso: toIso(lastActiveAtMs),
|
|
245
|
+
lastActiveAtMs,
|
|
246
|
+
selectedModel: identity.selectedModel,
|
|
247
|
+
selectedProfileId: identity.selectedProfileId,
|
|
248
|
+
sessionId: identity.sessionId,
|
|
249
|
+
sessionType: identity.sessionType,
|
|
250
|
+
title: getTitle(identity, file.indexEntry),
|
|
251
|
+
workspaceDirectory: identity.workspaceDirectory ?? file.indexEntry?.workspaceDirectory ?? null,
|
|
252
|
+
workspaceKey: getWorkspaceKey(file.directoryName),
|
|
253
|
+
workspaceLabel,
|
|
254
|
+
workspacePath: identity.workspacePath,
|
|
255
|
+
worktree
|
|
256
|
+
};
|
|
257
|
+
};
|
|
258
|
+
var getKiroDataDirFromSessionsDir = (sessionsDir) => {
|
|
259
|
+
return path.basename(sessionsDir) === "workspace-sessions" ? path.dirname(sessionsDir) : sessionsDir;
|
|
260
|
+
};
|
|
261
|
+
var getKiroWorkspaceHash = (workspacePath) => {
|
|
262
|
+
return createHash("sha256").update(workspacePath).digest("hex").slice(0, 32);
|
|
263
|
+
};
|
|
264
|
+
var listFilesRecursively = async (root, maxDepth = 3) => {
|
|
265
|
+
const entries = await readdir(root, { withFileTypes: true }).catch(() => []);
|
|
266
|
+
const files = [];
|
|
267
|
+
for (const entry of entries) {
|
|
268
|
+
const entryPath = path.join(root, entry.name);
|
|
269
|
+
if (entry.isFile()) {
|
|
270
|
+
files.push(entryPath);
|
|
271
|
+
continue;
|
|
272
|
+
}
|
|
273
|
+
if (entry.isDirectory() && maxDepth > 0) files.push(...await listFilesRecursively(entryPath, maxDepth - 1));
|
|
274
|
+
}
|
|
275
|
+
return files;
|
|
276
|
+
};
|
|
277
|
+
var listExecutionFilesForSession = async (dataDir, sessionId, worktree) => {
|
|
278
|
+
const workspaceExecutionRoot = path.join(dataDir, getKiroWorkspaceHash(worktree));
|
|
279
|
+
if (!await pathExists(workspaceExecutionRoot)) return [];
|
|
280
|
+
return (await mapWithConcurrency(await listFilesRecursively(workspaceExecutionRoot), READ_CONCURRENCY, async (filePath) => {
|
|
281
|
+
const raw = await readJsonObject(filePath);
|
|
282
|
+
return asString(raw?.chatSessionId ?? null) === sessionId && raw ? {
|
|
283
|
+
filePath,
|
|
284
|
+
raw
|
|
285
|
+
} : null;
|
|
286
|
+
})).flatMap((execution) => execution ? [execution] : []);
|
|
287
|
+
};
|
|
288
|
+
var getActionTimestamp = (action, execution) => {
|
|
289
|
+
return toIso(parseTimestampMs(action.emittedAt) ?? parseTimestampMs(action.endTime) ?? parseTimestampMs(execution.endTime));
|
|
290
|
+
};
|
|
291
|
+
var formatHumanLine = (value) => {
|
|
292
|
+
if (typeof value !== "number" || !Number.isInteger(value) || value < 0 || value >= Number.MAX_SAFE_INTEGER) return null;
|
|
293
|
+
return value + 1;
|
|
294
|
+
};
|
|
295
|
+
var formatFileRange = (file) => {
|
|
296
|
+
const range = asObject(file.range ?? null);
|
|
297
|
+
const startLine = formatHumanLine(range?.startLine);
|
|
298
|
+
const endLine = formatHumanLine(range?.endLine);
|
|
299
|
+
if (startLine !== null && endLine !== null) return `:${startLine}-${endLine}`;
|
|
300
|
+
if (startLine !== null) return `:${startLine}`;
|
|
301
|
+
return "";
|
|
302
|
+
};
|
|
303
|
+
var formatToolItems = (singularPrefix, pluralPrefix, items) => {
|
|
304
|
+
if (items.length === 1) return `${singularPrefix}: ${items[0]}`;
|
|
305
|
+
return `${pluralPrefix}:\n${items.map((item) => `- ${item}`).join("\n")}`;
|
|
306
|
+
};
|
|
307
|
+
var getToolCallSummary = (action) => {
|
|
308
|
+
const input = asObject(action.input ?? null);
|
|
309
|
+
if (!input) return null;
|
|
310
|
+
const files = Array.isArray(input.files) ? input.files.flatMap((item) => {
|
|
311
|
+
const file = asObject(item);
|
|
312
|
+
const filePath = asString(file?.path ?? null);
|
|
313
|
+
return file && filePath ? [`${filePath}${formatFileRange(file)}`] : [];
|
|
314
|
+
}) : [];
|
|
315
|
+
if (files.length > 0) return {
|
|
316
|
+
command: formatToolItems("Read file", "Read files", files),
|
|
317
|
+
toolName: "read_file"
|
|
318
|
+
};
|
|
319
|
+
const documents = Array.isArray(input.documents) ? input.documents.flatMap((item) => {
|
|
320
|
+
const document = typeof item === "string" ? item : asString(asObject(item)?.uri ?? null);
|
|
321
|
+
return document ? [document] : [];
|
|
322
|
+
}) : [];
|
|
323
|
+
if (documents.length > 0) return {
|
|
324
|
+
command: formatToolItems("Read document", "Read documents", documents),
|
|
325
|
+
toolName: "read_file"
|
|
326
|
+
};
|
|
327
|
+
const query = asString(input.query ?? null);
|
|
328
|
+
const why = asString(input.why ?? null);
|
|
329
|
+
if (query || why) return {
|
|
330
|
+
command: `Search: ${why ?? query}${why && query ? `\nQuery: ${query}` : ""}`,
|
|
331
|
+
toolName: "search"
|
|
332
|
+
};
|
|
333
|
+
return null;
|
|
334
|
+
};
|
|
335
|
+
var parseExecutionActionMessageEntry = (execution, action, index) => {
|
|
336
|
+
const text = cleanExtractedText(asString(asObject(action.output ?? null)?.message ?? null) ?? "").trim();
|
|
337
|
+
if (!text) return null;
|
|
338
|
+
const executionId = asString(execution.raw.executionId ?? null);
|
|
339
|
+
const actionId = asString(action.actionId ?? null) ?? `action:${index}`;
|
|
340
|
+
return {
|
|
341
|
+
entryId: `${executionId ?? path.basename(execution.filePath)}:${actionId}`,
|
|
342
|
+
entryType: "message",
|
|
343
|
+
executionId,
|
|
344
|
+
parts: [parseTextPart({
|
|
345
|
+
actionId,
|
|
346
|
+
executionFilePath: execution.filePath,
|
|
347
|
+
message: text,
|
|
348
|
+
type: "assistantMessage"
|
|
349
|
+
}, text)],
|
|
350
|
+
promptLogCount: 0,
|
|
351
|
+
raw: {
|
|
352
|
+
...action,
|
|
353
|
+
executionFilePath: execution.filePath
|
|
354
|
+
},
|
|
355
|
+
role: "assistant",
|
|
356
|
+
timestamp: getActionTimestamp(action, execution.raw)
|
|
357
|
+
};
|
|
358
|
+
};
|
|
359
|
+
var parseExecutionActionToolEntry = (execution, action, index) => {
|
|
360
|
+
const summary = getToolCallSummary(action);
|
|
361
|
+
if (!summary) return null;
|
|
362
|
+
const executionId = asString(execution.raw.executionId ?? null);
|
|
363
|
+
const actionId = asString(action.actionId ?? null) ?? `action:${index}`;
|
|
364
|
+
return {
|
|
365
|
+
entryId: `${executionId ?? path.basename(execution.filePath)}:${actionId}`,
|
|
366
|
+
entryType: "tool_call",
|
|
367
|
+
executionId,
|
|
368
|
+
parts: [parseTextPart({
|
|
369
|
+
actionId,
|
|
370
|
+
command: summary.command,
|
|
371
|
+
executionFilePath: execution.filePath,
|
|
372
|
+
toolName: summary.toolName,
|
|
373
|
+
type: "toolCall"
|
|
374
|
+
}, summary.command)],
|
|
375
|
+
promptLogCount: 0,
|
|
376
|
+
raw: {
|
|
377
|
+
...action,
|
|
378
|
+
executionFilePath: execution.filePath
|
|
379
|
+
},
|
|
380
|
+
role: "tool",
|
|
381
|
+
timestamp: getActionTimestamp(action, execution.raw)
|
|
382
|
+
};
|
|
383
|
+
};
|
|
384
|
+
var parseExecutionActionEntries = (execution, action, index) => {
|
|
385
|
+
return [parseExecutionActionToolEntry(execution, action, index), parseExecutionActionMessageEntry(execution, action, index)].filter((entry) => entry !== null);
|
|
386
|
+
};
|
|
387
|
+
var parseExecutionEntries = (execution) => {
|
|
388
|
+
return (Array.isArray(execution.raw.actions) ? execution.raw.actions : []).flatMap((item, index) => {
|
|
389
|
+
const action = asObject(item);
|
|
390
|
+
return action ? parseExecutionActionEntries(execution, action, index) : [];
|
|
391
|
+
});
|
|
392
|
+
};
|
|
393
|
+
var compareExecutionFiles = (left, right) => {
|
|
394
|
+
return (parseTimestampMs(left.raw.startTime) ?? 0) - (parseTimestampMs(right.raw.startTime) ?? 0) || left.filePath.localeCompare(right.filePath);
|
|
395
|
+
};
|
|
396
|
+
var readExecutionEntries = async (sessionsDir, session) => {
|
|
397
|
+
return (await listExecutionFilesForSession(getKiroDataDirFromSessionsDir(sessionsDir), session.sessionId, session.worktree)).sort(compareExecutionFiles).flatMap(parseExecutionEntries);
|
|
398
|
+
};
|
|
399
|
+
var getVisibleEntries = (historyEntries, executionEntries) => {
|
|
400
|
+
if (executionEntries.length === 0) return historyEntries;
|
|
401
|
+
const executionEntriesById = /* @__PURE__ */ new Map();
|
|
402
|
+
for (const entry of executionEntries) {
|
|
403
|
+
if (!entry.executionId) continue;
|
|
404
|
+
const entries = executionEntriesById.get(entry.executionId) ?? [];
|
|
405
|
+
entries.push(entry);
|
|
406
|
+
executionEntriesById.set(entry.executionId, entries);
|
|
407
|
+
}
|
|
408
|
+
const usedExecutionIds = /* @__PURE__ */ new Set();
|
|
409
|
+
const visibleEntries = [];
|
|
410
|
+
for (const entry of historyEntries) {
|
|
411
|
+
const matchingExecutionEntries = entry.executionId ? executionEntriesById.get(entry.executionId) : void 0;
|
|
412
|
+
if (isAssistantPlaceholderEntry(entry)) {
|
|
413
|
+
if (matchingExecutionEntries) {
|
|
414
|
+
visibleEntries.push(...matchingExecutionEntries);
|
|
415
|
+
usedExecutionIds.add(entry.executionId);
|
|
416
|
+
}
|
|
417
|
+
continue;
|
|
418
|
+
}
|
|
419
|
+
visibleEntries.push(entry);
|
|
420
|
+
}
|
|
421
|
+
visibleEntries.push(...executionEntries.filter((entry) => !entry.executionId || !usedExecutionIds.has(entry.executionId)));
|
|
422
|
+
return visibleEntries;
|
|
423
|
+
};
|
|
424
|
+
var createStatsFromEntries = (entries) => {
|
|
425
|
+
const stats = createEmptyStats();
|
|
426
|
+
for (const entry of entries) updateStatsFromEntry(stats, entry);
|
|
427
|
+
return stats;
|
|
428
|
+
};
|
|
429
|
+
var readSessionFile = async (file, options) => {
|
|
430
|
+
const rawSession = await readJsonObject(file.filePath);
|
|
431
|
+
if (!rawSession) return null;
|
|
432
|
+
const fileStats = await stat(file.filePath).then((stats) => ({
|
|
433
|
+
birthtimeMs: stats.birthtimeMs,
|
|
434
|
+
mtimeMs: stats.mtimeMs
|
|
435
|
+
})).catch(() => null);
|
|
436
|
+
const identity = {
|
|
437
|
+
autonomyMode: null,
|
|
438
|
+
defaultModelTitle: null,
|
|
439
|
+
firstUserText: null,
|
|
440
|
+
selectedModel: null,
|
|
441
|
+
selectedProfileId: null,
|
|
442
|
+
sessionId: path.basename(file.filePath, ".json"),
|
|
443
|
+
sessionType: null,
|
|
444
|
+
title: null,
|
|
445
|
+
workspaceDirectory: file.indexEntry?.workspaceDirectory ?? null,
|
|
446
|
+
workspacePath: null
|
|
447
|
+
};
|
|
448
|
+
const historyEntries = [];
|
|
449
|
+
const history = Array.isArray(rawSession.history) ? rawSession.history : [];
|
|
450
|
+
updateIdentityFromRaw(identity, rawSession);
|
|
451
|
+
history.forEach((item, index) => {
|
|
452
|
+
const raw = asObject(item);
|
|
453
|
+
if (!raw) return;
|
|
454
|
+
const entry = parseHistoryEntry(raw, index);
|
|
455
|
+
if (!entry) return;
|
|
456
|
+
historyEntries.push(entry);
|
|
457
|
+
updateIdentityFromEntry(identity, entry);
|
|
458
|
+
});
|
|
459
|
+
const baseSummary = toSessionSummary(file, identity, createEmptyStats(), fileStats);
|
|
460
|
+
const entries = getVisibleEntries(historyEntries, options.includeExecutions ? await readExecutionEntries(options.sessionsDir, baseSummary) : []);
|
|
461
|
+
const stats = createStatsFromEntries(entries);
|
|
462
|
+
return {
|
|
463
|
+
entries,
|
|
464
|
+
rawSession,
|
|
465
|
+
renderablePartCount: stats.renderablePartCount,
|
|
466
|
+
session: toSessionSummary(file, identity, stats, fileStats)
|
|
467
|
+
};
|
|
468
|
+
};
|
|
469
|
+
var listSessionFilesForWorkspace = async (sessionsDir, directoryName) => {
|
|
470
|
+
const workspaceDir = path.join(sessionsDir, directoryName);
|
|
471
|
+
const index = await readSessionIndex(workspaceDir);
|
|
472
|
+
return (await readdir(workspaceDir, { withFileTypes: true }).catch(() => [])).filter((entry) => entry.isFile() && entry.name.endsWith(".json") && entry.name !== "sessions.json").map((entry) => {
|
|
473
|
+
const sessionId = path.basename(entry.name, ".json");
|
|
474
|
+
return {
|
|
475
|
+
directoryName,
|
|
476
|
+
filePath: path.join(workspaceDir, entry.name),
|
|
477
|
+
indexEntry: index.get(sessionId) ?? null
|
|
478
|
+
};
|
|
479
|
+
});
|
|
480
|
+
};
|
|
481
|
+
var listSessionFiles = async (sessionsDir) => {
|
|
482
|
+
if (!await pathExists(sessionsDir)) return [];
|
|
483
|
+
return (await mapWithConcurrency((await readdir(sessionsDir, { withFileTypes: true })).filter((entry) => entry.isDirectory()).map((entry) => entry.name).sort(), READ_CONCURRENCY, (directoryName) => listSessionFilesForWorkspace(sessionsDir, directoryName))).flat();
|
|
484
|
+
};
|
|
485
|
+
var readSessionFiles = async (files) => {
|
|
486
|
+
return (await mapWithConcurrency(files, READ_CONCURRENCY, (file) => readSessionFile(file, {
|
|
487
|
+
includeExecutions: false,
|
|
488
|
+
sessionsDir: path.dirname(path.dirname(file.filePath))
|
|
489
|
+
}))).flatMap((transcript) => transcript ? [transcript] : []);
|
|
490
|
+
};
|
|
491
|
+
var compareNullableMsDesc = (left, right) => {
|
|
492
|
+
return (right ?? 0) - (left ?? 0);
|
|
493
|
+
};
|
|
494
|
+
var sumSessions = (sessions, key) => {
|
|
495
|
+
return sessions.reduce((total, session) => total + session[key], 0);
|
|
496
|
+
};
|
|
497
|
+
var toWorkspaceGroup = (directoryName, sessions) => {
|
|
498
|
+
const worktree = sessions[0]?.worktree ?? decodeWorkspaceDirectoryName(directoryName);
|
|
499
|
+
const lastActiveAtMs = sessions.reduce((latest, session) => {
|
|
500
|
+
if (session.lastActiveAtMs === null) return latest;
|
|
501
|
+
return latest === null ? session.lastActiveAtMs : Math.max(latest, session.lastActiveAtMs);
|
|
502
|
+
}, null);
|
|
503
|
+
return {
|
|
504
|
+
assistantMessageCount: sumSessions(sessions, "assistantMessageCount"),
|
|
505
|
+
directoryName,
|
|
506
|
+
imageCount: sumSessions(sessions, "imageCount"),
|
|
507
|
+
key: getWorkspaceKey(directoryName),
|
|
508
|
+
label: getWorkspaceLabel(worktree),
|
|
509
|
+
lastActiveAtIso: toIso(lastActiveAtMs),
|
|
510
|
+
lastActiveAtMs,
|
|
511
|
+
messageCount: sumSessions(sessions, "messageCount"),
|
|
512
|
+
promptLogCount: sumSessions(sessions, "promptLogCount"),
|
|
513
|
+
sessionCount: sessions.length,
|
|
514
|
+
uri: getWorkspaceUri(worktree),
|
|
515
|
+
userMessageCount: sumSessions(sessions, "userMessageCount"),
|
|
516
|
+
worktree
|
|
517
|
+
};
|
|
518
|
+
};
|
|
519
|
+
var listKiroWorkspaceGroups = async (sessionsDir = resolveKiroWorkspaceSessionsDir()) => {
|
|
520
|
+
const transcripts = await readSessionFiles(await listSessionFiles(sessionsDir));
|
|
521
|
+
const sessionsByDirectory = /* @__PURE__ */ new Map();
|
|
522
|
+
for (const transcript of transcripts) {
|
|
523
|
+
const directoryName = getDirectoryNameFromWorkspaceKey(transcript.session.workspaceKey);
|
|
524
|
+
if (!directoryName) continue;
|
|
525
|
+
const sessions = sessionsByDirectory.get(directoryName) ?? [];
|
|
526
|
+
sessions.push(transcript.session);
|
|
527
|
+
sessionsByDirectory.set(directoryName, sessions);
|
|
528
|
+
}
|
|
529
|
+
return [...sessionsByDirectory.entries()].map(([directoryName, sessions]) => toWorkspaceGroup(directoryName, sessions)).sort((left, right) => compareNullableMsDesc(left.lastActiveAtMs, right.lastActiveAtMs) || left.worktree.localeCompare(right.worktree));
|
|
530
|
+
};
|
|
531
|
+
var sortSessions = (sessions) => {
|
|
532
|
+
return [...sessions].sort((left, right) => compareNullableMsDesc(left.lastActiveAtMs, right.lastActiveAtMs) || left.title.localeCompare(right.title));
|
|
533
|
+
};
|
|
534
|
+
var listKiroSessionsForGroup = async (workspaceKey, sessionsDir = resolveKiroWorkspaceSessionsDir()) => {
|
|
535
|
+
const directoryName = getDirectoryNameFromWorkspaceKey(workspaceKey);
|
|
536
|
+
if (!directoryName || !await pathExists(sessionsDir)) return [];
|
|
537
|
+
return sortSessions((await readSessionFiles(await listSessionFilesForWorkspace(sessionsDir, directoryName))).map((transcript) => transcript.session));
|
|
538
|
+
};
|
|
539
|
+
var locateSessionFile = async (sessionsDir, sessionId) => {
|
|
540
|
+
return (await listSessionFiles(sessionsDir)).find((file) => path.basename(file.filePath, ".json") === sessionId) ?? null;
|
|
541
|
+
};
|
|
542
|
+
var readKiroSessionTranscript = async (sessionsDir, sessionId) => {
|
|
543
|
+
if (!await pathExists(sessionsDir)) return null;
|
|
544
|
+
const file = await locateSessionFile(sessionsDir, sessionId);
|
|
545
|
+
if (!file) return null;
|
|
546
|
+
return readSessionFile(file, {
|
|
547
|
+
includeExecutions: true,
|
|
548
|
+
sessionsDir
|
|
549
|
+
});
|
|
550
|
+
};
|
|
551
|
+
//#endregion
|
|
552
|
+
export { listKiroSessionsForGroup, listKiroWorkspaceGroups, readKiroSessionTranscript, resolveKiroWorkspaceSessionsDir };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { t as createServerFn } from "../server.js";
|
|
2
|
+
import { t as createSsrRpc } from "./createSsrRpc-C754NPki.js";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { queryOptions } from "@tanstack/react-query";
|
|
5
|
+
//#region src/lib/kiro-server.ts
|
|
6
|
+
var workspaceSchema = z.object({ workspaceKey: z.string().min(1) });
|
|
7
|
+
var sessionSchema = z.object({ sessionId: z.string().min(1) });
|
|
8
|
+
var exportSessionSchema = z.object({
|
|
9
|
+
includeCommentary: z.boolean().default(true),
|
|
10
|
+
includeMetadata: z.boolean().default(true),
|
|
11
|
+
includeTools: z.boolean().default(true),
|
|
12
|
+
outputFormat: z.enum(["md", "txt"]).default("md"),
|
|
13
|
+
sessionId: z.string().min(1),
|
|
14
|
+
zipArchive: z.boolean().default(false)
|
|
15
|
+
});
|
|
16
|
+
var listKiroWorkspacesFn = createServerFn({ method: "GET" }).handler(createSsrRpc("e5dccf57fb45a9c1fe971e71935dd743e2c4108badfb95aa89cf08a5ccd7c3af"));
|
|
17
|
+
var listKiroSessionsFn = createServerFn({ method: "GET" }).validator(workspaceSchema).handler(createSsrRpc("05f39c4ddd140732eec6814673bdb975c3092ae88d9fb87479586125e8da3917"));
|
|
18
|
+
var getKiroSessionDetailFn = createServerFn({ method: "GET" }).validator(sessionSchema).handler(createSsrRpc("51dfddfd486f04b369fef0b3a5aaa0dcd275fc5495ac2fba85a3348408d897c9"));
|
|
19
|
+
var exportKiroSessionFn = createServerFn({ method: "POST" }).validator(exportSessionSchema).handler(createSsrRpc("a3419cd85493ddc5959e22d85e6b1c5bfb4ce862bb7117ad6a98e3c97d14d066"));
|
|
20
|
+
//#endregion
|
|
21
|
+
//#region src/lib/kiro-queries.ts
|
|
22
|
+
var kiroWorkspacesQueryOptions = () => queryOptions({
|
|
23
|
+
queryFn: () => listKiroWorkspacesFn(),
|
|
24
|
+
queryKey: ["kiro-workspaces"]
|
|
25
|
+
});
|
|
26
|
+
var kiroSessionsQueryOptions = (workspaceKey) => queryOptions({
|
|
27
|
+
enabled: workspaceKey !== null,
|
|
28
|
+
queryFn: () => listKiroSessionsFn({ data: { workspaceKey: workspaceKey ?? "" } }),
|
|
29
|
+
queryKey: ["kiro-sessions", workspaceKey ?? "none"]
|
|
30
|
+
});
|
|
31
|
+
var kiroSessionDetailQueryOptions = (sessionId) => queryOptions({
|
|
32
|
+
enabled: sessionId !== null,
|
|
33
|
+
queryFn: () => getKiroSessionDetailFn({ data: { sessionId: sessionId ?? "" } }),
|
|
34
|
+
queryKey: ["kiro-session", sessionId ?? "none"]
|
|
35
|
+
});
|
|
36
|
+
//#endregion
|
|
37
|
+
export { exportKiroSessionFn as i, kiroSessionsQueryOptions as n, kiroWorkspacesQueryOptions as r, kiroSessionDetailQueryOptions as t };
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { t as createServerFn } from "../server.js";
|
|
2
|
+
import { t as createServerRpc } from "./createServerRpc-CF_DEwnm.js";
|
|
3
|
+
import { t as renderSourceSessionDownload } from "./source-session-export-server-DNutCawb.js";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
//#region src/lib/kiro-server.ts?tss-serverfn-split
|
|
6
|
+
var workspaceSchema = z.object({ workspaceKey: z.string().min(1) });
|
|
7
|
+
var sessionSchema = z.object({ sessionId: z.string().min(1) });
|
|
8
|
+
var exportSessionSchema = z.object({
|
|
9
|
+
includeCommentary: z.boolean().default(true),
|
|
10
|
+
includeMetadata: z.boolean().default(true),
|
|
11
|
+
includeTools: z.boolean().default(true),
|
|
12
|
+
outputFormat: z.enum(["md", "txt"]).default("md"),
|
|
13
|
+
sessionId: z.string().min(1),
|
|
14
|
+
zipArchive: z.boolean().default(false)
|
|
15
|
+
});
|
|
16
|
+
var listKiroWorkspacesFn_createServerFn_handler = createServerRpc({
|
|
17
|
+
id: "e5dccf57fb45a9c1fe971e71935dd743e2c4108badfb95aa89cf08a5ccd7c3af",
|
|
18
|
+
name: "listKiroWorkspacesFn",
|
|
19
|
+
filename: "src/lib/kiro-server.ts"
|
|
20
|
+
}, (opts) => listKiroWorkspacesFn.__executeServer(opts));
|
|
21
|
+
var listKiroWorkspacesFn = createServerFn({ method: "GET" }).handler(listKiroWorkspacesFn_createServerFn_handler, async () => {
|
|
22
|
+
const { listKiroWorkspaceGroups } = await import("./kiro-db--fXrED_-.js");
|
|
23
|
+
return listKiroWorkspaceGroups();
|
|
24
|
+
});
|
|
25
|
+
var listKiroSessionsFn_createServerFn_handler = createServerRpc({
|
|
26
|
+
id: "05f39c4ddd140732eec6814673bdb975c3092ae88d9fb87479586125e8da3917",
|
|
27
|
+
name: "listKiroSessionsFn",
|
|
28
|
+
filename: "src/lib/kiro-server.ts"
|
|
29
|
+
}, (opts) => listKiroSessionsFn.__executeServer(opts));
|
|
30
|
+
var listKiroSessionsFn = createServerFn({ method: "GET" }).validator(workspaceSchema).handler(listKiroSessionsFn_createServerFn_handler, async ({ data }) => {
|
|
31
|
+
const { listKiroSessionsForGroup } = await import("./kiro-db--fXrED_-.js");
|
|
32
|
+
return listKiroSessionsForGroup(data.workspaceKey);
|
|
33
|
+
});
|
|
34
|
+
var loadKiroSessionTranscript = async (sessionId) => {
|
|
35
|
+
const { readKiroSessionTranscript, resolveKiroWorkspaceSessionsDir } = await import("./kiro-db--fXrED_-.js");
|
|
36
|
+
const transcript = await readKiroSessionTranscript(resolveKiroWorkspaceSessionsDir(), sessionId);
|
|
37
|
+
if (!transcript) throw new Error(`Kiro session not found: ${sessionId}`);
|
|
38
|
+
return transcript;
|
|
39
|
+
};
|
|
40
|
+
var getKiroSessionDetailFn_createServerFn_handler = createServerRpc({
|
|
41
|
+
id: "51dfddfd486f04b369fef0b3a5aaa0dcd275fc5495ac2fba85a3348408d897c9",
|
|
42
|
+
name: "getKiroSessionDetailFn",
|
|
43
|
+
filename: "src/lib/kiro-server.ts"
|
|
44
|
+
}, (opts) => getKiroSessionDetailFn.__executeServer(opts));
|
|
45
|
+
var getKiroSessionDetailFn = createServerFn({ method: "GET" }).validator(sessionSchema).handler(getKiroSessionDetailFn_createServerFn_handler, async ({ data }) => {
|
|
46
|
+
return loadKiroSessionTranscript(data.sessionId);
|
|
47
|
+
});
|
|
48
|
+
var exportKiroSessionFn_createServerFn_handler = createServerRpc({
|
|
49
|
+
id: "a3419cd85493ddc5959e22d85e6b1c5bfb4ce862bb7117ad6a98e3c97d14d066",
|
|
50
|
+
name: "exportKiroSessionFn",
|
|
51
|
+
filename: "src/lib/kiro-server.ts"
|
|
52
|
+
}, (opts) => exportKiroSessionFn.__executeServer(opts));
|
|
53
|
+
var exportKiroSessionFn = createServerFn({ method: "POST" }).validator(exportSessionSchema).handler(exportKiroSessionFn_createServerFn_handler, async ({ data }) => {
|
|
54
|
+
const { renderKiroTranscript } = await import("./kiro-transcript-DoekQBaH.js");
|
|
55
|
+
const transcript = await loadKiroSessionTranscript(data.sessionId);
|
|
56
|
+
const content = renderKiroTranscript(transcript, {
|
|
57
|
+
includeCommentary: data.includeCommentary,
|
|
58
|
+
includeMetadata: data.includeMetadata,
|
|
59
|
+
includeTools: data.includeTools,
|
|
60
|
+
outputFormat: data.outputFormat
|
|
61
|
+
});
|
|
62
|
+
if (!content) throw new Error(`Kiro session has no exportable content: ${data.sessionId}`);
|
|
63
|
+
return renderSourceSessionDownload({
|
|
64
|
+
content,
|
|
65
|
+
fallbackBaseName: "kiro-session",
|
|
66
|
+
fileBaseName: transcript.session.title || transcript.session.sessionId,
|
|
67
|
+
outputFormat: data.outputFormat,
|
|
68
|
+
zipArchive: data.zipArchive
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
//#endregion
|
|
72
|
+
export { exportKiroSessionFn_createServerFn_handler, getKiroSessionDetailFn_createServerFn_handler, listKiroSessionsFn_createServerFn_handler, listKiroWorkspacesFn_createServerFn_handler };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { t as ReloadErrorPanel } from "./reload-error-panel-BJMxY3U1.js";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
//#region src/routes/kiro-sessions.$sessionId.tsx?tsr-split=errorComponent
|
|
4
|
+
var KiroSessionDetailErrorComponent = ({ error }) => {
|
|
5
|
+
return /* @__PURE__ */ jsx(ReloadErrorPanel, {
|
|
6
|
+
description: error.message,
|
|
7
|
+
title: "Failed to load Kiro session"
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
//#endregion
|
|
11
|
+
export { KiroSessionDetailErrorComponent as errorComponent };
|