@juspay/shooter 1.7.1 → 1.9.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.
Files changed (154) hide show
  1. package/.claude/hooks/notifier.cjs +481 -134
  2. package/bin/shooter.cjs +570 -12
  3. package/build/client/_app/immutable/assets/{0.B5tfAY8Y.css → 0.BZLcOr5z.css} +1 -1
  4. package/build/client/_app/immutable/assets/0.BZLcOr5z.css.br +0 -0
  5. package/build/client/_app/immutable/assets/0.BZLcOr5z.css.gz +0 -0
  6. package/build/client/_app/immutable/chunks/3EfvnCrr.js +1 -0
  7. package/build/client/_app/immutable/chunks/3EfvnCrr.js.br +0 -0
  8. package/build/client/_app/immutable/chunks/3EfvnCrr.js.gz +0 -0
  9. package/build/client/_app/immutable/chunks/{CBvZimn-.js → C2Qh_9aV.js} +1 -1
  10. package/build/client/_app/immutable/chunks/C2Qh_9aV.js.br +0 -0
  11. package/build/client/_app/immutable/chunks/C2Qh_9aV.js.gz +0 -0
  12. package/build/client/_app/immutable/chunks/C2yx8lo8.js +3 -0
  13. package/build/client/_app/immutable/chunks/C2yx8lo8.js.br +0 -0
  14. package/build/client/_app/immutable/chunks/C2yx8lo8.js.gz +0 -0
  15. package/build/client/_app/immutable/chunks/DdpA9n1s.js +5 -0
  16. package/build/client/_app/immutable/chunks/DdpA9n1s.js.br +4 -0
  17. package/build/client/_app/immutable/chunks/DdpA9n1s.js.gz +0 -0
  18. package/build/client/_app/immutable/chunks/{D347PuJK.js → klpn9j-A.js} +1 -1
  19. package/build/client/_app/immutable/chunks/klpn9j-A.js.br +0 -0
  20. package/build/client/_app/immutable/chunks/klpn9j-A.js.gz +0 -0
  21. package/build/client/_app/immutable/chunks/xs1Xl3_e.js +1 -0
  22. package/build/client/_app/immutable/chunks/xs1Xl3_e.js.br +0 -0
  23. package/build/client/_app/immutable/chunks/xs1Xl3_e.js.gz +0 -0
  24. package/build/client/_app/immutable/entry/{app.C_IPOstn.js → app.Bfisx3a0.js} +2 -2
  25. package/build/client/_app/immutable/entry/app.Bfisx3a0.js.br +0 -0
  26. package/build/client/_app/immutable/entry/app.Bfisx3a0.js.gz +0 -0
  27. package/build/client/_app/immutable/entry/start.BfgeeQYG.js +1 -0
  28. package/build/client/_app/immutable/entry/start.BfgeeQYG.js.br +2 -0
  29. package/build/client/_app/immutable/entry/start.BfgeeQYG.js.gz +0 -0
  30. package/build/client/_app/immutable/nodes/{0.DRy3hSaJ.js → 0.Vg8bq-s8.js} +1 -1
  31. package/build/client/_app/immutable/nodes/0.Vg8bq-s8.js.br +0 -0
  32. package/build/client/_app/immutable/nodes/0.Vg8bq-s8.js.gz +0 -0
  33. package/build/client/_app/immutable/nodes/{1.BL16K8Rb.js → 1.B7kXtFIl.js} +1 -1
  34. package/build/client/_app/immutable/nodes/1.B7kXtFIl.js.br +0 -0
  35. package/build/client/_app/immutable/nodes/1.B7kXtFIl.js.gz +0 -0
  36. package/build/client/_app/immutable/nodes/{2.iOKTlmTJ.js → 2.DVFe_SN2.js} +2 -2
  37. package/build/client/_app/immutable/nodes/2.DVFe_SN2.js.br +0 -0
  38. package/build/client/_app/immutable/nodes/2.DVFe_SN2.js.gz +0 -0
  39. package/build/client/_app/immutable/nodes/{3.GuF9Fr8V.js → 3.Deb3vtJl.js} +3 -3
  40. package/build/client/_app/immutable/nodes/3.Deb3vtJl.js.br +0 -0
  41. package/build/client/_app/immutable/nodes/3.Deb3vtJl.js.gz +0 -0
  42. package/build/client/_app/immutable/nodes/5.BN2SM61w.js +1 -0
  43. package/build/client/_app/immutable/nodes/5.BN2SM61w.js.br +0 -0
  44. package/build/client/_app/immutable/nodes/5.BN2SM61w.js.gz +0 -0
  45. package/build/client/_app/immutable/nodes/{6.DSC53pZZ.js → 6.CS_KYbQ7.js} +1 -1
  46. package/build/client/_app/immutable/nodes/6.CS_KYbQ7.js.br +0 -0
  47. package/build/client/_app/immutable/nodes/6.CS_KYbQ7.js.gz +0 -0
  48. package/build/client/_app/immutable/nodes/7.CEiUUm74.js +4 -0
  49. package/build/client/_app/immutable/nodes/7.CEiUUm74.js.br +0 -0
  50. package/build/client/_app/immutable/nodes/7.CEiUUm74.js.gz +0 -0
  51. package/build/client/_app/immutable/nodes/{8.Dn1iVaxc.js → 8.DGStHrkF.js} +2 -2
  52. package/build/client/_app/immutable/nodes/8.DGStHrkF.js.br +0 -0
  53. package/build/client/_app/immutable/nodes/8.DGStHrkF.js.gz +0 -0
  54. package/build/client/_app/immutable/nodes/{9.D3nURtQJ.js → 9.CbIw97FV.js} +1 -1
  55. package/build/client/_app/immutable/nodes/9.CbIw97FV.js.br +0 -0
  56. package/build/client/_app/immutable/nodes/9.CbIw97FV.js.gz +0 -0
  57. package/build/client/_app/version.json +1 -1
  58. package/build/client/_app/version.json.br +0 -0
  59. package/build/client/_app/version.json.gz +0 -0
  60. package/build/server/chunks/{0-D82zFKZh.js → 0-ikRVFZQS.js} +3 -3
  61. package/build/server/chunks/{0-D82zFKZh.js.map → 0-ikRVFZQS.js.map} +1 -1
  62. package/build/server/chunks/{1-BmaGmZUH.js → 1-CG-fUUbt.js} +2 -2
  63. package/build/server/chunks/{1-BmaGmZUH.js.map → 1-CG-fUUbt.js.map} +1 -1
  64. package/build/server/chunks/{2-T5uLjTgt.js → 2-BaV1q6GP.js} +2 -2
  65. package/build/server/chunks/{2-T5uLjTgt.js.map → 2-BaV1q6GP.js.map} +1 -1
  66. package/build/server/chunks/{3-D6FHwoMf.js → 3-BpzQzk4m.js} +2 -2
  67. package/build/server/chunks/{3-D6FHwoMf.js.map → 3-BpzQzk4m.js.map} +1 -1
  68. package/build/server/chunks/{5-Bj49x3to.js → 5-DRhcUdp_.js} +2 -2
  69. package/build/server/chunks/{5-Bj49x3to.js.map → 5-DRhcUdp_.js.map} +1 -1
  70. package/build/server/chunks/{6-Yh_tXC7x.js → 6-Bx-SE48t.js} +2 -2
  71. package/build/server/chunks/{6-Yh_tXC7x.js.map → 6-Bx-SE48t.js.map} +1 -1
  72. package/build/server/chunks/{7-Dmz1unig.js → 7-LeGA4bt3.js} +3 -3
  73. package/build/server/chunks/{7-Dmz1unig.js.map → 7-LeGA4bt3.js.map} +1 -1
  74. package/build/server/chunks/{8-Bf6s5ssE.js → 8-CXwtG-B-.js} +2 -2
  75. package/build/server/chunks/{8-Bf6s5ssE.js.map → 8-CXwtG-B-.js.map} +1 -1
  76. package/build/server/chunks/{9-AHy0sACd.js → 9-DBztKl9o.js} +2 -2
  77. package/build/server/chunks/{9-AHy0sACd.js.map → 9-DBztKl9o.js.map} +1 -1
  78. package/build/server/chunks/{_page.svelte-D1Iaycsm.js → _page.svelte-DpUVuiqQ.js} +3 -13
  79. package/build/server/chunks/_page.svelte-DpUVuiqQ.js.map +1 -0
  80. package/build/server/chunks/{_server.ts-A9_tRR-K.js → _server.ts-9P1PrkiL.js} +2 -2
  81. package/build/server/chunks/{_server.ts-A9_tRR-K.js.map → _server.ts-9P1PrkiL.js.map} +1 -1
  82. package/build/server/chunks/{_server.ts-G8OeADGj.js → _server.ts-BAPg2K8u.js} +5 -2
  83. package/build/server/chunks/_server.ts-BAPg2K8u.js.map +1 -0
  84. package/build/server/chunks/{_server.ts-BQarRaho.js → _server.ts-CilRds58.js} +14 -11
  85. package/build/server/chunks/_server.ts-CilRds58.js.map +1 -0
  86. package/build/server/chunks/{library-apns-Cf-E-DhM.js → library-apns-CUDtjHQk.js} +3 -2
  87. package/build/server/chunks/library-apns-CUDtjHQk.js.map +1 -0
  88. package/build/server/index.js +1 -1
  89. package/build/server/index.js.map +1 -1
  90. package/build/server/manifest.js +13 -13
  91. package/build/server/manifest.js.map +1 -1
  92. package/package.json +1 -1
  93. package/scripts/update-checker.cjs +196 -0
  94. package/scripts/update-state.cjs +235 -0
  95. package/server.ts +55 -3
  96. package/src/lib/modules/client/activity/summarizer.ts +1 -1
  97. package/src/lib/modules/client/dashboard/summarizer.ts +1 -2
  98. package/src/lib/modules/client/neurolink/cdn.ts +6 -0
  99. package/src/lib/modules/client/terminal/LaunchSheet.svelte +5 -12
  100. package/src/lib/modules/server/apn/library-apns.ts +1 -0
  101. package/src/lib/modules/server/fcm/fcm-service.ts +1 -0
  102. package/src/lib/theme.css +33 -1
  103. package/src/lib/types/apn.ts +1 -0
  104. package/src/routes/api/notify/+server.ts +2 -0
  105. package/src/routes/api/sessions/+server.ts +16 -10
  106. package/src/routes/neurolink/+page.svelte +4 -6
  107. package/src/routes/session/[id]/+page.svelte +25 -14
  108. package/build/client/_app/immutable/assets/0.B5tfAY8Y.css.br +0 -0
  109. package/build/client/_app/immutable/assets/0.B5tfAY8Y.css.gz +0 -0
  110. package/build/client/_app/immutable/chunks/Bkcn25gz.js +0 -3
  111. package/build/client/_app/immutable/chunks/Bkcn25gz.js.br +0 -0
  112. package/build/client/_app/immutable/chunks/Bkcn25gz.js.gz +0 -0
  113. package/build/client/_app/immutable/chunks/CBvZimn-.js.br +0 -0
  114. package/build/client/_app/immutable/chunks/CBvZimn-.js.gz +0 -0
  115. package/build/client/_app/immutable/chunks/CRXYOhph.js +0 -5
  116. package/build/client/_app/immutable/chunks/CRXYOhph.js.br +0 -0
  117. package/build/client/_app/immutable/chunks/CRXYOhph.js.gz +0 -0
  118. package/build/client/_app/immutable/chunks/D347PuJK.js.br +0 -0
  119. package/build/client/_app/immutable/chunks/D347PuJK.js.gz +0 -0
  120. package/build/client/_app/immutable/chunks/DQM017d5.js +0 -1
  121. package/build/client/_app/immutable/chunks/DQM017d5.js.br +0 -0
  122. package/build/client/_app/immutable/chunks/DQM017d5.js.gz +0 -0
  123. package/build/client/_app/immutable/chunks/Dqgg-a0I.js +0 -1
  124. package/build/client/_app/immutable/chunks/Dqgg-a0I.js.br +0 -0
  125. package/build/client/_app/immutable/chunks/Dqgg-a0I.js.gz +0 -0
  126. package/build/client/_app/immutable/entry/app.C_IPOstn.js.br +0 -0
  127. package/build/client/_app/immutable/entry/app.C_IPOstn.js.gz +0 -0
  128. package/build/client/_app/immutable/entry/start.BfrjAeOs.js +0 -1
  129. package/build/client/_app/immutable/entry/start.BfrjAeOs.js.br +0 -2
  130. package/build/client/_app/immutable/entry/start.BfrjAeOs.js.gz +0 -0
  131. package/build/client/_app/immutable/nodes/0.DRy3hSaJ.js.br +0 -0
  132. package/build/client/_app/immutable/nodes/0.DRy3hSaJ.js.gz +0 -0
  133. package/build/client/_app/immutable/nodes/1.BL16K8Rb.js.br +0 -0
  134. package/build/client/_app/immutable/nodes/1.BL16K8Rb.js.gz +0 -0
  135. package/build/client/_app/immutable/nodes/2.iOKTlmTJ.js.br +0 -0
  136. package/build/client/_app/immutable/nodes/2.iOKTlmTJ.js.gz +0 -0
  137. package/build/client/_app/immutable/nodes/3.GuF9Fr8V.js.br +0 -0
  138. package/build/client/_app/immutable/nodes/3.GuF9Fr8V.js.gz +0 -0
  139. package/build/client/_app/immutable/nodes/5.DRvLQ5NR.js +0 -1
  140. package/build/client/_app/immutable/nodes/5.DRvLQ5NR.js.br +0 -0
  141. package/build/client/_app/immutable/nodes/5.DRvLQ5NR.js.gz +0 -0
  142. package/build/client/_app/immutable/nodes/6.DSC53pZZ.js.br +0 -0
  143. package/build/client/_app/immutable/nodes/6.DSC53pZZ.js.gz +0 -0
  144. package/build/client/_app/immutable/nodes/7.C8lL01pY.js +0 -4
  145. package/build/client/_app/immutable/nodes/7.C8lL01pY.js.br +0 -0
  146. package/build/client/_app/immutable/nodes/7.C8lL01pY.js.gz +0 -0
  147. package/build/client/_app/immutable/nodes/8.Dn1iVaxc.js.br +0 -0
  148. package/build/client/_app/immutable/nodes/8.Dn1iVaxc.js.gz +0 -0
  149. package/build/client/_app/immutable/nodes/9.D3nURtQJ.js.br +0 -0
  150. package/build/client/_app/immutable/nodes/9.D3nURtQJ.js.gz +0 -0
  151. package/build/server/chunks/_page.svelte-D1Iaycsm.js.map +0 -1
  152. package/build/server/chunks/_server.ts-BQarRaho.js.map +0 -1
  153. package/build/server/chunks/_server.ts-G8OeADGj.js.map +0 -1
  154. package/build/server/chunks/library-apns-Cf-E-DhM.js.map +0 -1
@@ -0,0 +1,6 @@
1
+ // Single source of truth for the NeuroLink browser bundle URL.
2
+ // Bump the version here to upgrade the SDK across all callers
3
+ // (activity summarizer, dashboard summarizer, /neurolink playground).
4
+
5
+ export const NEUROLINK_CDN_URL =
6
+ 'https://unpkg.com/@juspay/neurolink@9.61.1/dist/browser/neurolink.min.js';
@@ -107,17 +107,9 @@
107
107
  launching = false;
108
108
  }
109
109
  }
110
-
111
-
112
110
  </script>
113
111
 
114
- <Sheet
115
- bind:open
116
- side="bottom"
117
- title="New Terminal"
118
- onclose={onClose}
119
- classes="launch-sheet"
120
- >
112
+ <Sheet bind:open side="bottom" title="New Terminal" onclose={onClose} classes="launch-sheet">
121
113
  {#snippet content()}
122
114
  <div class="section">
123
115
  <span class="section-label">Quick Launch</span>
@@ -126,7 +118,7 @@
126
118
  <Choicebox
127
119
  mode="radio"
128
120
  selected={selectedPreset === i}
129
- onclick={() => {
121
+ onclick={(): void => {
130
122
  selectPreset(i);
131
123
  }}
132
124
  classes="preset-choice"
@@ -145,7 +137,7 @@
145
137
  : [{ id: '', label: 'No recent projects' }]}
146
138
  value={selectedCwd ? [selectedCwd] : projectPaths.length > 0 ? [projectPaths[0]] : ['']}
147
139
  placeholder="Select a project"
148
- onchange={(value) => {
140
+ onchange={(value: string[]): void => {
149
141
  selectedCwd = value[0] || '';
150
142
  }}
151
143
  classes="launch-select"
@@ -193,7 +185,8 @@
193
185
  --sheet-title-color: var(--text-primary);
194
186
  --sheet-close-button-color: var(--text-secondary);
195
187
  --sheet-close-button-hover-background: var(--component-bg-hover);
196
- --sheet-content-padding: 0 var(--space-5) calc(var(--space-8, 32px) + env(safe-area-inset-bottom, 0px));
188
+ --sheet-content-padding: 0 var(--space-5)
189
+ calc(var(--space-8, 32px) + env(safe-area-inset-bottom, 0px));
197
190
  }
198
191
 
199
192
  /* Desktop: override bottom sheet to appear as centered modal */
@@ -75,6 +75,7 @@ export class LibraryAPNsService {
75
75
  notification.alert = {
76
76
  body: payload.body ?? payload.message ?? '',
77
77
  title: payload.title,
78
+ ...(payload.subtitle ? { subtitle: payload.subtitle } : {}),
78
79
  };
79
80
 
80
81
  notification.badge = payload.badge ?? 1;
@@ -36,6 +36,7 @@ export async function sendFCMNotification(
36
36
  project: typeof payload.data?.project === 'string' ? payload.data.project : '',
37
37
  requestId: typeof payload.data?.requestId === 'string' ? payload.data.requestId : '',
38
38
  source: typeof payload.data?.source === 'string' ? payload.data.source : '',
39
+ subtitle: payload.subtitle ?? '',
39
40
  timestamp: new Date().toISOString(),
40
41
  title: payload.title,
41
42
  toolInput: payload.data?.toolInput ? JSON.stringify(payload.data.toolInput) : '',
package/src/lib/theme.css CHANGED
@@ -631,7 +631,39 @@
631
631
  flex-shrink: 0;
632
632
  }
633
633
 
634
- /* ===== Shimmer Variant Classes ===== */
634
+ /* ===== Shimmer Base + Variant Classes ===== */
635
+
636
+ .shimmer {
637
+ width: var(--shimmer-width, 100%);
638
+ height: var(--shimmer-height, 16px);
639
+ border-radius: var(--shimmer-border-radius, 4px);
640
+ background-color: var(--shimmer-background, var(--ds-gray-alpha-200, #e0e0e0));
641
+ opacity: var(--shimmer-opacity, 1);
642
+ overflow: hidden;
643
+ position: relative;
644
+ }
645
+
646
+ .shimmer::after {
647
+ content: '';
648
+ position: absolute;
649
+ inset: 0;
650
+ background: linear-gradient(
651
+ 90deg,
652
+ transparent,
653
+ var(--shimmer-highlight, rgba(255, 255, 255, 0.08)),
654
+ transparent
655
+ );
656
+ animation: shimmer var(--shimmer-duration, 1.5s) infinite;
657
+ }
658
+
659
+ @keyframes shimmer {
660
+ 0% {
661
+ transform: translateX(-100%);
662
+ }
663
+ 100% {
664
+ transform: translateX(100%);
665
+ }
666
+ }
635
667
 
636
668
  .shimmer-header {
637
669
  --shimmer-height: 80px;
@@ -23,6 +23,7 @@ export interface NotificationPayload {
23
23
  data: null | Record<string, unknown>;
24
24
  message: null | string;
25
25
  sound: null | string;
26
+ subtitle?: null | string;
26
27
  title: string;
27
28
  }
28
29
 
@@ -289,6 +289,7 @@ export const POST: RequestHandler = async ({ request }) => {
289
289
  const requestDeviceToken = body.deviceToken as string | undefined;
290
290
  const message = body.message as string;
291
291
  const title = body.title as string;
292
+ const subtitle = typeof body.subtitle === 'string' ? body.subtitle : undefined;
292
293
 
293
294
  // Coerce skipPush and waitForResponse to booleans — string "false" would
294
295
  // be truthy so we require an actual boolean, defaulting to false otherwise.
@@ -379,6 +380,7 @@ export const POST: RequestHandler = async ({ request }) => {
379
380
  },
380
381
  message: null,
381
382
  sound: 'default' as const,
383
+ ...(subtitle ? { subtitle } : {}),
382
384
  title,
383
385
  };
384
386
 
@@ -78,7 +78,9 @@ export const GET: RequestHandler = ({ request, url }) => {
78
78
 
79
79
  // Resolve short project ID to full path for the readers
80
80
  const allProjects = getMergedProjects();
81
- const matchedProject = projectId ? allProjects.find((p) => p.id === projectId) : undefined;
81
+ const matchesProject = (p: ProjectGroup): boolean =>
82
+ p.id === projectId || p.fullPath === projectId;
83
+ const matchedProject = projectId ? allProjects.find(matchesProject) : undefined;
82
84
 
83
85
  // Try Claude Code first (pass the encoded dir name for filesystem lookup)
84
86
  const claudeProjectDir = matchedProject
@@ -90,15 +92,19 @@ export const GET: RequestHandler = ({ request, url }) => {
90
92
  if (messages.length === 0) {
91
93
  messages = getOpenCodeConversation(sessionId, offset, limit);
92
94
  }
93
- let sessionInfo = null;
94
- for (const project of allProjects) {
95
- if (projectId && project.id !== projectId) {
96
- continue;
97
- }
98
- const found = project.sessions.find((s) => s.id === sessionId);
99
- if (found) {
100
- sessionInfo = found;
101
- break;
95
+
96
+ // Find session info — short-circuit when project is already resolved
97
+ let sessionInfo = matchedProject?.sessions.find((s) => s.id === sessionId) ?? null;
98
+ if (!sessionInfo) {
99
+ for (const project of allProjects) {
100
+ if (projectId && !matchesProject(project)) {
101
+ continue;
102
+ }
103
+ const found = project.sessions.find((s) => s.id === sessionId);
104
+ if (found) {
105
+ sessionInfo = found;
106
+ break;
107
+ }
102
108
  }
103
109
  }
104
110
 
@@ -1,13 +1,11 @@
1
1
  <script lang="ts">
2
- import { installFetchProxy } from '$lib/modules/client/neurolink/fetch-proxy';
3
- import { Button, Input, Pill } from '@juspay/svelte-ui-components';
4
- import { onMount } from 'svelte';
5
-
6
- const NEUROLINK_CDN_URL = 'https://unpkg.com/@juspay/neurolink/dist/browser/neurolink.min.js';
7
-
8
2
  import type { ProviderId } from '$lib/types';
9
3
 
4
+ import { NEUROLINK_CDN_URL } from '$lib/modules/client/neurolink/cdn';
5
+ import { installFetchProxy } from '$lib/modules/client/neurolink/fetch-proxy';
10
6
  import { PROVIDERS } from '$lib/modules/client/neurolink/provider-config';
7
+ import { Button, Input, Pill } from '@juspay/svelte-ui-components';
8
+ import { onMount } from 'svelte';
11
9
 
12
10
  const { data } = $props<{
13
11
  data: {
@@ -12,7 +12,7 @@
12
12
  import { page } from '$app/state';
13
13
  import { getCached, setCache } from '$lib/modules/client/common';
14
14
  import ChatView from '$lib/modules/client/terminal/ChatView.svelte';
15
- import { Button, Shimmer } from '@juspay/svelte-ui-components';
15
+ import { Button } from '@juspay/svelte-ui-components';
16
16
  import { onMount } from 'svelte';
17
17
 
18
18
  // --- State ---
@@ -382,8 +382,15 @@
382
382
  return;
383
383
  }
384
384
 
385
- const sid = sessionId || '';
386
- const pid = projectId || '';
385
+ const sid = sessionId ?? '';
386
+ const pid = projectId;
387
+
388
+ if (!sid) {
389
+ error = 'No session ID';
390
+ loading = false;
391
+ return;
392
+ }
393
+
387
394
  const queryStr = pid
388
395
  ? `id=${encodeURIComponent(sid)}&project=${encodeURIComponent(pid)}&limit=${currentLimit}`
389
396
  : `id=${encodeURIComponent(sid)}&limit=${currentLimit}`;
@@ -420,13 +427,15 @@
420
427
  }
421
428
 
422
429
  const data = (await res.json()) as SessionViewResponse;
423
- session = data.session as SessionInfo;
424
430
  const rawMessages = Array.isArray(data.messages)
425
431
  ? (data.messages as unknown as ConversationMessage[])
426
432
  : [];
433
+ setCache(`shooter_session_${sid}`, { messages: rawMessages, session: data.session });
434
+ session = data.session as SessionInfo;
427
435
  messages = rawMessages;
428
436
  hasMoreMessages = rawMessages.length >= currentLimit;
429
- setCache(`shooter_session_${sid}`, { messages: rawMessages, session: data.session });
437
+ loading = false;
438
+ return;
430
439
  } catch {
431
440
  error = 'Failed to load session';
432
441
  }
@@ -445,8 +454,11 @@
445
454
  loadingMore = true;
446
455
  try {
447
456
  const newLimit = currentLimit + 200;
448
- const sid = sessionId || '';
449
- const pid = projectId || '';
457
+ const sid = sessionId ?? '';
458
+ const pid = projectId;
459
+ if (!sid) {
460
+ return;
461
+ }
450
462
  const queryParts = [`id=${encodeURIComponent(sid)}`, `limit=${newLimit}`];
451
463
  if (pid) {
452
464
  queryParts.push(`project=${encodeURIComponent(pid)}`);
@@ -548,13 +560,13 @@
548
560
 
549
561
  <main class="main session-page-main">
550
562
  {#if loading && messages.length === 0}
551
- <div class="loading-container">
552
- <Shimmer classes="shimmer-header" />
563
+ <div class="loading-container" aria-live="polite" aria-busy="true">
564
+ <div class="shimmer shimmer-header" aria-hidden="true"></div>
553
565
  <div class="chat-container">
554
- <Shimmer classes="shimmer-bubble shimmer-bubble-user" />
555
- <Shimmer classes="shimmer-bubble shimmer-bubble-assistant" />
556
- <Shimmer classes="shimmer-bubble shimmer-bubble-user-short" />
557
- <Shimmer classes="shimmer-bubble shimmer-bubble-assistant-wide" />
566
+ <div class="shimmer shimmer-bubble shimmer-bubble-user" aria-hidden="true"></div>
567
+ <div class="shimmer shimmer-bubble shimmer-bubble-assistant" aria-hidden="true"></div>
568
+ <div class="shimmer shimmer-bubble shimmer-bubble-user-short" aria-hidden="true"></div>
569
+ <div class="shimmer shimmer-bubble shimmer-bubble-assistant-wide" aria-hidden="true"></div>
558
570
  </div>
559
571
  </div>
560
572
  {:else if error}
@@ -684,5 +696,4 @@
684
696
  flex-shrink: 0;
685
697
  border-bottom: 1px solid var(--border);
686
698
  }
687
-
688
699
  </style>
@@ -1,3 +0,0 @@
1
- import{bq as Te,q as Ve,s as P,g as j,b as C,P as oe,br as vt}from"./Ce0VRwE1.js";class pe{constructor(t,n){this.status=t,typeof n=="string"?this.body={message:n}:n?this.body=n:this.body={message:`Error: ${t}`}}toString(){return JSON.stringify(this.body)}}class Ue{constructor(t,n){this.status=t,this.location=n}}class Le extends Error{constructor(t,n,r){super(r),this.status=t,this.text=n}}new URL("sveltekit-internal://");function bt(e,t){return e==="/"||t==="ignore"?e:t==="never"?e.endsWith("/")?e.slice(0,-1):e:t==="always"&&!e.endsWith("/")?e+"/":e}function kt(e){return e.split("%25").map(decodeURI).join("%25")}function Et(e){for(const t in e)e[t]=decodeURIComponent(e[t]);return e}function ye({href:e}){return e.split("#")[0]}function At(...e){let t=5381;for(const n of e)if(typeof n=="string"){let r=n.length;for(;r;)t=t*33^n.charCodeAt(--r)}else if(ArrayBuffer.isView(n)){const r=new Uint8Array(n.buffer,n.byteOffset,n.byteLength);let a=r.length;for(;a;)t=t*33^r[--a]}else throw new TypeError("value must be a string or TypedArray");return(t>>>0).toString(36)}new TextEncoder;const St=new TextDecoder;function Rt(e){const t=atob(e),n=new Uint8Array(t.length);for(let r=0;r<t.length;r++)n[r]=t.charCodeAt(r);return n}const It=window.fetch;window.fetch=(e,t)=>((e instanceof Request?e.method:t?.method||"GET")!=="GET"&&J.delete(Pe(e)),It(e,t));const J=new Map;function Tt(e,t){const n=Pe(e,t),r=document.querySelector(n);if(r?.textContent){r.remove();let{body:a,...s}=JSON.parse(r.textContent);const o=r.getAttribute("data-ttl");return o&&J.set(n,{body:a,init:s,ttl:1e3*Number(o)}),r.getAttribute("data-b64")!==null&&(a=Rt(a)),Promise.resolve(new Response(a,s))}return window.fetch(e,t)}function Ut(e,t,n){if(J.size>0){const r=Pe(e,n),a=J.get(r);if(a){if(performance.now()<a.ttl&&["default","force-cache","only-if-cached",void 0].includes(n?.cache))return new Response(a.body,a.init);J.delete(r)}}return window.fetch(t,n)}function Pe(e,t){let r=`script[data-sveltekit-fetched][data-url=${JSON.stringify(e instanceof Request?e.url:e)}]`;if(t?.headers||t?.body){const a=[];t.headers&&a.push([...new Headers(t.headers)].join(",")),t.body&&(typeof t.body=="string"||ArrayBuffer.isView(t.body))&&a.push(t.body),r+=`[data-hash="${At(...a)}"]`}return r}const Lt=/^(\[)?(\.\.\.)?(\w+)(?:=(\w+))?(\])?$/;function Pt(e){const t=[];return{pattern:e==="/"?/^\/$/:new RegExp(`^${Ct(e).map(r=>{const a=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(r);if(a)return t.push({name:a[1],matcher:a[2],optional:!1,rest:!0,chained:!0}),"(?:/([^]*))?";const s=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(r);if(s)return t.push({name:s[1],matcher:s[2],optional:!0,rest:!1,chained:!0}),"(?:/([^/]+))?";if(!r)return;const o=r.split(/\[(.+?)\](?!\])/);return"/"+o.map((i,l)=>{if(l%2){if(i.startsWith("x+"))return ve(String.fromCharCode(parseInt(i.slice(2),16)));if(i.startsWith("u+"))return ve(String.fromCharCode(...i.slice(2).split("-").map(h=>parseInt(h,16))));const f=Lt.exec(i),[,u,_,p,d]=f;return t.push({name:p,matcher:d,optional:!!u,rest:!!_,chained:_?l===1&&o[0]==="":!1}),_?"([^]*?)":u?"([^/]*)?":"([^/]+?)"}return ve(i)}).join("")}).join("")}/?$`),params:t}}function jt(e){return e!==""&&!/^\([^)]+\)$/.test(e)}function Ct(e){return e.slice(1).split("/").filter(jt)}function Ot(e,t,n){const r={},a=e.slice(1),s=a.filter(c=>c!==void 0);let o=0;for(let c=0;c<t.length;c+=1){const i=t[c];let l=a[c-o];if(i.chained&&i.rest&&o&&(l=a.slice(c-o,c+1).filter(f=>f).join("/"),o=0),l===void 0)if(i.rest)l="";else continue;if(!i.matcher||n[i.matcher](l)){r[i.name]=l;const f=t[c+1],u=a[c+1];f&&!f.rest&&f.optional&&u&&i.chained&&(o=0),!f&&!u&&Object.keys(r).length===s.length&&(o=0);continue}if(i.optional&&i.chained){o++;continue}return}if(!o)return r}function ve(e){return e.normalize().replace(/[[\]]/g,"\\$&").replace(/%/g,"%25").replace(/\//g,"%2[Ff]").replace(/\?/g,"%3[Ff]").replace(/#/g,"%23").replace(/[.*+?^${}()|\\]/g,"\\$&")}function Nt({nodes:e,server_loads:t,dictionary:n,matchers:r}){const a=new Set(t);return Object.entries(n).map(([c,[i,l,f]])=>{const{pattern:u,params:_}=Pt(c),p={id:c,exec:d=>{const h=u.exec(d);if(h)return Ot(h,_,r)},errors:[1,...f||[]].map(d=>e[d]),layouts:[0,...l||[]].map(o),leaf:s(i)};return p.errors.length=p.layouts.length=Math.max(p.errors.length,p.layouts.length),p});function s(c){const i=c<0;return i&&(c=~c),[i,e[c]]}function o(c){return c===void 0?c:[a.has(c),e[c]]}}function Ze(e,t=JSON.parse){try{return t(sessionStorage[e])}catch{}}function Me(e,t,n=JSON.stringify){const r=n(t);try{sessionStorage[e]=r}catch{}}const T=globalThis.__sveltekit_1wldm9p?.base??"",xt=globalThis.__sveltekit_1wldm9p?.assets??T??"",$t="1777103949796",Qe="sveltekit:snapshot",et="sveltekit:scroll",tt="sveltekit:states",Dt="sveltekit:pageurl",q="sveltekit:history",Q="sveltekit:navigation",B={tap:1,hover:2,viewport:3,eager:4,off:-1,false:-1},re=location.origin;function je(e){if(e instanceof URL)return e;let t=document.baseURI;if(!t){const n=document.getElementsByTagName("base");t=n.length?n[0].href:document.URL}return new URL(e,t)}function V(){return{x:pageXOffset,y:pageYOffset}}function M(e,t){return e.getAttribute(`data-sveltekit-${t}`)}const qe={...B,"":B.hover};function nt(e){let t=e.assignedSlot??e.parentNode;return t?.nodeType===11&&(t=t.host),t}function rt(e,t){for(;e&&e!==t;){if(e.nodeName.toUpperCase()==="A"&&e.hasAttribute("href"))return e;e=nt(e)}}function Ee(e,t,n){let r;try{if(r=new URL(e instanceof SVGAElement?e.href.baseVal:e.href,document.baseURI),n&&r.hash.match(/^#[^/]/)){const c=location.hash.split("#")[1]||"/";r.hash=`#${c}${r.hash}`}}catch{}const a=e instanceof SVGAElement?e.target.baseVal:e.target,s=!r||!!a||_e(r,t,n)||(e.getAttribute("rel")||"").split(/\s+/).includes("external"),o=r?.origin===re&&e.hasAttribute("download");return{url:r,external:s,target:a,download:o}}function se(e){let t=null,n=null,r=null,a=null,s=null,o=null,c=e;for(;c&&c!==document.documentElement;)r===null&&(r=M(c,"preload-code")),a===null&&(a=M(c,"preload-data")),t===null&&(t=M(c,"keepfocus")),n===null&&(n=M(c,"noscroll")),s===null&&(s=M(c,"reload")),o===null&&(o=M(c,"replacestate")),c=nt(c);function i(l){switch(l){case"":case"true":return!0;case"off":case"false":return!1;default:return}}return{preload_code:qe[r??"off"],preload_data:qe[a??"off"],keepfocus:i(t),noscroll:i(n),reload:i(s),replace_state:i(o)}}function Ge(e){const t=Te(e);let n=!0;function r(){n=!0,t.update(o=>o)}function a(o){n=!1,t.set(o)}function s(o){let c;return t.subscribe(i=>{(c===void 0||n&&i!==c)&&o(c=i)})}return{notify:r,set:a,subscribe:s}}const at={v:()=>{}};function Bt(){const{set:e,subscribe:t}=Te(!1);let n;async function r(){clearTimeout(n);try{const a=await fetch(`${xt}/_app/version.json`,{headers:{pragma:"no-cache","cache-control":"no-cache"}});if(!a.ok)return!1;const o=(await a.json()).version!==$t;return o&&(e(!0),at.v(),clearTimeout(n)),o}catch{return!1}}return{subscribe:t,check:r}}function _e(e,t,n){return e.origin!==re||!e.pathname.startsWith(t)?!0:n?e.pathname!==location.pathname:!1}function Sn(e){}function Ft(e){const t=Mt(e),n=new ArrayBuffer(t.length),r=new DataView(n);for(let a=0;a<n.byteLength;a++)r.setUint8(a,t.charCodeAt(a));return n}const Vt="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function Mt(e){e.length%4===0&&(e=e.replace(/==?$/,""));let t="",n=0,r=0;for(let a=0;a<e.length;a++)n<<=6,n|=Vt.indexOf(e[a]),r+=6,r===24&&(t+=String.fromCharCode((n&16711680)>>16),t+=String.fromCharCode((n&65280)>>8),t+=String.fromCharCode(n&255),n=r=0);return r===12?(n>>=4,t+=String.fromCharCode(n)):r===18&&(n>>=2,t+=String.fromCharCode((n&65280)>>8),t+=String.fromCharCode(n&255)),t}const qt=-1,Gt=-2,Kt=-3,Yt=-4,Wt=-5,Ht=-6,zt=-7;function Jt(e,t){if(typeof e=="number")return s(e,!0);if(!Array.isArray(e)||e.length===0)throw new Error("Invalid input");const n=e,r=Array(n.length);let a=null;function s(o,c=!1){if(o===qt)return;if(o===Kt)return NaN;if(o===Yt)return 1/0;if(o===Wt)return-1/0;if(o===Ht)return-0;if(c||typeof o!="number")throw new Error("Invalid input");if(o in r)return r[o];const i=n[o];if(!i||typeof i!="object")r[o]=i;else if(Array.isArray(i))if(typeof i[0]=="string"){const l=i[0],f=t&&Object.hasOwn(t,l)?t[l]:void 0;if(f){let u=i[1];if(typeof u!="number"&&(u=n.push(i[1])-1),a??=new Set,a.has(u))throw new Error("Invalid circular reference");return a.add(u),r[o]=f(s(u)),a.delete(u),r[o]}switch(l){case"Date":r[o]=new Date(i[1]);break;case"Set":const u=new Set;r[o]=u;for(let h=1;h<i.length;h+=1)u.add(s(i[h]));break;case"Map":const _=new Map;r[o]=_;for(let h=1;h<i.length;h+=2)_.set(s(i[h]),s(i[h+1]));break;case"RegExp":r[o]=new RegExp(i[1],i[2]);break;case"Object":const p=Object(i[1]);if(Object.hasOwn(p,"__proto__"))throw new Error("Cannot parse an object with a `__proto__` property");r[o]=p;break;case"BigInt":r[o]=BigInt(i[1]);break;case"null":const d=Object.create(null);r[o]=d;for(let h=1;h<i.length;h+=2){if(i[h]==="__proto__")throw new Error("Cannot parse an object with a `__proto__` property");d[i[h]]=s(i[h+1])}break;case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"BigInt64Array":case"BigUint64Array":{if(n[i[1]][0]!=="ArrayBuffer")throw new Error("Invalid data");const h=globalThis[l],w=s(i[1]),g=new h(w);r[o]=i[2]!==void 0?g.subarray(i[2],i[3]):g;break}case"ArrayBuffer":{const h=i[1];if(typeof h!="string")throw new Error("Invalid ArrayBuffer encoding");const w=Ft(h);r[o]=w;break}case"Temporal.Duration":case"Temporal.Instant":case"Temporal.PlainDate":case"Temporal.PlainTime":case"Temporal.PlainDateTime":case"Temporal.PlainMonthDay":case"Temporal.PlainYearMonth":case"Temporal.ZonedDateTime":{const h=l.slice(9);r[o]=Temporal[h].from(i[1]);break}case"URL":{const h=new URL(i[1]);r[o]=h;break}case"URLSearchParams":{const h=new URLSearchParams(i[1]);r[o]=h;break}default:throw new Error(`Unknown type ${l}`)}}else if(i[0]===zt){const l=i[1];if(!Number.isInteger(l)||l<0)throw new Error("Invalid input");const f=new Array(l);r[o]=f;for(let u=2;u<i.length;u+=2){const _=i[u];if(!Number.isInteger(_)||_<0||_>=l)throw new Error("Invalid input");f[_]=s(i[u+1])}}else{const l=new Array(i.length);r[o]=l;for(let f=0;f<i.length;f+=1){const u=i[f];u!==Gt&&(l[f]=s(u))}}else{const l={};r[o]=l;for(const f of Object.keys(i)){if(f==="__proto__")throw new Error("Cannot parse an object with a `__proto__` property");const u=i[f];l[f]=s(u)}}return r[o]}return s(0)}const ot=new Set(["load","prerender","csr","ssr","trailingSlash","config"]);[...ot];const Xt=new Set([...ot]);[...Xt];function Zt(e){return e.filter(t=>t!=null)}const Qt="x-sveltekit-invalidated",en="x-sveltekit-trailing-slash";function ie(e){return e instanceof pe||e instanceof Le?e.status:500}function tn(e){return e instanceof Le?e.text:"Internal Error"}let R,ee,be;const nn=Ve.toString().includes("$$")||/function \w+\(\) \{\}/.test(Ve.toString()),Ke="a:";nn?(R={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL(Ke)},ee={current:null},be={current:!1}):(R=new class{#e=P({});get data(){return j(this.#e)}set data(t){C(this.#e,t)}#t=P(null);get form(){return j(this.#t)}set form(t){C(this.#t,t)}#n=P(null);get error(){return j(this.#n)}set error(t){C(this.#n,t)}#r=P({});get params(){return j(this.#r)}set params(t){C(this.#r,t)}#a=P({id:null});get route(){return j(this.#a)}set route(t){C(this.#a,t)}#o=P({});get state(){return j(this.#o)}set state(t){C(this.#o,t)}#s=P(-1);get status(){return j(this.#s)}set status(t){C(this.#s,t)}#i=P(new URL(Ke));get url(){return j(this.#i)}set url(t){C(this.#i,t)}},ee=new class{#e=P(null);get current(){return j(this.#e)}set current(t){C(this.#e,t)}},be=new class{#e=P(!1);get current(){return j(this.#e)}set current(t){C(this.#e,t)}},at.v=()=>be.current=!0);function rn(e){Object.assign(R,e)}const an="/__data.json",on=".html__data.json";function sn(e){return e.endsWith(".html")?e.replace(/\.html$/,on):e.replace(/\/$/,"")+an}const cn=new Set(["icon","shortcut icon","apple-touch-icon"]);let H=null;const $=Ze(et)??{},te=Ze(Qe)??{},x={url:Ge({}),page:Ge({}),navigating:Te(null),updated:Bt()};function Ce(e){$[e]=V()}function ln(e,t){let n=e+1;for(;$[n];)delete $[n],n+=1;for(n=t+1;te[n];)delete te[n],n+=1}function Y(e,t=!1){return t?location.replace(e.href):location.href=e.href,new Promise(()=>{})}async function st(){if("serviceWorker"in navigator){const e=await navigator.serviceWorker.getRegistration(T||"/");e&&await e.update()}}function Ye(){}let Oe,Ae,ce,N,Se,k;const le=[],fe=[];let L=null;function Re(){L?.fork?.then(e=>e?.discard()),L=null}const ae=new Map,it=new Set,fn=new Set,X=new Set;let y={branch:[],error:null,url:null},Ne=!1,ue=!1,We=!0,ne=!1,z=!1,ct=!1,xe=!1,lt,S,I,F;const Z=new Set,He=new Map;async function Un(e,t,n){globalThis.__sveltekit_1wldm9p?.data&&globalThis.__sveltekit_1wldm9p.data,document.URL!==location.href&&(location.href=location.href),k=e,await e.hooks.init?.(),Oe=Nt(e),N=document.documentElement,Se=t,Ae=e.nodes[0],ce=e.nodes[1],Ae(),ce(),S=history.state?.[q],I=history.state?.[Q],S||(S=I=Date.now(),history.replaceState({...history.state,[q]:S,[Q]:I},""));const r=$[S];function a(){r&&(history.scrollRestoration="manual",scrollTo(r.x,r.y))}n?(a(),await bn(Se,n)):(await G({type:"enter",url:je(k.hash?En(new URL(location.href)):location.href),replace_state:!0}),a()),vn()}function un(){le.length=0,xe=!1}function ft(e){fe.some(t=>t?.snapshot)&&(te[e]=fe.map(t=>t?.snapshot?.capture()))}function ut(e){te[e]?.forEach((t,n)=>{fe[n]?.snapshot?.restore(t)})}function ze(){Ce(S),Me(et,$),ft(I),Me(Qe,te)}async function dt(e,t,n,r){let a;t.invalidateAll&&Re(),await G({type:"goto",url:je(e),keepfocus:t.keepFocus,noscroll:t.noScroll,replace_state:t.replaceState,state:t.state,redirect_count:n,nav_token:r,accept:()=>{t.invalidateAll&&(xe=!0,a=[...He.keys()]),t.invalidate&&t.invalidate.forEach(yn)}}),t.invalidateAll&&oe().then(oe).then(()=>{He.forEach(({resource:s},o)=>{a?.includes(o)&&s.refresh?.()})})}async function dn(e){if(e.id!==L?.id){Re();const t={};Z.add(t),L={id:e.id,token:t,promise:pt({...e,preload:t}).then(n=>(Z.delete(t),n.type==="loaded"&&n.state.error&&Re(),n)),fork:null}}return L.promise}async function ke(e){const t=(await me(e,!1))?.route;t&&await Promise.all([...t.layouts,t.leaf].filter(Boolean).map(n=>n[1]()))}async function ht(e,t,n){const r={params:y.params,route:{id:y.route?.id??null},url:new URL(location.href)};y={...e.state,nav:r};const a=document.querySelector("style[data-sveltekit]");if(a&&a.remove(),Object.assign(R,e.props.page),lt=new k.root({target:t,props:{...e.props,stores:x,components:fe},hydrate:n,sync:!1,transformError:void 0}),await Promise.resolve(),ut(I),n){const s={from:null,to:{...r,scroll:$[S]??V()},willUnload:!1,type:"enter",complete:Promise.resolve()};X.forEach(o=>o(s))}ue=!0}async function de({url:e,params:t,branch:n,errors:r,status:a,error:s,route:o,form:c}){let i="never";if(T&&(e.pathname===T||e.pathname===T+"/"))i="always";else for(const d of n)d?.slash!==void 0&&(i=d.slash);e.pathname=bt(e.pathname,i),e.search=e.search;const l={type:"loaded",state:{url:e,params:t,branch:n,error:s,route:o},props:{constructors:Zt(n).map(d=>d.node.component),page:Fe(R)}};c!==void 0&&(l.props.form=c);let f={},u=!R,_=0;for(let d=0;d<Math.max(n.length,y.branch.length);d+=1){const h=n[d],w=y.branch[d];h?.data!==w?.data&&(u=!0),h&&(f={...f,...h.data},u&&(l.props[`data_${_}`]=f),_+=1)}return(!y.url||e.href!==y.url.href||y.error!==s||c!==void 0&&c!==R.form||u)&&(l.props.page={error:s,params:t,route:{id:o?.id??null},state:{},status:a,url:new URL(e),form:c??null,data:u?f:R.data}),l}async function $e({loader:e,parent:t,url:n,params:r,route:a,server_data_node:s}){let o=null;const c={dependencies:new Set,params:new Set,parent:!1,route:!1,url:!1,search_params:new Set},i=await e();return{node:i,loader:e,server:s,universal:i.universal?.load?{type:"data",data:o,uses:c}:null,data:o??s?.data??null,slash:i.universal?.trailingSlash??s?.slash}}function hn(e,t,n){let r=e instanceof Request?e.url:e;const a=new URL(r,n);a.origin===n.origin&&(r=a.href.slice(n.origin.length));const s=ue?Ut(r,a.href,t):Tt(r,t);return{resolved:a,promise:s}}function Je(e,t,n,r,a,s){if(xe)return!0;if(!a)return!1;if(a.parent&&e||a.route&&t||a.url&&n)return!0;for(const o of a.search_params)if(r.has(o))return!0;for(const o of a.params)if(s[o]!==y.params[o])return!0;for(const o of a.dependencies)if(le.some(c=>c(new URL(o))))return!0;return!1}function De(e,t){return e?.type==="data"?e:e?.type==="skip"?t??null:null}function pn(e,t){if(!e)return new Set(t.searchParams.keys());const n=new Set([...e.searchParams.keys(),...t.searchParams.keys()]);for(const r of n){const a=e.searchParams.getAll(r),s=t.searchParams.getAll(r);a.every(o=>s.includes(o))&&s.every(o=>a.includes(o))&&n.delete(r)}return n}function Xe({error:e,url:t,route:n,params:r}){return{type:"loaded",state:{error:e,url:t,route:n,params:r,branch:[]},props:{page:Fe(R),constructors:[]}}}async function pt({id:e,invalidating:t,url:n,params:r,route:a,preload:s}){if(L?.id===e)return Z.delete(L.token),L.promise;const{errors:o,layouts:c,leaf:i}=a,l=[...c,i];o.forEach(m=>m?.().catch(()=>{})),l.forEach(m=>m?.[1]().catch(()=>{}));let f=null;const u=y.url?e!==he(y.url):!1,_=y.route?a.id!==y.route.id:!1,p=pn(y.url,n);let d=!1;{const m=l.map((v,E)=>{const A=y.branch[E],b=!!v?.[0]&&(A?.loader!==v[1]||Je(d,_,u,p,A.server?.uses,r));return b&&(d=!0),b});if(m.some(Boolean)){try{f=await mt(n,m)}catch(v){const E=await K(v,{url:n,params:r,route:{id:e}});return Z.has(s)?Xe({error:E,url:n,params:r,route:a}):ge({status:ie(v),error:E,url:n,route:a})}if(f.type==="redirect")return f}}const h=f?.nodes;let w=!1;const g=l.map(async(m,v)=>{if(!m)return;const E=y.branch[v],A=h?.[v];if((!A||A.type==="skip")&&m[1]===E?.loader&&!Je(w,_,u,p,E.universal?.uses,r))return E;if(w=!0,A?.type==="error")throw A;return $e({loader:m[1],url:n,params:r,route:a,parent:async()=>{const O={};for(let D=0;D<v;D+=1)Object.assign(O,(await g[D])?.data);return O},server_data_node:De(A===void 0&&m[0]?{type:"skip"}:A??null,m[0]?E?.server:void 0)})});for(const m of g)m.catch(()=>{});const U=[];for(let m=0;m<l.length;m+=1)if(l[m])try{U.push(await g[m])}catch(v){if(v instanceof Ue)return{type:"redirect",location:v.location};if(Z.has(s))return Xe({error:await K(v,{params:r,url:n,route:{id:a.id}}),url:n,params:r,route:a});let E=ie(v),A;if(h?.includes(v))E=v.status??E,A=v.error;else if(v instanceof pe)A=v.body;else{if(await x.updated.check())return await st(),await Y(n);A=await K(v,{params:r,url:n,route:{id:a.id}})}const b=await _n(m,U,o);return b?de({url:n,params:r,branch:U.slice(0,b.idx).concat(b.node),errors:o,status:E,error:A,route:a}):await gt(n,{id:a.id},A,E)}else U.push(void 0);return de({url:n,params:r,branch:U,errors:o,status:200,error:null,route:a,form:t?void 0:null})}async function _n(e,t,n){for(;e--;)if(n[e]){let r=e;for(;!t[r];)r-=1;try{return{idx:r+1,node:{node:await n[e](),loader:n[e],data:{},server:null,universal:null}}}catch{continue}}}async function ge({status:e,error:t,url:n,route:r}){const a={};let s=null;if(k.server_loads[0]===0)try{const c=await mt(n,[!0]);if(c.type!=="data"||c.nodes[0]&&c.nodes[0].type!=="data")throw 0;s=c.nodes[0]??null}catch{(n.origin!==re||n.pathname!==location.pathname||Ne)&&await Y(n)}try{const o=await $e({loader:Ae,url:n,params:a,route:r,parent:()=>Promise.resolve({}),server_data_node:De(s)}),c={node:await ce(),loader:ce,universal:null,server:null,data:null};return de({url:n,params:a,branch:[o,c],status:e,error:t,errors:[],route:null})}catch(o){if(o instanceof Ue)return dt(new URL(o.location,location.href),{},0);throw o}}async function gn(e){const t=e.href;if(ae.has(t))return ae.get(t);let n;try{const r=(async()=>{let a=await k.hooks.reroute({url:new URL(e),fetch:async(s,o)=>hn(s,o,e).promise})??e;if(typeof a=="string"){const s=new URL(e);k.hash?s.hash=a:s.pathname=a,a=s}return a})();ae.set(t,r),n=await r}catch{ae.delete(t);return}return n}async function me(e,t){if(e&&!_e(e,T,k.hash)){const n=await gn(e);if(!n)return;const r=mn(n);for(const a of Oe){const s=a.exec(r);if(s)return{id:he(e),invalidating:t,route:a,params:Et(s),url:e}}}}function mn(e){return kt(k.hash?e.hash.replace(/^#/,"").replace(/[?#].+/,""):e.pathname.slice(T.length))||"/"}function he(e){return(k.hash?e.hash.replace(/^#/,""):e.pathname)+e.search}function _t({url:e,type:t,intent:n,delta:r,event:a,scroll:s}){let o=!1;const c=Be(y,n,e,t,s??null);r!==void 0&&(c.navigation.delta=r),a!==void 0&&(c.navigation.event=a);const i={...c.navigation,cancel:()=>{o=!0,c.reject(new Error("navigation cancelled"))}};return ne||it.forEach(l=>l(i)),o?null:c}async function G({type:e,url:t,popped:n,keepfocus:r,noscroll:a,replace_state:s,state:o={},redirect_count:c=0,nav_token:i={},accept:l=Ye,block:f=Ye,event:u}){const _=F;F=i;const p=await me(t,!1),d=e==="enter"?Be(y,p,t,e):_t({url:t,type:e,delta:n?.delta,intent:p,scroll:n?.scroll,event:u});if(!d){f(),F===i&&(F=_);return}const h=S,w=I;l(),ne=!0,ue&&d.navigation.type!=="enter"&&x.navigating.set(ee.current=d.navigation);let g=p&&await pt(p);if(!g){if(_e(t,T,k.hash))return await Y(t,s);g=await gt(t,{id:null},await K(new Le(404,"Not Found",`Not found: ${t.pathname}`),{url:t,params:{},route:{id:null}}),404,s)}if(t=p?.url||t,F!==i)return d.reject(new Error("navigation aborted")),!1;if(g.type==="redirect"){if(c<20){await G({type:e,url:new URL(g.location,t),popped:n,keepfocus:r,noscroll:a,replace_state:s,state:o,redirect_count:c+1,nav_token:i}),d.fulfil(void 0);return}g=await ge({status:500,error:await K(new Error("Redirect loop"),{url:t,params:{},route:{id:null}}),url:t,route:{id:null}})}else g.props.page.status>=400&&await x.updated.check()&&(await st(),await Y(t,s));if(un(),Ce(h),ft(w),g.props.page.url.pathname!==t.pathname&&(t.pathname=g.props.page.url.pathname),o=n?n.state:o,!n){const b=s?0:1,O={[q]:S+=b,[Q]:I+=b,[tt]:o};(s?history.replaceState:history.pushState).call(history,O,"",t),s||ln(S,I)}const U=p&&L?.id===p.id?L.fork:null;L=null,g.props.page.state=o;let m;if(ue){const b=(await Promise.all(Array.from(fn,W=>W(d.navigation)))).filter(W=>typeof W=="function");if(b.length>0){let W=function(){b.forEach(we=>{X.delete(we)})};b.push(W),b.forEach(we=>{X.add(we)})}const O=d.navigation.to;y={...g.state,nav:{params:O.params,route:O.route,url:O.url}},g.props.page&&(g.props.page.url=t);const D=U&&await U;D?m=D.commit():(H=null,lt.$set(g.props),H&&Object.assign(g.props.page,H),rn(g.props.page),m=vt?.()),ct=!0}else await ht(g,Se,!1);const{activeElement:v}=document;await m,await oe(),await oe();let E=null;if(We){const b=n?n.scroll:a?V():null;b?scrollTo(b.x,b.y):(E=t.hash&&document.getElementById(yt(t)))?E.scrollIntoView():scrollTo(0,0)}const A=document.activeElement!==v&&document.activeElement!==document.body;!r&&!A&&kn(t,!E),We=!0,g.props.page&&(H&&Object.assign(g.props.page,H),Object.assign(R,g.props.page)),ne=!1,e==="popstate"&&ut(I),d.fulfil(void 0),d.navigation.to&&(d.navigation.to.scroll=V()),X.forEach(b=>b(d.navigation)),x.navigating.set(ee.current=null)}async function gt(e,t,n,r,a){return e.origin===re&&e.pathname===location.pathname&&!Ne?await ge({status:r,error:n,url:e,route:t}):await Y(e,a)}function wn(){let e,t={element:void 0,href:void 0},n;N.addEventListener("mousemove",c=>{const i=c.target;clearTimeout(e),e=setTimeout(()=>{s(i,B.hover)},20)});function r(c){c.defaultPrevented||s(c.composedPath()[0],B.tap)}N.addEventListener("mousedown",r),N.addEventListener("touchstart",r,{passive:!0});const a=new IntersectionObserver(c=>{for(const i of c)i.isIntersecting&&(ke(new URL(i.target.href)),a.unobserve(i.target))},{threshold:0});async function s(c,i){const l=rt(c,N),f=l===t.element&&l?.href===t.href&&i>=n;if(!l||f)return;const{url:u,external:_,download:p}=Ee(l,T,k.hash);if(_||p)return;const d=se(l),h=u&&he(y.url)===he(u);if(!(d.reload||h))if(i<=d.preload_data){t={element:l,href:l.href},n=B.tap;const w=await me(u,!1);if(!w)return;dn(w)}else i<=d.preload_code&&(t={element:l,href:l.href},n=i,ke(u))}function o(){a.disconnect();for(const c of N.querySelectorAll("a")){const{url:i,external:l,download:f}=Ee(c,T,k.hash);if(l||f)continue;const u=se(c);u.reload||(u.preload_code===B.viewport&&a.observe(c),u.preload_code===B.eager&&ke(i))}}X.add(o),o()}function K(e,t){if(e instanceof pe)return e.body;const n=ie(e),r=tn(e);return k.hooks.handleError({error:e,event:t,status:n,message:r})??{message:r}}function Ln(e,t={}){return e=new URL(je(e)),e.origin!==re?Promise.reject(new Error("goto: invalid URL")):dt(e,t,0)}function yn(e){if(typeof e=="function")le.push(e);else{const{href:t}=new URL(e,location.href);le.push(n=>n.href===t)}}function vn(){history.scrollRestoration="manual",addEventListener("beforeunload",t=>{let n=!1;if(ze(),!ne){const r=Be(y,void 0,null,"leave"),a={...r.navigation,cancel:()=>{n=!0,r.reject(new Error("navigation cancelled"))}};it.forEach(s=>s(a))}n?(t.preventDefault(),t.returnValue=""):history.scrollRestoration="auto"}),addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&ze()}),navigator.connection?.saveData||wn(),N.addEventListener("click",async t=>{if(t.button||t.which!==1||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.defaultPrevented)return;const n=rt(t.composedPath()[0],N);if(!n)return;const{url:r,external:a,target:s,download:o}=Ee(n,T,k.hash);if(!r)return;if(s==="_parent"||s==="_top"){if(window.parent!==window)return}else if(s&&s!=="_self")return;const c=se(n);if(!(n instanceof SVGAElement)&&r.protocol!==location.protocol&&!(r.protocol==="https:"||r.protocol==="http:")||o)return;const[l,f]=(k.hash?r.hash.replace(/^#/,""):r.href).split("#"),u=l===ye(location);if(a||c.reload&&(!u||!f)){_t({url:r,type:"link",event:t})?ne=!0:t.preventDefault();return}if(f!==void 0&&u){const[,_]=y.url.href.split("#");if(_===f){if(t.preventDefault(),f===""||f==="top"&&n.ownerDocument.getElementById("top")===null)scrollTo({top:0});else{const p=n.ownerDocument.getElementById(decodeURIComponent(f));p&&(p.scrollIntoView(),p.focus())}return}if(z=!0,Ce(S),e(r),!c.replace_state)return;z=!1}t.preventDefault(),await new Promise(_=>{requestAnimationFrame(()=>{setTimeout(_,0)}),setTimeout(_,100)}),await G({type:"link",url:r,keepfocus:c.keepfocus,noscroll:c.noscroll,replace_state:c.replace_state??r.href===location.href,event:t})}),N.addEventListener("submit",t=>{if(t.defaultPrevented)return;const n=HTMLFormElement.prototype.cloneNode.call(t.target),r=t.submitter;if((r?.formTarget||n.target)==="_blank"||(r?.formMethod||n.method)!=="get")return;const o=new URL(r?.hasAttribute("formaction")&&r?.formAction||n.action);if(_e(o,T,!1))return;const c=t.target,i=se(c);if(i.reload)return;t.preventDefault(),t.stopPropagation();const l=new FormData(c,r);o.search=new URLSearchParams(l).toString(),G({type:"form",url:o,keepfocus:i.keepfocus,noscroll:i.noscroll,replace_state:i.replace_state??o.href===location.href,event:t})}),addEventListener("popstate",async t=>{if(!Ie){if(t.state?.[q]){const n=t.state[q];if(F={},n===S)return;const r=$[n],a=t.state[tt]??{},s=new URL(t.state[Dt]??location.href),o=t.state[Q],c=y.url?ye(location)===ye(y.url):!1;if(o===I&&(ct||c)){a!==R.state&&(R.state=a),e(s),$[S]=V(),r&&scrollTo(r.x,r.y),S=n;return}const l=n-S;await G({type:"popstate",url:s,popped:{state:a,scroll:r,delta:l},accept:()=>{S=n,I=o},block:()=>{history.go(-l)},nav_token:F,event:t})}else if(!z){const n=new URL(location.href);e(n),k.hash&&location.reload()}}}),addEventListener("hashchange",()=>{z&&(z=!1,history.replaceState({...history.state,[q]:++S,[Q]:I},"",location.href))});for(const t of document.querySelectorAll("link"))cn.has(t.rel)&&(t.href=t.href);addEventListener("pageshow",t=>{t.persisted&&x.navigating.set(ee.current=null)});function e(t){y.url=R.url=t,x.page.set(Fe(R)),x.page.notify()}}async function bn(e,{status:t=200,error:n,node_ids:r,params:a,route:s,server_route:o,data:c,form:i}){Ne=!0;const l=new URL(location.href);let f;({params:a={},route:s={id:null}}=await me(l,!1)||{}),f=Oe.find(({id:p})=>p===s.id);let u,_=!0;try{const p=r.map(async(h,w)=>{const g=c[w];return g?.uses&&(g.uses=wt(g.uses)),$e({loader:k.nodes[h],url:l,params:a,route:s,parent:async()=>{const U={};for(let m=0;m<w;m+=1)Object.assign(U,(await p[m]).data);return U},server_data_node:De(g)})}),d=await Promise.all(p);if(f){const h=f.layouts;for(let w=0;w<h.length;w++)h[w]||d.splice(w,0,void 0)}u=await de({url:l,params:a,branch:d,status:t,error:n,errors:f?.errors,form:i,route:f??null})}catch(p){if(p instanceof Ue){await Y(new URL(p.location,location.href));return}u=await ge({status:ie(p),error:await K(p,{url:l,params:a,route:s}),url:l,route:s}),e.textContent="",_=!1}u.props.page&&(u.props.page.state={}),await ht(u,e,_)}async function mt(e,t){const n=new URL(e);n.pathname=sn(e.pathname),e.pathname.endsWith("/")&&n.searchParams.append(en,"1"),n.searchParams.append(Qt,t.map(s=>s?"1":"0").join(""));const r=window.fetch,a=await r(n.href,{});if(!a.ok){let s;throw a.headers.get("content-type")?.includes("application/json")?s=await a.json():a.status===404?s="Not Found":a.status===500&&(s="Internal Error"),new pe(a.status,s)}return new Promise(async s=>{const o=new Map,c=a.body.getReader();function i(f){return Jt(f,{...k.decoders,Promise:u=>new Promise((_,p)=>{o.set(u,{fulfil:_,reject:p})})})}let l="";for(;;){const{done:f,value:u}=await c.read();if(f&&!l)break;for(l+=!u&&l?`
2
- `:St.decode(u,{stream:!0});;){const _=l.indexOf(`
3
- `);if(_===-1)break;const p=JSON.parse(l.slice(0,_));if(l=l.slice(_+1),p.type==="redirect")return s(p);if(p.type==="data")p.nodes?.forEach(d=>{d?.type==="data"&&(d.uses=wt(d.uses),d.data=i(d.data))}),s(p);else if(p.type==="chunk"){const{id:d,data:h,error:w}=p,g=o.get(d);o.delete(d),w?g.reject(i(w)):g.fulfil(i(h))}}}})}function wt(e){return{dependencies:new Set(e?.dependencies??[]),params:new Set(e?.params??[]),parent:!!e?.parent,route:!!e?.route,url:!!e?.url,search_params:new Set(e?.search_params??[])}}let Ie=!1;function kn(e,t=!0){const n=document.querySelector("[autofocus]");if(n)n.focus();else{const r=yt(e);if(r&&document.getElementById(r)){const{x:s,y:o}=V();setTimeout(()=>{const c=history.state;Ie=!0,location.replace(new URL(`#${r}`,location.href)),history.replaceState(c,"",e),t&&scrollTo(s,o),Ie=!1})}else{const s=document.body,o=s.getAttribute("tabindex");s.tabIndex=-1,s.focus({preventScroll:!0,focusVisible:!1}),o!==null?s.setAttribute("tabindex",o):s.removeAttribute("tabindex")}const a=getSelection();if(a&&a.type!=="None"){const s=[];for(let o=0;o<a.rangeCount;o+=1)s.push(a.getRangeAt(o));setTimeout(()=>{if(a.rangeCount===s.length){for(let o=0;o<a.rangeCount;o+=1){const c=s[o],i=a.getRangeAt(o);if(c.commonAncestorContainer!==i.commonAncestorContainer||c.startContainer!==i.startContainer||c.endContainer!==i.endContainer||c.startOffset!==i.startOffset||c.endOffset!==i.endOffset)return}a.removeAllRanges()}})}}}function Be(e,t,n,r,a=null){let s,o;const c=new Promise((l,f)=>{s=l,o=f});return c.catch(()=>{}),{navigation:{from:{params:e.params,route:{id:e.route?.id??null},url:e.url,scroll:V()},to:n&&{params:t?.params??null,route:{id:t?.route?.id??null},url:n,scroll:a},willUnload:!t,type:r,complete:c},fulfil:s,reject:o}}function Fe(e){return{data:e.data,error:e.error,form:e.form,params:e.params,route:e.route,state:e.state,status:e.status,url:e.url}}function En(e){const t=new URL(e);return t.hash=decodeURIComponent(e.hash),t}function yt(e){let t;if(k.hash){const[,,n]=e.hash.split("#",3);t=n??""}else t=e.hash.slice(1);return decodeURIComponent(t)}export{Un as a,Ln as g,Sn as l,R as p,x as s};
@@ -1,5 +0,0 @@
1
- const e=`<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
2
- <path d="M23 4v6h-6M1 20v-6h6"/>
3
- <path d="M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15"/>
4
- </svg>
5
- `;export{e as R};
@@ -1 +0,0 @@
1
- import{g as y}from"./gQJcRhou.js";import"./BCwT4WOg.js";const b={"https://api.anthropic.com/":"anthropic","https://api.mistral.ai/":"mistral","https://api.openai.com/":"openai","https://generativelanguage.googleapis.com/":"google-ai"};let p=!1;function O(){if(p||typeof globalThis>"u")return;p=!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={},a=o?.headers??(e instanceof Request?e.headers:{}),d=a instanceof Headers?a:Object.entries(a);for(const[t,g]of d){const f=t.toLowerCase();f!=="x-api-key"&&f!=="authorization"&&(c[t]=g)}let s;try{s=JSON.parse(o?.body??(e instanceof Request?await e.text():"{}"))}catch{s={}}const l=y(),h={"Content-Type":"application/json"};return l&&(h.Authorization=`Bearer ${l}`),r("/api/neurolink-proxy",{body:JSON.stringify({body:s,headers:c,provider:n,url:i}),headers:h,method:"POST"})}}export{O as i};
@@ -1 +0,0 @@
1
- import{a as n,f as i}from"./3MMtouT7.js";import{t as o}from"./Ce0VRwE1.js";import{s as m,d as c}from"./BTu-2gkj.js";var f=i("<div></div>");function g(t,e){var s=f();o(()=>{m(s,1,`shimmer ${e.classes??""??""}`,"svelte-v69ai"),c(s,"data-pw",typeof e.testId=="string"?e.testId:null)}),n(t,s)}const l=5e3;function p(t){try{sessionStorage.removeItem(t)}catch{}}function v(t,e=l){try{const s=sessionStorage.getItem(t);if(!s)return null;const{data:a,timestamp:r}=JSON.parse(s);return Date.now()-r>e?null:a}catch{return null}}function S(t,e){try{sessionStorage.setItem(t,JSON.stringify({data:e,timestamp:Date.now()}))}catch{}}export{g as S,p as c,v as g,S as s};
@@ -1 +0,0 @@
1
- import{l as o,a as r}from"../chunks/Bkcn25gz.js";export{o as load_css,r as start};
@@ -1,2 +0,0 @@
1
- )�import{l as o,a as r}from"../chunks/Bkcn25gz.js";export{o as load_css,r as start};
2
- 
@@ -1 +0,0 @@
1
- import{d as q,i as K,b as H,a as E,f as P,s as V}from"../chunks/3MMtouT7.js";import{p as z,s as n,o as J,q as Q,v as W,g as t,b as r,w as _,d as g,c as b,r as c,t as X}from"../chunks/Ce0VRwE1.js";import{e as S,I as Z,B as ee,s as te,i as ae,P as I}from"../chunks/BTu-2gkj.js";import{i as se}from"../chunks/DQM017d5.js";import{P as O}from"../chunks/pRcLbE0d.js";var re=P('<div class="provider-bar svelte-sjabew"></div>'),ie=P("<div> </div>"),oe=P('<div class="page svelte-sjabew"><header class="svelte-sjabew"><h1 class="svelte-sjabew">NeuroLink</h1> <span class="version svelte-sjabew">new NeuroLink()</span> <!></header> <!> <div class="log svelte-sjabew" id="log"></div> <div class="input-bar svelte-sjabew"><!> <!></div></div>');function pe(M,p){z(p,!0);const N="https://unpkg.com/@juspay/neurolink/dist/browser/neurolink.min.js";let u=n(null),m=n(null),h=n(J([])),d=n(""),v=n(!1),f=n(!1),o=n("litellm");function i(e,a="info"){r(h,[...t(h),{text:e,type:a}],!0)}function R(){const e=globalThis.process;if(!e?.env)return;const a=e.env;p.data.litellmBaseUrl&&(a.LITELLM_BASE_URL=p.data.litellmBaseUrl),p.data.litellmModel&&(a.LITELLM_MODEL=p.data.litellmModel);const s=window.__aiProviders;s?.["google-ai"]&&(a.GOOGLE_AI_API_KEY="proxy-via-server"),s?.anthropic&&(a.ANTHROPIC_API_KEY="proxy-via-server"),s?.openai&&(a.OPENAI_API_KEY="proxy-via-server"),s?.mistral&&(a.MISTRAL_API_KEY="proxy-via-server")}Q(async()=>{$(),se(),R(),i("Loading NeuroLink from CDN..."),i(N,"dim");try{r(u,await import(N),!0),i(`Loaded! ${Object.keys(t(u)??{}).length} exports`,"pass"),r(m,new(t(u)).NeuroLink({provider:t(o)}),!0),i(`NeuroLink ready · provider: ${t(o)}`,"pass"),r(f,!0)}catch(e){i(`Failed to load: ${e instanceof Error?e.message:String(e)}`,"fail")}});function D(e){!t(u)||e===t(o)||(r(o,e,!0),r(m,new(t(u)).NeuroLink({provider:e}),!0),i(`Switched to provider: ${e}`,"dim"))}function $(){typeof globalThis.process>"u"&&(globalThis.process={cwd:()=>"/",env:{},platform:"browser",version:"v24.0.0"}),typeof globalThis.global>"u"&&(globalThis.global=globalThis)}async function j(){if(!t(d).trim()||!t(m)||t(v))return;const e=t(d).trim();r(d,""),r(v,!0),i(`> ${e}`,"user");const a=O.find(s=>s.id===t(o));if(!a){r(v,!1);return}try{const s=await t(m).generate({input:{text:e},model:a.model,provider:a.id}),l=typeof s.content=="string"?s.content:"(empty response)",x=s.usage;i(l,"ai"),i(`${a.id}/${a.model} | ${x?.total??"?"} tokens`,"dim")}catch(s){i(`Error: ${s instanceof Error?s.message:String(s)}`,"fail")}r(v,!1)}function B(e){e.key==="Enter"&&!e.shiftKey&&(e.preventDefault(),j())}var y=oe(),w=b(y),U=g(b(w),4);{var C=e=>{I(e,{text:"Connected",classes:"pill-connected"})},Y=e=>{I(e,{text:"Loading...",classes:"pill-loading"})};K(U,e=>{t(f)?e(C):e(Y,-1)})}c(w);var A=g(w,2);{var F=e=>{var a=re();S(a,21,()=>O,s=>s.id,(s,l)=>{{let x=_(()=>t(o)===t(l).id?"prov-pill--active":"");I(s,{get text(){return t(l).label},get classes(){return`prov-pill ${t(x)??""}`},onclick:()=>{D(t(l).id)}})}}),c(a),E(e,a)};K(A,e=>{t(f)&&e(F)})}var L=g(A,2);S(L,21,()=>t(h),ae,(e,a)=>{var s=ie(),l=b(s,!0);c(s),X(()=>{te(s,1,`log-entry ${t(a).type??""}`,"svelte-sjabew"),V(l,t(a).text)}),E(e,s)}),c(L);var k=g(L,2),T=b(k);{let e=_(()=>t(f)?`Ask anything... [${t(o)}]`:"Loading SDK...");Z(T,{name:"prompt",get placeholder(){return t(e)},classes:"input-prompt",get value(){return t(d)},set value(a){r(d,a,!0)}})}var G=g(T,2);{let e=_(()=>!t(f)||t(v)||!t(d).trim()),a=_(()=>t(v)?"...":"Send");ee(G,{classes:"btn-primary",onclick:j,get disabled(){return t(e)},get text(){return t(a)}})}c(k),c(y),H("keydown",k,B),E(M,y),W()}q(["keydown"]);export{pe as component};
@@ -1,4 +0,0 @@
1
- import{i as x,a as v,f as b,s as H}from"../chunks/3MMtouT7.js";import{p as ge,s as g,o as we,q as ye,v as be,y as _e,b as o,g as e,$ as Se,c as w,r as y,w as R,d as _,z as Q,t as X}from"../chunks/Ce0VRwE1.js";import{h as $e}from"../chunks/DFPEaIHz.js";import{d as Y,B as ke}from"../chunks/BTu-2gkj.js";import{p as L}from"../chunks/CBvZimn-.js";import{g as Ie,s as Z,S as W}from"../chunks/Dqgg-a0I.js";import"../chunks/BCwT4WOg.js";import{C as je}from"../chunks/BsNWiLas.js";var Ce=b('<meta name="description" content="Session conversation view"/>'),Oe=b('<div class="loading-container"><!> <div class="chat-container"><!> <!> <!> <!></div></div>'),Me=b('<div class="session-back-row svelte-1a2wdfb"><a class="back-link">← Back</a></div> <p class="error-text svelte-1a2wdfb"> </p>',1),Ne=b('<span class="resume-status svelte-1a2wdfb">Connecting...</span>'),Ae=b('<span class="resume-status svelte-1a2wdfb">Resuming session...</span>'),Pe=b('<span class="connection-dot connected svelte-1a2wdfb"></span>'),Te=b('<span class="connection-dot reconnecting svelte-1a2wdfb"></span>'),Re=b('<div class="load-earlier-row svelte-1a2wdfb"><!></div>'),We=b('<div class="session-header svelte-1a2wdfb"><div class="session-header-row svelte-1a2wdfb"><a class="back-link">← Back</a> <!></div> <h1 class="session-title svelte-1a2wdfb"> </h1></div> <div class="session-chat-container svelte-1a2wdfb"><!> <!></div>',1),De=b('<main class="main session-page-main svelte-1a2wdfb"><!></main>');function qe(ee,te){ge(te,!0);let p=g(null),a=g(we([])),I=g(!0),N=g(null),D=g(!1),A=g(!1),P=g(200),j=g(null),k=g("idle"),c=g("idle"),S=null,$=null,C=null,O=null,u=!1;const B=R(()=>L.params.id),M=R(()=>L.url.searchParams.get("project")||""),se=R(()=>e(c)==="connecting"||e(c)==="resuming");function T(){try{const t=localStorage.getItem("shooter_config");return t?JSON.parse(t):null}catch{return null}}async function q(){const t=T();if(!t)return null;try{const s=await fetch("/api/ws-ticket",{headers:{Authorization:`Bearer ${t.apiKey}`},method:"POST"});return s.ok?(await s.json()).ticket:null}catch{return null}}async function E(t,s){if(u||C&&(C.readyState===WebSocket.OPEN||C.readyState===WebSocket.CONNECTING))return;const n=await q();if(!n||u)return;o(k,"connecting");const i=window.location.protocol==="https:"?"wss:":"ws:",r=new WebSocket(`${i}//${window.location.host}${t}?ticket=${n}`);r.onopen=()=>{if(u){r.close();return}o(k,"connected"),r.send(JSON.stringify({sessionId:s,type:"subscribe"}))},r.onmessage=d=>{if(!u)try{const f=JSON.parse(d.data);ne(f)}catch{}},r.onclose=()=>{u||(o(k,"disconnected"),C=null,e(j)&&(O&&clearTimeout(O),O=setTimeout(()=>{O=null,!u&&e(j)&&E(`/ws/session/${e(j)}`,e(j))},2e3)))},r.onerror=()=>{u||o(k,"disconnected")},C=r}async function F(t){if(u)return;const s=await q();if(!s||u)return;const n=window.location.protocol==="https:"?"wss:":"ws:",i=new WebSocket(`${n}//${window.location.host}${t}?ticket=${s}`);i.onopen=()=>{if(u){i.close();return}$=i,e(c)==="ready"&&S&&(i.send(JSON.stringify({data:`${S}
2
- `,type:"input"})),S=null)},i.onclose=()=>{$===i&&($=null)}}function ne(t){if(t.type==="history"){const s=t.messages||[];o(a,s.map(n=>({id:n.id,parts:n.content,role:n.role,timestamp:n.timestamp})),!0),o(D,!1),e(c)==="resuming"&&(o(c,"ready"),S&&$?.readyState===WebSocket.OPEN&&($.send(JSON.stringify({data:`${S}
3
- `,type:"input"})),S=null))}else if(t.type==="message")o(a,[...e(a),{id:`msg-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,parts:t.content||[],role:t.role||"assistant",timestamp:t.timestamp||new Date().toISOString()}],!0);else if(t.type==="tool-use"){const s={id:t.id||`tool-${Date.now()}`,input:t.input||{},toolName:t.name,type:"tool_use"},n=e(a).length>0?e(a)[e(a).length-1]:null;n?.role==="assistant"?o(a,[...e(a).slice(0,-1),{...n,parts:[...n.parts,s]}],!0):o(a,[...e(a),{id:`tool-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,parts:[s],role:"assistant",timestamp:new Date().toISOString()}],!0)}else if(t.type==="tool-result"){const s={isError:t.isError||!1,output:t.output||"",toolUseId:t.id,type:"tool_result"},n=e(a).length>0?e(a)[e(a).length-1]:null;n?.role==="system"?o(a,[...e(a).slice(0,-1),{...n,parts:[...n.parts,s]}],!0):o(a,[...e(a),{id:`result-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,parts:[s],role:"system",timestamp:new Date().toISOString()}],!0)}else if(t.type==="thinking"){const s={content:t.text||"",type:"thinking"},n=e(a).length>0?e(a)[e(a).length-1]:null;n?.role==="assistant"?o(a,[...e(a).slice(0,-1),{...n,parts:[...n.parts,s]}],!0):o(a,[...e(a),{id:`think-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,parts:[s],role:"assistant",timestamp:new Date().toISOString()}],!0)}else t.type==="session-end"&&o(c,"idle")}async function oe(){if(!e(p)||u){o(c,"idle");return}const t=T();if(!t){o(c,"idle");return}o(c,"connecting");try{const s=e(p).source==="opencode"?"opencode":"claude",n=await fetch("/api/sessions/connect",{body:JSON.stringify({command:s,cwd:e(p).projectPath,sessionId:e(B)}),headers:{Authorization:`Bearer ${t.apiKey}`,"Content-Type":"application/json"},method:"POST"});if(!n.ok||u){o(c,"idle");return}const i=await n.json();o(j,i.terminalId,!0),o(c,"resuming"),E(i.sessionWs,i.terminalId),F(i.ws)}catch{o(c,"idle")}}function ae(t){if(t.trim()){if(e(c)==="ready"&&$?.readyState===WebSocket.OPEN){$.send(JSON.stringify({data:`${t}
4
- `,type:"input"}));return}if(e(c)==="connecting"||e(c)==="resuming"){S=t;return}S=t,oe()}}async function ie(){e(a).length===0&&o(I,!0);try{const t=T();if(!t){o(N,"No configuration found. Please configure settings first."),o(I,!1);return}const s=e(B)||"",n=e(M)||"",i=n?`id=${encodeURIComponent(s)}&project=${encodeURIComponent(n)}&limit=${e(P)}`:`id=${encodeURIComponent(s)}&limit=${e(P)}`;let r=await fetch(`/api/sessions?${i}`,{headers:{Authorization:`Bearer ${t.apiKey}`}});if(r.status===404&&!n){const h=await fetch("/api/sessions",{headers:{Authorization:`Bearer ${t.apiKey}`}});if(h.ok){const K=await h.json();for(const U of K.projects||[])if((U.sessions||[]).find(z=>z.id===s)){r=await fetch(`/api/sessions?id=${encodeURIComponent(s)}&project=${encodeURIComponent(U.id)}`,{headers:{Authorization:`Bearer ${t.apiKey}`}});break}}}if(!r.ok){o(N,"Session not found"),o(I,!1);return}const d=await r.json();o(p,d.session,!0);const f=Array.isArray(d.messages)?d.messages:[];o(a,f,!0),o(D,f.length>=e(P)),Z(`shooter_session_${s}`,{messages:f,session:d.session})}catch{o(N,"Failed to load session")}o(I,!1)}async function re(){if(e(A))return;const t=T();if(t){o(A,!0);try{const s=e(P)+200,n=e(B)||"",i=e(M)||"",r=[`id=${encodeURIComponent(n)}`,`limit=${s}`];i&&r.push(`project=${encodeURIComponent(i)}`);const d=await fetch(`/api/sessions?${r.join("&")}`,{headers:{Authorization:`Bearer ${t.apiKey}`}});if(!d.ok)return;const f=await d.json(),h=Array.isArray(f.messages)?f.messages:[];o(a,h,!0),o(P,s),o(D,h.length>=s),Z(`shooter_session_${n}`,{messages:h,session:f.session})}catch{}finally{o(A,!1)}}}ye(()=>{const t=Ie(`shooter_session_${L.params.id}`);return t&&(o(p,t.session,!0),o(a,Array.isArray(t.messages)?t.messages:[],!0),o(I,!1)),ie().then(async()=>{if(!e(p)||u)return;const s=T();if(s)try{const n=e(p).source==="opencode"?"opencode":"claude",i=await fetch("/api/sessions/connect",{body:JSON.stringify({command:n,cwd:e(p).projectPath,noCreate:!0,sessionId:e(B)}),headers:{Authorization:`Bearer ${s.apiKey}`,"Content-Type":"application/json"},method:"POST"});if(i.ok&&!u){const r=await i.json();o(j,r.terminalId,!0),o(c,"resuming"),E(r.sessionWs,r.terminalId),F(r.ws)}}catch{}}),()=>{u=!0,O&&clearTimeout(O),C?.close(),$?.close()}});var J=De();$e("1a2wdfb",t=>{var s=Ce();_e(()=>{Se.title=`${(e(p)?.title||"Session")??""} - Shooter`}),v(t,s)});var ce=w(J);{var le=t=>{var s=Oe(),n=w(s);W(n,{classes:"shimmer-header"});var i=_(n,2),r=w(i);W(r,{classes:"shimmer-bubble shimmer-bubble-user"});var d=_(r,2);W(d,{classes:"shimmer-bubble shimmer-bubble-assistant"});var f=_(d,2);W(f,{classes:"shimmer-bubble shimmer-bubble-user-short"});var h=_(f,2);W(h,{classes:"shimmer-bubble shimmer-bubble-assistant-wide"}),y(i),y(s),v(t,s)},de=t=>{var s=Me(),n=Q(s),i=w(n);y(n);var r=_(n,2),d=w(r,!0);y(r),X(()=>{Y(i,"href",e(M)?`/project?id=${e(M)}`:"/"),H(d,e(N))}),v(t,s)},ue=t=>{var s=We(),n=Q(s),i=w(n),r=w(i),d=_(r,2);{var f=l=>{var m=Ne();v(l,m)},h=l=>{var m=Ae();v(l,m)},K=l=>{var m=Pe();v(l,m)},U=l=>{var m=Te();v(l,m)};x(d,l=>{e(c)==="connecting"?l(f):e(c)==="resuming"?l(h,1):e(k)==="connected"?l(K,2):e(k)==="reconnecting"&&l(U,3)})}y(i);var z=_(i,2),fe=w(z,!0);y(z),y(n);var G=_(n,2),V=w(G);{var pe=l=>{var m=Re(),he=w(m);{let ve=R(()=>e(A)?"Loading...":"Load earlier messages");ke(he,{get text(){return e(ve)},classes:"btn-ghost btn-sm",get disabled(){return e(A)},onclick:re})}y(m),v(l,m)};x(V,l=>{e(D)&&l(pe)})}var me=_(V,2);{let l=R(()=>[...e(a)].reverse());je(me,{get messages(){return e(l)},newestFirst:!0,get connectionState(){return e(k)},showInput:!0,get sendDisabled(){return e(se)},onSendInput:ae,sessionEnded:!1})}y(G),X(()=>{Y(r,"href",e(M)?`/project?id=${e(M)}`:"/"),H(fe,e(p).title)}),v(t,s)};x(ce,t=>{e(I)&&e(a).length===0?t(le):e(N)?t(de,1):e(p)&&t(ue,2)})}y(J),v(ee,J),be()}export{qe as component};
@@ -1 +0,0 @@
1
- {"version":3,"file":"_page.svelte-D1Iaycsm.js","sources":["../../../.svelte-kit/adapter-node/entries/pages/session/_id_/_page.svelte.js"],"sourcesContent":["import { h as head, e as escape_html } from \"../../../../chunks/index.js\";\nimport \"../../../../chunks/client2.js\";\nimport \"../../../../chunks/markdown.js\";\n/* empty css */\nimport { S as Shimmer } from \"../../../../chunks/Shimmer.js\";\n/* empty css */\nfunction _page($$renderer, $$props) {\n $$renderer.component(($$renderer2) => {\n let messages = [];\n head(\"1a2wdfb\", $$renderer2, ($$renderer3) => {\n $$renderer3.title(($$renderer4) => {\n $$renderer4.push(`<title>${escape_html(\"Session\")} - Shooter</title>`);\n });\n $$renderer3.push(`<meta name=\"description\" content=\"Session conversation view\"/>`);\n });\n $$renderer2.push(`<main class=\"main session-page-main svelte-1a2wdfb\">`);\n if (messages.length === 0) {\n $$renderer2.push(\"<!--[0-->\");\n $$renderer2.push(`<div class=\"loading-container\">`);\n Shimmer($$renderer2, { classes: \"shimmer-header\" });\n $$renderer2.push(`<!----> <div class=\"chat-container\">`);\n Shimmer($$renderer2, { classes: \"shimmer-bubble shimmer-bubble-user\" });\n $$renderer2.push(`<!----> `);\n Shimmer($$renderer2, { classes: \"shimmer-bubble shimmer-bubble-assistant\" });\n $$renderer2.push(`<!----> `);\n Shimmer($$renderer2, { classes: \"shimmer-bubble shimmer-bubble-user-short\" });\n $$renderer2.push(`<!----> `);\n Shimmer($$renderer2, { classes: \"shimmer-bubble shimmer-bubble-assistant-wide\" });\n $$renderer2.push(`<!----></div></div>`);\n } else {\n $$renderer2.push(\"<!--[-1-->\");\n }\n $$renderer2.push(`<!--]--></main>`);\n });\n}\nexport {\n _page as default\n};\n"],"names":[],"mappings":";;;;;;;;;;;AAKA;AACA,SAAS,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE;AACpC,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC,WAAW,KAAK;AACxC,IAAI,IAAI,QAAQ,GAAG,EAAE;AACrB,IAAI,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC,WAAW,KAAK;AAClD,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC,WAAW,KAAK;AACzC,QAAQ,WAAW,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC,kBAAkB,CAAC,CAAC;AAC9E,MAAM,CAAC,CAAC;AACR,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC,8DAA8D,CAAC,CAAC;AACxF,IAAI,CAAC,CAAC;AACN,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,oDAAoD,CAAC,CAAC;AAC5E,IAAI,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;AAC/B,MAAM,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC;AACnC,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC,+BAA+B,CAAC,CAAC;AACzD,MAAM,OAAO,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;AACzD,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC,oCAAoC,CAAC,CAAC;AAC9D,MAAM,OAAO,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,oCAAoC,EAAE,CAAC;AAC7E,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC;AAClC,MAAM,OAAO,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,yCAAyC,EAAE,CAAC;AAClF,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC;AAClC,MAAM,OAAO,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,0CAA0C,EAAE,CAAC;AACnF,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC;AAClC,MAAM,OAAO,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,8CAA8C,EAAE,CAAC;AACvF,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC,mBAAmB,CAAC,CAAC;AAC7C,IAAI,CAAC,MAAM;AACX,MAAM,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC;AACpC,IAAI;AACJ,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,CAAC;AACvC,EAAE,CAAC,CAAC;AACJ;;;;"}