@juspay/shooter 1.21.0 → 1.23.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/.claude/hooks/notifier.cjs +94 -1
- package/build/client/_app/immutable/assets/2.JWRrnR-w.css +1 -0
- package/build/client/_app/immutable/assets/2.JWRrnR-w.css.br +0 -0
- package/build/client/_app/immutable/assets/2.JWRrnR-w.css.gz +0 -0
- package/build/client/_app/immutable/chunks/{DOEXXmsh.js → Bj5wFimK.js} +2 -2
- package/build/client/_app/immutable/chunks/Bj5wFimK.js.br +0 -0
- package/build/client/_app/immutable/chunks/Bj5wFimK.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{EqMAkEha.js → BjYr_-Ss.js} +1 -1
- package/build/client/_app/immutable/chunks/BjYr_-Ss.js.br +0 -0
- package/build/client/_app/immutable/chunks/BjYr_-Ss.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C4Hns_Wl.js +1 -0
- package/build/client/_app/immutable/chunks/C4Hns_Wl.js.br +0 -0
- package/build/client/_app/immutable/chunks/C4Hns_Wl.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DULfdsh6.js +6 -0
- package/build/client/_app/immutable/chunks/DULfdsh6.js.br +0 -0
- package/build/client/_app/immutable/chunks/DULfdsh6.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{BmfLecb1.js → fcNfTA-E.js} +1 -1
- package/build/client/_app/immutable/chunks/fcNfTA-E.js.br +0 -0
- package/build/client/_app/immutable/chunks/fcNfTA-E.js.gz +0 -0
- package/build/client/_app/immutable/entry/{app.CeSxgGat.js → app.Bvoqymnp.js} +2 -2
- package/build/client/_app/immutable/entry/app.Bvoqymnp.js.br +0 -0
- package/build/client/_app/immutable/entry/app.Bvoqymnp.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.BqXCPPZJ.js +1 -0
- package/build/client/_app/immutable/entry/start.BqXCPPZJ.js.br +2 -0
- package/build/client/_app/immutable/entry/start.BqXCPPZJ.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{0.oaPwxh1O.js → 0.Bv_TwEnq.js} +1 -1
- package/build/client/_app/immutable/nodes/0.Bv_TwEnq.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.Bv_TwEnq.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{1.DMPyoM-M.js → 1.7lffTIeb.js} +1 -1
- package/build/client/_app/immutable/nodes/1.7lffTIeb.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.7lffTIeb.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{10.Cbm7nQKK.js → 10.ChiIrIDl.js} +1 -1
- package/build/client/_app/immutable/nodes/10.ChiIrIDl.js.br +0 -0
- package/build/client/_app/immutable/nodes/10.ChiIrIDl.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{11.CKmZjP_a.js → 11.DO3vyXEv.js} +2 -2
- package/build/client/_app/immutable/nodes/11.DO3vyXEv.js.br +0 -0
- package/build/client/_app/immutable/nodes/{11.CKmZjP_a.js.gz → 11.DO3vyXEv.js.gz} +0 -0
- package/build/client/_app/immutable/nodes/2.iMIqsE7n.js +23 -0
- package/build/client/_app/immutable/nodes/2.iMIqsE7n.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.iMIqsE7n.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{3.BgLpGnzb.js → 3.CArnSHOO.js} +1 -1
- package/build/client/_app/immutable/nodes/3.CArnSHOO.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.CArnSHOO.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{5.Avc1-gVb.js → 5.DziEu9rx.js} +1 -1
- package/build/client/_app/immutable/nodes/5.DziEu9rx.js.br +0 -0
- package/build/client/_app/immutable/nodes/5.DziEu9rx.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{6.Dw2wEssJ.js → 6.B8l1RwkB.js} +1 -1
- package/build/client/_app/immutable/nodes/6.B8l1RwkB.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.B8l1RwkB.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{7.DwKZjoBg.js → 7.BPyfhDis.js} +1 -1
- package/build/client/_app/immutable/nodes/7.BPyfhDis.js.br +0 -0
- package/build/client/_app/immutable/nodes/7.BPyfhDis.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{8.ZUAI6g5E.js → 8.D_vszZ9E.js} +1 -1
- package/build/client/_app/immutable/nodes/8.D_vszZ9E.js.br +0 -0
- package/build/client/_app/immutable/nodes/8.D_vszZ9E.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{9.I_KGXPwB.js → 9.Drah-do-.js} +1 -1
- package/build/client/_app/immutable/nodes/9.Drah-do-.js.br +0 -0
- package/build/client/_app/immutable/nodes/9.Drah-do-.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/pty-holder.cjs +6 -0
- package/build/server/chunks/{0-vrTNAfZB.js → 0-DAB_6Vm1.js} +2 -2
- package/build/server/chunks/{0-vrTNAfZB.js.map → 0-DAB_6Vm1.js.map} +1 -1
- package/build/server/chunks/{1-nbr-bOoF.js → 1-D-qMYaCx.js} +2 -2
- package/build/server/chunks/{1-nbr-bOoF.js.map → 1-D-qMYaCx.js.map} +1 -1
- package/build/server/chunks/{10-ChyvvJ6w.js → 10-CeFFGo-X.js} +2 -2
- package/build/server/chunks/{10-ChyvvJ6w.js.map → 10-CeFFGo-X.js.map} +1 -1
- package/build/server/chunks/{11-6ZAjL3uU.js → 11-DRMu_ATU.js} +2 -2
- package/build/server/chunks/{11-6ZAjL3uU.js.map → 11-DRMu_ATU.js.map} +1 -1
- package/build/server/chunks/{2-DWFRVDWJ.js → 2-B7OLBMNH.js} +4 -4
- package/build/server/chunks/{2-DWFRVDWJ.js.map → 2-B7OLBMNH.js.map} +1 -1
- package/build/server/chunks/{3-CKANM_WM.js → 3-B38ZarLw.js} +2 -2
- package/build/server/chunks/{3-CKANM_WM.js.map → 3-B38ZarLw.js.map} +1 -1
- package/build/server/chunks/{5-BxVjs2qi.js → 5-D-Uv1voC.js} +2 -2
- package/build/server/chunks/{5-BxVjs2qi.js.map → 5-D-Uv1voC.js.map} +1 -1
- package/build/server/chunks/{6-Cbf1AAMQ.js → 6-DP46cUej.js} +2 -2
- package/build/server/chunks/{6-Cbf1AAMQ.js.map → 6-DP46cUej.js.map} +1 -1
- package/build/server/chunks/{7-CMK2quEf.js → 7-B29_3ar6.js} +2 -2
- package/build/server/chunks/{7-CMK2quEf.js.map → 7-B29_3ar6.js.map} +1 -1
- package/build/server/chunks/{8-DhdfkfDM.js → 8-DCnSDVrX.js} +2 -2
- package/build/server/chunks/{8-DhdfkfDM.js.map → 8-DCnSDVrX.js.map} +1 -1
- package/build/server/chunks/{9-CPpxtRM5.js → 9-BwqDc8wC.js} +2 -2
- package/build/server/chunks/{9-CPpxtRM5.js.map → 9-BwqDc8wC.js.map} +1 -1
- package/build/server/chunks/_page.svelte-8OFzwdNA.js +758 -0
- package/build/server/chunks/_page.svelte-8OFzwdNA.js.map +1 -0
- package/build/server/chunks/{_server.ts-BWVlO8iV.js → _server.ts-05JJOdcX.js} +15 -12
- package/build/server/chunks/_server.ts-05JJOdcX.js.map +1 -0
- package/build/server/chunks/{_server.ts-BevnuePu.js → _server.ts-BCljU9Sg.js} +7 -3
- package/build/server/chunks/_server.ts-BCljU9Sg.js.map +1 -0
- package/build/server/chunks/{_server.ts-D-vgx5UZ.js → _server.ts-BTmknWpO.js} +2 -2
- package/build/server/chunks/{_server.ts-D-vgx5UZ.js.map → _server.ts-BTmknWpO.js.map} +1 -1
- package/build/server/chunks/{_server.ts-tChyh9FX.js → _server.ts-BXhmLZwN.js} +4 -2
- package/build/server/chunks/{_server.ts-tChyh9FX.js.map → _server.ts-BXhmLZwN.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CvJKTS3Z.js → _server.ts-BbRSpB74.js} +4 -2
- package/build/server/chunks/{_server.ts-CvJKTS3Z.js.map → _server.ts-BbRSpB74.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CC2K8-L2.js → _server.ts-Blx6TuRU.js} +4 -2
- package/build/server/chunks/_server.ts-Blx6TuRU.js.map +1 -0
- package/build/server/chunks/_server.ts-C6NRpe7e.js +33 -0
- package/build/server/chunks/_server.ts-C6NRpe7e.js.map +1 -0
- package/build/server/chunks/_server.ts-CGqCOCdK.js +53 -0
- package/build/server/chunks/_server.ts-CGqCOCdK.js.map +1 -0
- package/build/server/chunks/{_server.ts-X1R7L_QI.js → _server.ts-CYWXjihn.js} +4 -2
- package/build/server/chunks/{_server.ts-X1R7L_QI.js.map → _server.ts-CYWXjihn.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CD7JP3fz.js → _server.ts-D0___krA.js} +4 -2
- package/build/server/chunks/_server.ts-D0___krA.js.map +1 -0
- package/build/server/chunks/{_server.ts-VzDcFFgy.js → _server.ts-DPHRUFYS.js} +4 -2
- package/build/server/chunks/_server.ts-DPHRUFYS.js.map +1 -0
- package/build/server/chunks/{_server.ts-D0zRDSx0.js → _server.ts-D_WRex0k.js} +4 -2
- package/build/server/chunks/_server.ts-D_WRex0k.js.map +1 -0
- package/build/server/chunks/{_server.ts-CA5KUENM.js → _server.ts-Da1kSClZ.js} +4 -2
- package/build/server/chunks/_server.ts-Da1kSClZ.js.map +1 -0
- package/build/server/chunks/{_server.ts-Dp-hXW_I.js → _server.ts-l3cd4Cto.js} +4 -2
- package/build/server/chunks/_server.ts-l3cd4Cto.js.map +1 -0
- package/build/server/chunks/{library-apns-Dl3iRE2h.js → library-apns-D8RPINlv.js} +62 -7
- package/build/server/chunks/library-apns-D8RPINlv.js.map +1 -0
- package/build/server/chunks/{pending-requests-C9p57WoU.js → pending-requests-8rWjrF6d.js} +3 -2
- package/build/server/chunks/pending-requests-8rWjrF6d.js.map +1 -0
- package/build/server/chunks/presence-store-Bx_g0-Gd.js +23 -0
- package/build/server/chunks/presence-store-Bx_g0-Gd.js.map +1 -0
- package/build/server/chunks/{pty-manager-ZqXqa-6A.js → pty-manager-DDjG7DlH.js} +297 -31
- package/build/server/chunks/pty-manager-DDjG7DlH.js.map +1 -0
- package/build/server/chunks/shooter-home-4f_HkdGI.js +10 -0
- package/build/server/chunks/shooter-home-4f_HkdGI.js.map +1 -0
- package/build/server/index.js +1 -1
- package/build/server/index.js.map +1 -1
- package/build/server/manifest.js +38 -24
- package/build/server/manifest.js.map +1 -1
- package/package.json +4 -2
- package/server.ts +2 -2
- package/src/lib/modules/client/common/index.ts +1 -0
- package/src/lib/modules/client/common/presence.ts +47 -0
- package/src/lib/modules/client/dashboard/AutopilotPanel.svelte +188 -4
- package/src/lib/modules/client/dashboard/autopilot-driver.svelte.ts +681 -0
- package/src/lib/modules/client/dashboard/decide-injection.ts +127 -0
- package/src/lib/modules/client/dashboard/store.svelte.ts +65 -24
- package/src/lib/modules/client/neurolink/fetch-proxy.ts +38 -1
- package/src/lib/modules/client/terminal/xterm-wrapper.ts +52 -12
- package/src/lib/modules/server/apn/apns-payload.ts +50 -0
- package/src/lib/modules/server/apn/library-apns.ts +50 -8
- package/src/lib/modules/server/apn/pending-requests.ts +3 -1
- package/src/lib/modules/server/sessions/autopilot-context.ts +57 -0
- package/src/lib/modules/server/sessions/autopilot-engine.ts +148 -43
- package/src/lib/modules/server/sessions/litellm-client.ts +90 -34
- package/src/lib/modules/server/sessions/next-step-consensus.ts +27 -2
- package/src/lib/modules/server/sessions/summary-store.ts +3 -1
- package/src/lib/modules/server/terminal/agent-launch.ts +26 -0
- package/src/lib/modules/server/terminal/pty-holder.cjs +6 -0
- package/src/lib/modules/server/terminal/pty-manager.ts +292 -38
- package/src/lib/modules/server/terminal/session-watcher.ts +12 -2
- package/src/lib/modules/server/terminal/terminal-emulator.ts +102 -0
- package/src/lib/modules/server/terminal/terminal-store.ts +3 -1
- package/src/lib/modules/server/utils/shooter-home.ts +16 -0
- package/src/lib/modules/server/ws/presence-store.ts +50 -0
- package/src/lib/modules/server/ws/server.ts +18 -2
- package/src/lib/modules/server/ws/terminal-handler.ts +11 -6
- package/src/lib/types/autopilot.ts +65 -0
- package/src/lib/types/generated/WsProtocol.ts +10 -1
- package/src/lib/types/server.ts +27 -1
- package/src/lib/types/terminal-client.ts +3 -0
- package/src/lib/types/ws.ts +3 -2
- package/src/routes/api/autopilot/goal/+server.ts +72 -0
- package/src/routes/api/neurolink-proxy/+server.ts +8 -2
- package/src/routes/api/notify/+server.ts +22 -15
- package/src/routes/api/presence/+server.ts +39 -0
- package/src/routes/api/ws-status/+server.ts +8 -5
- package/build/client/_app/immutable/assets/2.BHi6pjT2.css +0 -1
- package/build/client/_app/immutable/assets/2.BHi6pjT2.css.br +0 -0
- package/build/client/_app/immutable/assets/2.BHi6pjT2.css.gz +0 -0
- package/build/client/_app/immutable/chunks/BmfLecb1.js.br +0 -0
- package/build/client/_app/immutable/chunks/BmfLecb1.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CRkG7oE4.js +0 -1
- package/build/client/_app/immutable/chunks/CRkG7oE4.js.br +0 -0
- package/build/client/_app/immutable/chunks/CRkG7oE4.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DOEXXmsh.js.br +0 -0
- package/build/client/_app/immutable/chunks/DOEXXmsh.js.gz +0 -0
- package/build/client/_app/immutable/chunks/EqMAkEha.js.br +0 -0
- package/build/client/_app/immutable/chunks/EqMAkEha.js.gz +0 -0
- package/build/client/_app/immutable/chunks/J5-Cr5oR.js +0 -6
- package/build/client/_app/immutable/chunks/J5-Cr5oR.js.br +0 -0
- package/build/client/_app/immutable/chunks/J5-Cr5oR.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.CeSxgGat.js.br +0 -0
- package/build/client/_app/immutable/entry/app.CeSxgGat.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.DrnJFwxA.js +0 -1
- package/build/client/_app/immutable/entry/start.DrnJFwxA.js.br +0 -2
- package/build/client/_app/immutable/entry/start.DrnJFwxA.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.oaPwxh1O.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.oaPwxh1O.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.DMPyoM-M.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.DMPyoM-M.js.gz +0 -0
- package/build/client/_app/immutable/nodes/10.Cbm7nQKK.js.br +0 -0
- package/build/client/_app/immutable/nodes/10.Cbm7nQKK.js.gz +0 -0
- package/build/client/_app/immutable/nodes/11.CKmZjP_a.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.zlrdNFtH.js +0 -13
- package/build/client/_app/immutable/nodes/2.zlrdNFtH.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.zlrdNFtH.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.BgLpGnzb.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.BgLpGnzb.js.gz +0 -0
- package/build/client/_app/immutable/nodes/5.Avc1-gVb.js.br +0 -0
- package/build/client/_app/immutable/nodes/5.Avc1-gVb.js.gz +0 -0
- package/build/client/_app/immutable/nodes/6.Dw2wEssJ.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.Dw2wEssJ.js.gz +0 -0
- package/build/client/_app/immutable/nodes/7.DwKZjoBg.js.br +0 -0
- package/build/client/_app/immutable/nodes/7.DwKZjoBg.js.gz +0 -0
- package/build/client/_app/immutable/nodes/8.ZUAI6g5E.js.br +0 -0
- package/build/client/_app/immutable/nodes/8.ZUAI6g5E.js.gz +0 -0
- package/build/client/_app/immutable/nodes/9.I_KGXPwB.js.br +0 -0
- package/build/client/_app/immutable/nodes/9.I_KGXPwB.js.gz +0 -0
- package/build/server/chunks/_page.svelte-tBuIq8Pg.js +0 -159
- package/build/server/chunks/_page.svelte-tBuIq8Pg.js.map +0 -1
- package/build/server/chunks/_server.ts-BWVlO8iV.js.map +0 -1
- package/build/server/chunks/_server.ts-BevnuePu.js.map +0 -1
- package/build/server/chunks/_server.ts-CA5KUENM.js.map +0 -1
- package/build/server/chunks/_server.ts-CC2K8-L2.js.map +0 -1
- package/build/server/chunks/_server.ts-CD7JP3fz.js.map +0 -1
- package/build/server/chunks/_server.ts-D0zRDSx0.js.map +0 -1
- package/build/server/chunks/_server.ts-Dp-hXW_I.js.map +0 -1
- package/build/server/chunks/_server.ts-VzDcFFgy.js.map +0 -1
- package/build/server/chunks/library-apns-Dl3iRE2h.js.map +0 -1
- package/build/server/chunks/pending-requests-C9p57WoU.js.map +0 -1
- package/build/server/chunks/pty-manager-ZqXqa-6A.js.map +0 -1
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
// GET /api/ws-status —
|
|
1
|
+
// GET /api/ws-status — WebSocket presence for the notifier's push decision.
|
|
2
2
|
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
3
|
+
// `connectedClients` counts ALL /ws/events clients — but the phone-resident autonomous loop holds
|
|
4
|
+
// a PERSISTENT events connection, so that count is ~always > 0 and is NO LONGER a valid "someone is
|
|
5
|
+
// watching" signal (using it suppressed every phone push while autopilot ran). `viewerPresent` is
|
|
6
|
+
// the correct signal: a viewer reported `foreground` within the heartbeat TTL (POST /api/presence) —
|
|
7
|
+
// the same signal the autopilot engine uses to gate its pushes. The notifier prefers viewerPresent.
|
|
7
8
|
|
|
8
9
|
import { validateAuth } from '$lib/modules/server/auth';
|
|
10
|
+
import { isViewerPresent } from '$lib/modules/server/ws/presence-store';
|
|
9
11
|
import { getConnectedClientCount } from '$lib/modules/server/ws/server';
|
|
10
12
|
import { json } from '@sveltejs/kit';
|
|
11
13
|
|
|
@@ -21,5 +23,6 @@ export const GET: RequestHandler = ({ request }) => {
|
|
|
21
23
|
|
|
22
24
|
return json({
|
|
23
25
|
connectedClients: getConnectedClientCount(),
|
|
26
|
+
viewerPresent: isViewerPresent(),
|
|
24
27
|
});
|
|
25
28
|
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.autopilot-panel.svelte-ziwu2n{background:var(--component-bg, #1a1a1a);border:1px solid var(--border, #2e2e2e);border-radius:var(--radius-lg, 8px);padding:var(--space-4, 16px);margin-bottom:var(--space-4, 16px)}.panel-header.svelte-ziwu2n{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--space-3, 12px)}.panel-title-row.svelte-ziwu2n{display:flex;align-items:center;gap:var(--space-2, 8px)}.panel-title.svelte-ziwu2n{color:var(--text-primary, #ededed);font-size:var(--text-sm, 13px);font-weight:600;letter-spacing:.04em;text-transform:uppercase}@keyframes svelte-ziwu2n-pulse{0%,to{opacity:1}50%{opacity:.4}}.status-dot-active.svelte-ziwu2n{animation:svelte-ziwu2n-pulse 2s ease-in-out infinite;background:var(--ds-green-700, #16a34a);border-radius:50%;display:inline-block;flex-shrink:0;height:7px;width:7px}.toggle-btn.svelte-ziwu2n{border:1px solid transparent;border-radius:var(--radius-full, 9999px);cursor:pointer;font-size:var(--text-xs, 12px);font-weight:600;padding:4px 14px;transition:background var(--transition-fast, .15s ease),color var(--transition-fast, .15s ease)}.toggle-btn--off.svelte-ziwu2n{background:var(--ds-green-alpha-200, rgba(22, 163, 74, .12));border-color:var(--ds-green-alpha-400, rgba(22, 163, 74, .3));color:var(--ds-green-700, #16a34a)}.toggle-btn--off.svelte-ziwu2n:hover{background:var(--ds-green-alpha-400, rgba(22, 163, 74, .2))}.toggle-btn--on.svelte-ziwu2n{background:var(--ds-gray-alpha-200, rgba(255, 255, 255, .06));border-color:var(--border, #2e2e2e);color:var(--text-secondary, #a1a1a1)}.toggle-btn--on.svelte-ziwu2n:hover{background:var(--ds-gray-alpha-300, rgba(255, 255, 255, .1));color:var(--text-primary, #ededed)}.toggle-btn.svelte-ziwu2n:focus-visible{outline:2px solid var(--ds-blue-700, #0070f3);outline-offset:2px}.panel-empty.svelte-ziwu2n{color:var(--text-tertiary, #7d7d7d);font-size:var(--text-xs, 12px);font-style:italic;margin:0}.sessions-list.svelte-ziwu2n{display:flex;flex-direction:column;gap:var(--space-3, 12px)}.session-card.svelte-ziwu2n{background:var(--bg-subtle, rgba(255, 255, 255, .02));border:1px solid var(--border-subtle, rgba(255, 255, 255, .06));border-radius:var(--radius-md, 6px);display:flex;flex-direction:column;gap:var(--space-2, 8px);padding:var(--space-3, 12px)}.session-header.svelte-ziwu2n{align-items:center;display:flex;gap:var(--space-2, 8px);justify-content:space-between}.session-name.svelte-ziwu2n{color:var(--text-primary, #ededed);flex:1;font-size:var(--text-sm, 13px);font-weight:600;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.session-status.svelte-ziwu2n{flex-shrink:0;font-size:var(--text-xs, 12px);font-weight:500}.session-status--idle.svelte-ziwu2n{color:var(--text-tertiary, #7d7d7d)}.session-summary.svelte-ziwu2n{-webkit-box-orient:vertical;-webkit-line-clamp:2;color:var(--text-secondary, #a1a1a1);display:-webkit-box;font-size:var(--text-xs, 12px);line-clamp:2;line-height:var(--leading-normal, 1.5);margin:0;overflow:hidden}.next-steps.svelte-ziwu2n{display:flex;flex-direction:column;gap:6px}.next-steps-label.svelte-ziwu2n{color:var(--text-tertiary, #7d7d7d);font-size:var(--text-xs, 12px);font-weight:600;letter-spacing:.06em;text-transform:uppercase}.steps-list.svelte-ziwu2n{display:flex;flex-direction:column;gap:5px;list-style:none;margin:0;padding:0}.step-item.svelte-ziwu2n{align-items:baseline;display:flex;gap:8px}.step-badge.svelte-ziwu2n{align-items:center;border-radius:var(--radius-full, 9999px);cursor:default;display:inline-flex;flex-shrink:0;font-size:10px;font-weight:700;height:18px;justify-content:center;min-width:20px;padding:0 5px}.step-badge--strong.svelte-ziwu2n{background:var(--ds-green-alpha-200, rgba(22, 163, 74, .12));color:var(--ds-green-700, #16a34a)}.step-badge--medium.svelte-ziwu2n{background:var(--ds-blue-alpha-200, rgba(0, 112, 243, .12));color:var(--ds-blue-700, #0070f3)}.step-badge--weak.svelte-ziwu2n{background:var(--ds-gray-alpha-200, rgba(255, 255, 255, .06));color:var(--text-tertiary, #7d7d7d)}.step-badge--tentative.svelte-ziwu2n{background:var(--ds-amber-alpha-200, rgba(217, 119, 6, .12));color:var(--ds-amber-700, #d97706);font-style:italic}.step-text.svelte-ziwu2n{color:var(--text-secondary, #a1a1a1);font-size:var(--text-xs, 12px);line-height:var(--leading-normal, 1.5)}.last-updated.svelte-ziwu2n{color:var(--text-tertiary, #7d7d7d);font-size:10px;margin-top:2px}@keyframes svelte-1qbe2oo-pulse{0%,to{opacity:1}50%{opacity:.4}}@keyframes svelte-1qbe2oo-activity-pulse{0%,to{transform:scale(1);opacity:1}50%{transform:scale(1.5);opacity:.7}}.card.svelte-1qbe2oo{background:var(--component-bg, #1a1a1a);border:1px solid var(--border, #2e2e2e);border-left:4px solid var(--status-color, #6b7280);border-radius:var(--radius-lg, 8px);padding:var(--space-4, 16px);display:flex;flex-direction:column;gap:var(--space-3, 12px);cursor:pointer;transition:border-color var(--transition-fast, .15s ease),background var(--transition-fast, .15s ease);color:inherit;text-align:left;width:100%}.card.svelte-1qbe2oo:hover{background:var(--component-bg-hover, #1f1f1f);border-color:var(--border-hover, #454545);border-left-color:var(--status-color, #6b7280)}.card.svelte-1qbe2oo:focus-visible{outline:2px solid var(--ds-blue-700, #0070f3);outline-offset:2px}.card-header.svelte-1qbe2oo{display:flex;align-items:center;justify-content:space-between;gap:var(--space-2, 8px);min-width:0}.project-name.svelte-1qbe2oo{font-size:var(--text-base, 14px);font-weight:600;color:var(--text-primary, #ededed);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;flex:1}.status-pill{--pill-font-size: var(--text-xs, 12px);--pill-font-weight: 500;--pill-padding: 3px 10px;--pill-border-radius: var(--radius-full, 9999px);--pill-cursor: default;flex-shrink:0}.status-pill--running-active{--pill-background: var(--ds-green-100);--pill-color: var(--ds-green-700);--pill-hover-background: var(--ds-green-100);--pill-hover-color: var(--ds-green-700);animation:svelte-1qbe2oo-pulse 2s ease-in-out infinite}.status-pill--running{--pill-background: var(--ds-blue-100);--pill-color: var(--ds-blue-700);--pill-hover-background: var(--ds-blue-100);--pill-hover-color: var(--ds-blue-700)}.status-pill--idle{--pill-background: var(--ds-amber-100);--pill-color: var(--ds-amber-700);--pill-hover-background: var(--ds-amber-100);--pill-hover-color: var(--ds-amber-700)}.status-pill--exited{--pill-background: var(--ds-gray-alpha-200);--pill-color: var(--ds-gray-600);--pill-hover-background: var(--ds-gray-alpha-200);--pill-hover-color: var(--ds-gray-600)}.status-pill--error{--pill-background: var(--ds-red-100);--pill-color: var(--ds-red-700);--pill-hover-background: var(--ds-red-100);--pill-hover-color: var(--ds-red-700)}.goal-text.svelte-1qbe2oo{font-size:var(--text-sm, 13px);color:var(--text-secondary, #a1a1a1);font-style:italic;margin:0;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;line-height:var(--leading-normal, 1.5)}.summary-row.svelte-1qbe2oo{min-height:18px}.summary-text.svelte-1qbe2oo{font-size:var(--text-sm, 13px);color:var(--text-primary, #ededed);line-height:var(--leading-normal, 1.5);display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.summarizing.svelte-1qbe2oo{font-size:var(--text-xs, 12px);color:var(--ds-amber-700);font-style:italic}.summary-fallback.svelte-1qbe2oo{font-size:var(--text-xs, 12px);color:var(--text-tertiary, #7d7d7d);font-style:italic}.stats-row.svelte-1qbe2oo{display:flex;align-items:center;gap:var(--space-3, 12px);flex-wrap:wrap;min-width:0}.stat.svelte-1qbe2oo{display:inline-flex;align-items:center;gap:var(--space-1, 4px);font-size:var(--text-xs, 12px);color:var(--text-tertiary, #7d7d7d);white-space:nowrap}.stat-error.svelte-1qbe2oo{color:var(--ds-red-700)}.stat-path.svelte-1qbe2oo{font-family:var(--font-mono, monospace);overflow:hidden;text-overflow:ellipsis;min-width:0;flex:1;text-align:right}.status-dot-active.svelte-1qbe2oo{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--ds-green-700);animation:svelte-1qbe2oo-activity-pulse .6s ease-in-out infinite;flex-shrink:0}.status-dot-static.svelte-1qbe2oo{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--ds-gray-600, #878787);flex-shrink:0}@media(max-width:768px){.card.svelte-1qbe2oo{padding:10px 12px}.stats-row.svelte-1qbe2oo{flex-wrap:wrap;gap:4px}}@media(max-width:480px){.card.svelte-1qbe2oo{padding:8px 10px}.goal-text.svelte-1qbe2oo{-webkit-line-clamp:1;line-clamp:1}}.section.svelte-14sxgtb{display:flex;flex-direction:column;gap:var(--space-3, 12px);margin-bottom:var(--space-6, 24px)}.section-label.svelte-14sxgtb{font-size:var(--text-xs, 12px);font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--text-secondary, #a1a1a1);margin:0 0 var(--space-1, 4px) 0}.stats-bar.svelte-1uha8ag{display:flex;gap:10px;margin-top:var(--space-4)}.stat-chip.svelte-1uha8ag{display:flex;align-items:center;gap:6px;background:#ffffff0a;border:1px solid rgba(255,255,255,.06);border-radius:20px;padding:6px 14px}.stat-chip-active.svelte-1uha8ag{background:var(--ds-green-alpha-200);border-color:var(--ds-green-alpha-400)}.stat-value.svelte-1uha8ag{font-weight:700;font-size:.9rem;color:#f0f0f0}.stat-chip-active.svelte-1uha8ag .stat-value:where(.svelte-1uha8ag){color:var(--ds-green-500)}.stat-label.svelte-1uha8ag{font-size:.78rem;color:#a3a3a3cc}.dashboard-section.svelte-1uha8ag{margin-bottom:var(--space-6)}.section-label.svelte-1uha8ag{font-size:var(--text-xs, 12px);font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--text-secondary);margin-bottom:var(--space-3)}.projects-container.svelte-1uha8ag{display:flex;flex-direction:column;gap:var(--space-3);animation:fadeIn .2s ease}@media(max-width:768px){.stats-bar.svelte-1uha8ag{flex-wrap:wrap}}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{g as y}from"./gQJcRhou.js";import"./BDcFu3l7.js";const k="https://unpkg.com/@juspay/neurolink@9.61.1/dist/browser/neurolink.min.js",b={"https://api.anthropic.com/":"anthropic","https://api.mistral.ai/":"mistral","https://api.openai.com/":"openai","https://generativelanguage.googleapis.com/":"google-ai"};let f=!1;function O(){if(f||typeof globalThis>"u")return;f=!0;const r=globalThis.fetch.bind(globalThis);globalThis.fetch=async(e,o)=>{const i=typeof e=="string"?e:e instanceof URL?e.href:e.url,n=Object.entries(b).find(([t])=>i.startsWith(t))?.[1];if(!n)return r(e,o);const c={},s=o?.headers??(e instanceof Request?e.headers:{}),d=s instanceof Headers?s:Object.entries(s);for(const[t,g]of d){const p=t.toLowerCase();p!=="x-api-key"&&p!=="authorization"&&(c[t]=g)}let a;try{a=JSON.parse(o?.body??(e instanceof Request?await e.text():"{}"))}catch{a={}}const l=y(),h={"Content-Type":"application/json"};return l&&(h.Authorization=`Bearer ${l}`),r("/api/neurolink-proxy",{body:JSON.stringify({body:a,headers:c,provider:n,url:i}),headers:h,method:"POST"})}}export{k as N,O as i};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../assets/xterm.DFuMZ0ql.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{_ as u}from"./PPVm8Dsz.js";async function D(e){const{Terminal:y}=await u(async()=>{const{Terminal:r}=await import("./BTGVxaYV.js").then(n=>n.x);return{Terminal:r}},[],import.meta.url),{FitAddon:h}=await u(async()=>{const{FitAddon:r}=await import("./BlxrFPDK.js").then(n=>n.a);return{FitAddon:r}},[],import.meta.url),{WebLinksAddon:S}=await u(async()=>{const{WebLinksAddon:r}=await import("./DLu6yJIZ.js").then(n=>n.a);return{WebLinksAddon:r}},[],import.meta.url);await u(()=>Promise.resolve({}),__vite__mapDeps([0]),import.meta.url);const d=new h,a=new y({allowTransparency:!0,cursorBlink:!0,cursorStyle:"block",fontFamily:"'SF Mono', 'Fira Code', 'Cascadia Code', 'Menlo', monospace",fontSize:e.fontSize||14,theme:{background:"#0a0a0f",black:"#0a0a0f",blue:"#3b82f6",brightBlack:"#64748b",brightBlue:"#60a5fa",brightCyan:"#67e8f9",brightGreen:"#4ade80",brightMagenta:"#c4b5fd",brightRed:"#f87171",brightWhite:"#f8fafc",brightYellow:"#fbbf24",cursor:"#e2e8f0",cursorAccent:"#0a0a0f",cyan:"#38bdf8",foreground:"#e2e8f0",green:"#22c55e",magenta:"#a78bfa",red:"#ef4444",selectionBackground:"rgba(99, 102, 241, 0.3)",white:"#e2e8f0",yellow:"#f59e0b"}});a.loadAddon(d),a.loadAddon(new S),a.open(e.container),e.readOnly&&e.initialCols&&e.initialRows?a.resize(e.initialCols,e.initialRows):d.fit();const O=new Set(["f","g","h","j","n","o","p","q","s","t","u","w"]);a.attachCustomKeyEventHandler(r=>{const n=r.key.toLowerCase();return r.metaKey?n==="c"||n==="v"?!0:!O.has(n):!0});let l=null;if(e.terminalId&&e.apiKey&&!e.readOnly){const r=e.terminalId,n=e.apiKey;l=t=>{(async()=>{try{if(!t.clipboardData)return;const g=Array.from(t.clipboardData.items).find(b=>b.type.startsWith("image/"));if(!g)return;const p=g.getAsFile();if(!p)return;t.preventDefault();const f=new FileReader,v=await new Promise((b,A)=>{f.onload=()=>{b(f.result)},f.onerror=A,f.readAsDataURL(p)});(await fetch(`/api/terminals/${r}/paste-image`,{body:JSON.stringify({image:v}),headers:{Authorization:`Bearer ${n}`,"Content-Type":"application/json"},method:"POST"})).ok&&i?.readyState===WebSocket.OPEN&&i.send(JSON.stringify({data:"",type:"input"}))}catch{}})()},e.container.addEventListener("paste",l)}let i=null,s=null,o=1e3,c=!1;async function m(){if(c)return;let r;try{r=await e.getTicket()}catch{c||(e.onDisconnect?.(),s=setTimeout(()=>{o=Math.min(o*2,3e4),m()},o));return}c||(i=new WebSocket(`${e.wsUrl}?ticket=${r}`),i.onopen=()=>{o=1e3,e.onReconnect?.()},i.onmessage=n=>{const t=JSON.parse(n.data);t.type==="output"||t.type==="scrollback"?a.write(t.data??""):t.type==="exit"?(a.write(`\r
|
|
3
|
-
\x1B[90m[Process exited with code ${String(t.code)}]\x1B[0m\r
|
|
4
|
-
`),c=!0,s&&clearTimeout(s),e.onExit?.(t.code??0)):t.type==="output-dropped"?a.write(`\r
|
|
5
|
-
\x1B[33m[${String(t.bytes)} bytes dropped]\x1B[0m\r
|
|
6
|
-
`):t.type==="activity"?e.onActivity?.(t.active??!1):t.type==="cwd"?e.onCwd?.(t.path??""):t.type==="resize"&&e.readOnly&&t.cols&&t.rows&&a.resize(t.cols,t.rows)},i.onclose=()=>{c||(e.onDisconnect?.(),s=setTimeout(()=>{o=Math.min(o*2,3e4),m()},o))})}m(),a.onData(r=>{e.readOnly||i?.readyState===WebSocket.OPEN&&i.send(JSON.stringify({data:r,type:"input"}))});const w=new ResizeObserver(()=>{e.readOnly||!e.container.offsetWidth||!e.container.offsetHeight||(d.fit(),i?.readyState===WebSocket.OPEN&&i.send(JSON.stringify({cols:a.cols,rows:a.rows,type:"resize"})))});w.observe(e.container);function _(){c=!0,s&&clearTimeout(s),l&&e.container.removeEventListener("paste",l),w.disconnect(),i?.close(),a.dispose()}function k(r){i?.readyState===WebSocket.OPEN&&i.send(JSON.stringify({data:r,type:"input"}))}return{dispose:_,fitAddon:d,sendInput:k,term:a}}function N(e,y){e.readyState===WebSocket.OPEN&&e.send(JSON.stringify({signal:y,type:"signal"}))}export{D as createTerminal,N as sendSignal};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{l as o,a as r}from"../chunks/DOEXXmsh.js";export{o as load_css,r as start};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import{d as re,i as P,s as y,b as Bt,a as g,f as m}from"../chunks/BPDiEZo0.js";import{p as Nt,s as H,q as Kt,v as ne,c as l,d as v,g as s,r as o,t as q,w as It,x as U,b as _,A as kt,y as _e,D as Se,$ as ye,B as Vt}from"../chunks/DWmC0QM7.js";import{s as Mt,g as qt,d as gt,e as ct,P as oe,l as be,j as Yt,B as jt,c as Rt,b as we,i as Ht}from"../chunks/B1bOvemT.js";import{h as xe}from"../chunks/2rBV5OkJ.js";import{g as Xt}from"../chunks/DOEXXmsh.js";import{B as Ae}from"../chunks/Bn-6X1BO.js";import{R as ke,S as Zt}from"../chunks/CJulw9ux.js";import{S as Ce}from"../chunks/CG453M9q.js";import{c as Ee,s as ze,g as Ne}from"../chunks/xs1Xl3_e.js";import{g as Ie,i as Pe}from"../chunks/gQJcRhou.js";import"../chunks/BDcFu3l7.js";import{f as ie}from"../chunks/BLszSzTT.js";import{S as Te}from"../chunks/BcpydfqI.js";import{i as De,N as Oe}from"../chunks/CRkG7oE4.js";import{d as je}from"../chunks/C87ZRWX0.js";import{E as Qt}from"../chunks/DomZZqvG.js";var Re=m('<span class="status-dot-active svelte-ziwu2n" aria-hidden="true"></span>'),Le=m('<p class="session-summary svelte-ziwu2n"> </p>'),Be=m('<li class="step-item svelte-ziwu2n"><span> </span> <span class="step-text svelte-ziwu2n"> </span></li>'),Me=m('<div class="next-steps svelte-ziwu2n"><span class="next-steps-label svelte-ziwu2n">Next steps</span> <ul class="steps-list svelte-ziwu2n"></ul></div>'),qe=m('<div class="session-card svelte-ziwu2n"><div class="session-header svelte-ziwu2n"><span class="session-name svelte-ziwu2n"> </span> <span class="session-status session-status--idle svelte-ziwu2n"> </span></div> <!> <!> <span class="last-updated svelte-ziwu2n"> </span></div>'),Ke=m('<div class="sessions-list svelte-ziwu2n"></div>'),Ye=m('<p class="panel-empty svelte-ziwu2n"> </p>'),Fe=m('<div class="autopilot-panel svelte-ziwu2n"><div class="panel-header svelte-ziwu2n"><div class="panel-title-row svelte-ziwu2n"><span class="panel-title svelte-ziwu2n">Auto-pilot</span> <!></div> <button> </button></div> <!></div>');function Ge(e,t){Nt(t,!0);let r=H(!1),i=H(Kt([]));const a=U(()=>{const u=new Set,h=[];for(const L of s(i)){const D=L.sessionId??L.terminalId??L.id;u.has(D)||(u.add(D),h.push(L))}return h});function n(){const u=Ie();return u?{Authorization:`Bearer ${u}`}:{}}async function w(){try{const u=await fetch("/api/autopilot",{headers:n()});u.ok&&_(r,!!(await u.json()).enabled,!0)}catch{}}async function x(){try{const u=await fetch("/api/summaries?limit=30",{headers:n()});u.ok&&_(i,(await u.json()).summaries??[],!0)}catch{}}async function T(){const u=!s(r);_(r,u);try{const h=await fetch("/api/autopilot",{body:JSON.stringify({enabled:u}),headers:{...n(),"Content-Type":"application/json"},method:"POST"});h.ok&&_(r,!!(await h.json()).enabled,!0)}catch{_(r,!u)}}function k(u){try{const h=JSON.parse(u);return Array.isArray(h)?h:[]}catch{return[]}}function S(u){if(u.tentative)return"step-badge step-badge--tentative";const h=u.votes??1;return h>=4?"step-badge step-badge--strong":h>=3?"step-badge step-badge--medium":"step-badge step-badge--weak"}function p(u){return u.tentative?"~":`${u.votes??1}`}ne(()=>{w(),x();const u=setInterval(()=>{x(),w()},8e3);return()=>{clearInterval(u)}});var C=Fe(),z=l(C),N=l(z),ht=v(l(N),2);{var rt=u=>{var h=Re();g(u,h)};P(ht,u=>{s(r)&&u(rt)})}o(N);var W=v(N,2),_t=l(W,!0);o(W),o(z);var nt=v(z,2);{var ot=u=>{var h=Ke();ct(h,21,()=>s(a),L=>L.id,(L,D)=>{const ut=U(()=>k(s(D).nextSteps));var Z=qe(),it=l(Z),Q=l(it),St=l(Q,!0);o(Q);var d=v(Q,2),f=l(d,!0);o(d),o(it);var c=v(it,2);{var b=B=>{var M=Le(),V=l(M,!0);o(M),q(()=>y(V,s(D).summary)),g(B,M)};P(c,B=>{s(D).summary&&B(b)})}var E=v(c,2);{var j=B=>{var M=Me(),V=v(l(M),2);ct(V,21,()=>s(ut),lt=>lt.text,(lt,A)=>{var I=Be(),O=l(I),et=l(O,!0);o(O);var K=v(O,2),$=l(K,!0);o(K),o(I),q((dt,R)=>{Mt(O,1,dt,"svelte-ziwu2n"),gt(O,"title",`${s(A).votes??1??""} vote(s)`),y(et,R),y($,s(A).text)},[()=>qt(S(s(A))),()=>p(s(A))]),g(lt,I)}),o(V),o(M),g(B,M)};P(E,B=>{s(ut).length>0&&B(j)})}var J=v(E,2),G=l(J);o(J),o(Z),q(B=>{y(St,s(D).projectName??s(D).terminalId),y(f,s(D).trigger),y(G,`Updated ${B??""}`)},[()=>ie(s(D).createdAt)]),g(L,Z)}),o(h),g(u,h)},tt=u=>{var h=Ye(),L=l(h,!0);o(h),q(()=>y(L,s(r)?"Watching all active sessions…":"Start Auto-pilot for AI summaries + next steps across all sessions — runs on the server, even with this page closed.")),g(u,h)};P(nt,u=>{s(a).length>0?u(ot):u(tt,-1)})}o(C),q(()=>{Mt(W,1,qt(s(r)?"toggle-btn toggle-btn--on":"toggle-btn toggle-btn--off"),"svelte-ziwu2n"),gt(W,"aria-label",s(r)?"Stop Auto-pilot":"Start Auto-pilot"),gt(W,"aria-pressed",s(r)),y(_t,s(r)?"Stop":"Start")}),Bt("click",W,T),g(e,C),It()}re(["click"]);var Ue=m('<p class="goal-text svelte-1qbe2oo"> </p>'),We=m('<span class="summarizing svelte-1qbe2oo">Analyzing…</span>'),Je=m('<span class="summary-text svelte-1qbe2oo"> </span>'),Ve=m('<span class="summary-fallback svelte-1qbe2oo"> </span>'),He=m('<span class="stat stat-error svelte-1qbe2oo"> </span>'),Xe=m('<div class="card svelte-1qbe2oo" role="button" tabindex="0"><div class="card-header svelte-1qbe2oo"><span class="project-name svelte-1qbe2oo"> </span> <!></div> <!> <div class="summary-row svelte-1qbe2oo"><!></div> <div class="stats-row svelte-1qbe2oo"><span class="stat svelte-1qbe2oo"><span></span> </span> <span class="stat svelte-1qbe2oo"> </span> <!> <span class="stat stat-path svelte-1qbe2oo"> </span></div></div>');function $t(e,t){Nt(t,!0);function r(d){const f=Math.floor(d/1e3);if(f<60)return`${f}s`;const c=Math.floor(f/60);return c<60?`${c}m ${f%60}s`:`${Math.floor(c/60)}h ${c%60}m`}function i(d){const f=d.replace(/\/$/,"").split("/");return f.length<=2?d:f.slice(-2).join("/")}const a=U(()=>t.card.status==="running"&&t.card.isActive?"var(--ds-green-700)":t.card.status==="running"?"var(--ds-blue-700)":t.card.status==="idle"?"var(--ds-amber-700)":t.card.status==="error"?"var(--ds-red-700)":"var(--ds-gray-600)"),n=U(()=>t.card.status==="running"&&t.card.isActive||t.card.status==="running"?"● Running":t.card.status==="idle"?"◎ Idle":t.card.status==="exited"?"○ Done":t.card.status==="error"?"✕ Error":t.card.status),w=U(()=>t.card.status==="running"&&t.card.isActive?"status-pill status-pill--running-active":t.card.status==="running"?"status-pill status-pill--running":t.card.status==="idle"?"status-pill status-pill--idle":t.card.status==="exited"?"status-pill status-pill--exited":t.card.status==="error"?"status-pill status-pill--error":"status-pill"),x=U(()=>t.card.toolCallCount===0?"Waiting for activity…":t.card.toolCallCount===1?"1 tool call so far":`${t.card.toolCallCount} tool calls so far`);function T(d){(d.key==="Enter"||d.key===" ")&&(d.key===" "&&d.preventDefault(),t.onclick?.())}var k=Xe(),S=l(k),p=l(S),C=l(p,!0);o(p);var z=v(p,2);oe(z,{get text(){return s(n)},get classes(){return s(w)}}),o(S);var N=v(S,2);{var ht=d=>{var f=Ue(),c=l(f,!0);o(f),q(()=>y(c,t.card.goal)),g(d,f)};P(N,d=>{t.card.goal&&d(ht)})}var rt=v(N,2),W=l(rt);{var _t=d=>{var f=We();g(d,f)},nt=d=>{var f=Je(),c=l(f,!0);o(f),q(()=>y(c,t.card.summary)),g(d,f)},ot=d=>{var f=Ve(),c=l(f,!0);o(f),q(()=>y(c,s(x))),g(d,f)};P(W,d=>{t.card.isSummarizing?d(_t):t.card.summary?d(nt,1):t.card.status==="running"&&d(ot,2)})}o(rt);var tt=v(rt,2),u=l(tt),h=l(u),L=v(h);o(u);var D=v(u,2),ut=l(D);o(D);var Z=v(D,2);{var it=d=>{var f=He(),c=l(f);o(f),q(()=>y(c,`${t.card.errorCount??""} errors`)),g(d,f)};P(Z,d=>{t.card.errorCount>0&&d(it)})}var Q=v(Z,2),St=l(Q,!0);o(Q),o(tt),o(k),q((d,f)=>{be(k,`--status-color: ${s(a)??""}`),gt(k,"aria-label",`Open ${t.card.projectName??""} session`),y(C,t.card.projectName),Mt(h,1,qt(t.card.status==="running"&&t.card.isActive?"status-dot-active":"status-dot-static"),"svelte-1qbe2oo"),y(L,` ${d??""}`),y(ut,`${t.card.toolCallCount??""} tools`),gt(Q,"title",t.card.cwd),y(St,f)},[()=>r(t.card.duration),()=>i(t.card.cwd)]),Bt("click",k,function(...d){t.onclick?.apply(this,d)}),Bt("keydown",k,T),g(e,k),It()}re(["click","keydown"]);var Ze=m('<div class="section svelte-14sxgtb"><h3 class="section-label svelte-14sxgtb">Active</h3> <!></div>'),Qe=m('<div class="section svelte-14sxgtb"><h3 class="section-label svelte-14sxgtb">Recent</h3> <!></div>'),$e=m("<!> <!>",1);function ta(e,t){Nt(t,!0);const r=U(()=>t.cards.filter(S=>S.status==="running")),i=U(()=>t.cards.filter(S=>S.status!=="running"));function a(S){t.onCardClick?.(S)}var n=$e(),w=kt(n);{var x=S=>{var p=Ze(),C=v(l(p),2);ct(C,17,()=>s(r),z=>z.terminalId,(z,N)=>{$t(z,{get card(){return s(N)},onclick:()=>{a(s(N))}})}),o(p),g(S,p)};P(w,S=>{s(r).length>0&&S(x)})}var T=v(w,2);{var k=S=>{var p=Qe(),C=v(l(p),2);ct(C,17,()=>s(i),z=>z.terminalId,(z,N)=>{$t(z,{get card(){return s(N)},onclick:()=>{a(s(N))}})}),o(p),g(S,p)};P(T,S=>{s(i).length>0&&S(k)})}g(e,n),It()}const ea=new Set(["agent-question","terminal-exited","tool-failed"]);let xt=null,At=null,Ct=null;class aa{async summarize(t){const r=this.chooseTone(t),i=r==="conversational"?this.buildConversationalPrompt(t):this.buildStatusReportPrompt(t);try{const a=await sa();if(!a)return console.log("[SessionSummarizer] NeuroLink not available, using fallback."),{generatedAt:new Date().toISOString(),text:this.fallbackText(t),tone:r};const n=await a.generate({input:{text:i},...Ct?{model:Ct.model,provider:Ct.provider}:{}}),w=na(n.content??"").trim()||this.fallbackText(t);return{generatedAt:new Date().toISOString(),text:w,tone:r}}catch(a){return console.warn("[SessionSummarizer] summarize failed:",a instanceof Error?a.message:String(a)),{generatedAt:new Date().toISOString(),text:this.fallbackText(t),tone:r}}}buildConversationalPrompt(t){const r=t.goal??"unknown",i=t.recentEvents.map(a=>{const n=[a.type];return a.tool&&n.push(`tool=${a.tool}`),a.error&&n.push(`error=${a.error}`),a.command&&n.push(`command=${a.command}`),n.join(" ")}).join(", ");return`You are monitoring a coding session. Based on the context below, write ONE sentence (max 100 chars) describing what's happening in plain English. Be specific about what Claude did or is doing.
|
|
2
|
-
|
|
3
|
-
Goal: ${r}
|
|
4
|
-
Recent events: ${i}
|
|
5
|
-
Conversation excerpt: ${t.conversationExcerpt}
|
|
6
|
-
Status: ${t.status}
|
|
7
|
-
|
|
8
|
-
One sentence only, no quotes, no markdown.`}buildStatusReportPrompt(t){return`You are monitoring a coding session. Write a brief status update (max 60 chars) in the format "Doing X, Y done". Focus on the action.
|
|
9
|
-
|
|
10
|
-
Recent tool calls: ${t.recentEvents.flatMap(i=>i.tool?[i.tool]:[]).join(", ")||"none"}
|
|
11
|
-
Status: ${t.status}
|
|
12
|
-
|
|
13
|
-
Short phrase only, no quotes.`}chooseTone(t){return t.status==="error"||t.errorCount>0||t.recentEvents.some(i=>ea.has(i.type))?"conversational":"status-report"}fallbackText(t){const r=t.recentEvents.flatMap(a=>a.tool?[a.tool]:[]),i=[...new Set(r)];return i.length>0?`Running: ${i.join(", ")} (${t.toolCallCount} tools)`:`Status: ${t.status} — ${t.toolCallCount} tool calls`}}async function sa(){if(At)return At;De();const t=(await ra()).NeuroLink;if(!t)return null;const r=window.__aiProviders,i=window.process?.env?.NEUROLINK_PROVIDER,a=je(r,i);if(!a)return console.warn("[SessionSummarizer] No AI provider configured"),null;const n=window.process;return n?.env&&r&&(r["google-ai"]&&!n.env.GOOGLE_AI_API_KEY&&(n.env.GOOGLE_AI_API_KEY="proxy-via-server"),r.anthropic&&!n.env.ANTHROPIC_API_KEY&&(n.env.ANTHROPIC_API_KEY="proxy-via-server"),r.openai&&!n.env.OPENAI_API_KEY&&(n.env.OPENAI_API_KEY="proxy-via-server"),r.mistral&&!n.env.MISTRAL_API_KEY&&(n.env.MISTRAL_API_KEY="proxy-via-server")),At=new t({provider:a.provider}),Ct=a,console.log(`[SessionSummarizer] Using provider: ${a.provider}/${a.model}`),At}function ra(){return xt||(xt=import(Oe).catch(e=>{throw console.warn("[SessionSummarizer] Failed to load NeuroLink SDK:",e),xt=null,e})),xt}function na(e){return typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):""}function Ft(){return new Date(Date.now()).toISOString()}const oa=100,ia=15e3,la=3e4,le=2e3,ca=3e4;let X=H(Kt([])),yt=H(!1),F=null,mt=null,pt=null,Et=le,ua=0,at="";const wt=new Yt,st=new Yt,zt=new Te;async function da(e){at=e||ma(),at&&(await ae(at),await ue(at),mt&&clearInterval(mt),mt=setInterval(()=>{ae(at)},ia))}function va(){F&&(F.onclose=null,F.close(),F=null),mt&&(clearInterval(mt),mt=null),pt&&(clearTimeout(pt),pt=null);for(const[,e]of st)e.onclose=null,e.close();st.clear(),zt.clear(),wt.clear(),_(yt,!1),at=""}function fa(){const e=Date.now();return Gt(s(X)).map(t=>{const r=Date.parse(t.createdAt),i=t.events.length>0?Date.parse(t.events[t.events.length-1].timestamp):0;return{...t,duration:e-r,goal:t.goal,isActive:i>0&&e-i<la,isSummarizing:t.isSummarizing,summary:t.summary}})}function te(e,t){const r=s(X).find(i=>i.terminalId===e);r&&(r.goal=t)}function ga(e,t){const r=s(X).find(i=>i.terminalId===e);r&&(r.summary=t,r.summaryUpdatedAt=Ft(),r.isSummarizing=!1)}function ft(e,t,r){const i={data:r,id:`evt-${++ua}`,summarized:!1,terminalId:e.terminalId,timestamp:r.timestamp??Ft(),type:t},a=e.events.length>=oa?[...e.events.slice(1),i]:[...e.events,i];e.events=a,e.eventCount+=1}function ce(e){return e.split("/").filter(Boolean).pop()??e}function bt(e){const t=st.get(e);t&&(t.onclose=null,t.close(),st.delete(e))}async function ue(e){if(!(F&&F.readyState<=1))try{const t=await fetch("/api/ws-ticket",{headers:{Authorization:`Bearer ${e}`},method:"POST"});if(!t.ok){Lt(e);return}const{ticket:r}=await t.json(),i=window.location.origin.replace(/^http/,"ws");F=new WebSocket(`${i}/ws/events?ticket=${r}`),F.onopen=()=>{_(yt,!0),Et=le},F.onmessage=a=>{try{const n=JSON.parse(a.data);n&&typeof n=="object"&&pa(n)}catch{}},F.onclose=()=>{_(yt,!1),F=null,Lt(e)},F.onerror=()=>{_(yt,!1)}}catch{_(yt,!1),Lt(e)}}function ee(e){let t="";return typeof e=="string"?t=e:Array.isArray(e)&&(t=e.find(i=>i.type==="text")?.content??""),t.slice(0,200).trim()}async function ae(e){if(e)try{const t=await fetch("/api/terminals",{headers:{Authorization:`Bearer ${e}`}});if(!t.ok)return;const i=(await t.json()).terminals??[];_(X,Gt(_a(s(X),i)),!0)}catch{}}function ma(){try{const e=localStorage.getItem("shooter_config");if(!e)return"";const t=JSON.parse(e);if(t&&typeof t=="object"){const r=t;if(typeof r.apiKey=="string")return r.apiKey}}catch{}return""}function pa(e){const t=e.type;if(!t||t==="welcome")return;const r=e.terminalId??null;if(!r)return;const i=s(X).findIndex(w=>w.terminalId===r);if(i===-1)return;const a=s(X)[i];switch(t){case"agent-idle":case"agent-question":{a.status="idle",ft(a,t,e);break}case"terminal-exited":{a.status="exited",a.exitedAt=e.exitedAt??Ft(),ft(a,t,e),bt(r),wt.delete(r);break}case"tool-completed":{ft(a,t,e);break}case"tool-failed":{a.errorCount+=1,ft(a,t,e);break}case"tool-started":{a.toolCallCount+=1,a.status="running",ft(a,t,e);break}default:{ft(a,t,e);break}}(t==="tool-failed"||t==="agent-question"||a.errorCount>=3||a.eventCount>0&&a.eventCount%20===0)&&!a.isSummarizing&&Sa(a),_(X,Gt(s(X)),!0)}function ha(e){return{command:e.command,createdAt:e.createdAt,cwd:e.cwd,errorCount:0,eventCount:0,events:[],exitedAt:e.exitedAt,goal:"",isSummarizing:!1,projectName:ce(e.cwd),projectPath:e.cwd,status:de(e.status),summary:"",summaryUpdatedAt:"",terminalId:e.id,toolCallCount:0}}function de(e){return e==="running"?"running":e==="idle"?"idle":e==="exited"?"exited":"error"}function _a(e,t){const r=new Set(t.map(a=>a.id));for(const a of e)r.has(a.terminalId)||(bt(a.terminalId),wt.delete(a.terminalId));const i=new Yt;for(const a of e)r.has(a.terminalId)&&i.set(a.terminalId,a);for(const a of t){const n=i.get(a.id);n?(n.command=a.command,n.cwd=a.cwd,n.projectName=ce(a.cwd),n.projectPath=a.cwd,n.exitedAt=a.exitedAt,n.status!=="error"&&(n.status=de(a.status)),n.goal||se(a.id)):(i.set(a.id,ha(a)),se(a.id))}return Array.from(i.values())}async function se(e){if(at&&!(st.has(e)||zt.has(e))){zt.add(e),console.log(`[DashboardStore] Opening session socket for ${e}`);try{const t=await fetch("/api/ws-ticket",{headers:{Authorization:`Bearer ${at}`},method:"POST"});if(!t.ok){console.warn(`[DashboardStore] Failed to get WS ticket for ${e}:`,t.status);return}const{ticket:r}=await t.json(),a=`${window.location.origin.replace(/^http/,"ws")}/ws/session/${e}?ticket=${r}`;console.log(`[DashboardStore] Connecting session socket for ${e}`);const n=new WebSocket(a);st.set(e,n),n.onopen=()=>{console.log(`[DashboardStore] Session socket opened for ${e}`)},n.onmessage=w=>{try{const x=JSON.parse(w.data);if(!x||typeof x!="object")return;const T=x,k=s(X).find(p=>p.terminalId===e),S=k?.goal&&k.goal.length>0;if(T.type==="history"){console.log(`[DashboardStore] Received history for ${e}, extracting goal...`);const p=T.messages;if(!Array.isArray(p)){console.warn(`[DashboardStore] No messages array in history for ${e}`);return}console.log(`[DashboardStore] Found ${p.length} messages, looking for first user message...`);for(const C of p)if(C.role==="user"){const z=ee(C.content);console.log(`[DashboardStore] Extracted goal for ${e}: "${z.substring(0,50)}..."`),z&&te(e,z),bt(e);return}console.log(`[DashboardStore] No user message found in history for ${e}`);return}if(T.type==="message"&&T.role==="user"&&!S){const p=ee(T.content);p&&(console.log(`[DashboardStore] Extracted goal from message for ${e}: "${p.substring(0,50)}..."`),te(e,p),bt(e));return}if(!S)return;bt(e)}catch(x){console.warn("[DashboardStore] Error processing session message:",x)}},n.onclose=()=>{console.log(`[DashboardStore] Session socket closed for ${e}`),st.delete(e)},n.onerror=w=>{console.warn(`[DashboardStore] Session socket error for ${e}:`,w),st.delete(e)}}catch(t){console.warn("[DashboardStore] Failed to open session socket:",t)}finally{zt.delete(e)}}}function Lt(e){pt||(pt=setTimeout(()=>{pt=null,ue(e)},Et),Et=Math.min(Et*2,ca))}function Gt(e){return[...e].sort((t,r)=>{const i={error:2,exited:3,idle:1,running:0},a=i[t.status],n=i[r.status];if(a!==n)return a-n;if(t.status!=="exited"&&r.status!=="exited")return r.createdAt.localeCompare(t.createdAt);const w=t.exitedAt??t.createdAt;return(r.exitedAt??r.createdAt).localeCompare(w)})}function Sa(e){e.isSummarizing=!0;let t=wt.get(e.terminalId);t||(t=new aa,wt.set(e.terminalId,t));const r=e.events.slice(-10).map(a=>({command:typeof a.data.command=="string"?a.data.command:null,error:typeof a.data.error=="string"?a.data.error:null,tool:typeof a.data.tool=="string"?a.data.tool:null,type:a.type})),i={conversationExcerpt:e.goal??"",errorCount:e.errorCount,goal:e.goal,recentEvents:r,status:e.status,toolCallCount:e.toolCallCount};(async()=>{try{const a=await t.summarize(i);ga(e.terminalId,a.text)}catch(a){console.error(`[dashboard] Summarization failed for ${e.terminalId}:`,a)}finally{e.isSummarizing=!1}})()}var ya=m('<meta name="description" content="Active terminals and Claude Code sessions"/>'),ba=m("<!> Refresh",1),wa=m('<div class="stat-chip stat-chip-active svelte-1uha8ag"><span class="stat-value svelte-1uha8ag"> </span> <span class="stat-label svelte-1uha8ag">active</span></div>'),xa=m('<div class="stats-bar svelte-1uha8ag"><div class="stat-chip svelte-1uha8ag"><span class="stat-value svelte-1uha8ag"> </span> <span class="stat-label svelte-1uha8ag"> </span></div> <div class="stat-chip svelte-1uha8ag"><span class="stat-value svelte-1uha8ag"> </span> <span class="stat-label svelte-1uha8ag"> </span></div> <!></div>'),Aa=m('<div class="loading-container"></div>'),ka=m('<div class="dashboard-section svelte-1uha8ag"><!></div>'),Ca=m('<div class="loading-container"></div>'),Ea=m('<h3 class="section-label svelte-1uha8ag">Sessions</h3>'),za=m('<a class="session-card"><div class="session-card-header"><div><h3 class="session-card-title"> </h3> <div class="session-card-subtitle"> </div></div> <!></div> <div class="session-stats"><span><strong> </strong> </span></div></a>'),Na=m('<div style="text-align: center; padding: 1rem;"><!></div>'),Ia=m('<!> <div class="projects-container svelte-1uha8ag"></div> <!>',1),Pa=m("<!> <!> <!>",1),Ta=m('<main class="main"><div class="page-header"><div class="page-header-content"><div><h1 class="page-title">Dashboard</h1> <p class="page-description">Active terminals and Claude Code sessions</p></div> <div class="page-actions"><!></div></div> <!></div> <!> <!></main>');function Ha(e,t){Nt(t,!0);const r=1e4,i=20;let a=H(Kt([])),n=H(!1),w=!1,x=H(null),T=null,k=H(null),S=H(!1),p=H(0);const C=U(fa);ne(()=>{z();const c=Ne("shooter_projects");c&&(_(a,c,!0),_(n,!1)),N(),T=setInterval(()=>{s(x)?.apiKey&&s(p)<=i&&N()},r)}),_e(()=>{T&&(clearInterval(T),T=null),va()});function z(){try{const c=localStorage.getItem("shooter_config");if(c){const b=JSON.parse(c);Pe(b)?(_(x,b,!0),da(s(x).apiKey)):(localStorage.removeItem("shooter_config"),_(x,null))}}catch{}}async function N(c=!1,b=!1){if(!s(x)?.apiKey||w)return;w=!0,s(a).length===0&&_(n,!0);const E=c?s(p):0;try{const J=await fetch(`${b?"/api/sessions?refresh=true&":"/api/sessions?"}limit=${i}&offset=${E}`,{headers:{Authorization:`Bearer ${s(x).apiKey}`}});if(!J.ok){_(k,`Failed to load projects (HTTP ${J.status})`);return}_(k,null);const G=await J.json();c?_(a,[...s(a),...G.projects],!0):_(a,G.projects,!0),_(p,s(a).length,!0),_(S,G.total!==void 0?s(a).length<G.total:!1,!0),ze("shooter_projects",s(a))}catch(j){_(k,"Failed to load projects"),console.error("Failed to fetch sessions:",j)}finally{_(n,!1),w=!1}}async function ht(){await N(!0)}async function rt(){_(n,!0),Ee("shooter_projects"),await N(!1,!0)}function W(){Xt("/config")}function _t(c){Xt(`/terminals/${c}`)}function nt(){return s(a).reduce((c,b)=>c+b.sessionCount,0)}var ot=Ta();xe("1uha8ag",c=>{var b=ya();Se(()=>{ye.title="Dashboard - Shooter"}),g(c,b)});var tt=l(ot),u=l(tt),h=v(l(u),2),L=l(h);jt(L,{classes:"btn-secondary",onclick:rt,get disabled(){return s(n)},children:(c,b)=>{var E=ba(),j=kt(E);Rt(j,{get svg(){return ke},classes:"icon-14"}),Vt(),g(c,E)},$$slots:{default:!0}}),o(h),o(u);var D=v(u,2);{var ut=c=>{var b=xa(),E=l(b),j=l(E),J=l(j,!0);o(j);var G=v(j,2),B=l(G,!0);o(G),o(E);var M=v(E,2),V=l(M),lt=l(V,!0);o(V);var A=v(V,2),I=l(A,!0);o(A),o(M);var O=v(M,2);{var et=K=>{var $=wa(),dt=l($),R=l(dt,!0);o(dt),Vt(2),o($),q(()=>y(R,s(C).length)),g(K,$)};P(O,K=>{s(C).length>0&&K(et)})}o(b),q((K,$)=>{y(J,s(a).length),y(B,s(a).length===1?"project":"projects"),y(lt,K),y(I,$)},[()=>nt(),()=>nt()===1?"session":"sessions"]),g(c,b)};P(D,c=>{s(a).length>0&&c(ut)})}o(tt);var Z=v(tt,2);{var it=c=>{we(c,{get text(){return s(k)},classes:"banner-error"})};P(Z,c=>{s(k)&&c(it)})}var Q=v(Z,2);{var St=c=>{var b=Aa();ct(b,20,()=>Array(3),Ht,(E,j)=>{Zt(E,{classes:"shimmer-card"})}),o(b),g(c,b)},d=c=>{Qt(c,{title:"Configuration Required",description:"Set up your API credentials to start tracking sessions",icon:E=>{Rt(E,{get svg(){return Ce},classes:"icon-24"})},children:(E,j)=>{jt(E,{classes:"btn-primary",onclick:W,text:"Configure Settings"})}})},f=c=>{var b=Pa(),E=kt(b);Ge(E,{});var j=v(E,2);{var J=A=>{var I=ka(),O=l(I);ta(O,{get cards(){return s(C)},onCardClick:et=>{_t(et.terminalId)}}),o(I),g(A,I)};P(j,A=>{s(C).length>0&&A(J)})}var G=v(j,2);{var B=A=>{var I=Ca();ct(I,20,()=>Array(3),Ht,(O,et)=>{Zt(O,{classes:"shimmer-card"})}),o(I),g(A,I)},M=A=>{Qt(A,{title:"No sessions yet",description:"Claude Code sessions will appear here once JSONL files are found",icon:O=>{Rt(O,{get svg(){return Ae},classes:"icon-24"})}})},V=U(()=>nt()===0&&s(C).length===0),lt=A=>{var I=Ia(),O=kt(I);{var et=R=>{var Y=Ea();g(R,Y)};P(O,R=>{s(C).length>0&&R(et)})}var K=v(O,2);ct(K,21,()=>s(a),R=>R.id,(R,Y)=>{var vt=za(),Pt=l(vt),Tt=l(Pt),Dt=l(Tt),ve=l(Dt,!0);o(Dt);var Ut=v(Dt,2),fe=l(Ut,!0);o(Ut),o(Tt);var ge=v(Tt,2);{let he=U(()=>ie(s(Y).lastModified));oe(ge,{get text(){return`Last updated ${s(he)??""}`},classes:"pill-session-time"})}o(Pt);var Wt=v(Pt,2),Jt=l(Wt),Ot=l(Jt),me=l(Ot,!0);o(Ot);var pe=v(Ot);o(Jt),o(Wt),o(vt),q(()=>{gt(vt,"href",`/project?id=${s(Y).id??""}`),y(ve,s(Y).name),y(fe,s(Y).fullPath),y(me,s(Y).sessionCount),y(pe,` ${s(Y).sessionCount===1?"session":"sessions"}`)}),g(R,vt)}),o(K);var $=v(K,2);{var dt=R=>{var Y=Na(),vt=l(Y);jt(vt,{classes:"btn-secondary",onclick:ht,text:"Load More"}),o(Y),g(R,Y)};P($,R=>{s(S)&&R(dt)})}g(A,I)};P(G,A=>{s(n)&&s(a).length===0?A(B):s(V)?A(M,1):s(a).length>0&&A(lt,2)})}g(c,b)};P(Q,c=>{s(n)&&s(a).length===0&&s(C).length===0?c(St):s(x)?.apiKey?c(f,-1):c(d,1)})}o(ot),g(e,ot),It()}export{Ha as component};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
import { aw as head, au as escape_html, a6 as derived, ax as ensure_array_like } from './index-CoYB03g7.js';
|
|
2
|
-
import { g as goto } from './client-Ds1brw-8.js';
|
|
3
|
-
import { E as EmptyState, R as RefreshSvg, c as clearCache } from './cache-BlMaDsHi.js';
|
|
4
|
-
import { S as SettingsSvg } from './settings-Dv3Esboo.js';
|
|
5
|
-
import './markdown-W_mTBct0.js';
|
|
6
|
-
import { o as onDestroy } from './index-server-Bq3cnK69.js';
|
|
7
|
-
import { B as Button } from './Button-D0hZ7JYt.js';
|
|
8
|
-
import { I as Icon } from './Icon-D0GBnDcs.js';
|
|
9
|
-
import { S as Shimmer } from './Shimmer-Dw2uvTC1.js';
|
|
10
|
-
import { S as SvelteMap, a as SvelteSet } from './index-server2-BJrT0wnA.js';
|
|
11
|
-
import './root-D4IoFC8F.js';
|
|
12
|
-
import './index2-dSGQ9Eaa.js';
|
|
13
|
-
import './state.svelte-CmHqngc_.js';
|
|
14
|
-
import 'dompurify';
|
|
15
|
-
import 'marked';
|
|
16
|
-
|
|
17
|
-
const ACTIVE_THRESHOLD_MS = 3e4;
|
|
18
|
-
let sessions = [];
|
|
19
|
-
const summarizers = new SvelteMap();
|
|
20
|
-
const sessionSockets = new SvelteMap();
|
|
21
|
-
const pendingSessionSockets = new SvelteSet();
|
|
22
|
-
function disconnect() {
|
|
23
|
-
for (const [, sock] of sessionSockets) {
|
|
24
|
-
sock.onclose = null;
|
|
25
|
-
sock.close();
|
|
26
|
-
}
|
|
27
|
-
sessionSockets.clear();
|
|
28
|
-
pendingSessionSockets.clear();
|
|
29
|
-
summarizers.clear();
|
|
30
|
-
}
|
|
31
|
-
function getCards() {
|
|
32
|
-
const now = Date.now();
|
|
33
|
-
return sortSessions(sessions).map((s) => {
|
|
34
|
-
const createdMs = Date.parse(s.createdAt);
|
|
35
|
-
const lastEventTs = s.events.length > 0 ? Date.parse(s.events[s.events.length - 1].timestamp) : 0;
|
|
36
|
-
return {
|
|
37
|
-
...s,
|
|
38
|
-
duration: now - createdMs,
|
|
39
|
-
goal: s.goal,
|
|
40
|
-
// Ensure goal is mapped
|
|
41
|
-
isActive: lastEventTs > 0 && now - lastEventTs < ACTIVE_THRESHOLD_MS,
|
|
42
|
-
isSummarizing: s.isSummarizing,
|
|
43
|
-
// Ensure isSummarizing is mapped
|
|
44
|
-
summary: s.summary
|
|
45
|
-
// Ensure summary is mapped
|
|
46
|
-
};
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
function sortSessions(list) {
|
|
50
|
-
return [...list].sort((a, b) => {
|
|
51
|
-
const order = { error: 2, exited: 3, idle: 1, running: 0 };
|
|
52
|
-
const rankA = order[a.status];
|
|
53
|
-
const rankB = order[b.status];
|
|
54
|
-
if (rankA !== rankB) {
|
|
55
|
-
return rankA - rankB;
|
|
56
|
-
}
|
|
57
|
-
if (a.status !== "exited" && b.status !== "exited") {
|
|
58
|
-
return b.createdAt.localeCompare(a.createdAt);
|
|
59
|
-
}
|
|
60
|
-
const exitA = a.exitedAt ?? a.createdAt;
|
|
61
|
-
const exitB = b.exitedAt ?? b.createdAt;
|
|
62
|
-
return exitB.localeCompare(exitA);
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
function _page($$renderer, $$props) {
|
|
66
|
-
$$renderer.component(($$renderer2) => {
|
|
67
|
-
let projects = [];
|
|
68
|
-
let loading = false;
|
|
69
|
-
const cards = derived(getCards);
|
|
70
|
-
onDestroy(() => {
|
|
71
|
-
disconnect();
|
|
72
|
-
});
|
|
73
|
-
async function fetchSessions(append = false, bustCache = false) {
|
|
74
|
-
{
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
async function forceRefresh() {
|
|
79
|
-
loading = true;
|
|
80
|
-
clearCache("shooter_projects");
|
|
81
|
-
await fetchSessions(false, true);
|
|
82
|
-
}
|
|
83
|
-
function navigateToConfig() {
|
|
84
|
-
void goto();
|
|
85
|
-
}
|
|
86
|
-
function totalSessionCount() {
|
|
87
|
-
return projects.reduce((sum, p) => sum + p.sessionCount, 0);
|
|
88
|
-
}
|
|
89
|
-
head("1uha8ag", $$renderer2, ($$renderer3) => {
|
|
90
|
-
$$renderer3.title(($$renderer4) => {
|
|
91
|
-
$$renderer4.push(`<title>Dashboard - Shooter</title>`);
|
|
92
|
-
});
|
|
93
|
-
$$renderer3.push(`<meta name="description" content="Active terminals and Claude Code sessions"/>`);
|
|
94
|
-
});
|
|
95
|
-
$$renderer2.push(`<main class="main"><div class="page-header"><div class="page-header-content"><div><h1 class="page-title">Dashboard</h1> <p class="page-description">Active terminals and Claude Code sessions</p></div> <div class="page-actions">`);
|
|
96
|
-
Button($$renderer2, {
|
|
97
|
-
classes: "btn-secondary",
|
|
98
|
-
onclick: forceRefresh,
|
|
99
|
-
disabled: loading,
|
|
100
|
-
children: ($$renderer3) => {
|
|
101
|
-
Icon($$renderer3, { svg: RefreshSvg, classes: "icon-14" });
|
|
102
|
-
$$renderer3.push(`<!----> Refresh`);
|
|
103
|
-
},
|
|
104
|
-
$$slots: { default: true }
|
|
105
|
-
});
|
|
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> `);
|
|
121
|
-
{
|
|
122
|
-
$$renderer2.push("<!--[-1-->");
|
|
123
|
-
}
|
|
124
|
-
$$renderer2.push(`<!--]--> `);
|
|
125
|
-
if (loading && projects.length === 0 && cards().length === 0) {
|
|
126
|
-
$$renderer2.push("<!--[0-->");
|
|
127
|
-
$$renderer2.push(`<div class="loading-container"><!--[-->`);
|
|
128
|
-
const each_array = ensure_array_like(Array(3));
|
|
129
|
-
for (let i = 0, $$length = each_array.length; i < $$length; i++) {
|
|
130
|
-
each_array[i];
|
|
131
|
-
Shimmer($$renderer2, { classes: "shimmer-card" });
|
|
132
|
-
}
|
|
133
|
-
$$renderer2.push(`<!--]--></div>`);
|
|
134
|
-
} else {
|
|
135
|
-
$$renderer2.push("<!--[1-->");
|
|
136
|
-
{
|
|
137
|
-
let icon = function($$renderer3) {
|
|
138
|
-
Icon($$renderer3, { svg: SettingsSvg, classes: "icon-24" });
|
|
139
|
-
};
|
|
140
|
-
EmptyState($$renderer2, {
|
|
141
|
-
title: "Configuration Required",
|
|
142
|
-
description: "Set up your API credentials to start tracking sessions",
|
|
143
|
-
icon,
|
|
144
|
-
children: ($$renderer3) => {
|
|
145
|
-
Button($$renderer3, {
|
|
146
|
-
classes: "btn-primary",
|
|
147
|
-
onclick: navigateToConfig,
|
|
148
|
-
text: "Configure Settings"
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
$$renderer2.push(`<!--]--></main>`);
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
export { _page as default };
|
|
159
|
-
//# sourceMappingURL=_page.svelte-tBuIq8Pg.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"_page.svelte-tBuIq8Pg.js","sources":["../../../.svelte-kit/adapter-node/entries/pages/_page.svelte.js"],"sourcesContent":["import { ad as head, ab as escape_html, a1 as derived, ae as ensure_array_like } from \"../../chunks/index.js\";\nimport { g as goto } from \"../../chunks/client.js\";\nimport { R as RefreshSvg, E as EmptyState, c as clearCache } from \"../../chunks/cache.js\";\nimport { S as SettingsSvg } from \"../../chunks/settings.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 { I as Icon } from \"../../chunks/Icon.js\";\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\"><div class=\"page-header-content\"><div><h1 class=\"page-title\">Dashboard</h1> <p class=\"page-description\">Active terminals and Claude Code sessions</p></div> <div class=\"page-actions\">`);\n Button($$renderer2, {\n classes: \"btn-secondary\",\n onclick: forceRefresh,\n disabled: loading,\n children: ($$renderer3) => {\n Icon($$renderer3, { svg: RefreshSvg, classes: \"icon-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 {\n let icon = function($$renderer3) {\n Icon($$renderer3, { svg: SettingsSvg, classes: \"icon-24\" });\n };\n EmptyState($$renderer2, {\n title: \"Configuration Required\",\n description: \"Set up your API credentials to start tracking sessions\",\n icon,\n children: ($$renderer3) => {\n Button($$renderer3, {\n classes: \"btn-primary\",\n onclick: navigateToConfig,\n text: \"Configure Settings\"\n });\n }\n });\n }\n }\n $$renderer2.push(`<!--]--></main>`);\n });\n}\nexport {\n _page as default\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"_server.ts-BWVlO8iV.js","sources":["../../../.svelte-kit/adapter-node/entries/endpoints/api/notify/_server.ts.js"],"sourcesContent":["import { b as private_env } from \"../../../../chunks/shared-server.js\";\nimport { L as LibraryAPNsService } from \"../../../../chunks/library-apns.js\";\nimport { c as createPendingRequest } from \"../../../../chunks/pending-requests.js\";\nimport { v as validateAuth } from \"../../../../chunks/auth.js\";\nimport admin from \"firebase-admin\";\nimport { t as toErrorMessage } from \"../../../../chunks/error.js\";\nimport { b as broadcastEvent } from \"../../../../chunks/guest-registry.js\";\nimport { existsSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport \"../../../../chunks/super-session-handler.js\";\nimport { json } from \"@sveltejs/kit\";\nconst MAX_HISTORY = 100;\nconst history = [];\nfunction addNotification(record) {\n history.unshift(record);\n if (history.length > MAX_HISTORY) {\n history.length = MAX_HISTORY;\n }\n}\nfunction getNotifications(limit = 50) {\n return history.slice(0, limit);\n}\nlet app = null;\nfunction isFCMConfigured() {\n return !!(process.env.FCM_PROJECT_ID && process.env.FCM_CLIENT_EMAIL && process.env.FCM_PRIVATE_KEY);\n}\nasync function sendFCMNotification(deviceToken, payload) {\n try {\n const fcmApp = getApp();\n const message = {\n android: {\n priority: \"high\",\n // Ensures delivery even in Doze mode\n ttl: 3e5\n // 5 minutes TTL (matches pending request expiry)\n },\n data: {\n body: payload.body || payload.message || \"\",\n category: payload.category ?? (typeof payload.data?.category === \"string\" ? payload.data.category : \"\"),\n project: typeof payload.data?.project === \"string\" ? payload.data.project : \"\",\n requestId: typeof payload.data?.requestId === \"string\" ? payload.data.requestId : \"\",\n source: typeof payload.data?.source === \"string\" ? payload.data.source : \"\",\n subtitle: payload.subtitle ?? \"\",\n timestamp: (/* @__PURE__ */ new Date()).toISOString(),\n title: payload.title,\n toolInput: payload.data?.toolInput ? JSON.stringify(payload.data.toolInput) : \"\",\n toolName: typeof payload.data?.toolName === \"string\" ? payload.data.toolName : \"\",\n type: typeof payload.data?.type === \"string\" ? payload.data.type : \"\"\n },\n token: deviceToken\n };\n const messageId = await admin.messaging(fcmApp).send(message);\n return { messageId, success: true };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(\"[FCM] Send failed:\", errorMessage);\n return { error: errorMessage, success: false };\n }\n}\nfunction getApp() {\n if (!app) {\n const projectId = process.env.FCM_PROJECT_ID;\n const clientEmail = process.env.FCM_CLIENT_EMAIL;\n const privateKey = process.env.FCM_PRIVATE_KEY?.replace(/\\\\n/g, \"\\n\");\n if (!projectId || !clientEmail || !privateKey) {\n throw new Error(\n \"FCM not configured: missing FCM_PROJECT_ID, FCM_CLIENT_EMAIL, or FCM_PRIVATE_KEY\"\n );\n }\n app = admin.initializeApp({\n credential: admin.credential.cert({ clientEmail, privateKey, projectId })\n });\n }\n return app;\n}\nfunction readPersistedDeviceToken(platform) {\n const tokensFile = join(homedir(), \".shooter\", \"device-tokens.json\");\n if (!existsSync(tokensFile)) {\n return void 0;\n }\n try {\n const parsed = JSON.parse(readFileSync(tokensFile, \"utf-8\"));\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n const value = parsed[platform];\n return typeof value === \"string\" && value ? value : void 0;\n }\n } catch {\n }\n return void 0;\n}\nlet apnsSingleton = null;\nfunction getAPNsClient() {\n if (!apnsSingleton) {\n apnsSingleton = new LibraryAPNsService();\n }\n return apnsSingleton;\n}\nconst notificationCache = /* @__PURE__ */ new Map();\nconst DEDUP_WINDOW = 1e4;\nfunction broadcastHookEvent(body) {\n const data = body.data ?? {};\n const eventType = typeof data.eventType === \"string\" ? data.eventType : typeof body.eventType === \"string\" ? body.eventType : \"\";\n const tool = typeof data.tool === \"string\" ? data.tool : \"\";\n const terminalId = typeof data.terminalId === \"string\" ? data.terminalId : void 0;\n const sessionId = typeof data.sessionId === \"string\" ? data.sessionId : void 0;\n switch (eventType) {\n case \"error\":\n broadcastEvent({\n error: typeof data.error === \"string\" ? data.error : typeof data.message === \"string\" ? data.message : \"Unknown error\",\n terminalId,\n tool,\n type: \"tool-failed\"\n });\n break;\n case \"idle_input\":\n case \"session.idle\":\n broadcastEvent({\n message: typeof data.message === \"string\" ? data.message : \"\",\n sessionId,\n terminalId,\n type: \"agent-idle\"\n });\n break;\n case \"permission\":\n case \"permission_notification\":\n if (data.requestId && data.toolName) {\n broadcastEvent({\n input: typeof data.toolInput === \"object\" && data.toolInput !== null ? data.toolInput : {},\n requestId: data.requestId,\n tool: data.toolName,\n type: \"permission-requested\"\n });\n }\n break;\n case \"question\":\n broadcastEvent({\n message: typeof data.message === \"string\" ? data.message : \"\",\n sessionId,\n terminalId,\n type: \"agent-question\"\n });\n break;\n case \"tool.after\":\n broadcastEvent({ success: true, terminalId, tool, type: \"tool-completed\" });\n break;\n case \"tool.before\":\n broadcastEvent({\n command: typeof data.command === \"string\" ? data.command : \"\",\n filePath: typeof data.filePath === \"string\" ? data.filePath : typeof data.files === \"string\" ? data.files : \"\",\n terminalId,\n tool,\n type: \"tool-started\"\n });\n break;\n }\n}\nfunction buildNotificationRecord(id, title, message, status, data, error) {\n return {\n category: data?.category ?? null,\n data: data ?? null,\n error: error ?? null,\n id,\n message,\n project: data?.project ?? null,\n source: data?.source ?? null,\n status,\n timestamp: (/* @__PURE__ */ new Date()).toISOString(),\n title,\n tool: data?.tool ?? null\n };\n}\nfunction intelligentNotificationFilter(title, message, data, waitForResponse = false) {\n const source = data?.source || \"unknown\";\n if (isDuplicateNotification(title, message, data, waitForResponse)) {\n return {\n reason: \"Duplicate notification within 10-second window\",\n send: false\n };\n }\n if (source === \"smart-completion-detector\" || source === \"shooter-completion-detector\") {\n return {\n reason: \"Smart completion detector - completion or intervention needed\",\n send: true\n };\n }\n if (source === \"stop-hook\") {\n return {\n reason: \"Stop hook completion notification - session finished\",\n send: true\n };\n }\n const spamPatterns = [\n /PreToolUse/i,\n // Any PreToolUse notifications\n /PostToolUse/i,\n // Any PostToolUse notifications\n /^(Read|Write|Edit|Bash)\\s+Starting\\s*\\|\\s*\\w+$/i,\n // Only basic tool starting patterns\n /^unknown\\s*\\|\\s*\\w+$/i\n // Only \"unknown | projectname\" exactly\n ];\n const isSpam = spamPatterns.some((pattern) => pattern.test(title) || pattern.test(message));\n if (isSpam) {\n return {\n reason: \"Filtered spam notification from old hook system\",\n send: false\n };\n }\n const importantPatterns = [\n /session complete/i,\n /intervention needed/i,\n /error/i,\n /failed/i,\n /blocked/i,\n /attention/i\n ];\n const isImportant = importantPatterns.some(\n (pattern) => pattern.test(title) || pattern.test(message)\n );\n if (isImportant) {\n return {\n reason: \"Important notification - completion or intervention\",\n send: true\n };\n }\n return {\n reason: \"General notification - allowing by default\",\n send: true\n };\n}\nfunction isDuplicateNotification(title, message, data, waitForResponse = false) {\n if (waitForResponse) {\n return false;\n }\n const dataRecord = data;\n const key = dataRecord?.dedupKey ? dataRecord.dedupKey : `${title}|${message}|${data?.category || \"unknown\"}`;\n const now = Date.now();\n if (notificationCache.has(key)) {\n const lastSent = notificationCache.get(key) ?? 0;\n if (now - lastSent < DEDUP_WINDOW) {\n return true;\n }\n }\n for (const [k, v] of notificationCache.entries()) {\n if (now - v > DEDUP_WINDOW) {\n notificationCache.delete(k);\n }\n }\n return false;\n}\nfunction recordNotification(title, message, data) {\n const dataRecord = data;\n const key = dataRecord?.dedupKey ? dataRecord.dedupKey : `${title}|${message}|${data?.category || \"unknown\"}`;\n notificationCache.set(key, Date.now());\n}\nconst POST = async ({ request }) => {\n try {\n const apnsClient = getAPNsClient();\n const authError = validateAuth(request);\n if (authError) {\n return authError;\n }\n const rawBody = await request.json();\n if (!rawBody || typeof rawBody !== \"object\" || Array.isArray(rawBody)) {\n return json({ error: \"Request body must be a JSON object\" }, { status: 400 });\n }\n const body = rawBody;\n const data = body.data;\n const requestDeviceToken = body.deviceToken;\n const message = body.message;\n const title = body.title;\n const subtitle = typeof body.subtitle === \"string\" ? body.subtitle : void 0;\n const skipPush = typeof body.skipPush === \"boolean\" ? body.skipPush : false;\n const waitForResponse = typeof body.waitForResponse === \"boolean\" ? body.waitForResponse : false;\n const forcePush = typeof body.forcePush === \"boolean\" ? body.forcePush : false;\n const notificationCategory = typeof body.notificationCategory === \"string\" && body.notificationCategory.length > 0 ? body.notificationCategory : void 0;\n const question = typeof body.question === \"string\" ? body.question : void 0;\n const options = Array.isArray(body.options) && body.options.every((o) => o && typeof o === \"object\") ? body.options : void 0;\n const responseKindRaw = body.responseKind;\n const responseKind = responseKindRaw === \"hook\" || responseKindRaw === \"pty\" || responseKindRaw === \"info\" ? responseKindRaw : void 0;\n try {\n broadcastHookEvent(body);\n } catch {\n }\n if (!title || typeof title !== \"string\" || !message || typeof message !== \"string\") {\n return json({ error: \"Title and message are required and must be strings\" }, { status: 400 });\n }\n if (requestDeviceToken !== void 0 && typeof requestDeviceToken !== \"string\") {\n return json({ error: \"deviceToken must be a string\" }, { status: 400 });\n }\n const requestId = Math.random().toString(36).substring(2, 15);\n const dataRequestId = typeof data?.requestId === \"string\" ? data.requestId : void 0;\n const canonicalRequestId = dataRequestId || requestId;\n const shouldSendNotification = intelligentNotificationFilter(\n title,\n message,\n data,\n waitForResponse\n );\n if (!shouldSendNotification.send) {\n addNotification(\n buildNotificationRecord(\n canonicalRequestId,\n title,\n message,\n \"filtered\",\n data,\n shouldSendNotification.reason\n )\n );\n return json({\n message: \"Notification filtered (not sent)\",\n reason: shouldSendNotification.reason,\n success: true,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n });\n }\n if (skipPush && !forcePush) {\n if (waitForResponse) {\n createPendingRequest(canonicalRequestId, {\n options,\n question: question ?? null,\n responseKind: responseKind ?? \"hook\",\n sessionId: data?.sessionId || \"\",\n toolInput: data?.toolInput || {},\n toolName: data?.toolName || \"\"\n });\n }\n addNotification(buildNotificationRecord(canonicalRequestId, title, message, \"skipped\", data));\n return json({\n message: \"Push skipped (WebSocket clients connected)\",\n requestId: canonicalRequestId,\n success: true,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n });\n }\n const payload = {\n badge: 1,\n body: message,\n // notificationCategory wins when explicitly set so plan-mode /\n // elicitation flows can pick CLAUDE_PLAN_APPROVAL / CHOICE_2..4.\n // Falls back to CLAUDE_PERMISSION for the legacy bidirectional\n // permission flow when only waitForResponse is provided.\n category: notificationCategory ?? (waitForResponse ? \"CLAUDE_PERMISSION\" : void 0),\n data: {\n ...data,\n requestId: canonicalRequestId,\n source: \"modern-apns-api\",\n timestamp: (/* @__PURE__ */ new Date()).toISOString(),\n waitForResponse: waitForResponse || false\n },\n message: null,\n sound: \"default\",\n ...subtitle ? { subtitle } : {},\n title\n };\n const platform = private_env.DEVICE_PLATFORM || \"ios\";\n if (platform === \"android\") {\n if (!isFCMConfigured()) {\n return json(\n {\n details: \"Missing FCM_PROJECT_ID, FCM_CLIENT_EMAIL, or FCM_PRIVATE_KEY environment variables\",\n error: \"FCM not configured\"\n },\n { status: 500 }\n );\n }\n const androidToken = requestDeviceToken?.trim() || private_env.ANDROID_DEVICE_TOKEN?.trim() || readPersistedDeviceToken(\"android\");\n if (!androidToken) {\n return json(\n {\n 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.\",\n error: \"No device token configured\"\n },\n { status: 500 }\n );\n }\n const fcmResult = await sendFCMNotification(androidToken, payload);\n if (fcmResult.success) {\n recordNotification(title, message, data);\n if (waitForResponse) {\n createPendingRequest(canonicalRequestId, {\n options,\n question: question ?? null,\n responseKind: responseKind ?? \"hook\",\n sessionId: data?.sessionId || \"\",\n toolInput: data?.toolInput || {},\n toolName: data?.toolName || \"\"\n });\n }\n addNotification(buildNotificationRecord(canonicalRequestId, title, message, \"sent\", data));\n return json({\n message: \"Notification sent successfully\",\n requestId: canonicalRequestId,\n result: { messageId: fcmResult.messageId },\n success: true,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n });\n } else {\n console.error(`[notify] FCM delivery failed: ${fcmResult.error}`);\n addNotification(\n buildNotificationRecord(\n canonicalRequestId,\n title,\n message,\n \"failed\",\n data,\n fcmResult.error\n )\n );\n return json(\n {\n details: fcmResult.error,\n error: \"Failed to send notification\",\n requestId: canonicalRequestId,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n },\n { status: 500 }\n );\n }\n } else {\n if (!apnsClient.isConfigured()) {\n return json(\n {\n details: \"Missing APNS_KEY, APNS_KEY_ID, or APNS_TEAM_ID environment variables\",\n error: \"APNs client not configured\"\n },\n { status: 500 }\n );\n }\n const deviceToken = requestDeviceToken?.trim() || private_env.DEVICE_TOKEN?.trim();\n if (!deviceToken) {\n return json(\n {\n details: \"DEVICE_TOKEN environment variable is missing and no deviceToken in request body\",\n error: \"No device token configured\"\n },\n { status: 500 }\n );\n }\n try {\n const result = await apnsClient.sendNotification(deviceToken, payload);\n recordNotification(title, message, data);\n if (waitForResponse) {\n createPendingRequest(canonicalRequestId, {\n options,\n question: question ?? null,\n responseKind: responseKind ?? \"hook\",\n sessionId: data?.sessionId || \"\",\n toolInput: data?.toolInput || {},\n toolName: data?.toolName || \"\"\n });\n }\n addNotification(buildNotificationRecord(canonicalRequestId, title, message, \"sent\", data));\n return json({\n message: \"Notification sent successfully\",\n requestId: canonicalRequestId,\n result,\n success: true,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n });\n } catch (notificationError) {\n const notifErrMsg = toErrorMessage(notificationError);\n console.error(`[notify] APNs delivery failed: ${notifErrMsg}`);\n addNotification(\n buildNotificationRecord(canonicalRequestId, title, message, \"failed\", data, notifErrMsg)\n );\n return json(\n {\n details: notifErrMsg,\n error: \"Failed to send notification\",\n requestId: canonicalRequestId,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n },\n { status: 500 }\n );\n }\n }\n } catch (error) {\n console.error(\"Notification error:\", error);\n return json(\n {\n details: toErrorMessage(error),\n error: \"Failed to send notification\",\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n },\n { status: 500 }\n );\n }\n};\nconst GET = ({ request, url }) => {\n const authError = validateAuth(request);\n if (authError) {\n return authError;\n }\n const limit = parseInt(url.searchParams.get(\"limit\") || \"50\");\n const notifications = getNotifications(limit);\n return json({\n count: notifications.length,\n notifications,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n });\n};\nexport {\n GET,\n POST\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAYA,MAAM,WAAW,GAAG,GAAG;AACvB,MAAM,OAAO,GAAG,EAAE;AAClB,SAAS,eAAe,CAAC,MAAM,EAAE;AACjC,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;AACzB,EAAE,IAAI,OAAO,CAAC,MAAM,GAAG,WAAW,EAAE;AACpC,IAAI,OAAO,CAAC,MAAM,GAAG,WAAW;AAChC,EAAE;AACF;AACA,SAAS,gBAAgB,CAAC,KAAK,GAAG,EAAE,EAAE;AACtC,EAAE,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;AAChC;AACA,IAAI,GAAG,GAAG,IAAI;AACd,SAAS,eAAe,GAAG;AAC3B,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;AACtG;AACA,eAAe,mBAAmB,CAAC,WAAW,EAAE,OAAO,EAAE;AACzD,EAAE,IAAI;AACN,IAAI,MAAM,MAAM,GAAG,MAAM,EAAE;AAC3B,IAAI,MAAM,OAAO,GAAG;AACpB,MAAM,OAAO,EAAE;AACf,QAAQ,QAAQ,EAAE,MAAM;AACxB;AACA,QAAQ,GAAG,EAAE;AACb;AACA,OAAO;AACP,MAAM,IAAI,EAAE;AACZ,QAAQ,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO,IAAI,EAAE;AACnD,QAAQ,QAAQ,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,OAAO,CAAC,IAAI,EAAE,QAAQ,KAAK,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;AAC/G,QAAQ,OAAO,EAAE,OAAO,OAAO,CAAC,IAAI,EAAE,OAAO,KAAK,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE;AACtF,QAAQ,SAAS,EAAE,OAAO,OAAO,CAAC,IAAI,EAAE,SAAS,KAAK,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,GAAG,EAAE;AAC5F,QAAQ,MAAM,EAAE,OAAO,OAAO,CAAC,IAAI,EAAE,MAAM,KAAK,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE;AACnF,QAAQ,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE;AACxC,QAAQ,SAAS,EAAE,iBAAiB,IAAI,IAAI,EAAE,EAAE,WAAW,EAAE;AAC7D,QAAQ,KAAK,EAAE,OAAO,CAAC,KAAK;AAC5B,QAAQ,SAAS,EAAE,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE;AACxF,QAAQ,QAAQ,EAAE,OAAO,OAAO,CAAC,IAAI,EAAE,QAAQ,KAAK,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,GAAG,EAAE;AACzF,QAAQ,IAAI,EAAE,OAAO,OAAO,CAAC,IAAI,EAAE,IAAI,KAAK,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG;AAC3E,OAAO;AACP,MAAM,KAAK,EAAE;AACb,KAAK;AACL,IAAI,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;AACjE,IAAI,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE;AACvC,EAAE,CAAC,CAAC,OAAO,KAAK,EAAE;AAClB,IAAI,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;AAC/E,IAAI,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,YAAY,CAAC;AACrD,IAAI,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE;AAClD,EAAE;AACF;AACA,SAAS,MAAM,GAAG;AAClB,EAAE,IAAI,CAAC,GAAG,EAAE;AACZ,IAAI,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc;AAChD,IAAI,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB;AACpD,IAAI,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC;AACzE,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,WAAW,IAAI,CAAC,UAAU,EAAE;AACnD,MAAM,MAAM,IAAI,KAAK;AACrB,QAAQ;AACR,OAAO;AACP,IAAI;AACJ,IAAI,GAAG,GAAG,KAAK,CAAC,aAAa,CAAC;AAC9B,MAAM,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE;AAC9E,KAAK,CAAC;AACN,EAAE;AACF,EAAE,OAAO,GAAG;AACZ;AACA,SAAS,wBAAwB,CAAC,QAAQ,EAAE;AAC5C,EAAE,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,oBAAoB,CAAC;AACtE,EAAE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE;AAC/B,IAAI,OAAO,MAAM;AACjB,EAAE;AACF,EAAE,IAAI;AACN,IAAI,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AAChE,IAAI,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AACxE,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC;AACpC,MAAM,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAChE,IAAI;AACJ,EAAE,CAAC,CAAC,MAAM;AACV,EAAE;AACF,EAAE,OAAO,MAAM;AACf;AACA,IAAI,aAAa,GAAG,IAAI;AACxB,SAAS,aAAa,GAAG;AACzB,EAAE,IAAI,CAAC,aAAa,EAAE;AACtB,IAAI,aAAa,GAAG,IAAI,kBAAkB,EAAE;AAC5C,EAAE;AACF,EAAE,OAAO,aAAa;AACtB;AACA,MAAM,iBAAiB,mBAAmB,IAAI,GAAG,EAAE;AACnD,MAAM,YAAY,GAAG,GAAG;AACxB,SAAS,kBAAkB,CAAC,IAAI,EAAE;AAClC,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE;AAC9B,EAAE,MAAM,SAAS,GAAG,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,GAAG,IAAI,CAAC,SAAS,GAAG,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,GAAG,IAAI,CAAC,SAAS,GAAG,EAAE;AAClI,EAAE,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,GAAG,IAAI,CAAC,IAAI,GAAG,EAAE;AAC7D,EAAE,MAAM,UAAU,GAAG,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,GAAG,IAAI,CAAC,UAAU,GAAG,MAAM;AACnF,EAAE,MAAM,SAAS,GAAG,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,GAAG,IAAI,CAAC,SAAS,GAAG,MAAM;AAChF,EAAE,QAAQ,SAAS;AACnB,IAAI,KAAK,OAAO;AAChB,MAAM,cAAc,CAAC;AACrB,QAAQ,KAAK,EAAE,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,GAAG,IAAI,CAAC,KAAK,GAAG,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,GAAG,IAAI,CAAC,OAAO,GAAG,eAAe;AAC9H,QAAQ,UAAU;AAClB,QAAQ,IAAI;AACZ,QAAQ,IAAI,EAAE;AACd,OAAO,CAAC;AACR,MAAM;AACN,IAAI,KAAK,YAAY;AACrB,IAAI,KAAK,cAAc;AACvB,MAAM,cAAc,CAAC;AACrB,QAAQ,OAAO,EAAE,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,GAAG,IAAI,CAAC,OAAO,GAAG,EAAE;AACrE,QAAQ,SAAS;AACjB,QAAQ,UAAU;AAClB,QAAQ,IAAI,EAAE;AACd,OAAO,CAAC;AACR,MAAM;AACN,IAAI,KAAK,YAAY;AACrB,IAAI,KAAK,yBAAyB;AAClC,MAAM,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,EAAE;AAC3C,QAAQ,cAAc,CAAC;AACvB,UAAU,KAAK,EAAE,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,GAAG,IAAI,CAAC,SAAS,GAAG,EAAE;AACpG,UAAU,SAAS,EAAE,IAAI,CAAC,SAAS;AACnC,UAAU,IAAI,EAAE,IAAI,CAAC,QAAQ;AAC7B,UAAU,IAAI,EAAE;AAChB,SAAS,CAAC;AACV,MAAM;AACN,MAAM;AACN,IAAI,KAAK,UAAU;AACnB,MAAM,cAAc,CAAC;AACrB,QAAQ,OAAO,EAAE,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,GAAG,IAAI,CAAC,OAAO,GAAG,EAAE;AACrE,QAAQ,SAAS;AACjB,QAAQ,UAAU;AAClB,QAAQ,IAAI,EAAE;AACd,OAAO,CAAC;AACR,MAAM;AACN,IAAI,KAAK,YAAY;AACrB,MAAM,cAAc,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC;AACjF,MAAM;AACN,IAAI,KAAK,aAAa;AACtB,MAAM,cAAc,CAAC;AACrB,QAAQ,OAAO,EAAE,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,GAAG,IAAI,CAAC,OAAO,GAAG,EAAE;AACrE,QAAQ,QAAQ,EAAE,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,GAAG,IAAI,CAAC,QAAQ,GAAG,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,GAAG,IAAI,CAAC,KAAK,GAAG,EAAE;AACtH,QAAQ,UAAU;AAClB,QAAQ,IAAI;AACZ,QAAQ,IAAI,EAAE;AACd,OAAO,CAAC;AACR,MAAM;AACN;AACA;AACA,SAAS,uBAAuB,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE;AAC1E,EAAE,OAAO;AACT,IAAI,QAAQ,EAAE,IAAI,EAAE,QAAQ,IAAI,IAAI;AACpC,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI;AACtB,IAAI,KAAK,EAAE,KAAK,IAAI,IAAI;AACxB,IAAI,EAAE;AACN,IAAI,OAAO;AACX,IAAI,OAAO,EAAE,IAAI,EAAE,OAAO,IAAI,IAAI;AAClC,IAAI,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,IAAI;AAChC,IAAI,MAAM;AACV,IAAI,SAAS,EAAE,iBAAiB,IAAI,IAAI,EAAE,EAAE,WAAW,EAAE;AACzD,IAAI,KAAK;AACT,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI;AACxB,GAAG;AACH;AACA,SAAS,6BAA6B,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,GAAG,KAAK,EAAE;AACtF,EAAE,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,IAAI,SAAS;AAC1C,EAAE,IAAI,uBAAuB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,CAAC,EAAE;AACtE,IAAI,OAAO;AACX,MAAM,MAAM,EAAE,gDAAgD;AAC9D,MAAM,IAAI,EAAE;AACZ,KAAK;AACL,EAAE;AACF,EAAE,IAAI,MAAM,KAAK,2BAA2B,IAAI,MAAM,KAAK,6BAA6B,EAAE;AAC1F,IAAI,OAAO;AACX,MAAM,MAAM,EAAE,+DAA+D;AAC7E,MAAM,IAAI,EAAE;AACZ,KAAK;AACL,EAAE;AACF,EAAE,IAAI,MAAM,KAAK,WAAW,EAAE;AAC9B,IAAI,OAAO;AACX,MAAM,MAAM,EAAE,sDAAsD;AACpE,MAAM,IAAI,EAAE;AACZ,KAAK;AACL,EAAE;AACF,EAAE,MAAM,YAAY,GAAG;AACvB,IAAI,aAAa;AACjB;AACA,IAAI,cAAc;AAClB;AACA,IAAI,iDAAiD;AACrD;AACA,IAAI;AACJ;AACA,GAAG;AACH,EAAE,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC7F,EAAE,IAAI,MAAM,EAAE;AACd,IAAI,OAAO;AACX,MAAM,MAAM,EAAE,iDAAiD;AAC/D,MAAM,IAAI,EAAE;AACZ,KAAK;AACL,EAAE;AACF,EAAE,MAAM,iBAAiB,GAAG;AAC5B,IAAI,mBAAmB;AACvB,IAAI,sBAAsB;AAC1B,IAAI,QAAQ;AACZ,IAAI,SAAS;AACb,IAAI,UAAU;AACd,IAAI;AACJ,GAAG;AACH,EAAE,MAAM,WAAW,GAAG,iBAAiB,CAAC,IAAI;AAC5C,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO;AAC5D,GAAG;AACH,EAAE,IAAI,WAAW,EAAE;AACnB,IAAI,OAAO;AACX,MAAM,MAAM,EAAE,qDAAqD;AACnE,MAAM,IAAI,EAAE;AACZ,KAAK;AACL,EAAE;AACF,EAAE,OAAO;AACT,IAAI,MAAM,EAAE,4CAA4C;AACxD,IAAI,IAAI,EAAE;AACV,GAAG;AACH;AACA,SAAS,uBAAuB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,GAAG,KAAK,EAAE;AAChF,EAAE,IAAI,eAAe,EAAE;AACvB,IAAI,OAAO,KAAK;AAChB,EAAE;AACF,EAAE,MAAM,UAAU,GAAG,IAAI;AACzB,EAAE,MAAM,GAAG,GAAG,UAAU,EAAE,QAAQ,GAAG,UAAU,CAAC,QAAQ,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,IAAI,SAAS,CAAC,CAAC;AAC/G,EAAE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;AACxB,EAAE,IAAI,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AAClC,IAAI,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;AACpD,IAAI,IAAI,GAAG,GAAG,QAAQ,GAAG,YAAY,EAAE;AACvC,MAAM,OAAO,IAAI;AACjB,IAAI;AACJ,EAAE;AACF,EAAE,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,iBAAiB,CAAC,OAAO,EAAE,EAAE;AACpD,IAAI,IAAI,GAAG,GAAG,CAAC,GAAG,YAAY,EAAE;AAChC,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;AACjC,IAAI;AACJ,EAAE;AACF,EAAE,OAAO,KAAK;AACd;AACA,SAAS,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE;AAClD,EAAE,MAAM,UAAU,GAAG,IAAI;AACzB,EAAE,MAAM,GAAG,GAAG,UAAU,EAAE,QAAQ,GAAG,UAAU,CAAC,QAAQ,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,IAAI,SAAS,CAAC,CAAC;AAC/G,EAAE,iBAAiB,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;AACxC;AACK,MAAC,IAAI,GAAG,OAAO,EAAE,OAAO,EAAE,KAAK;AACpC,EAAE,IAAI;AACN,IAAI,MAAM,UAAU,GAAG,aAAa,EAAE;AACtC,IAAI,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC;AAC3C,IAAI,IAAI,SAAS,EAAE;AACnB,MAAM,OAAO,SAAS;AACtB,IAAI;AACJ,IAAI,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE;AACxC,IAAI,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;AAC3E,MAAM,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,oCAAoC,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACnF,IAAI;AACJ,IAAI,MAAM,IAAI,GAAG,OAAO;AACxB,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI;AAC1B,IAAI,MAAM,kBAAkB,GAAG,IAAI,CAAC,WAAW;AAC/C,IAAI,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO;AAChC,IAAI,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK;AAC5B,IAAI,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,GAAG,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;AAC/E,IAAI,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,QAAQ,KAAK,SAAS,GAAG,IAAI,CAAC,QAAQ,GAAG,KAAK;AAC/E,IAAI,MAAM,eAAe,GAAG,OAAO,IAAI,CAAC,eAAe,KAAK,SAAS,GAAG,IAAI,CAAC,eAAe,GAAG,KAAK;AACpG,IAAI,MAAM,SAAS,GAAG,OAAO,IAAI,CAAC,SAAS,KAAK,SAAS,GAAG,IAAI,CAAC,SAAS,GAAG,KAAK;AAClF,IAAI,MAAM,oBAAoB,GAAG,OAAO,IAAI,CAAC,oBAAoB,KAAK,QAAQ,IAAI,IAAI,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;AAC3J,IAAI,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,GAAG,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;AAC/E,IAAI,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;AAChI,IAAI,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY;AAC7C,IAAI,MAAM,YAAY,GAAG,eAAe,KAAK,MAAM,IAAI,eAAe,KAAK,KAAK,IAAI,eAAe,KAAK,MAAM,GAAG,eAAe,GAAG,KAAK,CAAC;AACzI,IAAI,IAAI;AACR,MAAM,kBAAkB,CAAC,IAAI,CAAC;AAC9B,IAAI,CAAC,CAAC,MAAM;AACZ,IAAI;AACJ,IAAI,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;AACxF,MAAM,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,oDAAoD,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACnG,IAAI;AACJ,IAAI,IAAI,kBAAkB,KAAK,KAAK,CAAC,IAAI,OAAO,kBAAkB,KAAK,QAAQ,EAAE;AACjF,MAAM,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,8BAA8B,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAC7E,IAAI;AACJ,IAAI,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;AACjE,IAAI,MAAM,aAAa,GAAG,OAAO,IAAI,EAAE,SAAS,KAAK,QAAQ,GAAG,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;AACvF,IAAI,MAAM,kBAAkB,GAAG,aAAa,IAAI,SAAS;AACzD,IAAI,MAAM,sBAAsB,GAAG,6BAA6B;AAChE,MAAM,KAAK;AACX,MAAM,OAAO;AACb,MAAM,IAAI;AACV,MAAM;AACN,KAAK;AACL,IAAI,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE;AACtC,MAAM,eAAe;AACrB,QAAQ,uBAAuB;AAC/B,UAAU,kBAAkB;AAC5B,UAAU,KAAK;AACf,UAAU,OAAO;AACjB,UAAU,UAAU;AACpB,UAAU,IAAI;AACd,UAAU,sBAAsB,CAAC;AACjC;AACA,OAAO;AACP,MAAM,OAAO,IAAI,CAAC;AAClB,QAAQ,OAAO,EAAE,kCAAkC;AACnD,QAAQ,MAAM,EAAE,sBAAsB,CAAC,MAAM;AAC7C,QAAQ,OAAO,EAAE,IAAI;AACrB,QAAQ,SAAS,EAAE,iBAAiB,IAAI,IAAI,EAAE,EAAE,WAAW;AAC3D,OAAO,CAAC;AACR,IAAI;AACJ,IAAI,IAAI,QAAQ,IAAI,CAAC,SAAS,EAAE;AAChC,MAAM,IAAI,eAAe,EAAE;AAC3B,QAAQ,oBAAoB,CAAC,kBAAkB,EAAE;AACjD,UAAU,OAAO;AACjB,UAAU,QAAQ,EAAE,QAAQ,IAAI,IAAI;AACpC,UAAU,YAAY,EAAE,YAAY,IAAI,MAAM;AAC9C,UAAU,SAAS,EAAE,IAAI,EAAE,SAAS,IAAI,EAAE;AAC1C,UAAU,SAAS,EAAE,IAAI,EAAE,SAAS,IAAI,EAAE;AAC1C,UAAU,QAAQ,EAAE,IAAI,EAAE,QAAQ,IAAI;AACtC,SAAS,CAAC;AACV,MAAM;AACN,MAAM,eAAe,CAAC,uBAAuB,CAAC,kBAAkB,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;AACnG,MAAM,OAAO,IAAI,CAAC;AAClB,QAAQ,OAAO,EAAE,4CAA4C;AAC7D,QAAQ,SAAS,EAAE,kBAAkB;AACrC,QAAQ,OAAO,EAAE,IAAI;AACrB,QAAQ,SAAS,EAAE,iBAAiB,IAAI,IAAI,EAAE,EAAE,WAAW;AAC3D,OAAO,CAAC;AACR,IAAI;AACJ,IAAI,MAAM,OAAO,GAAG;AACpB,MAAM,KAAK,EAAE,CAAC;AACd,MAAM,IAAI,EAAE,OAAO;AACnB;AACA;AACA;AACA;AACA,MAAM,QAAQ,EAAE,oBAAoB,KAAK,eAAe,GAAG,mBAAmB,GAAG,KAAK,CAAC,CAAC;AACxF,MAAM,IAAI,EAAE;AACZ,QAAQ,GAAG,IAAI;AACf,QAAQ,SAAS,EAAE,kBAAkB;AACrC,QAAQ,MAAM,EAAE,iBAAiB;AACjC,QAAQ,SAAS,EAAE,iBAAiB,IAAI,IAAI,EAAE,EAAE,WAAW,EAAE;AAC7D,QAAQ,eAAe,EAAE,eAAe,IAAI;AAC5C,OAAO;AACP,MAAM,OAAO,EAAE,IAAI;AACnB,MAAM,KAAK,EAAE,SAAS;AACtB,MAAM,GAAG,QAAQ,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE;AACrC,MAAM;AACN,KAAK;AACL,IAAI,MAAM,QAAQ,GAAG,WAAW,CAAC,eAAe,IAAI,KAAK;AACzD,IAAI,IAAI,QAAQ,KAAK,SAAS,EAAE;AAChC,MAAM,IAAI,CAAC,eAAe,EAAE,EAAE;AAC9B,QAAQ,OAAO,IAAI;AACnB,UAAU;AACV,YAAY,OAAO,EAAE,oFAAoF;AACzG,YAAY,KAAK,EAAE;AACnB,WAAW;AACX,UAAU,EAAE,MAAM,EAAE,GAAG;AACvB,SAAS;AACT,MAAM;AACN,MAAM,MAAM,YAAY,GAAG,kBAAkB,EAAE,IAAI,EAAE,IAAI,WAAW,CAAC,oBAAoB,EAAE,IAAI,EAAE,IAAI,wBAAwB,CAAC,SAAS,CAAC;AACxI,MAAM,IAAI,CAAC,YAAY,EAAE;AACzB,QAAQ,OAAO,IAAI;AACnB,UAAU;AACV,YAAY,OAAO,EAAE,oKAAoK;AACzL,YAAY,KAAK,EAAE;AACnB,WAAW;AACX,UAAU,EAAE,MAAM,EAAE,GAAG;AACvB,SAAS;AACT,MAAM;AACN,MAAM,MAAM,SAAS,GAAG,MAAM,mBAAmB,CAAC,YAAY,EAAE,OAAO,CAAC;AACxE,MAAM,IAAI,SAAS,CAAC,OAAO,EAAE;AAC7B,QAAQ,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC;AAChD,QAAQ,IAAI,eAAe,EAAE;AAC7B,UAAU,oBAAoB,CAAC,kBAAkB,EAAE;AACnD,YAAY,OAAO;AACnB,YAAY,QAAQ,EAAE,QAAQ,IAAI,IAAI;AACtC,YAAY,YAAY,EAAE,YAAY,IAAI,MAAM;AAChD,YAAY,SAAS,EAAE,IAAI,EAAE,SAAS,IAAI,EAAE;AAC5C,YAAY,SAAS,EAAE,IAAI,EAAE,SAAS,IAAI,EAAE;AAC5C,YAAY,QAAQ,EAAE,IAAI,EAAE,QAAQ,IAAI;AACxC,WAAW,CAAC;AACZ,QAAQ;AACR,QAAQ,eAAe,CAAC,uBAAuB,CAAC,kBAAkB,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AAClG,QAAQ,OAAO,IAAI,CAAC;AACpB,UAAU,OAAO,EAAE,gCAAgC;AACnD,UAAU,SAAS,EAAE,kBAAkB;AACvC,UAAU,MAAM,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE;AACpD,UAAU,OAAO,EAAE,IAAI;AACvB,UAAU,SAAS,EAAE,iBAAiB,IAAI,IAAI,EAAE,EAAE,WAAW;AAC7D,SAAS,CAAC;AACV,MAAM,CAAC,MAAM;AACb,QAAQ,OAAO,CAAC,KAAK,CAAC,CAAC,8BAA8B,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;AACzE,QAAQ,eAAe;AACvB,UAAU,uBAAuB;AACjC,YAAY,kBAAkB;AAC9B,YAAY,KAAK;AACjB,YAAY,OAAO;AACnB,YAAY,QAAQ;AACpB,YAAY,IAAI;AAChB,YAAY,SAAS,CAAC;AACtB;AACA,SAAS;AACT,QAAQ,OAAO,IAAI;AACnB,UAAU;AACV,YAAY,OAAO,EAAE,SAAS,CAAC,KAAK;AACpC,YAAY,KAAK,EAAE,6BAA6B;AAChD,YAAY,SAAS,EAAE,kBAAkB;AACzC,YAAY,SAAS,EAAE,iBAAiB,IAAI,IAAI,EAAE,EAAE,WAAW;AAC/D,WAAW;AACX,UAAU,EAAE,MAAM,EAAE,GAAG;AACvB,SAAS;AACT,MAAM;AACN,IAAI,CAAC,MAAM;AACX,MAAM,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,EAAE;AACtC,QAAQ,OAAO,IAAI;AACnB,UAAU;AACV,YAAY,OAAO,EAAE,sEAAsE;AAC3F,YAAY,KAAK,EAAE;AACnB,WAAW;AACX,UAAU,EAAE,MAAM,EAAE,GAAG;AACvB,SAAS;AACT,MAAM;AACN,MAAM,MAAM,WAAW,GAAG,kBAAkB,EAAE,IAAI,EAAE,IAAI,WAAW,CAAC,YAAY,EAAE,IAAI,EAAE;AACxF,MAAM,IAAI,CAAC,WAAW,EAAE;AACxB,QAAQ,OAAO,IAAI;AACnB,UAAU;AACV,YAAY,OAAO,EAAE,iFAAiF;AACtG,YAAY,KAAK,EAAE;AACnB,WAAW;AACX,UAAU,EAAE,MAAM,EAAE,GAAG;AACvB,SAAS;AACT,MAAM;AACN,MAAM,IAAI;AACV,QAAQ,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,gBAAgB,CAAC,WAAW,EAAE,OAAO,CAAC;AAC9E,QAAQ,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC;AAChD,QAAQ,IAAI,eAAe,EAAE;AAC7B,UAAU,oBAAoB,CAAC,kBAAkB,EAAE;AACnD,YAAY,OAAO;AACnB,YAAY,QAAQ,EAAE,QAAQ,IAAI,IAAI;AACtC,YAAY,YAAY,EAAE,YAAY,IAAI,MAAM;AAChD,YAAY,SAAS,EAAE,IAAI,EAAE,SAAS,IAAI,EAAE;AAC5C,YAAY,SAAS,EAAE,IAAI,EAAE,SAAS,IAAI,EAAE;AAC5C,YAAY,QAAQ,EAAE,IAAI,EAAE,QAAQ,IAAI;AACxC,WAAW,CAAC;AACZ,QAAQ;AACR,QAAQ,eAAe,CAAC,uBAAuB,CAAC,kBAAkB,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AAClG,QAAQ,OAAO,IAAI,CAAC;AACpB,UAAU,OAAO,EAAE,gCAAgC;AACnD,UAAU,SAAS,EAAE,kBAAkB;AACvC,UAAU,MAAM;AAChB,UAAU,OAAO,EAAE,IAAI;AACvB,UAAU,SAAS,EAAE,iBAAiB,IAAI,IAAI,EAAE,EAAE,WAAW;AAC7D,SAAS,CAAC;AACV,MAAM,CAAC,CAAC,OAAO,iBAAiB,EAAE;AAClC,QAAQ,MAAM,WAAW,GAAG,cAAc,CAAC,iBAAiB,CAAC;AAC7D,QAAQ,OAAO,CAAC,KAAK,CAAC,CAAC,+BAA+B,EAAE,WAAW,CAAC,CAAC,CAAC;AACtE,QAAQ,eAAe;AACvB,UAAU,uBAAuB,CAAC,kBAAkB,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW;AACjG,SAAS;AACT,QAAQ,OAAO,IAAI;AACnB,UAAU;AACV,YAAY,OAAO,EAAE,WAAW;AAChC,YAAY,KAAK,EAAE,6BAA6B;AAChD,YAAY,SAAS,EAAE,kBAAkB;AACzC,YAAY,SAAS,EAAE,iBAAiB,IAAI,IAAI,EAAE,EAAE,WAAW;AAC/D,WAAW;AACX,UAAU,EAAE,MAAM,EAAE,GAAG;AACvB,SAAS;AACT,MAAM;AACN,IAAI;AACJ,EAAE,CAAC,CAAC,OAAO,KAAK,EAAE;AAClB,IAAI,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC;AAC/C,IAAI,OAAO,IAAI;AACf,MAAM;AACN,QAAQ,OAAO,EAAE,cAAc,CAAC,KAAK,CAAC;AACtC,QAAQ,KAAK,EAAE,6BAA6B;AAC5C,QAAQ,SAAS,EAAE,iBAAiB,IAAI,IAAI,EAAE,EAAE,WAAW;AAC3D,OAAO;AACP,MAAM,EAAE,MAAM,EAAE,GAAG;AACnB,KAAK;AACL,EAAE;AACF;AACK,MAAC,GAAG,GAAG,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK;AAClC,EAAE,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC;AACzC,EAAE,IAAI,SAAS,EAAE;AACjB,IAAI,OAAO,SAAS;AACpB,EAAE;AACF,EAAE,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;AAC/D,EAAE,MAAM,aAAa,GAAG,gBAAgB,CAAC,KAAK,CAAC;AAC/C,EAAE,OAAO,IAAI,CAAC;AACd,IAAI,KAAK,EAAE,aAAa,CAAC,MAAM;AAC/B,IAAI,aAAa;AACjB,IAAI,SAAS,EAAE,iBAAiB,IAAI,IAAI,EAAE,EAAE,WAAW;AACvD,GAAG,CAAC;AACJ;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"_server.ts-BevnuePu.js","sources":["../../../.svelte-kit/adapter-node/entries/endpoints/api/neurolink-proxy/_server.ts.js"],"sourcesContent":["import { b as private_env } from \"../../../../chunks/shared-server.js\";\nimport { v as validateAuth } from \"../../../../chunks/auth.js\";\nimport { json } from \"@sveltejs/kit\";\nconst ALLOWED_CLIENT_HEADERS = {\n anthropic: /* @__PURE__ */ new Set([\"anthropic-beta\", \"anthropic-version\"]),\n \"google-ai\": /* @__PURE__ */ new Set([]),\n litellm: /* @__PURE__ */ new Set([]),\n mistral: /* @__PURE__ */ new Set([]),\n openai: /* @__PURE__ */ new Set([\"openai-organization\", \"openai-project\"])\n};\nconst POST = async ({ request }) => {\n const authError = validateAuth(request);\n if (authError) {\n return authError;\n }\n let payload;\n try {\n payload = await request.json();\n } catch {\n return json({ error: \"Invalid JSON body\" }, { status: 400 });\n }\n if (!payload || typeof payload !== \"object\" || typeof payload.provider !== \"string\" || typeof payload.url !== \"string\" || !payload.headers || typeof payload.headers !== \"object\") {\n return json({ error: \"Invalid proxy payload\" }, { status: 400 });\n }\n const {\n body,\n headers: reqHeaders,\n provider,\n url\n } = payload;\n const ALLOWED_PREFIXES = {\n anthropic: \"https://api.anthropic.com/\",\n \"google-ai\": \"https://generativelanguage.googleapis.com/\",\n mistral: \"https://api.mistral.ai/\",\n openai: \"https://api.openai.com/\"\n };\n if (provider === \"litellm\") {\n const rawBase = private_env.LITELLM_BASE_URL?.trim();\n if (!rawBase) {\n return json({ error: \"LiteLLM is not configured on this server\" }, { status: 403 });\n }\n const litellmPrefix = `${rawBase.replace(/\\/+$/, \"\")}/`;\n if (!url.startsWith(litellmPrefix)) {\n return json({ error: `Provider \"${provider}\" or URL not allowed` }, { status: 403 });\n }\n } else {\n const allowedPrefix = ALLOWED_PREFIXES[provider];\n if (!allowedPrefix || !url.startsWith(allowedPrefix)) {\n return json({ error: `Provider \"${provider}\" or URL not allowed` }, { status: 403 });\n }\n }\n const apiKeyEnv = {\n anthropic: private_env.ANTHROPIC_API_KEY ?? \"\",\n \"google-ai\": private_env.GOOGLE_AI_API_KEY ?? \"\",\n litellm: private_env.LITELLM_API_KEY ?? \"\",\n mistral: private_env.MISTRAL_API_KEY ?? \"\",\n openai: private_env.OPENAI_API_KEY ?? \"\"\n };\n const allowedForProvider = ALLOWED_CLIENT_HEADERS[provider] ?? /* @__PURE__ */ new Set();\n const normalizedReqHeaders = {};\n for (const [k, v] of Object.entries(reqHeaders)) {\n const key = k.toLowerCase();\n if (allowedForProvider.has(key)) {\n normalizedReqHeaders[key] = v;\n }\n }\n const forwardHeaders = {\n \"Content-Type\": \"application/json\",\n ...normalizedReqHeaders\n };\n if (provider === \"anthropic\") {\n forwardHeaders[\"x-api-key\"] = apiKeyEnv.anthropic;\n forwardHeaders[\"anthropic-version\"] = forwardHeaders[\"anthropic-version\"] ?? \"2023-06-01\";\n } else if (provider === \"google-ai\") {\n forwardHeaders[\"x-goog-api-key\"] = apiKeyEnv[\"google-ai\"];\n } else if (provider === \"openai\") {\n if (apiKeyEnv.openai) {\n forwardHeaders.Authorization = `Bearer ${apiKeyEnv.openai}`;\n }\n } else if (provider === \"mistral\") {\n if (apiKeyEnv.mistral) {\n forwardHeaders.Authorization = `Bearer ${apiKeyEnv.mistral}`;\n }\n } else if (provider === \"litellm\") {\n if (apiKeyEnv.litellm) {\n forwardHeaders.Authorization = `Bearer ${apiKeyEnv.litellm}`;\n }\n }\n const controller = new AbortController();\n const timeout = setTimeout(() => {\n controller.abort();\n }, 3e4);\n let resp;\n try {\n resp = await fetch(url, {\n body: JSON.stringify(body),\n headers: forwardHeaders,\n method: \"POST\",\n signal: controller.signal\n });\n } catch (err) {\n clearTimeout(timeout);\n const message = err instanceof Error ? err.message : \"Upstream request failed\";\n return json({ error: message }, { status: 502 });\n }\n clearTimeout(timeout);\n let data;\n try {\n data = await resp.json();\n } catch {\n return json({ error: \"Upstream returned non-JSON response\" }, { status: 502 });\n }\n return json(data, { status: resp.status });\n};\nexport {\n POST\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"_server.ts-CA5KUENM.js","sources":["../../../.svelte-kit/adapter-node/entries/endpoints/api/terminals/_id_/share/_server.ts.js"],"sourcesContent":["import { v as validateAuth } from \"../../../../../../chunks/auth.js\";\nimport { p as ptyManager } from \"../../../../../../chunks/pty-manager.js\";\nimport { s as shareStore, h as hashPassword } from \"../../../../../../chunks/share-store.js\";\nimport { c as closeGuests } from \"../../../../../../chunks/guest-registry.js\";\nimport { json } from \"@sveltejs/kit\";\nconst MIN_PASSWORD_LENGTH = 6;\nconst MODES = [\"view\", \"control\"];\nfunction toInfo(terminalId) {\n const share = shareStore.getShare(terminalId);\n if (!share) {\n return { active: false, createdAt: null, mode: null, updatedAt: null };\n }\n return { active: true, createdAt: share.createdAt, mode: share.mode, updatedAt: share.updatedAt };\n}\nconst GET = ({ params, request }) => {\n const authError = validateAuth(request);\n if (authError) {\n return authError;\n }\n return json(toInfo(params.id));\n};\nconst PUT = async ({ params, request }) => {\n const authError = validateAuth(request);\n if (authError) {\n return authError;\n }\n if (!ptyManager.get(params.id)) {\n return json({ error: \"Terminal not found\" }, { status: 404 });\n }\n let body;\n try {\n body = await request.json();\n } catch {\n return json({ error: \"Invalid JSON\" }, { status: 400 });\n }\n if (!MODES.includes(body.mode)) {\n return json({ error: \"mode must be 'view' or 'control'\" }, { status: 400 });\n }\n const existing = shareStore.getShare(params.id);\n const password = typeof body.password === \"string\" ? body.password : \"\";\n if (!existing && password.length < MIN_PASSWORD_LENGTH) {\n return json(\n { error: `password is required (min ${String(MIN_PASSWORD_LENGTH)} chars)` },\n { status: 400 }\n );\n }\n if (password && password.length < MIN_PASSWORD_LENGTH) {\n return json(\n { error: `password must be at least ${String(MIN_PASSWORD_LENGTH)} chars` },\n { status: 400 }\n );\n }\n const now = Date.now();\n shareStore.setShare({\n createdAt: existing?.createdAt ?? now,\n mode: body.mode,\n // `existing` is guaranteed non-null when password is empty (validated above).\n passwordHash: password ? hashPassword(password) : existing?.passwordHash ?? \"\",\n terminalId: params.id,\n updatedAt: now\n });\n if (password) {\n shareStore.deleteSessions(params.id);\n }\n if (password || existing?.mode !== body.mode) {\n closeGuests(params.id);\n }\n return json(toInfo(params.id));\n};\nconst DELETE = ({ params, request }) => {\n const authError = validateAuth(request);\n if (authError) {\n return authError;\n }\n shareStore.deleteShare(params.id);\n const closed = closeGuests(params.id);\n return json({ closedConnections: closed, success: true });\n};\nexport {\n DELETE,\n GET,\n PUT\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"_server.ts-CC2K8-L2.js","sources":["../../../.svelte-kit/adapter-node/entries/endpoints/api/terminals/_id_/_server.ts.js"],"sourcesContent":["import { v as validateAuth } from \"../../../../../chunks/auth.js\";\nimport { p as ptyManager } from \"../../../../../chunks/pty-manager.js\";\nimport { r as resolveAccess } from \"../../../../../chunks/share-auth.js\";\nimport { s as shareStore } from \"../../../../../chunks/share-store.js\";\nimport { t as toErrorMessage } from \"../../../../../chunks/error.js\";\nimport { c as closeGuests } from \"../../../../../chunks/guest-registry.js\";\nimport { json } from \"@sveltejs/kit\";\nfunction lastScrollbackLine(scrollback) {\n if (!scrollback) {\n return null;\n }\n const lines = scrollback.trimEnd().split(\"\\n\");\n for (let i = lines.length - 1; i >= 0; i--) {\n const line = lines[i].trim();\n if (line) {\n return line.slice(0, 200);\n }\n }\n return null;\n}\nconst GET = ({ params, request }) => {\n const access = resolveAccess(request, params.id);\n if (!access) {\n return json({ error: \"Unauthorized\" }, { status: 401 });\n }\n try {\n const terminal = ptyManager.get(params.id);\n if (!terminal) {\n return json({ error: \"Terminal not found\" }, { status: 404 });\n }\n return json({\n args: terminal.args,\n clientCount: terminal.clients.size,\n cols: terminal.cols,\n command: terminal.command,\n createdAt: terminal.createdAt.toISOString(),\n cwd: terminal.cwd,\n exitCode: terminal.exitCode,\n exitedAt: terminal.exitedAt?.toISOString() ?? null,\n id: terminal.id,\n lastOutput: lastScrollbackLine(terminal.scrollback),\n pid: terminal.pid,\n rows: terminal.rows,\n sessionWs: `/ws/session/${terminal.id}`,\n status: terminal.status,\n timestamp: (/* @__PURE__ */ new Date()).toISOString(),\n ws: `/ws/terminal/${terminal.id}`,\n ...access.level === \"guest\" ? { shareMode: access.mode } : {}\n });\n } catch (error) {\n console.error(\"[terminals] Failed to get terminal:\", toErrorMessage(error));\n return json({ error: \"Failed to get terminal\" }, { status: 500 });\n }\n};\nconst DELETE = ({ params, request }) => {\n const authError = validateAuth(request);\n if (authError) {\n return authError;\n }\n try {\n const terminal = ptyManager.get(params.id);\n if (!terminal) {\n return json({ error: \"Terminal not found\" }, { status: 404 });\n }\n if (terminal.status === \"exited\") {\n ptyManager.remove(params.id);\n shareStore.deleteShare(params.id);\n closeGuests(params.id);\n console.log(`[terminals] Removed exited terminal ${params.id}`);\n return json({\n removed: true,\n success: true,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n });\n }\n ptyManager.kill(params.id);\n shareStore.deleteShare(params.id);\n closeGuests(params.id);\n console.log(`[terminals] Killed terminal ${params.id} (pid=${terminal.pid})`);\n return json({\n success: true,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n });\n } catch (error) {\n console.error(\"[terminals] Failed to kill terminal:\", toErrorMessage(error));\n return json({ error: \"Failed to kill terminal\" }, { status: 500 });\n }\n};\nexport {\n DELETE,\n GET\n};\n"],"names":[],"mappings":"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"}
|