@juspay/shooter 1.6.0 → 1.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/client/_app/immutable/assets/0.BXHU1bFd.css +1 -0
- package/build/client/_app/immutable/assets/0.BXHU1bFd.css.br +0 -0
- package/build/client/_app/immutable/assets/0.BXHU1bFd.css.gz +0 -0
- package/build/client/_app/immutable/assets/{2.Dk9NfqnS.css → 2.Bxu934IC.css} +1 -1
- package/build/client/_app/immutable/assets/2.Bxu934IC.css.br +0 -0
- package/build/client/_app/immutable/assets/2.Bxu934IC.css.gz +0 -0
- package/build/client/_app/immutable/chunks/{CqfYvnci.js → B7UYUXav.js} +1 -1
- package/build/client/_app/immutable/chunks/B7UYUXav.js.br +0 -0
- package/build/client/_app/immutable/chunks/B7UYUXav.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{y_g-KC7l.js → CAWtH3Iy.js} +1 -1
- package/build/client/_app/immutable/chunks/CAWtH3Iy.js.br +0 -0
- package/build/client/_app/immutable/chunks/{y_g-KC7l.js.gz → CAWtH3Iy.js.gz} +0 -0
- package/build/client/_app/immutable/chunks/{EhLZwqfu.js → DMGoTOyn.js} +2 -2
- package/build/client/_app/immutable/chunks/DMGoTOyn.js.br +0 -0
- package/build/client/_app/immutable/chunks/DMGoTOyn.js.gz +0 -0
- package/build/client/_app/immutable/entry/{app.zJvbFXsj.js → app.DLyiS7a7.js} +2 -2
- package/build/client/_app/immutable/entry/app.DLyiS7a7.js.br +0 -0
- package/build/client/_app/immutable/entry/app.DLyiS7a7.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.iu831vTf.js +1 -0
- package/build/client/_app/immutable/entry/start.iu831vTf.js.br +2 -0
- package/build/client/_app/immutable/entry/start.iu831vTf.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{0.B_E4j3MX.js → 0.B76xpgU3.js} +1 -1
- package/build/client/_app/immutable/nodes/0.B76xpgU3.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.B76xpgU3.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{1.B0oFqb8X.js → 1.C8HQaM7E.js} +1 -1
- package/build/client/_app/immutable/nodes/1.C8HQaM7E.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.C8HQaM7E.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.BAtXcLWF.js +13 -0
- package/build/client/_app/immutable/nodes/2.BAtXcLWF.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.BAtXcLWF.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{3.CTqUQKSN.js → 3.CYU2wJvk.js} +1 -1
- package/build/client/_app/immutable/nodes/3.CYU2wJvk.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.CYU2wJvk.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{6.BvjUfHnH.js → 6.C_uZdnK8.js} +1 -1
- package/build/client/_app/immutable/nodes/6.C_uZdnK8.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.C_uZdnK8.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{7.5K7Od8ba.js → 7.Cuv-AoHz.js} +1 -1
- package/build/client/_app/immutable/nodes/7.Cuv-AoHz.js.br +0 -0
- package/build/client/_app/immutable/nodes/7.Cuv-AoHz.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{8.Bs1DrW0_.js → 8.jzwOIQUM.js} +1 -1
- package/build/client/_app/immutable/nodes/8.jzwOIQUM.js.br +0 -0
- package/build/client/_app/immutable/nodes/8.jzwOIQUM.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{9.1fMlGdqv.js → 9.BDETv_rs.js} +1 -1
- package/build/client/_app/immutable/nodes/9.BDETv_rs.js.br +0 -0
- package/build/client/_app/immutable/nodes/9.BDETv_rs.js.gz +0 -0
- package/build/client/_app/version.json +1 -1
- package/build/client/_app/version.json.br +0 -0
- package/build/client/_app/version.json.gz +0 -0
- package/build/server/chunks/{0-e1fgD9Mi.js → 0-JnYsOPFg.js} +4 -4
- package/build/server/chunks/{0-e1fgD9Mi.js.map → 0-JnYsOPFg.js.map} +1 -1
- package/build/server/chunks/{1-D2_XVthm.js → 1-uXVmLPvu.js} +3 -3
- package/build/server/chunks/{1-D2_XVthm.js.map → 1-uXVmLPvu.js.map} +1 -1
- package/build/server/chunks/{2-DADX86JZ.js → 2-CVN3QR62.js} +4 -4
- package/build/server/chunks/{2-DADX86JZ.js.map → 2-CVN3QR62.js.map} +1 -1
- package/build/server/chunks/{3-CHacdiCg.js → 3-BGXBcTfb.js} +3 -3
- package/build/server/chunks/{3-CHacdiCg.js.map → 3-BGXBcTfb.js.map} +1 -1
- package/build/server/chunks/{4-0UE_6Ep-.js → 4-DOCzBx63.js} +2 -2
- package/build/server/chunks/{4-0UE_6Ep-.js.map → 4-DOCzBx63.js.map} +1 -1
- package/build/server/chunks/{5-BBIP1PzX.js → 5-7A7zBuKk.js} +2 -2
- package/build/server/chunks/{5-BBIP1PzX.js.map → 5-7A7zBuKk.js.map} +1 -1
- package/build/server/chunks/{6-CWLNQu6F.js → 6-DWdCl-Zi.js} +3 -3
- package/build/server/chunks/{6-CWLNQu6F.js.map → 6-DWdCl-Zi.js.map} +1 -1
- package/build/server/chunks/{7-DmQ3B8uy.js → 7-DUY-pQp0.js} +3 -3
- package/build/server/chunks/{7-DmQ3B8uy.js.map → 7-DUY-pQp0.js.map} +1 -1
- package/build/server/chunks/{8-CnFVjQtZ.js → 8-vdkbC7-0.js} +3 -3
- package/build/server/chunks/{8-CnFVjQtZ.js.map → 8-vdkbC7-0.js.map} +1 -1
- package/build/server/chunks/{9-Dw7-P6aF.js → 9-Bo4T88xL.js} +3 -3
- package/build/server/chunks/{9-Dw7-P6aF.js.map → 9-Bo4T88xL.js.map} +1 -1
- package/build/server/chunks/{Button-WKgiLWZI.js → Button-DdjxOkSZ.js} +2 -2
- package/build/server/chunks/{Button-WKgiLWZI.js.map → Button-DdjxOkSZ.js.map} +1 -1
- package/build/server/chunks/{EmptyState-BUBqASsp.js → EmptyState-Do0HSexX.js} +3 -3
- package/build/server/chunks/{EmptyState-BUBqASsp.js.map → EmptyState-Do0HSexX.js.map} +1 -1
- package/build/server/chunks/{Icon-BNBAg85a.js → Icon-CmfQpMj8.js} +2 -2
- package/build/server/chunks/{Icon-BNBAg85a.js.map → Icon-CmfQpMj8.js.map} +1 -1
- package/build/server/chunks/{Shimmer-C4uBVwxz.js → Shimmer-5rSdw-ut.js} +2 -2
- package/build/server/chunks/{Shimmer-C4uBVwxz.js.map → Shimmer-5rSdw-ut.js.map} +1 -1
- package/build/server/chunks/{_error.svelte-DkIwmECt.js → _error.svelte-B3eSa4PI.js} +5 -5
- package/build/server/chunks/{_error.svelte-DkIwmECt.js.map → _error.svelte-B3eSa4PI.js.map} +1 -1
- package/build/server/chunks/{_layout.svelte-DllETxmJ.js → _layout.svelte-DIibCT-o.js} +6 -6
- package/build/server/chunks/{_layout.svelte-DllETxmJ.js.map → _layout.svelte-DIibCT-o.js.map} +1 -1
- package/build/server/chunks/{_page.svelte-BZSdLKE_.js → _page.svelte-BCVxxMg-.js} +4 -4
- package/build/server/chunks/{_page.svelte-BZSdLKE_.js.map → _page.svelte-BCVxxMg-.js.map} +1 -1
- package/build/server/chunks/{_page.svelte-Co5sF7W-.js → _page.svelte-BnIJOtvm.js} +11 -11
- package/build/server/chunks/{_page.svelte-Co5sF7W-.js.map → _page.svelte-BnIJOtvm.js.map} +1 -1
- package/build/server/chunks/{_page.svelte-Cmuco1mC.js → _page.svelte-D4TBiar7.js} +5 -5
- package/build/server/chunks/{_page.svelte-Cmuco1mC.js.map → _page.svelte-D4TBiar7.js.map} +1 -1
- package/build/server/chunks/{_page.svelte-JIkgFUFf.js → _page.svelte-DQZWJdHb.js} +4 -4
- package/build/server/chunks/{_page.svelte-JIkgFUFf.js.map → _page.svelte-DQZWJdHb.js.map} +1 -1
- package/build/server/chunks/{_page.svelte-fcX09N4d.js → _page.svelte-DYhv6WTT.js} +9 -9
- package/build/server/chunks/{_page.svelte-fcX09N4d.js.map → _page.svelte-DYhv6WTT.js.map} +1 -1
- package/build/server/chunks/{_page.svelte-Y9-O5a5w.js → _page.svelte-DZK06z97.js} +8 -8
- package/build/server/chunks/{_page.svelte-Y9-O5a5w.js.map → _page.svelte-DZK06z97.js.map} +1 -1
- package/build/server/chunks/{_page.svelte-CpL3R-VI.js → _page.svelte-qNZy4ITB.js} +8 -8
- package/build/server/chunks/{_page.svelte-CpL3R-VI.js.map → _page.svelte-qNZy4ITB.js.map} +1 -1
- package/build/server/chunks/{_page.svelte-DDSzYLUs.js → _page.svelte-vwYD3-TB.js} +29 -12
- package/build/server/chunks/_page.svelte-vwYD3-TB.js.map +1 -0
- package/build/server/chunks/{_server.ts-ByIrRtCx.js → _server.ts-BQarRaho.js} +138 -87
- package/build/server/chunks/_server.ts-BQarRaho.js.map +1 -0
- package/build/server/chunks/{_server.ts-B__YN2kX.js → _server.ts-G8OeADGj.js} +21 -3
- package/build/server/chunks/_server.ts-G8OeADGj.js.map +1 -0
- package/build/server/chunks/{client-DRtPDkMh.js → client-CHdjSh4H.js} +4 -4
- package/build/server/chunks/{client-DRtPDkMh.js.map → client-CHdjSh4H.js.map} +1 -1
- package/build/server/chunks/client2-BTUnRGQp.js +7 -0
- package/build/server/chunks/{client2-bqqmu0b7.js.map → client2-BTUnRGQp.js.map} +1 -1
- package/build/server/chunks/{close-BGlLztTb.js → close-DAiakm6B.js} +2 -2
- package/build/server/chunks/{close-BGlLztTb.js.map → close-DAiakm6B.js.map} +1 -1
- package/build/server/chunks/{index-DP9bWJrR.js → index-C2COL4R7.js} +2 -2
- package/build/server/chunks/{index-DP9bWJrR.js.map → index-C2COL4R7.js.map} +1 -1
- package/build/server/chunks/{index-server-BUmV4MIG.js → index-server-Cpgjzv_S.js} +2 -2
- package/build/server/chunks/{index-server-BUmV4MIG.js.map → index-server-Cpgjzv_S.js.map} +1 -1
- package/build/server/chunks/{index2-D5Y19GKR.js → index2-CKXBGyRH.js} +2 -2
- package/build/server/chunks/{index2-D5Y19GKR.js.map → index2-CKXBGyRH.js.map} +1 -1
- package/build/server/chunks/{root-CATOR_0t.js → root-CeOG24Ij.js} +2 -2
- package/build/server/chunks/{root-CATOR_0t.js.map → root-CeOG24Ij.js.map} +1 -1
- package/build/server/chunks/{state.svelte-CftllyvC.js → state.svelte-BMNP49Le.js} +3 -3
- package/build/server/chunks/{state.svelte-CftllyvC.js.map → state.svelte-BMNP49Le.js.map} +1 -1
- package/build/server/chunks/{stores-BjL57aOK.js → stores-NzQ5oCpr.js} +4 -4
- package/build/server/chunks/{stores-BjL57aOK.js.map → stores-NzQ5oCpr.js.map} +1 -1
- package/build/server/index.js +4 -4
- package/build/server/index.js.map +1 -1
- package/build/server/manifest.js +13 -13
- package/build/server/manifest.js.map +1 -1
- package/package.json +1 -1
- package/src/app.css +41 -18
- package/src/lib/modules/server/sessions/jsonl-reader.ts +178 -108
- package/src/routes/+page.svelte +60 -2
- package/src/routes/api/notify/+server.ts +31 -3
- package/build/client/_app/immutable/assets/0.BhZOCxO4.css +0 -1
- package/build/client/_app/immutable/assets/0.BhZOCxO4.css.br +0 -0
- package/build/client/_app/immutable/assets/0.BhZOCxO4.css.gz +0 -0
- package/build/client/_app/immutable/assets/2.Dk9NfqnS.css.br +0 -0
- package/build/client/_app/immutable/assets/2.Dk9NfqnS.css.gz +0 -0
- package/build/client/_app/immutable/chunks/CqfYvnci.js.br +0 -0
- package/build/client/_app/immutable/chunks/CqfYvnci.js.gz +0 -0
- package/build/client/_app/immutable/chunks/EhLZwqfu.js.br +0 -0
- package/build/client/_app/immutable/chunks/EhLZwqfu.js.gz +0 -0
- package/build/client/_app/immutable/chunks/y_g-KC7l.js.br +0 -0
- package/build/client/_app/immutable/entry/app.zJvbFXsj.js.br +0 -0
- package/build/client/_app/immutable/entry/app.zJvbFXsj.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.B2Jf5iFd.js +0 -1
- package/build/client/_app/immutable/entry/start.B2Jf5iFd.js.br +0 -2
- package/build/client/_app/immutable/entry/start.B2Jf5iFd.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.B_E4j3MX.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.B_E4j3MX.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.B0oFqb8X.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.B0oFqb8X.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.Bqul0XyM.js +0 -13
- package/build/client/_app/immutable/nodes/2.Bqul0XyM.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.Bqul0XyM.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.CTqUQKSN.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.CTqUQKSN.js.gz +0 -0
- package/build/client/_app/immutable/nodes/6.BvjUfHnH.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.BvjUfHnH.js.gz +0 -0
- package/build/client/_app/immutable/nodes/7.5K7Od8ba.js.br +0 -0
- package/build/client/_app/immutable/nodes/7.5K7Od8ba.js.gz +0 -0
- package/build/client/_app/immutable/nodes/8.Bs1DrW0_.js.br +0 -0
- package/build/client/_app/immutable/nodes/8.Bs1DrW0_.js.gz +0 -0
- package/build/client/_app/immutable/nodes/9.1fMlGdqv.js.br +0 -0
- package/build/client/_app/immutable/nodes/9.1fMlGdqv.js.gz +0 -0
- package/build/server/chunks/_page.svelte-DDSzYLUs.js.map +0 -1
- package/build/server/chunks/_server.ts-B__YN2kX.js.map +0 -1
- package/build/server/chunks/_server.ts-ByIrRtCx.js.map +0 -1
- package/build/server/chunks/client2-bqqmu0b7.js +0 -7
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { l as head, n as
|
|
2
|
-
import { g as goto } from './client-
|
|
3
|
-
import { E as EmptyState, c as clearCache } from './EmptyState-
|
|
4
|
-
import { I as Icon } from './Icon-
|
|
1
|
+
import { l as head, k as escape_html, n as derived, o as ensure_array_like } from './index-C2COL4R7.js';
|
|
2
|
+
import { g as goto } from './client-CHdjSh4H.js';
|
|
3
|
+
import { E as EmptyState, c as clearCache } from './EmptyState-Do0HSexX.js';
|
|
4
|
+
import { I as Icon } from './Icon-CmfQpMj8.js';
|
|
5
5
|
import './markdown-W_mTBct0.js';
|
|
6
|
-
import { o as onDestroy } from './index-server-
|
|
7
|
-
import { B as Button } from './Button-
|
|
8
|
-
import { S as Shimmer } from './Shimmer-
|
|
6
|
+
import { o as onDestroy } from './index-server-Cpgjzv_S.js';
|
|
7
|
+
import { B as Button } from './Button-DdjxOkSZ.js';
|
|
8
|
+
import { S as Shimmer } from './Shimmer-5rSdw-ut.js';
|
|
9
9
|
import { S as SvelteMap, a as SvelteSet } from './index-server2-BJrT0wnA.js';
|
|
10
|
-
import './root-
|
|
11
|
-
import './index2-
|
|
12
|
-
import './state.svelte-
|
|
10
|
+
import './root-CeOG24Ij.js';
|
|
11
|
+
import './index2-CKXBGyRH.js';
|
|
12
|
+
import './state.svelte-BMNP49Le.js';
|
|
13
13
|
import './html-FW6Ia4bL.js';
|
|
14
14
|
import 'dompurify';
|
|
15
15
|
import 'marked';
|
|
@@ -83,6 +83,9 @@ function _page($$renderer, $$props) {
|
|
|
83
83
|
function navigateToConfig() {
|
|
84
84
|
void goto();
|
|
85
85
|
}
|
|
86
|
+
function totalSessionCount() {
|
|
87
|
+
return projects.reduce((sum, p) => sum + p.sessionCount, 0);
|
|
88
|
+
}
|
|
86
89
|
head("1uha8ag", $$renderer2, ($$renderer3) => {
|
|
87
90
|
$$renderer3.title(($$renderer4) => {
|
|
88
91
|
$$renderer4.push(`<title>Dashboard - Shooter</title>`);
|
|
@@ -100,7 +103,21 @@ function _page($$renderer, $$props) {
|
|
|
100
103
|
},
|
|
101
104
|
$$slots: { default: true }
|
|
102
105
|
});
|
|
103
|
-
$$renderer2.push(`<!----></div></div
|
|
106
|
+
$$renderer2.push(`<!----></div></div> `);
|
|
107
|
+
if (projects.length > 0) {
|
|
108
|
+
$$renderer2.push("<!--[0-->");
|
|
109
|
+
$$renderer2.push(`<div class="stats-bar svelte-1uha8ag"><div class="stat-chip svelte-1uha8ag"><span class="stat-value svelte-1uha8ag">${escape_html(projects.length)}</span> <span class="stat-label svelte-1uha8ag">${escape_html(projects.length === 1 ? "project" : "projects")}</span></div> <div class="stat-chip svelte-1uha8ag"><span class="stat-value svelte-1uha8ag">${escape_html(totalSessionCount())}</span> <span class="stat-label svelte-1uha8ag">${escape_html(totalSessionCount() === 1 ? "session" : "sessions")}</span></div> `);
|
|
110
|
+
if (cards().length > 0) {
|
|
111
|
+
$$renderer2.push("<!--[0-->");
|
|
112
|
+
$$renderer2.push(`<div class="stat-chip stat-chip-active svelte-1uha8ag"><span class="stat-value svelte-1uha8ag">${escape_html(cards().length)}</span> <span class="stat-label svelte-1uha8ag">active</span></div>`);
|
|
113
|
+
} else {
|
|
114
|
+
$$renderer2.push("<!--[-1-->");
|
|
115
|
+
}
|
|
116
|
+
$$renderer2.push(`<!--]--></div>`);
|
|
117
|
+
} else {
|
|
118
|
+
$$renderer2.push("<!--[-1-->");
|
|
119
|
+
}
|
|
120
|
+
$$renderer2.push(`<!--]--></div> `);
|
|
104
121
|
{
|
|
105
122
|
$$renderer2.push("<!--[-1-->");
|
|
106
123
|
}
|
|
@@ -134,4 +151,4 @@ function _page($$renderer, $$props) {
|
|
|
134
151
|
}
|
|
135
152
|
|
|
136
153
|
export { _page as default };
|
|
137
|
-
//# sourceMappingURL=_page.svelte-
|
|
154
|
+
//# sourceMappingURL=_page.svelte-vwYD3-TB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_page.svelte-vwYD3-TB.js","sources":["../../../.svelte-kit/adapter-node/entries/pages/_page.svelte.js"],"sourcesContent":["import { h as head, e as escape_html, d as derived, f as ensure_array_like } from \"../../chunks/index.js\";\nimport { g as goto } from \"../../chunks/client.js\";\nimport { E as EmptyState, c as clearCache } from \"../../chunks/EmptyState.js\";\nimport { I as Icon } from \"../../chunks/Icon.js\";\nimport \"../../chunks/markdown.js\";\nimport { o as onDestroy } from \"../../chunks/index-server.js\";\nimport { B as Button } from \"../../chunks/Button.js\";\n/* empty css */\nimport { S as Shimmer } from \"../../chunks/Shimmer.js\";\nimport { S as SvelteMap, a as SvelteSet } from \"../../chunks/index-server2.js\";\nconst ACTIVE_THRESHOLD_MS = 3e4;\nlet sessions = [];\nconst summarizers = new SvelteMap();\nconst sessionSockets = new SvelteMap();\nconst pendingSessionSockets = new SvelteSet();\nfunction disconnect() {\n for (const [, sock] of sessionSockets) {\n sock.onclose = null;\n sock.close();\n }\n sessionSockets.clear();\n pendingSessionSockets.clear();\n summarizers.clear();\n}\nfunction getCards() {\n const now = Date.now();\n return sortSessions(sessions).map((s) => {\n const createdMs = Date.parse(s.createdAt);\n const lastEventTs = s.events.length > 0 ? Date.parse(s.events[s.events.length - 1].timestamp) : 0;\n return {\n ...s,\n duration: now - createdMs,\n goal: s.goal,\n // Ensure goal is mapped\n isActive: lastEventTs > 0 && now - lastEventTs < ACTIVE_THRESHOLD_MS,\n isSummarizing: s.isSummarizing,\n // Ensure isSummarizing is mapped\n summary: s.summary\n // Ensure summary is mapped\n };\n });\n}\nfunction sortSessions(list) {\n return [...list].sort((a, b) => {\n const order = { error: 2, exited: 3, idle: 1, running: 0 };\n const rankA = order[a.status];\n const rankB = order[b.status];\n if (rankA !== rankB) {\n return rankA - rankB;\n }\n if (a.status !== \"exited\" && b.status !== \"exited\") {\n return b.createdAt.localeCompare(a.createdAt);\n }\n const exitA = a.exitedAt ?? a.createdAt;\n const exitB = b.exitedAt ?? b.createdAt;\n return exitB.localeCompare(exitA);\n });\n}\nfunction _page($$renderer, $$props) {\n $$renderer.component(($$renderer2) => {\n let projects = [];\n let loading = false;\n const cards = derived(getCards);\n onDestroy(() => {\n disconnect();\n });\n async function fetchSessions(append = false, bustCache = false) {\n {\n return;\n }\n }\n async function forceRefresh() {\n loading = true;\n clearCache(\"shooter_projects\");\n await fetchSessions(false, true);\n }\n function navigateToConfig() {\n void goto();\n }\n function totalSessionCount() {\n return projects.reduce((sum, p) => sum + p.sessionCount, 0);\n }\n head(\"1uha8ag\", $$renderer2, ($$renderer3) => {\n $$renderer3.title(($$renderer4) => {\n $$renderer4.push(`<title>Dashboard - Shooter</title>`);\n });\n $$renderer3.push(`<meta name=\"description\" content=\"Active terminals and Claude Code sessions\"/>`);\n });\n $$renderer2.push(`<main class=\"main\"><div class=\"page-header svelte-1uha8ag\"><div class=\"page-header-content svelte-1uha8ag\"><div><h1 class=\"page-title svelte-1uha8ag\">Dashboard</h1> <p class=\"page-description svelte-1uha8ag\">Active terminals and Claude Code sessions</p></div> <div class=\"page-actions svelte-1uha8ag\">`);\n Button($$renderer2, {\n classes: \"btn-secondary\",\n onclick: forceRefresh,\n disabled: loading,\n children: ($$renderer3) => {\n Icon($$renderer3, { name: \"refresh\", size: 14 });\n $$renderer3.push(`<!----> Refresh`);\n },\n $$slots: { default: true }\n });\n $$renderer2.push(`<!----></div></div> `);\n if (projects.length > 0) {\n $$renderer2.push(\"<!--[0-->\");\n $$renderer2.push(`<div class=\"stats-bar svelte-1uha8ag\"><div class=\"stat-chip svelte-1uha8ag\"><span class=\"stat-value svelte-1uha8ag\">${escape_html(projects.length)}</span> <span class=\"stat-label svelte-1uha8ag\">${escape_html(projects.length === 1 ? \"project\" : \"projects\")}</span></div> <div class=\"stat-chip svelte-1uha8ag\"><span class=\"stat-value svelte-1uha8ag\">${escape_html(totalSessionCount())}</span> <span class=\"stat-label svelte-1uha8ag\">${escape_html(totalSessionCount() === 1 ? \"session\" : \"sessions\")}</span></div> `);\n if (cards().length > 0) {\n $$renderer2.push(\"<!--[0-->\");\n $$renderer2.push(`<div class=\"stat-chip stat-chip-active svelte-1uha8ag\"><span class=\"stat-value svelte-1uha8ag\">${escape_html(cards().length)}</span> <span class=\"stat-label svelte-1uha8ag\">active</span></div>`);\n } else {\n $$renderer2.push(\"<!--[-1-->\");\n }\n $$renderer2.push(`<!--]--></div>`);\n } else {\n $$renderer2.push(\"<!--[-1-->\");\n }\n $$renderer2.push(`<!--]--></div> `);\n {\n $$renderer2.push(\"<!--[-1-->\");\n }\n $$renderer2.push(`<!--]--> `);\n if (loading && projects.length === 0 && cards().length === 0) {\n $$renderer2.push(\"<!--[0-->\");\n $$renderer2.push(`<div class=\"loading-container\"><!--[-->`);\n const each_array = ensure_array_like(Array(3));\n for (let i = 0, $$length = each_array.length; i < $$length; i++) {\n each_array[i];\n Shimmer($$renderer2, { classes: \"shimmer-card\" });\n }\n $$renderer2.push(`<!--]--></div>`);\n } else {\n $$renderer2.push(\"<!--[1-->\");\n EmptyState($$renderer2, {\n icon: \"settings\",\n title: \"Configuration Required\",\n description: \"Set up your API credentials to start tracking sessions\",\n children: ($$renderer3) => {\n Button($$renderer3, {\n classes: \"btn-primary\",\n onclick: navigateToConfig,\n text: \"Configure Settings\"\n });\n }\n });\n }\n $$renderer2.push(`<!--]--></main>`);\n });\n}\nexport {\n _page as default\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -257,14 +257,23 @@ function getSessionConversation(sessionId, offset = 0, limit = 100, projectId) {
|
|
|
257
257
|
});
|
|
258
258
|
}
|
|
259
259
|
}
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
260
|
+
const seenIds = /* @__PURE__ */ new Set();
|
|
261
|
+
const deduped = [];
|
|
262
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
263
|
+
if (!seenIds.has(messages[i].id)) {
|
|
264
|
+
seenIds.add(messages[i].id);
|
|
265
|
+
deduped.push(messages[i]);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
deduped.reverse();
|
|
269
|
+
if (offset === 0 && deduped.length > limit) {
|
|
270
|
+
let startIdx = deduped.length - limit;
|
|
271
|
+
while (startIdx > 0 && startIdx < deduped.length && deduped[startIdx].role !== "user") {
|
|
263
272
|
startIdx--;
|
|
264
273
|
}
|
|
265
|
-
return
|
|
274
|
+
return deduped.slice(startIdx);
|
|
266
275
|
}
|
|
267
|
-
return
|
|
276
|
+
return deduped.slice(offset, offset + limit);
|
|
268
277
|
} catch (error) {
|
|
269
278
|
console.error("[sessions] Failed to parse session JSONL:", error);
|
|
270
279
|
return [];
|
|
@@ -295,7 +304,7 @@ function listProjectsWithSessions() {
|
|
|
295
304
|
continue;
|
|
296
305
|
}
|
|
297
306
|
sessions.sort((a, b) => new Date(b.modified).getTime() - new Date(a.modified).getTime());
|
|
298
|
-
const realPath = sessions.find((s) => s.projectPath && !s.projectPath.includes(".claude/projects"))?.projectPath || readCwdFromProjectDir(projectDir, sessions) || (dir.startsWith("-") ? dir.replace(/-/g, "/") : `/${dir.replace(/-/g, "/")}`);
|
|
307
|
+
const realPath = sessions.find((s) => s.projectPath && !s.projectPath.includes(".claude/projects"))?.projectPath || readCwdFromProjectDir(projectDir, sessions) || decodeClaudeProjectDir(dir) || (dir.startsWith("-") ? dir.replace(/-/g, "/") : `/${dir.replace(/-/g, "/")}`);
|
|
299
308
|
const pathSegments = realPath.split("/").filter(Boolean);
|
|
300
309
|
const projectName = pathSegments.slice(-2).join("/");
|
|
301
310
|
projects.push({
|
|
@@ -311,6 +320,9 @@ function listProjectsWithSessions() {
|
|
|
311
320
|
(a, b) => new Date(b.lastModified).getTime() - new Date(a.lastModified).getTime()
|
|
312
321
|
);
|
|
313
322
|
}
|
|
323
|
+
function bytesReadEnded(chunk) {
|
|
324
|
+
return chunk.length > 0 && chunk.charCodeAt(chunk.length - 1) === 10;
|
|
325
|
+
}
|
|
314
326
|
function cleanTitle(prompt) {
|
|
315
327
|
let cleaned = prompt.replace(/<command-message>.*?<\/command-message>/gs, "").replace(/<command-name>.*?<\/command-name>/gs, "").replace(/<command-args>.*?<\/command-args>/gs, "").replace(/<local-command-caveat>.*?<\/local-command-caveat>/gs, "").replace(/<local-command-stdout>.*?<\/local-command-stdout>/gs, "").replace(/<system-reminder>.*?<\/system-reminder>/gs, "").replace(/<task-notification>.*?<\/task-notification>/gs, "");
|
|
316
328
|
let prev = "";
|
|
@@ -331,6 +343,37 @@ function cleanTitle(prompt) {
|
|
|
331
343
|
}
|
|
332
344
|
return firstLine;
|
|
333
345
|
}
|
|
346
|
+
function decodeClaudeProjectDir(encoded) {
|
|
347
|
+
if (!encoded.startsWith("-")) {
|
|
348
|
+
return null;
|
|
349
|
+
}
|
|
350
|
+
const parts = encoded.slice(1).split("-");
|
|
351
|
+
if (parts.length === 0) {
|
|
352
|
+
return null;
|
|
353
|
+
}
|
|
354
|
+
let currentPath = "/";
|
|
355
|
+
let i = 0;
|
|
356
|
+
while (i < parts.length) {
|
|
357
|
+
let matchedTo = -1;
|
|
358
|
+
for (let j = parts.length; j > i; j--) {
|
|
359
|
+
const segment = parts.slice(i, j).join("-");
|
|
360
|
+
const candidate = path.join(currentPath, segment);
|
|
361
|
+
try {
|
|
362
|
+
if (fs.statSync(candidate).isDirectory()) {
|
|
363
|
+
matchedTo = j;
|
|
364
|
+
break;
|
|
365
|
+
}
|
|
366
|
+
} catch {
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
if (matchedTo === -1) {
|
|
370
|
+
return null;
|
|
371
|
+
}
|
|
372
|
+
currentPath = path.join(currentPath, parts.slice(i, matchedTo).join("-"));
|
|
373
|
+
i = matchedTo;
|
|
374
|
+
}
|
|
375
|
+
return currentPath;
|
|
376
|
+
}
|
|
334
377
|
function getProjectDir() {
|
|
335
378
|
const projectPath = process.cwd();
|
|
336
379
|
const encoded = projectPath.replace(/\//g, "-");
|
|
@@ -338,86 +381,91 @@ function getProjectDir() {
|
|
|
338
381
|
}
|
|
339
382
|
function listSessionsForProject(projectDir) {
|
|
340
383
|
const indexPath = path.join(projectDir, "sessions-index.json");
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
const raw = fs.readFileSync(indexPath, "utf-8");
|
|
346
|
-
const index = JSON.parse(raw);
|
|
347
|
-
const indexedIds = /* @__PURE__ */ new Set();
|
|
348
|
-
const sessions = index.entries.filter((e) => !e.isSidechain).filter((e) => {
|
|
349
|
-
const jsonlFile = path.join(projectDir, `${e.sessionId}.jsonl`);
|
|
350
|
-
return fs.existsSync(jsonlFile);
|
|
351
|
-
}).map((entry) => {
|
|
352
|
-
indexedIds.add(entry.sessionId);
|
|
353
|
-
return {
|
|
354
|
-
created: entry.created || "",
|
|
355
|
-
gitBranch: entry.gitBranch || "",
|
|
356
|
-
id: entry.sessionId,
|
|
357
|
-
messageCount: entry.messageCount || 0,
|
|
358
|
-
modified: entry.modified || "",
|
|
359
|
-
projectPath: entry.projectPath || "",
|
|
360
|
-
source: "claude-code",
|
|
361
|
-
summary: entry.summary || "",
|
|
362
|
-
title: cleanTitle(entry.firstPrompt || entry.summary || "Untitled Session")
|
|
363
|
-
};
|
|
364
|
-
});
|
|
384
|
+
const hasIndex = fs.existsSync(indexPath);
|
|
385
|
+
const indexedIds = /* @__PURE__ */ new Set();
|
|
386
|
+
const sessions = [];
|
|
387
|
+
if (hasIndex) {
|
|
365
388
|
try {
|
|
366
|
-
const
|
|
367
|
-
|
|
368
|
-
|
|
389
|
+
const raw = fs.readFileSync(indexPath, "utf-8");
|
|
390
|
+
const index = JSON.parse(raw);
|
|
391
|
+
for (const entry of index.entries) {
|
|
392
|
+
if (entry.isSidechain) {
|
|
369
393
|
continue;
|
|
370
394
|
}
|
|
371
|
-
const
|
|
372
|
-
if (
|
|
395
|
+
const jsonlFile = path.join(projectDir, `${entry.sessionId}.jsonl`);
|
|
396
|
+
if (!fs.existsSync(jsonlFile)) {
|
|
373
397
|
continue;
|
|
374
398
|
}
|
|
375
|
-
|
|
376
|
-
const stat = fs.statSync(filePath);
|
|
377
|
-
let firstPrompt = "Active Session";
|
|
378
|
-
let messageCount = 0;
|
|
379
|
-
try {
|
|
380
|
-
const content = fs.readFileSync(filePath, "utf-8");
|
|
381
|
-
let countPos = 0;
|
|
382
|
-
while (countPos < content.length) {
|
|
383
|
-
const nl = content.indexOf("\n", countPos);
|
|
384
|
-
const lineEnd = nl === -1 ? content.length : nl;
|
|
385
|
-
const line = content.substring(countPos, lineEnd);
|
|
386
|
-
if (line.includes('"type":"user"') || line.includes('"type":"assistant"')) {
|
|
387
|
-
messageCount++;
|
|
388
|
-
}
|
|
389
|
-
if (nl === -1) {
|
|
390
|
-
break;
|
|
391
|
-
}
|
|
392
|
-
countPos = nl + 1;
|
|
393
|
-
}
|
|
394
|
-
const prompt = findFirstUserPrompt(content);
|
|
395
|
-
if (prompt) {
|
|
396
|
-
firstPrompt = prompt;
|
|
397
|
-
}
|
|
398
|
-
} catch {
|
|
399
|
-
}
|
|
399
|
+
indexedIds.add(entry.sessionId);
|
|
400
400
|
sessions.push({
|
|
401
|
-
created:
|
|
402
|
-
gitBranch: "",
|
|
403
|
-
id: sessionId,
|
|
404
|
-
messageCount,
|
|
405
|
-
modified:
|
|
406
|
-
projectPath: "",
|
|
401
|
+
created: entry.created || "",
|
|
402
|
+
gitBranch: entry.gitBranch || "",
|
|
403
|
+
id: entry.sessionId,
|
|
404
|
+
messageCount: entry.messageCount || 0,
|
|
405
|
+
modified: entry.modified || "",
|
|
406
|
+
projectPath: entry.projectPath || "",
|
|
407
407
|
source: "claude-code",
|
|
408
|
-
summary: "",
|
|
409
|
-
title: cleanTitle(firstPrompt)
|
|
408
|
+
summary: entry.summary || "",
|
|
409
|
+
title: cleanTitle(entry.firstPrompt || entry.summary || "Untitled Session")
|
|
410
410
|
});
|
|
411
411
|
}
|
|
412
|
-
} catch {
|
|
412
|
+
} catch (error) {
|
|
413
|
+
console.error("[sessions] Failed to read sessions index:", error);
|
|
413
414
|
}
|
|
414
|
-
return sessions.sort((a, b) => new Date(b.modified).getTime() - new Date(a.modified).getTime());
|
|
415
|
-
} catch (error) {
|
|
416
|
-
console.error("[sessions] Failed to read sessions index:", error);
|
|
417
|
-
return [];
|
|
418
415
|
}
|
|
416
|
+
try {
|
|
417
|
+
const files = fs.readdirSync(projectDir);
|
|
418
|
+
for (const file of files) {
|
|
419
|
+
if (!file.endsWith(".jsonl")) {
|
|
420
|
+
continue;
|
|
421
|
+
}
|
|
422
|
+
const sessionId = file.replace(".jsonl", "");
|
|
423
|
+
if (indexedIds.has(sessionId)) {
|
|
424
|
+
continue;
|
|
425
|
+
}
|
|
426
|
+
const filePath = path.join(projectDir, file);
|
|
427
|
+
const stat = fs.statSync(filePath);
|
|
428
|
+
let firstPrompt = "Active Session";
|
|
429
|
+
let messageCount = 0;
|
|
430
|
+
try {
|
|
431
|
+
const content = fs.readFileSync(filePath, "utf-8");
|
|
432
|
+
let countPos = 0;
|
|
433
|
+
while (countPos < content.length) {
|
|
434
|
+
const nl = content.indexOf("\n", countPos);
|
|
435
|
+
const lineEnd = nl === -1 ? content.length : nl;
|
|
436
|
+
const line = content.substring(countPos, lineEnd);
|
|
437
|
+
if (line.includes('"type":"user"') || line.includes('"type":"assistant"')) {
|
|
438
|
+
messageCount++;
|
|
439
|
+
}
|
|
440
|
+
if (nl === -1) {
|
|
441
|
+
break;
|
|
442
|
+
}
|
|
443
|
+
countPos = nl + 1;
|
|
444
|
+
}
|
|
445
|
+
const prompt = findFirstUserPrompt(content);
|
|
446
|
+
if (prompt) {
|
|
447
|
+
firstPrompt = prompt;
|
|
448
|
+
}
|
|
449
|
+
} catch {
|
|
450
|
+
}
|
|
451
|
+
sessions.push({
|
|
452
|
+
created: stat.birthtime.toISOString(),
|
|
453
|
+
gitBranch: "",
|
|
454
|
+
id: sessionId,
|
|
455
|
+
messageCount,
|
|
456
|
+
modified: stat.mtime.toISOString(),
|
|
457
|
+
projectPath: "",
|
|
458
|
+
source: "claude-code",
|
|
459
|
+
summary: "",
|
|
460
|
+
title: cleanTitle(firstPrompt)
|
|
461
|
+
});
|
|
462
|
+
}
|
|
463
|
+
} catch {
|
|
464
|
+
}
|
|
465
|
+
return sessions.sort((a, b) => new Date(b.modified).getTime() - new Date(a.modified).getTime());
|
|
419
466
|
}
|
|
420
467
|
function readCwdFromProjectDir(projectDir, sessions) {
|
|
468
|
+
const READ_BYTES = 65536;
|
|
421
469
|
for (const session of sessions) {
|
|
422
470
|
try {
|
|
423
471
|
const filePath = path.join(projectDir, `${session.id}.jsonl`);
|
|
@@ -425,24 +473,27 @@ function readCwdFromProjectDir(projectDir, sessions) {
|
|
|
425
473
|
continue;
|
|
426
474
|
}
|
|
427
475
|
const fd = fs.openSync(filePath, "r");
|
|
428
|
-
let
|
|
476
|
+
let chunk;
|
|
429
477
|
try {
|
|
430
|
-
const buf = Buffer.alloc(
|
|
431
|
-
const bytesRead = fs.readSync(fd, buf, 0,
|
|
432
|
-
|
|
478
|
+
const buf = Buffer.alloc(READ_BYTES);
|
|
479
|
+
const bytesRead = fs.readSync(fd, buf, 0, READ_BYTES, 0);
|
|
480
|
+
chunk = buf.toString("utf-8", 0, bytesRead);
|
|
433
481
|
} finally {
|
|
434
482
|
fs.closeSync(fd);
|
|
435
483
|
}
|
|
436
|
-
const
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
484
|
+
const lines = chunk.split("\n");
|
|
485
|
+
const completeLines = bytesReadEnded(chunk) ? lines : lines.slice(0, -1);
|
|
486
|
+
for (const line of completeLines) {
|
|
487
|
+
if (!line.trim()) {
|
|
488
|
+
continue;
|
|
489
|
+
}
|
|
490
|
+
try {
|
|
491
|
+
const entry = JSON.parse(line);
|
|
492
|
+
if (typeof entry.cwd === "string" && entry.cwd) {
|
|
493
|
+
return entry.cwd;
|
|
494
|
+
}
|
|
495
|
+
} catch {
|
|
444
496
|
}
|
|
445
|
-
} catch {
|
|
446
497
|
}
|
|
447
498
|
} catch {
|
|
448
499
|
}
|
|
@@ -722,4 +773,4 @@ const GET = ({ request, url }) => {
|
|
|
722
773
|
};
|
|
723
774
|
|
|
724
775
|
export { GET };
|
|
725
|
-
//# sourceMappingURL=_server.ts-
|
|
776
|
+
//# sourceMappingURL=_server.ts-BQarRaho.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_server.ts-BQarRaho.js","sources":["../../../.svelte-kit/adapter-node/entries/endpoints/api/sessions/_server.ts.js"],"sourcesContent":["import { v as validateAuth } from \"../../../../chunks/auth.js\";\nimport * as crypto from \"crypto\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport Database from \"better-sqlite3\";\nimport { r as resolveOpenCodeDbPath } from \"../../../../chunks/opencode-db-path.js\";\nimport { json } from \"@sveltejs/kit\";\nfunction extractToolResultText(content) {\n if (typeof content === \"string\") {\n return content;\n }\n if (Array.isArray(content)) {\n return content.filter((c) => isRecord(c) && c.type === \"text\").map((c) => {\n const text = c.text;\n return typeof text === \"string\" ? text : \"\";\n }).join(\"\\n\");\n }\n return \"\";\n}\nfunction isRecord(value) {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\nfunction str(obj, key) {\n const v = obj[key];\n return typeof v === \"string\" ? v : \"\";\n}\nfunction toContentBlocks(raw) {\n if (Array.isArray(raw)) {\n return raw.filter((item) => isRecord(item));\n }\n if (isRecord(raw)) {\n return [raw];\n }\n return [];\n}\nconst SKIP_EVENT_TYPES = /* @__PURE__ */ new Set([\n \"config\",\n \"heartbeat\",\n \"metadata\",\n \"result\",\n \"summary\",\n \"system\"\n]);\nfunction parseAssistantBlock(block) {\n if (!block || typeof block !== \"object\") {\n return null;\n }\n switch (block.type) {\n case \"text\":\n return { content: block.text || \"\", type: \"text\" };\n case \"thinking\":\n return { content: block.thinking || \"\", type: \"thinking\" };\n case \"tool_use\":\n return {\n id: block.id || \"\",\n input: block.input || {},\n toolName: block.name || \"Unknown\",\n type: \"tool_use\"\n };\n default:\n return null;\n }\n}\nfunction parseJsonlLine(line, assistantTurns, messageIndex) {\n const messages = [];\n const assistantCompleted = [];\n const entry = JSON.parse(line);\n if (!isRecord(entry)) {\n return { assistantCompleted, messages };\n }\n const entryType = str(entry, \"type\");\n if (SKIP_EVENT_TYPES.has(entryType)) {\n return { assistantCompleted, messages };\n }\n const entryTimestamp = str(entry, \"timestamp\");\n const entryUuid = str(entry, \"uuid\");\n if (entryType === \"user\") {\n const msg = isRecord(entry.message) ? entry.message : null;\n if (!msg?.content) {\n return { assistantCompleted, messages };\n }\n const parts = [];\n const blocks = toContentBlocks(msg.content);\n if (Array.isArray(msg.content)) {\n for (const item of msg.content) {\n if (typeof item === \"string\") {\n parts.push({ content: item, type: \"text\" });\n }\n }\n } else if (typeof msg.content === \"string\") {\n parts.push({ content: msg.content, type: \"text\" });\n }\n for (const block of blocks) {\n const blockType = str(block, \"type\");\n if (!blockType) {\n continue;\n }\n if (blockType === \"text\") {\n parts.push({ content: str(block, \"text\"), type: \"text\" });\n } else if (blockType === \"tool_result\") {\n let output = extractToolResultText(block.content);\n const toolUseResult = isRecord(entry.toolUseResult) ? entry.toolUseResult : null;\n if (toolUseResult?.content !== void 0) {\n output = extractToolResultText(toolUseResult.content);\n }\n parts.push({\n isError: typeof block.is_error === \"boolean\" ? block.is_error : false,\n output: output.slice(0, 2e3),\n toolUseId: str(block, \"tool_use_id\"),\n type: \"tool_result\"\n });\n }\n }\n if (parts.length > 0 && parts.some((p) => p.type === \"text\")) {\n messages.push({\n id: entryUuid || `user-${messageIndex}`,\n parts: parts.filter((p) => p.type === \"text\"),\n role: \"user\",\n timestamp: entryTimestamp\n });\n }\n const toolResults = parts.filter((p) => p.type === \"tool_result\");\n if (toolResults.length > 0) {\n messages.push({\n id: `tool-result-${entryUuid || messageIndex}`,\n parts: toolResults,\n role: \"system\",\n timestamp: entryTimestamp\n });\n }\n } else if (entryType === \"assistant\") {\n const msg = isRecord(entry.message) ? entry.message : null;\n if (!msg?.content) {\n return { assistantCompleted, messages };\n }\n const blocks = toContentBlocks(msg.content);\n const msgId = str(msg, \"id\") || entryUuid;\n for (const block of blocks) {\n const part = parseAssistantBlock(block);\n if (!part) {\n continue;\n }\n if (!assistantTurns.has(msgId)) {\n assistantTurns.set(msgId, { parts: [], timestamp: entryTimestamp });\n }\n const turn = assistantTurns.get(msgId);\n if (turn) {\n turn.parts.push(part);\n }\n }\n if (msg.stop_reason) {\n const turn = assistantTurns.get(msgId);\n if (turn && turn.parts.length > 0) {\n assistantCompleted.push({\n id: msgId,\n parts: turn.parts,\n role: \"assistant\",\n timestamp: turn.timestamp\n });\n assistantTurns.delete(msgId);\n }\n }\n }\n return { assistantCompleted, messages };\n}\nfunction parseJsonlText(text, assistantTurns, startIndex) {\n const lines = text.split(\"\\n\").filter((line) => line.trim());\n const allMessages = [];\n let idx = startIndex;\n for (const line of lines) {\n try {\n const { assistantCompleted, messages } = parseJsonlLine(line, assistantTurns, idx);\n allMessages.push(...messages, ...assistantCompleted);\n idx++;\n } catch {\n }\n }\n return allMessages;\n}\nconst SYSTEM_TAG_PREFIXES = [\n \"<local-command\",\n \"<command-name>\",\n \"<command-message>\",\n \"<command-args>\",\n \"<local-command-stdout>\",\n \"<local-command-caveat>\",\n \"<system-reminder>\",\n \"<task-notification>\"\n];\nfunction extractContentText(content) {\n if (typeof content === \"string\") {\n return content.trim();\n }\n if (Array.isArray(content)) {\n for (const b of content) {\n if (typeof b === \"string\" && b.trim()) {\n return b.trim();\n }\n if (typeof b === \"object\" && b !== null) {\n const block = b;\n if (block.type === \"text\" && typeof block.text === \"string\" && block.text.trim()) {\n return block.text.trim();\n }\n }\n }\n }\n return \"\";\n}\nfunction findFirstUserPrompt(content) {\n for (const line of content.split(\"\\n\")) {\n if (!line.trim()) {\n continue;\n }\n try {\n const entry = JSON.parse(line);\n if (entry.type !== \"user\") {\n continue;\n }\n const msg = entry.message;\n if (!msg?.content) {\n continue;\n }\n const text = extractContentText(msg.content);\n if (!text || SYSTEM_TAG_PREFIXES.some((p) => text.startsWith(p))) {\n continue;\n }\n return text;\n } catch {\n continue;\n }\n }\n return \"\";\n}\nfunction shortHash$1(input) {\n return crypto.createHash(\"sha256\").update(input).digest(\"hex\").slice(0, 8);\n}\nconst CLAUDE_PROJECTS_DIR = path.join(process.env.HOME || \"\", \".claude\", \"projects\");\nfunction getSessionConversation(sessionId, offset = 0, limit = 100, projectId) {\n const projectDir = projectId ? path.join(CLAUDE_PROJECTS_DIR, projectId) : getProjectDir();\n const jsonlPath = path.join(projectDir, `${sessionId}.jsonl`);\n if (!fs.existsSync(jsonlPath)) {\n return [];\n }\n try {\n const raw = fs.readFileSync(jsonlPath, \"utf-8\");\n const assistantTurns = /* @__PURE__ */ new Map();\n const messages = parseJsonlText(raw, assistantTurns, 0);\n for (const [msgId, turn] of assistantTurns) {\n if (turn.parts.length > 0) {\n messages.push({\n id: msgId,\n parts: turn.parts,\n role: \"assistant\",\n timestamp: turn.timestamp\n });\n }\n }\n const seenIds = /* @__PURE__ */ new Set();\n const deduped = [];\n for (let i = messages.length - 1; i >= 0; i--) {\n if (!seenIds.has(messages[i].id)) {\n seenIds.add(messages[i].id);\n deduped.push(messages[i]);\n }\n }\n deduped.reverse();\n if (offset === 0 && deduped.length > limit) {\n let startIdx = deduped.length - limit;\n while (startIdx > 0 && startIdx < deduped.length && deduped[startIdx].role !== \"user\") {\n startIdx--;\n }\n return deduped.slice(startIdx);\n }\n return deduped.slice(offset, offset + limit);\n } catch (error) {\n console.error(\"[sessions] Failed to parse session JSONL:\", error);\n return [];\n }\n}\nfunction listProjectsWithSessions() {\n if (!fs.existsSync(CLAUDE_PROJECTS_DIR)) {\n return [];\n }\n let projectDirs;\n try {\n projectDirs = fs.readdirSync(CLAUDE_PROJECTS_DIR).filter((d) => {\n const fullPath = path.join(CLAUDE_PROJECTS_DIR, d);\n try {\n return fs.statSync(fullPath).isDirectory();\n } catch {\n return false;\n }\n });\n } catch {\n return [];\n }\n const projects = [];\n for (const dir of projectDirs) {\n const projectDir = path.join(CLAUDE_PROJECTS_DIR, dir);\n const sessions = listSessionsForProject(projectDir);\n if (sessions.length === 0) {\n continue;\n }\n sessions.sort((a, b) => new Date(b.modified).getTime() - new Date(a.modified).getTime());\n const realPath = sessions.find((s) => s.projectPath && !s.projectPath.includes(\".claude/projects\"))?.projectPath || readCwdFromProjectDir(projectDir, sessions) || decodeClaudeProjectDir(dir) || (dir.startsWith(\"-\") ? dir.replace(/-/g, \"/\") : `/${dir.replace(/-/g, \"/\")}`);\n const pathSegments = realPath.split(\"/\").filter(Boolean);\n const projectName = pathSegments.slice(-2).join(\"/\");\n projects.push({\n fullPath: realPath,\n id: shortHash$1(realPath),\n lastModified: sessions[0]?.modified || \"\",\n name: projectName,\n sessionCount: sessions.length,\n sessions\n });\n }\n return projects.sort(\n (a, b) => new Date(b.lastModified).getTime() - new Date(a.lastModified).getTime()\n );\n}\nfunction bytesReadEnded(chunk) {\n return chunk.length > 0 && chunk.charCodeAt(chunk.length - 1) === 10;\n}\nfunction cleanTitle(prompt) {\n let cleaned = prompt.replace(/<command-message>.*?<\\/command-message>/gs, \"\").replace(/<command-name>.*?<\\/command-name>/gs, \"\").replace(/<command-args>.*?<\\/command-args>/gs, \"\").replace(/<local-command-caveat>.*?<\\/local-command-caveat>/gs, \"\").replace(/<local-command-stdout>.*?<\\/local-command-stdout>/gs, \"\").replace(/<system-reminder>.*?<\\/system-reminder>/gs, \"\").replace(/<task-notification>.*?<\\/task-notification>/gs, \"\");\n let prev = \"\";\n while (prev !== cleaned) {\n prev = cleaned;\n cleaned = cleaned.replace(/<[^>]*>/g, \"\").replace(/</g, \"\");\n }\n cleaned = cleaned.trim();\n if (!cleaned) {\n return \"Untitled Session\";\n }\n const firstLine = cleaned.split(\"\\n\")[0].trim();\n if (!firstLine) {\n return \"Untitled Session\";\n }\n if (firstLine.length > 80) {\n return `${firstLine.slice(0, 77)}...`;\n }\n return firstLine;\n}\nfunction decodeClaudeProjectDir(encoded) {\n if (!encoded.startsWith(\"-\")) {\n return null;\n }\n const parts = encoded.slice(1).split(\"-\");\n if (parts.length === 0) {\n return null;\n }\n let currentPath = \"/\";\n let i = 0;\n while (i < parts.length) {\n let matchedTo = -1;\n for (let j = parts.length; j > i; j--) {\n const segment = parts.slice(i, j).join(\"-\");\n const candidate = path.join(currentPath, segment);\n try {\n if (fs.statSync(candidate).isDirectory()) {\n matchedTo = j;\n break;\n }\n } catch {\n }\n }\n if (matchedTo === -1) {\n return null;\n }\n currentPath = path.join(currentPath, parts.slice(i, matchedTo).join(\"-\"));\n i = matchedTo;\n }\n return currentPath;\n}\nfunction getProjectDir() {\n const projectPath = process.cwd();\n const encoded = projectPath.replace(/\\//g, \"-\");\n return path.join(CLAUDE_PROJECTS_DIR, encoded);\n}\nfunction listSessionsForProject(projectDir) {\n const indexPath = path.join(projectDir, \"sessions-index.json\");\n const hasIndex = fs.existsSync(indexPath);\n const indexedIds = /* @__PURE__ */ new Set();\n const sessions = [];\n if (hasIndex) {\n try {\n const raw = fs.readFileSync(indexPath, \"utf-8\");\n const index = JSON.parse(raw);\n for (const entry of index.entries) {\n if (entry.isSidechain) {\n continue;\n }\n const jsonlFile = path.join(projectDir, `${entry.sessionId}.jsonl`);\n if (!fs.existsSync(jsonlFile)) {\n continue;\n }\n indexedIds.add(entry.sessionId);\n sessions.push({\n created: entry.created || \"\",\n gitBranch: entry.gitBranch || \"\",\n id: entry.sessionId,\n messageCount: entry.messageCount || 0,\n modified: entry.modified || \"\",\n projectPath: entry.projectPath || \"\",\n source: \"claude-code\",\n summary: entry.summary || \"\",\n title: cleanTitle(entry.firstPrompt || entry.summary || \"Untitled Session\")\n });\n }\n } catch (error) {\n console.error(\"[sessions] Failed to read sessions index:\", error);\n }\n }\n try {\n const files = fs.readdirSync(projectDir);\n for (const file of files) {\n if (!file.endsWith(\".jsonl\")) {\n continue;\n }\n const sessionId = file.replace(\".jsonl\", \"\");\n if (indexedIds.has(sessionId)) {\n continue;\n }\n const filePath = path.join(projectDir, file);\n const stat = fs.statSync(filePath);\n let firstPrompt = \"Active Session\";\n let messageCount = 0;\n try {\n const content = fs.readFileSync(filePath, \"utf-8\");\n let countPos = 0;\n while (countPos < content.length) {\n const nl = content.indexOf(\"\\n\", countPos);\n const lineEnd = nl === -1 ? content.length : nl;\n const line = content.substring(countPos, lineEnd);\n if (line.includes('\"type\":\"user\"') || line.includes('\"type\":\"assistant\"')) {\n messageCount++;\n }\n if (nl === -1) {\n break;\n }\n countPos = nl + 1;\n }\n const prompt = findFirstUserPrompt(content);\n if (prompt) {\n firstPrompt = prompt;\n }\n } catch {\n }\n sessions.push({\n created: stat.birthtime.toISOString(),\n gitBranch: \"\",\n id: sessionId,\n messageCount,\n modified: stat.mtime.toISOString(),\n projectPath: \"\",\n source: \"claude-code\",\n summary: \"\",\n title: cleanTitle(firstPrompt)\n });\n }\n } catch {\n }\n return sessions.sort((a, b) => new Date(b.modified).getTime() - new Date(a.modified).getTime());\n}\nfunction readCwdFromProjectDir(projectDir, sessions) {\n const READ_BYTES = 65536;\n for (const session of sessions) {\n try {\n const filePath = path.join(projectDir, `${session.id}.jsonl`);\n if (!fs.existsSync(filePath)) {\n continue;\n }\n const fd = fs.openSync(filePath, \"r\");\n let chunk;\n try {\n const buf = Buffer.alloc(READ_BYTES);\n const bytesRead = fs.readSync(fd, buf, 0, READ_BYTES, 0);\n chunk = buf.toString(\"utf-8\", 0, bytesRead);\n } finally {\n fs.closeSync(fd);\n }\n const lines = chunk.split(\"\\n\");\n const completeLines = bytesReadEnded(chunk) ? lines : lines.slice(0, -1);\n for (const line of completeLines) {\n if (!line.trim()) {\n continue;\n }\n try {\n const entry = JSON.parse(line);\n if (typeof entry.cwd === \"string\" && entry.cwd) {\n return entry.cwd;\n }\n } catch {\n }\n }\n } catch {\n }\n }\n return \"\";\n}\nfunction shortHash(input) {\n return crypto.createHash(\"sha256\").update(input).digest(\"hex\").slice(0, 8);\n}\nconst OPENCODE_DB_PATH = resolveOpenCodeDbPath();\nfunction getOpenCodeConversation(sessionId, offset = 0, limit = 200) {\n const db = getDb();\n if (!db) {\n return [];\n }\n try {\n const messages = db.prepare(\n `\n SELECT id, session_id, time_created, data FROM (\n SELECT id, session_id, time_created, data\n FROM message\n WHERE session_id = ?\n ORDER BY time_created DESC\n LIMIT ? OFFSET ?\n ) ORDER BY time_created ASC\n `\n ).all(sessionId, limit, offset);\n const messageIds = messages.map((m) => m.id);\n if (messageIds.length === 0) {\n return [];\n }\n const placeholders = messageIds.map(() => \"?\").join(\",\");\n const parts = db.prepare(\n `\n SELECT id, message_id, time_created, data\n FROM part\n WHERE message_id IN (${placeholders})\n ORDER BY time_created ASC\n `\n ).all(...messageIds);\n const partsByMessage = /* @__PURE__ */ new Map();\n for (const part of parts) {\n if (!partsByMessage.has(part.message_id)) {\n partsByMessage.set(part.message_id, []);\n }\n const bucket = partsByMessage.get(part.message_id);\n if (bucket) {\n bucket.push(part);\n }\n }\n const result = [];\n for (const msg of messages) {\n let msgData = {};\n try {\n msgData = JSON.parse(msg.data);\n } catch {\n }\n const role = msgData.role === \"user\" ? \"user\" : \"assistant\";\n const msgParts = partsByMessage.get(msg.id) || [];\n const convertedParts = [];\n for (const part of msgParts) {\n let partData = {};\n try {\n partData = JSON.parse(part.data);\n } catch {\n continue;\n }\n const converted = convertOpenCodePart(partData);\n if (converted) {\n convertedParts.push(converted);\n }\n }\n if (convertedParts.length > 0) {\n result.push({\n id: msg.id,\n parts: convertedParts,\n role,\n timestamp: new Date(msg.time_created).toISOString()\n });\n }\n }\n return result;\n } catch (error) {\n console.error(\"[opencode] Failed to read conversation:\", error);\n return [];\n } finally {\n db.close();\n }\n}\nfunction listOpenCodeProjects() {\n const db = getDb();\n if (!db) {\n return [];\n }\n try {\n const sessions = db.prepare(\n `\n SELECT id, directory, title, slug, time_created, time_updated, parent_id\n FROM session\n WHERE time_archived IS NULL OR time_archived = 0\n ORDER BY time_updated DESC\n `\n ).all();\n const msgCounts = db.prepare(`SELECT session_id, COUNT(*) as count FROM message GROUP BY session_id`).all();\n const msgCountMap = new Map(msgCounts.map((r) => [r.session_id, r.count]));\n const projectMap = /* @__PURE__ */ new Map();\n for (const row of sessions) {\n const dir = row.directory || \"unknown\";\n if (!projectMap.has(dir)) {\n projectMap.set(dir, []);\n }\n const sessionInfo = {\n created: new Date(row.time_created).toISOString(),\n gitBranch: \"\",\n id: row.id,\n messageCount: msgCountMap.get(row.id) || 0,\n modified: new Date(row.time_updated).toISOString(),\n projectPath: dir,\n source: \"opencode\",\n summary: \"\",\n title: row.title || row.slug || \"Untitled Session\"\n };\n const bucket = projectMap.get(dir);\n if (bucket) {\n bucket.push(sessionInfo);\n }\n }\n const projects = [];\n for (const [dir, dirSessions] of projectMap) {\n const pathSegments = dir.split(\"/\").filter(Boolean);\n const projectName = pathSegments.slice(-2).join(\"/\");\n dirSessions.sort((a, b) => new Date(b.modified).getTime() - new Date(a.modified).getTime());\n projects.push({\n fullPath: dir,\n id: shortHash(dir),\n lastModified: dirSessions[0]?.modified || \"\",\n name: `${projectName} (OpenCode)`,\n sessionCount: dirSessions.length,\n sessions: dirSessions\n });\n }\n return projects.sort(\n (a, b) => new Date(b.lastModified).getTime() - new Date(a.lastModified).getTime()\n );\n } catch (error) {\n console.error(\"[opencode] Failed to read sessions:\", error);\n return [];\n } finally {\n db.close();\n }\n}\nfunction convertOpenCodePart(data) {\n const type = data.type;\n switch (type) {\n case \"reasoning\":\n return {\n content: data.text || \"\",\n type: \"thinking\"\n };\n case \"text\":\n return {\n content: data.text || \"\",\n type: \"text\"\n };\n case \"tool\": {\n const state = data.state;\n return {\n id: data.callID || data.id || \"\",\n input: state?.input || {},\n toolName: data.tool || \"Unknown\",\n type: \"tool_use\"\n };\n }\n default:\n return null;\n }\n}\nfunction getDb() {\n if (!fs.existsSync(OPENCODE_DB_PATH)) {\n return null;\n }\n try {\n return new Database(OPENCODE_DB_PATH, { readonly: true });\n } catch {\n return null;\n }\n}\nlet cachedProjects = null;\nlet cacheTimestamp = 0;\nconst CACHE_TTL_MS = 5e3;\nfunction getMergedProjects() {\n const now = Date.now();\n if (cachedProjects && now - cacheTimestamp < CACHE_TTL_MS) {\n return cachedProjects;\n }\n const claudeProjects = listProjectsWithSessions();\n const openCodeProjects = listOpenCodeProjects();\n const projectsByPath = /* @__PURE__ */ new Map();\n for (const p of claudeProjects) {\n projectsByPath.set(p.fullPath, { ...p });\n }\n for (const op of openCodeProjects) {\n const existing = projectsByPath.get(op.fullPath);\n if (existing) {\n existing.sessions.push(...op.sessions);\n existing.sessions.sort(\n (a, b) => new Date(b.modified).getTime() - new Date(a.modified).getTime()\n );\n existing.sessionCount = existing.sessions.length;\n existing.lastModified = existing.sessions[0]?.modified || existing.lastModified;\n existing.name = existing.name.replace(\" (OpenCode)\", \"\");\n } else {\n op.name = op.name.replace(\" (OpenCode)\", \"\");\n projectsByPath.set(op.fullPath, { ...op });\n }\n }\n cachedProjects = [...projectsByPath.values()].sort(\n (a, b) => new Date(b.lastModified).getTime() - new Date(a.lastModified).getTime()\n );\n cacheTimestamp = now;\n return cachedProjects;\n}\nconst GET = ({ request, url }) => {\n const authError = validateAuth(request);\n if (authError) {\n return authError;\n }\n if (url.searchParams.get(\"refresh\") === \"true\") {\n cachedProjects = null;\n cacheTimestamp = 0;\n }\n const sessionId = url.searchParams.get(\"id\");\n if (sessionId) {\n const projectId = url.searchParams.get(\"project\") || \"\";\n const rawOffset = parseInt(url.searchParams.get(\"offset\") || \"0\");\n const rawLimit = parseInt(url.searchParams.get(\"limit\") || \"200\");\n const offset2 = Number.isFinite(rawOffset) && rawOffset >= 0 ? rawOffset : 0;\n const limit2 = Number.isFinite(rawLimit) && rawLimit >= 1 ? Math.min(rawLimit, 500) : 200;\n const allProjects2 = getMergedProjects();\n const matchedProject = projectId ? allProjects2.find((p) => p.id === projectId) : void 0;\n const claudeProjectDir = matchedProject ? matchedProject.fullPath.replace(/\\//g, \"-\") : void 0;\n let messages = getSessionConversation(sessionId, offset2, limit2, claudeProjectDir);\n if (messages.length === 0) {\n messages = getOpenCodeConversation(sessionId, offset2, limit2);\n }\n let sessionInfo = null;\n for (const project of allProjects2) {\n if (projectId && project.id !== projectId) {\n continue;\n }\n const found = project.sessions.find((s) => s.id === sessionId);\n if (found) {\n sessionInfo = found;\n break;\n }\n }\n if (!sessionInfo) {\n return json({ error: \"Session not found\" }, { status: 404 });\n }\n return json({\n messages,\n session: sessionInfo,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n });\n }\n const allProjects = getMergedProjects();\n const limit = parseInt(url.searchParams.get(\"limit\") || \"0\");\n const offset = parseInt(url.searchParams.get(\"offset\") || \"0\");\n const total = allProjects.length;\n const paginatedProjects = limit > 0 ? allProjects.slice(offset, offset + limit) : allProjects;\n return json({\n count: allProjects.reduce((sum, p) => sum + p.sessionCount, 0),\n projects: paginatedProjects,\n timestamp: (/* @__PURE__ */ new Date()).toISOString(),\n total\n });\n};\nexport {\n GET\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,10 @@ import { v as validateAuth } from './auth-DuunT7Cg.js';
|
|
|
5
5
|
import admin from 'firebase-admin';
|
|
6
6
|
import { t as toErrorMessage } from './error-DDXB3duW.js';
|
|
7
7
|
import { b as broadcastEvent } from './events-handler-Dm1mNPQP.js';
|
|
8
|
+
import { existsSync, readFileSync } from 'fs';
|
|
9
|
+
import { join } from 'path';
|
|
8
10
|
import { j as json } from './index-CoD1IJuy.js';
|
|
11
|
+
import { homedir } from 'os';
|
|
9
12
|
import '@parse/node-apn';
|
|
10
13
|
import 'crypto';
|
|
11
14
|
|
|
@@ -72,6 +75,21 @@ function getApp() {
|
|
|
72
75
|
}
|
|
73
76
|
return app;
|
|
74
77
|
}
|
|
78
|
+
function readPersistedDeviceToken(platform) {
|
|
79
|
+
const tokensFile = join(homedir(), ".shooter", "device-tokens.json");
|
|
80
|
+
if (!existsSync(tokensFile)) {
|
|
81
|
+
return void 0;
|
|
82
|
+
}
|
|
83
|
+
try {
|
|
84
|
+
const parsed = JSON.parse(readFileSync(tokensFile, "utf-8"));
|
|
85
|
+
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
|
|
86
|
+
const value = parsed[platform];
|
|
87
|
+
return typeof value === "string" && value ? value : void 0;
|
|
88
|
+
}
|
|
89
|
+
} catch {
|
|
90
|
+
}
|
|
91
|
+
return void 0;
|
|
92
|
+
}
|
|
75
93
|
let apnsSingleton = null;
|
|
76
94
|
function getAPNsClient() {
|
|
77
95
|
if (!apnsSingleton) {
|
|
@@ -332,11 +350,11 @@ const POST = async ({ request }) => {
|
|
|
332
350
|
{ status: 500 }
|
|
333
351
|
);
|
|
334
352
|
}
|
|
335
|
-
const androidToken = requestDeviceToken?.trim() ||
|
|
353
|
+
const androidToken = requestDeviceToken?.trim() || private_env.ANDROID_DEVICE_TOKEN?.trim() || readPersistedDeviceToken("android");
|
|
336
354
|
if (!androidToken) {
|
|
337
355
|
return json(
|
|
338
356
|
{
|
|
339
|
-
details: "
|
|
357
|
+
details: "No Android device token available — set ANDROID_DEVICE_TOKEN, pass deviceToken in the request body, or open the Android app so it can auto-register its FCM token.",
|
|
340
358
|
error: "No device token configured"
|
|
341
359
|
},
|
|
342
360
|
{ status: 500 }
|
|
@@ -464,4 +482,4 @@ const GET = ({ request, url }) => {
|
|
|
464
482
|
};
|
|
465
483
|
|
|
466
484
|
export { GET, POST };
|
|
467
|
-
//# sourceMappingURL=_server.ts-
|
|
485
|
+
//# sourceMappingURL=_server.ts-G8OeADGj.js.map
|