@juspay/shooter 1.17.0 → 1.18.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/build/client/_app/immutable/assets/{0.B0O0vCnX.css → 0.NV8k8wxG.css} +1 -1
- package/build/client/_app/immutable/assets/0.NV8k8wxG.css.br +0 -0
- package/build/client/_app/immutable/assets/{0.B0O0vCnX.css.gz → 0.NV8k8wxG.css.gz} +0 -0
- package/build/client/_app/immutable/chunks/{BctvtE4d.js → 8lO1IL7u.js} +1 -1
- package/build/client/_app/immutable/chunks/8lO1IL7u.js.br +0 -0
- package/build/client/_app/immutable/chunks/{BctvtE4d.js.gz → 8lO1IL7u.js.gz} +0 -0
- package/build/client/_app/immutable/chunks/B9WQy_3X.js +1 -0
- package/build/client/_app/immutable/chunks/B9WQy_3X.js.br +0 -0
- package/build/client/_app/immutable/chunks/B9WQy_3X.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BdtLzPpO.js +1 -0
- package/build/client/_app/immutable/chunks/BdtLzPpO.js.br +0 -0
- package/build/client/_app/immutable/chunks/BdtLzPpO.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{CjfxuHdN.js → DJvX78LW.js} +1 -1
- package/build/client/_app/immutable/chunks/DJvX78LW.js.br +0 -0
- package/build/client/_app/immutable/chunks/DJvX78LW.js.gz +0 -0
- package/build/client/_app/immutable/chunks/nWG9RHyB.js +3 -0
- package/build/client/_app/immutable/chunks/nWG9RHyB.js.br +0 -0
- package/build/client/_app/immutable/chunks/nWG9RHyB.js.gz +0 -0
- package/build/client/_app/immutable/entry/{app.CNaTe-zm.js → app.f46Ko1hu.js} +2 -2
- package/build/client/_app/immutable/entry/app.f46Ko1hu.js.br +0 -0
- package/build/client/_app/immutable/entry/app.f46Ko1hu.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.BVDjNnXt.js +1 -0
- package/build/client/_app/immutable/entry/start.BVDjNnXt.js.br +2 -0
- package/build/client/_app/immutable/entry/start.BVDjNnXt.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{0.C3ELOf4c.js → 0.D_9EwVmq.js} +1 -1
- package/build/client/_app/immutable/nodes/0.D_9EwVmq.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.D_9EwVmq.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{1.Fqso94b3.js → 1.C4eFlqSB.js} +1 -1
- package/build/client/_app/immutable/nodes/1.C4eFlqSB.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.C4eFlqSB.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{2.BusCVJWk.js → 2.CdC092Za.js} +1 -1
- package/build/client/_app/immutable/nodes/2.CdC092Za.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.CdC092Za.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{3.DUlpocIc.js → 3.Dhf4ZWW0.js} +1 -1
- package/build/client/_app/immutable/nodes/3.Dhf4ZWW0.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.Dhf4ZWW0.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{6.CG4eKRH0.js → 6.B3SEB_li.js} +1 -1
- package/build/client/_app/immutable/nodes/6.B3SEB_li.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.B3SEB_li.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{7.DHilxD1o.js → 7.DV8cJ1lX.js} +1 -1
- package/build/client/_app/immutable/nodes/7.DV8cJ1lX.js.br +0 -0
- package/build/client/_app/immutable/nodes/7.DV8cJ1lX.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{8.BjKgvSie.js → 8.Bs362gyb.js} +2 -2
- package/build/client/_app/immutable/nodes/8.Bs362gyb.js.br +0 -0
- package/build/client/_app/immutable/nodes/8.Bs362gyb.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{9.BRT6HOXB.js → 9.Cf7_3uqT.js} +1 -1
- package/build/client/_app/immutable/nodes/9.Cf7_3uqT.js.br +0 -0
- package/build/client/_app/immutable/nodes/9.Cf7_3uqT.js.gz +0 -0
- package/build/client/_app/version.json +1 -1
- package/build/client/_app/version.json.br +0 -0
- package/build/client/_app/version.json.gz +0 -0
- package/build/server/chunks/{0-BWFSL107.js → 0-Cd7jY0a7.js} +3 -3
- package/build/server/chunks/{0-BWFSL107.js.map → 0-Cd7jY0a7.js.map} +1 -1
- package/build/server/chunks/{1-Bw5KlAjL.js → 1-C4BOGoJY.js} +2 -2
- package/build/server/chunks/{1-Bw5KlAjL.js.map → 1-C4BOGoJY.js.map} +1 -1
- package/build/server/chunks/{2-CQ3yYSVK.js → 2-Ba0mNwJ6.js} +2 -2
- package/build/server/chunks/{2-CQ3yYSVK.js.map → 2-Ba0mNwJ6.js.map} +1 -1
- package/build/server/chunks/{3-DZ4H9hPs.js → 3-Pg8t1uJU.js} +2 -2
- package/build/server/chunks/{3-DZ4H9hPs.js.map → 3-Pg8t1uJU.js.map} +1 -1
- package/build/server/chunks/{6-BZ0enR6b.js → 6-D8xbnTSo.js} +2 -2
- package/build/server/chunks/{6-BZ0enR6b.js.map → 6-D8xbnTSo.js.map} +1 -1
- package/build/server/chunks/{7-Lg8imTZn.js → 7-CkVK06S0.js} +2 -2
- package/build/server/chunks/{7-Lg8imTZn.js.map → 7-CkVK06S0.js.map} +1 -1
- package/build/server/chunks/{8-DKs4yOL7.js → 8-C8qVhrds.js} +2 -2
- package/build/server/chunks/{8-DKs4yOL7.js.map → 8-C8qVhrds.js.map} +1 -1
- package/build/server/chunks/{9-UNmpUWDY.js → 9-fL5zqN0T.js} +2 -2
- package/build/server/chunks/{9-UNmpUWDY.js.map → 9-fL5zqN0T.js.map} +1 -1
- package/build/server/chunks/{_server.ts-B1z0q6qZ.js → _server.ts-BA_uWcPw.js} +4 -5
- package/build/server/chunks/_server.ts-BA_uWcPw.js.map +1 -0
- package/build/server/chunks/{_server.ts-5wx4ZppI.js → _server.ts-Bu3s5hfv.js} +3 -3
- package/build/server/chunks/{_server.ts-5wx4ZppI.js.map → _server.ts-Bu3s5hfv.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CKXVBbwb.js → _server.ts-CwAjt91u.js} +8 -8
- package/build/server/chunks/_server.ts-CwAjt91u.js.map +1 -0
- package/build/server/chunks/{_server.ts-CgHc1Zpx.js → _server.ts-DZP2lhaY.js} +3 -3
- package/build/server/chunks/{_server.ts-CgHc1Zpx.js.map → _server.ts-DZP2lhaY.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BMMTS86y.js → _server.ts-DZgfQKiH.js} +3 -4
- package/build/server/chunks/{_server.ts-BMMTS86y.js.map → _server.ts-DZgfQKiH.js.map} +1 -1
- package/build/server/chunks/{_server.ts-Bt7EAfjo.js → _server.ts-MbnroWEF.js} +25 -48
- package/build/server/chunks/_server.ts-MbnroWEF.js.map +1 -0
- package/build/server/chunks/{pty-manager-RmhVe2Ez.js → pty-manager-DmNSCKAr.js} +99 -2
- package/build/server/chunks/pty-manager-DmNSCKAr.js.map +1 -0
- package/build/server/chunks/qwen-reader-DGfUbKaJ.js +2112 -0
- package/build/server/chunks/qwen-reader-DGfUbKaJ.js.map +1 -0
- package/build/server/chunks/{registry-DzJj2E6I.js → registry-Kcw2UCMv.js} +55 -23
- package/build/server/chunks/registry-Kcw2UCMv.js.map +1 -0
- package/build/server/index.js +1 -1
- package/build/server/index.js.map +1 -1
- package/build/server/manifest.js +15 -15
- package/build/server/manifest.js.map +1 -1
- package/package.json +2 -2
- package/scripts/e2e-all-features.sh +165 -0
- package/scripts/e2e-cross-terminal.sh +168 -0
- package/server.ts +12 -0
- package/src/lib/modules/client/common/provider.ts +0 -2
- package/src/lib/modules/client/terminal/ChatView.svelte +9 -2
- package/src/lib/modules/client/terminal/LaunchSheet.svelte +3 -0
- package/src/lib/modules/server/sessions/amp-reader.ts +439 -0
- package/src/lib/modules/server/sessions/copilot-reader.ts +542 -0
- package/src/lib/modules/server/sessions/cursor-reader.ts +634 -0
- package/src/lib/modules/server/sessions/gemini-reader.ts +48 -25
- package/src/lib/modules/server/sessions/opencode-reader.ts +13 -12
- package/src/lib/modules/server/sessions/process-detector.ts +37 -60
- package/src/lib/modules/server/sessions/provider-paths.ts +173 -0
- package/src/lib/modules/server/sessions/qwen-reader.ts +41 -15
- package/src/lib/modules/server/sessions/registry.ts +55 -14
- package/src/lib/modules/server/terminal/generic-session-watcher.ts +163 -0
- package/src/lib/modules/server/terminal/pty-manager.ts +51 -0
- package/src/lib/modules/server/ws/session-handler.ts +11 -1
- package/src/lib/theme.css +1 -2
- package/src/lib/types/generated/Sessions.ts +1 -4
- package/src/lib/types/server.ts +23 -6
- package/src/lib/types/sessions.ts +1 -10
- package/src/routes/api/sessions/connect/+server.ts +7 -3
- package/build/client/_app/immutable/assets/0.B0O0vCnX.css.br +0 -0
- package/build/client/_app/immutable/chunks/BctvtE4d.js.br +0 -0
- package/build/client/_app/immutable/chunks/BxFShcQO.js +0 -1
- package/build/client/_app/immutable/chunks/BxFShcQO.js.br +0 -0
- package/build/client/_app/immutable/chunks/BxFShcQO.js.gz +0 -0
- package/build/client/_app/immutable/chunks/ByzqAuXw.js +0 -3
- package/build/client/_app/immutable/chunks/ByzqAuXw.js.br +0 -0
- package/build/client/_app/immutable/chunks/ByzqAuXw.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CjfxuHdN.js.br +0 -0
- package/build/client/_app/immutable/chunks/CjfxuHdN.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Pw0jDB7M.js +0 -1
- package/build/client/_app/immutable/chunks/Pw0jDB7M.js.br +0 -0
- package/build/client/_app/immutable/chunks/Pw0jDB7M.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.CNaTe-zm.js.br +0 -0
- package/build/client/_app/immutable/entry/app.CNaTe-zm.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.hxYnjcDu.js +0 -1
- package/build/client/_app/immutable/entry/start.hxYnjcDu.js.br +0 -0
- package/build/client/_app/immutable/entry/start.hxYnjcDu.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.C3ELOf4c.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.C3ELOf4c.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.Fqso94b3.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.Fqso94b3.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.BusCVJWk.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.BusCVJWk.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.DUlpocIc.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.DUlpocIc.js.gz +0 -0
- package/build/client/_app/immutable/nodes/6.CG4eKRH0.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.CG4eKRH0.js.gz +0 -0
- package/build/client/_app/immutable/nodes/7.DHilxD1o.js.br +0 -0
- package/build/client/_app/immutable/nodes/7.DHilxD1o.js.gz +0 -0
- package/build/client/_app/immutable/nodes/8.BjKgvSie.js.br +0 -0
- package/build/client/_app/immutable/nodes/8.BjKgvSie.js.gz +0 -0
- package/build/client/_app/immutable/nodes/9.BRT6HOXB.js.br +0 -0
- package/build/client/_app/immutable/nodes/9.BRT6HOXB.js.gz +0 -0
- package/build/server/chunks/_server.ts-B1z0q6qZ.js.map +0 -1
- package/build/server/chunks/_server.ts-Bt7EAfjo.js.map +0 -1
- package/build/server/chunks/_server.ts-CKXVBbwb.js.map +0 -1
- package/build/server/chunks/opencode-db-path-BwaPufWf.js +0 -411
- package/build/server/chunks/opencode-db-path-BwaPufWf.js.map +0 -1
- package/build/server/chunks/pty-manager-RmhVe2Ez.js.map +0 -1
- package/build/server/chunks/qwen-reader-2fTFuC_D.js +0 -622
- package/build/server/chunks/qwen-reader-2fTFuC_D.js.map +0 -1
- package/build/server/chunks/registry-DzJj2E6I.js.map +0 -1
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GenericSessionWatcher — live tailing for the five read-only providers
|
|
3
|
+
* (cursor, copilot, qwen, gemini, amp).
|
|
4
|
+
*
|
|
5
|
+
* The byte-offset watchers (claude/codex) and the SQLite poller (opencode)
|
|
6
|
+
* each understand one wire format. These five providers store sessions in
|
|
7
|
+
* heterogeneous shapes — per-turn JSONL for some, a single rewritten JSON
|
|
8
|
+
* document for others — so a byte-incremental reader would need five bespoke
|
|
9
|
+
* parsers. Instead this watcher re-parses the whole file on each change via
|
|
10
|
+
* the shared `parseReadOnlyProviderFile` dispatch and emits only messages
|
|
11
|
+
* whose ID it has not delivered before. That makes it correct for both
|
|
12
|
+
* append-only and whole-document-rewrite formats with one code path.
|
|
13
|
+
*
|
|
14
|
+
* The public surface (getHistory + ref-counted subscribe) matches
|
|
15
|
+
* SessionWatcherLike, so the server's session-watcher adapter can route to it
|
|
16
|
+
* by path without any handler changes.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import type { ConversationMessage, GenericWatchedFile, OnNewEntries } from '$lib/types';
|
|
20
|
+
|
|
21
|
+
import { watch as chokidarWatch } from 'chokidar';
|
|
22
|
+
|
|
23
|
+
import { parseReadOnlyProviderFile } from '../sessions/provider-paths';
|
|
24
|
+
|
|
25
|
+
class GenericSessionWatcher {
|
|
26
|
+
private watched = new Map<string, GenericWatchedFile>();
|
|
27
|
+
|
|
28
|
+
/** Re-read the whole file and return the full parsed conversation. */
|
|
29
|
+
getHistory(filePath: string): ConversationMessage[] {
|
|
30
|
+
return parseReadOnlyProviderFile(filePath);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** Stop watching a single file and release its chokidar handle. */
|
|
34
|
+
stop(filePath: string): void {
|
|
35
|
+
const watched = this.watched.get(filePath);
|
|
36
|
+
if (!watched) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
void watched.watcher.close();
|
|
40
|
+
this.watched.delete(filePath);
|
|
41
|
+
console.log(`[generic-watcher] Stopped watching: ${filePath}`);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** Stop watching every file. */
|
|
45
|
+
stopAll(): void {
|
|
46
|
+
for (const [filePath] of this.watched) {
|
|
47
|
+
this.stop(filePath);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Subscribe to new messages for a file. Adds the callback to an existing
|
|
53
|
+
* watcher when one is present (ref-counted), otherwise starts a chokidar
|
|
54
|
+
* watch. Returns an unsubscribe function that tears the watcher down once
|
|
55
|
+
* the last subscriber leaves — identical lifecycle to SessionWatcher.
|
|
56
|
+
*/
|
|
57
|
+
subscribe(filePath: string, onNewEntries: OnNewEntries): () => void {
|
|
58
|
+
const existing = this.watched.get(filePath);
|
|
59
|
+
if (existing) {
|
|
60
|
+
existing.callbacks.add(onNewEntries);
|
|
61
|
+
return () => {
|
|
62
|
+
this.removeCallback(filePath, onNewEntries);
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Seed the emitted set with everything already in the file so the first
|
|
67
|
+
// change only surfaces genuinely new messages — history is sent separately
|
|
68
|
+
// via getHistory, mirroring the byte watchers' initial-offset behaviour.
|
|
69
|
+
const emittedMessageIds = new Set<string>();
|
|
70
|
+
try {
|
|
71
|
+
for (const msg of parseReadOnlyProviderFile(filePath)) {
|
|
72
|
+
emittedMessageIds.add(msg.id);
|
|
73
|
+
}
|
|
74
|
+
} catch (error) {
|
|
75
|
+
// Degrade gracefully: an unreadable/racy file at subscribe time must not
|
|
76
|
+
// prevent watching — the first change will just re-surface what's there.
|
|
77
|
+
console.error(`[generic-watcher] Failed to seed ${filePath}:`, error);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const watcher = chokidarWatch(filePath, {
|
|
81
|
+
awaitWriteFinish: { pollInterval: 100, stabilityThreshold: 200 },
|
|
82
|
+
ignoreInitial: true,
|
|
83
|
+
usePolling: false,
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
const watched: GenericWatchedFile = {
|
|
87
|
+
callbacks: new Set([onNewEntries]),
|
|
88
|
+
emittedMessageIds,
|
|
89
|
+
filePath,
|
|
90
|
+
watcher,
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
const onChange = (): void => {
|
|
94
|
+
this.readNew(watched);
|
|
95
|
+
};
|
|
96
|
+
watcher.on('add', onChange);
|
|
97
|
+
watcher.on('change', onChange);
|
|
98
|
+
watcher.on('error', (error) => {
|
|
99
|
+
console.error(`[generic-watcher] Error watching ${filePath}:`, error);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
this.watched.set(filePath, watched);
|
|
103
|
+
console.log(`[generic-watcher] Watching: ${filePath} (seeded ${emittedMessageIds.size} msgs)`);
|
|
104
|
+
|
|
105
|
+
return () => {
|
|
106
|
+
this.removeCallback(filePath, onNewEntries);
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** Legacy fire-and-forget API matching SessionWatcher.watch(). */
|
|
111
|
+
watch(filePath: string, onNewEntries: OnNewEntries): void {
|
|
112
|
+
this.subscribe(filePath, onNewEntries);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Re-parse the file and deliver any messages whose ID has not been emitted.
|
|
117
|
+
* If a rewrite drops the count below what we have seen (truncation/reset),
|
|
118
|
+
* the new IDs simply won't match, so nothing spurious is sent.
|
|
119
|
+
*/
|
|
120
|
+
private readNew(watched: GenericWatchedFile): void {
|
|
121
|
+
let messages: ConversationMessage[];
|
|
122
|
+
try {
|
|
123
|
+
messages = parseReadOnlyProviderFile(watched.filePath);
|
|
124
|
+
} catch (error) {
|
|
125
|
+
console.error(`[generic-watcher] Failed to re-read ${watched.filePath}:`, error);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const fresh = messages.filter((msg) => !watched.emittedMessageIds.has(msg.id));
|
|
130
|
+
if (fresh.length === 0) {
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
for (const msg of fresh) {
|
|
134
|
+
watched.emittedMessageIds.add(msg.id);
|
|
135
|
+
}
|
|
136
|
+
for (const cb of watched.callbacks) {
|
|
137
|
+
try {
|
|
138
|
+
cb(fresh);
|
|
139
|
+
} catch (cbError) {
|
|
140
|
+
console.error('[generic-watcher] Callback error:', cbError);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** Remove one callback; stop watching when none remain. */
|
|
146
|
+
private removeCallback(filePath: string, onNewEntries: OnNewEntries): void {
|
|
147
|
+
const watched = this.watched.get(filePath);
|
|
148
|
+
if (!watched) {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
watched.callbacks.delete(onNewEntries);
|
|
152
|
+
if (watched.callbacks.size === 0) {
|
|
153
|
+
this.stop(filePath);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Single shared instance across module loaders (matches sessionWatcher).
|
|
159
|
+
const GW_GLOBAL_KEY = '__shooter_generic_session_watcher';
|
|
160
|
+
export const genericSessionWatcher: GenericSessionWatcher =
|
|
161
|
+
((globalThis as Record<string, unknown>)[GW_GLOBAL_KEY] as GenericSessionWatcher) ||
|
|
162
|
+
new GenericSessionWatcher();
|
|
163
|
+
(globalThis as Record<string, unknown>)[GW_GLOBAL_KEY] = genericSessionWatcher;
|
|
@@ -13,6 +13,10 @@ import path from 'path';
|
|
|
13
13
|
import { fileURLToPath } from 'url';
|
|
14
14
|
|
|
15
15
|
import { findCodexRolloutForCwd } from '../sessions/codex-reader';
|
|
16
|
+
import {
|
|
17
|
+
discoverReadOnlyProviderSessionFile,
|
|
18
|
+
readOnlySourceForCommand,
|
|
19
|
+
} from '../sessions/provider-paths';
|
|
16
20
|
import { broadcastEvent } from '../ws/server.js';
|
|
17
21
|
import { HolderClient } from './holder-client';
|
|
18
22
|
import { openCodeWatcher } from './opencode-watcher';
|
|
@@ -1005,6 +1009,53 @@ class PtyManager {
|
|
|
1005
1009
|
5 * 60 * 1000
|
|
1006
1010
|
);
|
|
1007
1011
|
}
|
|
1012
|
+
|
|
1013
|
+
// For the read-only providers (cursor/copilot/qwen/gemini/amp): poll their
|
|
1014
|
+
// store for a session started after launch and matching this cwd, then set
|
|
1015
|
+
// sessionFile to that path. The WS adapter routes it to the generic watcher
|
|
1016
|
+
// by its provider-root path, giving the same live-tail the JSONL watchers
|
|
1017
|
+
// provide for Claude/Codex.
|
|
1018
|
+
const readOnlySource = readOnlySourceForCommand(command);
|
|
1019
|
+
if (readOnlySource) {
|
|
1020
|
+
const launchTime = terminal.createdAt.getTime();
|
|
1021
|
+
terminal.pollTimer = setInterval(() => {
|
|
1022
|
+
if (terminal.status === 'exited' || terminal.sessionFile) {
|
|
1023
|
+
if (terminal.pollTimer) {
|
|
1024
|
+
clearInterval(terminal.pollTimer);
|
|
1025
|
+
terminal.pollTimer = null;
|
|
1026
|
+
}
|
|
1027
|
+
return;
|
|
1028
|
+
}
|
|
1029
|
+
try {
|
|
1030
|
+
const file = discoverReadOnlyProviderSessionFile(
|
|
1031
|
+
readOnlySource,
|
|
1032
|
+
cwd,
|
|
1033
|
+
launchTime,
|
|
1034
|
+
Date.now()
|
|
1035
|
+
);
|
|
1036
|
+
if (file) {
|
|
1037
|
+
terminal.sessionFile = file;
|
|
1038
|
+
if (terminal.pollTimer) {
|
|
1039
|
+
clearInterval(terminal.pollTimer);
|
|
1040
|
+
terminal.pollTimer = null;
|
|
1041
|
+
}
|
|
1042
|
+
terminalStore.update(id, { sessionFile: file });
|
|
1043
|
+
}
|
|
1044
|
+
} catch {
|
|
1045
|
+
// ignore filesystem errors
|
|
1046
|
+
}
|
|
1047
|
+
}, 2000);
|
|
1048
|
+
|
|
1049
|
+
setTimeout(
|
|
1050
|
+
() => {
|
|
1051
|
+
if (terminal.pollTimer) {
|
|
1052
|
+
clearInterval(terminal.pollTimer);
|
|
1053
|
+
terminal.pollTimer = null;
|
|
1054
|
+
}
|
|
1055
|
+
},
|
|
1056
|
+
5 * 60 * 1000
|
|
1057
|
+
);
|
|
1058
|
+
}
|
|
1008
1059
|
}
|
|
1009
1060
|
|
|
1010
1061
|
/** Wire up all HolderClient callbacks (activity, CWD, output, exit, disconnect). */
|
|
@@ -222,7 +222,17 @@ function findTerminalBySessionUuid(uuid: string): ManagedTerminal | undefined {
|
|
|
222
222
|
// module-level _ptyManagerFull reference if available.
|
|
223
223
|
if (_ptyManagerFull) {
|
|
224
224
|
for (const t of _ptyManagerFull.list()) {
|
|
225
|
-
|
|
225
|
+
// Match across every provider's file naming so a running non-Claude
|
|
226
|
+
// agent can be reached (and replied to) by its session UUID:
|
|
227
|
+
// claude/cursor/qwen: <uuid>.jsonl ; codex: -<uuid>.jsonl ;
|
|
228
|
+
// copilot: <uuid>.jsonl OR <uuid>/events.jsonl ; amp: T-<uuid>.json ;
|
|
229
|
+
// opencode: bare session id.
|
|
230
|
+
if (
|
|
231
|
+
t.sessionFile?.includes(`${uuid}.jsonl`) ||
|
|
232
|
+
t.sessionFile?.endsWith(`/${uuid}/events.jsonl`) ||
|
|
233
|
+
t.sessionFile?.endsWith(`/T-${uuid}.json`) ||
|
|
234
|
+
t.openCodeSessionId === uuid
|
|
235
|
+
) {
|
|
226
236
|
return _ptyManager.getTerminal(t.id);
|
|
227
237
|
}
|
|
228
238
|
}
|
package/src/lib/theme.css
CHANGED
|
@@ -527,8 +527,7 @@
|
|
|
527
527
|
}
|
|
528
528
|
|
|
529
529
|
/* Additional providers reuse the existing colour families (cosmetic only). */
|
|
530
|
-
.pill-source-qwen
|
|
531
|
-
.pill-source-iflow {
|
|
530
|
+
.pill-source-qwen {
|
|
532
531
|
--pill-background: var(--ds-red-100);
|
|
533
532
|
--pill-color: var(--ds-red-900);
|
|
534
533
|
--pill-font-size: 10px;
|
|
@@ -22,8 +22,7 @@ export type SessionSource =
|
|
|
22
22
|
| 'qwen'
|
|
23
23
|
| 'cursor'
|
|
24
24
|
| 'copilot'
|
|
25
|
-
| 'amp'
|
|
26
|
-
| 'iflow';
|
|
25
|
+
| 'amp';
|
|
27
26
|
|
|
28
27
|
export function decodeSessionSource(rawInput: unknown): SessionSource | null {
|
|
29
28
|
switch (rawInput) {
|
|
@@ -35,7 +34,6 @@ export function decodeSessionSource(rawInput: unknown): SessionSource | null {
|
|
|
35
34
|
case 'cursor':
|
|
36
35
|
case 'copilot':
|
|
37
36
|
case 'amp':
|
|
38
|
-
case 'iflow':
|
|
39
37
|
return rawInput;
|
|
40
38
|
}
|
|
41
39
|
return null;
|
|
@@ -51,7 +49,6 @@ export function _decodeSessionSource(rawInput: unknown): SessionSource | undefin
|
|
|
51
49
|
case 'cursor':
|
|
52
50
|
case 'copilot':
|
|
53
51
|
case 'amp':
|
|
54
|
-
case 'iflow':
|
|
55
52
|
return rawInput;
|
|
56
53
|
}
|
|
57
54
|
return;
|
package/src/lib/types/server.ts
CHANGED
|
@@ -24,6 +24,23 @@ export interface CodexWatchState {
|
|
|
24
24
|
watcher: FSWatcher;
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
+
/**
|
|
28
|
+
* Watch state for the generic re-read-on-change watcher used by the
|
|
29
|
+
* read-only providers (cursor, copilot, qwen, gemini, amp). Unlike the
|
|
30
|
+
* byte-offset watchers, it re-parses the whole file on each change and
|
|
31
|
+
* dedupes by message ID — robust for both append-only JSONL and
|
|
32
|
+
* whole-document JSON formats.
|
|
33
|
+
*/
|
|
34
|
+
export interface GenericWatchedFile {
|
|
35
|
+
callbacks: Set<OnNewEntries>;
|
|
36
|
+
/** Message IDs already delivered, so re-reads only emit genuinely new messages. */
|
|
37
|
+
emittedMessageIds: Set<string>;
|
|
38
|
+
filePath: string;
|
|
39
|
+
watcher: FSWatcher;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// ── pty-manager types ───────────────────────────────────────────────
|
|
43
|
+
|
|
27
44
|
/** Messages received from the holder process (local ndjson protocol). */
|
|
28
45
|
export type HolderIncomingMessage =
|
|
29
46
|
| { active: boolean; type: 'activity' }
|
|
@@ -33,21 +50,19 @@ export type HolderIncomingMessage =
|
|
|
33
50
|
| { exitCode: null | number; exited: boolean; pid: number; type: 'info' }
|
|
34
51
|
| { path: string; type: 'cwd' };
|
|
35
52
|
|
|
36
|
-
// ── pty-manager types ───────────────────────────────────────────────
|
|
37
|
-
|
|
38
53
|
/** Messages sent to the holder process (local ndjson protocol). */
|
|
39
54
|
export type HolderOutgoingMessage =
|
|
40
55
|
| { cols: number; rows: number; type: 'resize' }
|
|
41
56
|
| { data: string; type: 'input' }
|
|
42
57
|
| { signal?: string; type: 'kill' };
|
|
43
58
|
|
|
59
|
+
// ── session-watcher types ───────────────────────────────────────────
|
|
60
|
+
|
|
44
61
|
/**
|
|
45
62
|
* Callback invoked when new JSONL entries are parsed from a watched file.
|
|
46
63
|
*/
|
|
47
64
|
export type OnNewEntries = (entries: ConversationMessage[]) => void;
|
|
48
65
|
|
|
49
|
-
// ── session-watcher types ───────────────────────────────────────────
|
|
50
|
-
|
|
51
66
|
export interface OpenCodeWatchState {
|
|
52
67
|
callbacks: Set<(messages: ConversationMessage[]) => void>;
|
|
53
68
|
/** Set of message IDs we have already emitted, to avoid duplicates. */
|
|
@@ -62,6 +77,8 @@ export interface OpenCodeWatchState {
|
|
|
62
77
|
sessionId: string;
|
|
63
78
|
}
|
|
64
79
|
|
|
80
|
+
// ── opencode-watcher types ──────────────────────────────────────────
|
|
81
|
+
|
|
65
82
|
export interface PtyManagedTerminal {
|
|
66
83
|
args: string[];
|
|
67
84
|
clients: Set<WebSocket>;
|
|
@@ -89,14 +106,14 @@ export interface PtyManagedTerminal {
|
|
|
89
106
|
watcherOffset: number;
|
|
90
107
|
}
|
|
91
108
|
|
|
92
|
-
// ──
|
|
109
|
+
// ── codex-watcher types ─────────────────────────────────────────────
|
|
93
110
|
|
|
94
111
|
export interface PtyOutputBuffer {
|
|
95
112
|
data: string[];
|
|
96
113
|
size: number;
|
|
97
114
|
}
|
|
98
115
|
|
|
99
|
-
// ──
|
|
116
|
+
// ── generic-session-watcher types ───────────────────────────────────
|
|
100
117
|
|
|
101
118
|
export interface SessionWatchedFile {
|
|
102
119
|
callbacks: Set<OnNewEntries>;
|
|
@@ -23,16 +23,7 @@ export interface ConversationMessage {
|
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
export interface DetectedProcess {
|
|
26
|
-
command:
|
|
27
|
-
| 'amp'
|
|
28
|
-
| 'claude'
|
|
29
|
-
| 'codex'
|
|
30
|
-
| 'copilot'
|
|
31
|
-
| 'cursor-agent'
|
|
32
|
-
| 'gemini'
|
|
33
|
-
| 'iflow'
|
|
34
|
-
| 'opencode'
|
|
35
|
-
| 'qwen';
|
|
26
|
+
command: 'amp' | 'claude' | 'codex' | 'copilot' | 'cursor-agent' | 'gemini' | 'opencode' | 'qwen';
|
|
36
27
|
cwd: string;
|
|
37
28
|
kind: string;
|
|
38
29
|
pid: number;
|
|
@@ -36,8 +36,9 @@ export const POST: RequestHandler = async ({ request }) => {
|
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
// sessionId becomes a process argument (e.g. `codex resume <id>`); restrict it
|
|
39
|
-
// to safe identifier
|
|
40
|
-
|
|
39
|
+
// to safe identifier chars — dots included, since cursor/copilot/amp IDs use
|
|
40
|
+
// them — but no path separators, which prevents argument/path injection.
|
|
41
|
+
if (!/^[A-Za-z0-9_.-]+$/.test(sessionId)) {
|
|
41
42
|
return json({ error: 'Invalid sessionId format' }, { status: 400 });
|
|
42
43
|
}
|
|
43
44
|
|
|
@@ -76,9 +77,12 @@ export const POST: RequestHandler = async ({ request }) => {
|
|
|
76
77
|
const existing = ptyManager.list().find(
|
|
77
78
|
(t) =>
|
|
78
79
|
t.status === 'running' &&
|
|
79
|
-
// Claude: <id>.jsonl ; Codex rollout: rollout-<ts>-<id>.jsonl ;
|
|
80
|
+
// Claude / Cursor / Qwen: <id>.jsonl ; Codex rollout: rollout-<ts>-<id>.jsonl ;
|
|
81
|
+
// Copilot: <id>.jsonl OR <id>/events.jsonl ; Amp: T-<id>.json ; OpenCode: session id
|
|
80
82
|
(t.sessionFile?.endsWith(`/${sessionId}.jsonl`) ||
|
|
81
83
|
t.sessionFile?.endsWith(`-${sessionId}.jsonl`) ||
|
|
84
|
+
t.sessionFile?.endsWith(`/${sessionId}/events.jsonl`) ||
|
|
85
|
+
t.sessionFile?.endsWith(`/T-${sessionId}.json`) ||
|
|
82
86
|
t.openCodeSessionId === sessionId)
|
|
83
87
|
);
|
|
84
88
|
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
const e={amp:"amp","claude-code":"claude",codex:"codex",copilot:"copilot",cursor:"cursor-agent",gemini:"gemini",iflow:"iflow",opencode:"opencode",qwen:"qwen"},c={amp:"Amp","claude-code":"Claude Code",codex:"Codex",copilot:"Copilot",cursor:"Cursor",gemini:"Gemini",iflow:"iFlow",opencode:"OpenCode",qwen:"Qwen"},n=Object.values(e);function d(o){return c[o]??"Claude Code"}function i(o){return e[o]??"claude"}export{n as A,d as a,i as s};
|
|
Binary file
|
|
Binary file
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{bv as Te,v as qe,s as P,g as j,b as N,P as oe,bw as At}from"./DYuMZGL5.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 Le{constructor(t,n){this.status=t,this.location=n}}class Pe extends Error{constructor(t,n,r){super(r),this.status=t,this.text=n}}new URL("sveltekit-internal://");function Et(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 Rt(e){for(const t in e)e[t]=decodeURIComponent(e[t]);return e}function ye({href:e}){return e.split("#")[0]}function St(...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 It=new TextDecoder;function Ut(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 Tt=window.fetch;window.fetch=(e,t)=>((e instanceof Request?e.method:t?.method||"GET")!=="GET"&&z.delete(je(e)),Tt(e,t));const z=new Map;function Lt(e,t){const n=je(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&&z.set(n,{body:a,init:s,ttl:1e3*Number(o)}),r.getAttribute("data-b64")!==null&&(a=Ut(a)),Promise.resolve(new Response(a,s))}return window.fetch(e,t)}function Pt(e,t,n){if(z.size>0){const r=je(e,n),a=z.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);z.delete(r)}}return window.fetch(t,n)}function je(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="${St(...a)}"]`}return r}const jt=/^(\[)?(\.\.\.)?(\w+)(?:=(\w+))?(\])?$/;function Nt(e){const t=[];return{pattern:e==="/"?/^\/$/:new RegExp(`^${xt(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(g=>parseInt(g,16))));const u=jt.exec(i),[,d,p,h,f]=u;return t.push({name:h,matcher:f,optional:!!d,rest:!!p,chained:p?l===1&&o[0]==="":!1}),p?"([^]*?)":d?"([^/]*)?":"([^/]+?)"}return ve(i)}).join("")}).join("")}/?$`),params:t}}function Ot(e){return e!==""&&!/^\([^)]+\)$/.test(e)}function xt(e){return e.slice(1).split("/").filter(Ot)}function Ct(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(u=>u).join("/"),o=0),l===void 0)if(i.rest)l="";else continue;if(!i.matcher||n[i.matcher](l)){r[i.name]=l;const u=t[c+1],d=a[c+1];u&&!u.rest&&u.optional&&d&&i.chained&&(o=0),!u&&!d&&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 Dt({nodes:e,server_loads:t,dictionary:n,matchers:r}){const a=new Set(t);return Object.entries(n).map(([c,[i,l,u]])=>{const{pattern:d,params:p}=Nt(c),h={id:c,exec:f=>{const g=d.exec(f);if(g)return Ct(g,p,r)},errors:[1,...u||[]].map(f=>e[f]),layouts:[0,...l||[]].map(o),leaf:s(i)};return h.errors.length=h.layouts.length=Math.max(h.errors.length,h.layouts.length),h});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 Qe(e,t=JSON.parse){try{return t(sessionStorage[e])}catch{}}function Ve(e,t,n=JSON.stringify){const r=n(t);try{sessionStorage[e]=r}catch{}}const U=globalThis.__sveltekit_gqs2s0?.base??"",$t=globalThis.__sveltekit_gqs2s0?.assets??U??"",Bt="1780800154021",et="sveltekit:snapshot",tt="sveltekit:scroll",nt="sveltekit:states",Ft="sveltekit:pageurl",V="sveltekit:history",Q="sveltekit:navigation",B={tap:1,hover:2,viewport:3,eager:4,off:-1,false:-1},re=location.origin;function Ne(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 M(){return{x:pageXOffset,y:pageYOffset}}function q(e,t){return e.getAttribute(`data-sveltekit-${t}`)}const Ye={...B,"":B.hover};function rt(e){let t=e.assignedSlot??e.parentNode;return t?.nodeType===11&&(t=t.host),t}function at(e,t){for(;e&&e!==t;){if(e.nodeName.toUpperCase()==="A"&&e.hasAttribute("href"))return e;e=rt(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=q(c,"preload-code")),a===null&&(a=q(c,"preload-data")),t===null&&(t=q(c,"keepfocus")),n===null&&(n=q(c,"noscroll")),s===null&&(s=q(c,"reload")),o===null&&(o=q(c,"replacestate")),c=rt(c);function i(l){switch(l){case"":case"true":return!0;case"off":case"false":return!1;default:return}}return{preload_code:Ye[r??"off"],preload_data:Ye[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 ot={v:()=>{}};function Mt(){const{set:e,subscribe:t}=Te(!1);let n;async function r(){clearTimeout(n);try{const a=await fetch(`${$t}/_app/version.json`,{headers:{pragma:"no-cache","cache-control":"no-cache"}});if(!a.ok)return!1;const o=(await a.json()).version!==Bt;return o&&(e(!0),ot.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 jn(e){}const qt=-1,Vt=-2,Yt=-3,Gt=-4,Kt=-5,Wt=-6,Ht=-7,st=2**32-1,ke=st-1;function Xt(e){return!(!Number.isInteger(e)||e<0||e>ke)}function zt(e){return!(!Number.isInteger(e)||e<0||e>st)}function Jt(e){return Uint8Array.fromBase64(e).buffer}function Zt(e){return Uint8Array.from(Buffer.from(e,"base64")).buffer}function Qt(e){const t=atob(e),n=t.length,r=new Uint8Array(n);for(let a=0;a<n;a++)r[a]=t.charCodeAt(a);return r.buffer}const en=typeof Uint8Array.fromBase64=="function",tn=typeof process=="object"&&process.versions?.node!==void 0,nn=en?Jt:tn?Zt:Qt;function rn(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===Yt)return NaN;if(o===Gt)return 1/0;if(o===Kt)return-1/0;if(o===Wt)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],u=t&&Object.hasOwn(t,l)?t[l]:void 0;if(u){let d=i[1];if(typeof d!="number"&&(d=n.push(i[1])-1),a??=new Set,a.has(d))throw new Error("Invalid circular reference");return a.add(d),r[o]=u(s(d)),a.delete(d),r[o]}switch(l){case"Date":r[o]=new Date(i[1]);break;case"Set":const d=new Set;r[o]=d;for(let f=1;f<i.length;f+=1)d.add(s(i[f]));break;case"Map":const p=new Map;r[o]=p;for(let f=1;f<i.length;f+=2)p.set(s(i[f]),s(i[f+1]));break;case"RegExp":r[o]=new RegExp(i[1],i[2]);break;case"Object":{const f=i[1];if(typeof n[f]=="object"&&n[f][0]!=="BigInt")throw new Error("Invalid input");r[o]=Object(s(f));break}case"BigInt":r[o]=BigInt(i[1]);break;case"null":const h=Object.create(null);r[o]=h;for(let f=1;f<i.length;f+=2){if(i[f]==="__proto__")throw new Error("Cannot parse an object with a `__proto__` property");h[i[f]]=s(i[f+1])}break;case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Float16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"BigInt64Array":case"BigUint64Array":case"DataView":{if(n[i[1]][0]!=="ArrayBuffer")throw new Error("Invalid data");const f=globalThis[l],g=s(i[1]);r[o]=i[2]!==void 0?new f(g,i[2],i[3]):new f(g);break}case"ArrayBuffer":{const f=i[1];if(typeof f!="string")throw new Error("Invalid ArrayBuffer encoding");const g=nn(f);r[o]=g;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 f=l.slice(9);r[o]=Temporal[f].from(i[1]);break}case"URL":{const f=new URL(i[1]);r[o]=f;break}case"URLSearchParams":{const f=new URLSearchParams(i[1]);r[o]=f;break}default:throw new Error(`Unknown type ${l}`)}}else if(i[0]===Ht){const l=i[1];if(!zt(l))throw new Error("Invalid input");const u=[];r[o]=u,u[ke]=void 0,delete u[ke];for(let d=2;d<i.length;d+=2){const p=i[d];if(!Xt(p)||p>=l)throw new Error("Invalid input");u[p]=s(i[d+1])}u.length=l}else{const l=new Array(i.length);r[o]=l;for(let u=0;u<i.length;u+=1){const d=i[u];d!==Vt&&(l[u]=s(d))}}else{const l={};r[o]=l;for(const u of Object.keys(i)){if(u==="__proto__")throw new Error("Cannot parse an object with a `__proto__` property");const d=i[u];l[u]=s(d)}}return r[o]}return s(0)}const it=new Set(["load","prerender","csr","ssr","trailingSlash","config"]);[...it];const an=new Set([...it]);[...an];function on(e){return e.filter(t=>t!=null)}const sn="x-sveltekit-invalidated",cn="x-sveltekit-trailing-slash";function ie(e){return e instanceof pe||e instanceof Pe?e.status:500}function ln(e){return e instanceof Pe?e.text:"Internal Error"}let S,ee,be;const fn=qe.toString().includes("$$")||/function \w+\(\) \{\}/.test(qe.toString()),Ke="a:";fn?(S={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL(Ke)},ee={current:null},be={current:!1}):(S=new class{#e=P({});get data(){return j(this.#e)}set data(t){N(this.#e,t)}#t=P(null);get form(){return j(this.#t)}set form(t){N(this.#t,t)}#n=P(null);get error(){return j(this.#n)}set error(t){N(this.#n,t)}#r=P({});get params(){return j(this.#r)}set params(t){N(this.#r,t)}#a=P({id:null});get route(){return j(this.#a)}set route(t){N(this.#a,t)}#o=P({});get state(){return j(this.#o)}set state(t){N(this.#o,t)}#s=P(-1);get status(){return j(this.#s)}set status(t){N(this.#s,t)}#i=P(new URL(Ke));get url(){return j(this.#i)}set url(t){N(this.#i,t)}},ee=new class{#e=P(null);get current(){return j(this.#e)}set current(t){N(this.#e,t)}},be=new class{#e=P(!1);get current(){return j(this.#e)}set current(t){N(this.#e,t)}},ot.v=()=>be.current=!0);function un(e){Object.assign(S,e)}const dn="/__data.json",hn=".html__data.json";function pn(e){return e.endsWith(".html")?e.replace(/\.html$/,hn):e.replace(/\/$/,"")+dn}const _n=new Set(["icon","shortcut icon","apple-touch-icon"]);let H=null;const D=Qe(tt)??{},te=Qe(et)??{},C={url:Ge({}),page:Ge({}),navigating:Te(null),updated:Mt()};function Oe(e){D[e]=M()}function gn(e,t){let n=e+1;for(;D[n];)delete D[n],n+=1;for(n=t+1;te[n];)delete te[n],n+=1}function K(e,t=!1){return t?location.replace(e.href):location.href=e.href,new Promise(()=>{})}async function ct(){if("serviceWorker"in navigator){const e=await navigator.serviceWorker.getRegistration(U||"/");e&&await e.update()}}function We(){}let xe,Re,ce,x,Se,A;const le=[],fe=[];let L=null;function Ie(){L?.fork?.then(e=>e?.discard()),L=null}const ae=new Map,lt=new Set,mn=new Set,J=new Set;let w={branch:[],error:null,url:null},Ce=!1,ue=!1,He=!0,ne=!1,X=!1,ft=!1,De=!1,ut,R,I,F;const Z=new Set,Xe=new Map;async function Cn(e,t,n){globalThis.__sveltekit_gqs2s0?.data&&globalThis.__sveltekit_gqs2s0.data,document.URL!==location.href&&(location.href=location.href),A=e,await e.hooks.init?.(),xe=Dt(e),x=document.documentElement,Se=t,Re=e.nodes[0],ce=e.nodes[1],Re(),ce(),R=history.state?.[V],I=history.state?.[Q],R||(R=I=Date.now(),history.replaceState({...history.state,[V]:R,[Q]:I},""));const r=D[R];function a(){r&&(history.scrollRestoration="manual",scrollTo(r.x,r.y))}n?(a(),await Un(Se,n)):(await Y({type:"enter",url:Ne(A.hash?Ln(new URL(location.href)):location.href),replace_state:!0}),a()),In()}function wn(){le.length=0,De=!1}function dt(e){fe.some(t=>t?.snapshot)&&(te[e]=fe.map(t=>t?.snapshot?.capture()))}function ht(e){te[e]?.forEach((t,n)=>{fe[n]?.snapshot?.restore(t)})}function ze(){Oe(R),Ve(tt,D),dt(I),Ve(et,te)}async function pt(e,t,n,r){let a;t.invalidateAll&&Ie(),await Y({type:"goto",url:Ne(e),keepfocus:t.keepFocus,noscroll:t.noScroll,replace_state:t.replaceState,state:t.state,redirect_count:n,nav_token:r,accept:()=>{t.invalidateAll&&(De=!0,a=[...Xe.keys()]),t.invalidate&&t.invalidate.forEach(Sn)}}),t.invalidateAll&&oe().then(oe).then(()=>{Xe.forEach(({resource:s},o)=>{a?.includes(o)&&s.refresh?.()})})}async function yn(e){if(e.id!==L?.id){Ie();const t={};Z.add(t),L={id:e.id,token:t,promise:gt({...e,preload:t}).then(n=>(Z.delete(t),n.type==="loaded"&&n.state.error&&Ie(),n)),fork:null}}return L.promise}async function Ae(e){const t=(await me(e,!1))?.route;t&&await Promise.all([...t.layouts,t.leaf].filter(Boolean).map(n=>n[1]()))}async function _t(e,t,n){const r={params:w.params,route:{id:w.route?.id??null},url:new URL(location.href)};w={...e.state,nav:r};const a=document.querySelector("style[data-sveltekit]");if(a&&a.remove(),Object.assign(S,e.props.page),ut=new A.root({target:t,props:{...e.props,stores:C,components:fe},hydrate:n,sync:!1,transformError:void 0}),await Promise.resolve(),ht(I),n){const s={from:null,to:{...r,scroll:D[R]??M()},willUnload:!1,type:"enter",complete:Promise.resolve()};J.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(U&&(e.pathname===U||e.pathname===U+"/"))i="always";else for(const f of n)f?.slash!==void 0&&(i=f.slash);e.pathname=Et(e.pathname,i),e.search=e.search;const l={type:"loaded",state:{url:e,params:t,branch:n,error:s,route:o},props:{constructors:on(n).map(f=>f.node.component),page:Me(S)}};c!==void 0&&(l.props.form=c);let u={},d=!S,p=0;for(let f=0;f<Math.max(n.length,w.branch.length);f+=1){const g=n[f],b=w.branch[f];g?.data!==b?.data&&(d=!0),g&&(u={...u,...g.data},d&&(l.props[`data_${p}`]=u),p+=1)}return(!w.url||e.href!==w.url.href||w.error!==s||c!==void 0&&c!==S.form||d)&&(l.props.page={error:s,params:t,route:{id:o?.id??null},state:{},status:a,url:new URL(e),form:c??null,data:d?u:S.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 vn(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?Pt(r,a.href,t):Lt(r,t);return{resolved:a,promise:s}}function Je(e,t,n,r,a,s){if(De)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]!==w.params[o])return!0;for(const o of a.dependencies)if(le.some(c=>c(new URL(o))))return!0;return!1}function Be(e,t){return e?.type==="data"?e:e?.type==="skip"?t??null:null}function bn(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 Ze({error:e,url:t,route:n,params:r}){return{type:"loaded",state:{error:e,url:t,route:n,params:r,branch:[]},props:{page:Me(S),constructors:[]}}}async function gt({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 u=null;const d=w.url?e!==he(w.url):!1,p=w.route?a.id!==w.route.id:!1,h=bn(w.url,n);let f=!1;{const m=l.map((y,E)=>{const k=w.branch[E],v=!!y?.[0]&&(k?.loader!==y[1]||Je(f,p,d,h,k.server?.uses,r));return v&&(f=!0),v});if(m.some(Boolean)){try{u=await yt(n,m)}catch(y){const E=await G(y,{url:n,params:r,route:{id:e}});return Z.has(s)?Ze({error:E,url:n,params:r,route:a}):ge({status:ie(y),error:E,url:n,route:a})}if(u.type==="redirect")return u}}const g=u?.nodes;let b=!1;const _=l.map(async(m,y)=>{if(!m)return;const E=w.branch[y],k=g?.[y];if((!k||k.type==="skip")&&m[1]===E?.loader&&!Je(b,p,d,h,E.universal?.uses,r))return E;if(b=!0,k?.type==="error")throw k;return $e({loader:m[1],url:n,params:r,route:a,parent:async()=>{const O={};for(let $=0;$<y;$+=1)Object.assign(O,(await _[$])?.data);return O},server_data_node:Be(k===void 0&&m[0]?{type:"skip"}:k??null,m[0]?E?.server:void 0)})});for(const m of _)m.catch(()=>{});const T=[];for(let m=0;m<l.length;m+=1)if(l[m])try{T.push(await _[m])}catch(y){if(y instanceof Le)return{type:"redirect",location:y.location};if(Z.has(s))return Ze({error:await G(y,{params:r,url:n,route:{id:a.id}}),url:n,params:r,route:a});let E=ie(y),k;if(g?.includes(y))E=y.status??E,k=y.error;else if(y instanceof pe)k=y.body;else{if(await C.updated.check())return await ct(),await K(n);k=await G(y,{params:r,url:n,route:{id:a.id}})}const v=await An(m,T,o);return v?de({url:n,params:r,branch:T.slice(0,v.idx).concat(v.node),errors:o,status:E,error:k,route:a}):await wt(n,{id:a.id},k,E)}else T.push(void 0);return de({url:n,params:r,branch:T,errors:o,status:200,error:null,route:a,form:t?void 0:null})}async function An(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(A.server_loads[0]===0)try{const c=await yt(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||Ce)&&await K(n)}try{const o=await $e({loader:Re,url:n,params:a,route:r,parent:()=>Promise.resolve({}),server_data_node:Be(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 Le)return pt(new URL(o.location,location.href),{},0);throw o}}async function En(e){const t=e.href;if(ae.has(t))return ae.get(t);let n;try{const r=(async()=>{let a=await A.hooks.reroute({url:new URL(e),fetch:async(s,o)=>vn(s,o,e).promise})??e;if(typeof a=="string"){const s=new URL(e);A.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,U,A.hash)){const n=await En(e);if(!n)return;const r=kn(n);for(const a of xe){const s=a.exec(r);if(s)return{id:he(e),invalidating:t,route:a,params:Rt(s),url:e}}}}function kn(e){return kt(A.hash?e.hash.replace(/^#/,"").replace(/[?#].+/,""):e.pathname.slice(U.length))||"/"}function he(e){return(A.hash?e.hash.replace(/^#/,""):e.pathname)+e.search}function mt({url:e,type:t,intent:n,delta:r,event:a,scroll:s}){let o=!1;const c=Fe(w,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||lt.forEach(l=>l(i)),o?null:c}async function Y({type:e,url:t,popped:n,keepfocus:r,noscroll:a,replace_state:s,state:o={},redirect_count:c=0,nav_token:i={},accept:l=We,block:u=We,event:d}){const p=F;F=i;const h=await me(t,!1),f=e==="enter"?Fe(w,h,t,e):mt({url:t,type:e,delta:n?.delta,intent:h,scroll:n?.scroll,event:d});if(!f){u(),F===i&&(F=p);return}const g=R,b=I;l(),ne=!0,ue&&f.navigation.type!=="enter"&&C.navigating.set(ee.current=f.navigation);let _=h&&await gt(h);if(!_){if(_e(t,U,A.hash))return await K(t,s);_=await wt(t,{id:null},await G(new Pe(404,"Not Found",`Not found: ${t.pathname}`),{url:t,params:{},route:{id:null}}),404,s)}if(t=h?.url||t,F!==i)return f.reject(new Error("navigation aborted")),!1;if(_.type==="redirect"){if(c<20){await Y({type:e,url:new URL(_.location,t),popped:n,keepfocus:r,noscroll:a,replace_state:s,state:o,redirect_count:c+1,nav_token:i}),f.fulfil(void 0);return}_=await ge({status:500,error:await G(new Error("Redirect loop"),{url:t,params:{},route:{id:null}}),url:t,route:{id:null}})}else _.props.page.status>=400&&await C.updated.check()&&(await ct(),await K(t,s));if(wn(),Oe(g),dt(b),_.props.page.url.pathname!==t.pathname&&(t.pathname=_.props.page.url.pathname),o=n?n.state:o,!n){const v=s?0:1,O={[V]:R+=v,[Q]:I+=v,[nt]:o};(s?history.replaceState:history.pushState).call(history,O,"",t),s||gn(R,I)}const T=h&&L?.id===h.id?L.fork:null;L=null,_.props.page.state=o;let m;if(ue){const v=(await Promise.all(Array.from(mn,W=>W(f.navigation)))).filter(W=>typeof W=="function");if(v.length>0){let W=function(){v.forEach(we=>{J.delete(we)})};v.push(W),v.forEach(we=>{J.add(we)})}const O=f.navigation.to;w={..._.state,nav:{params:O.params,route:O.route,url:O.url}},_.props.page&&(_.props.page.url=t);const $=T&&await T;$?m=$.commit():(H=null,ut.$set(_.props),H&&Object.assign(_.props.page,H),un(_.props.page),m=At?.()),ft=!0}else await _t(_,Se,!1);const{activeElement:y}=document;await m,await oe(),await oe();let E=null;if(He){const v=n?n.scroll:a?M():null;v?scrollTo(v.x,v.y):(E=t.hash&&document.getElementById(bt(t)))?E.scrollIntoView():scrollTo(0,0)}const k=document.activeElement!==y&&document.activeElement!==document.body;!r&&!k&&Tn(t,!E),He=!0,_.props.page&&(H&&Object.assign(_.props.page,H),Object.assign(S,_.props.page)),ne=!1,e==="popstate"&&ht(I),f.fulfil(void 0),f.navigation.to&&(f.navigation.to.scroll=M()),J.forEach(v=>v(f.navigation)),C.navigating.set(ee.current=null)}async function wt(e,t,n,r,a){return e.origin===re&&e.pathname===location.pathname&&!Ce?await ge({status:r,error:n,url:e,route:t}):await K(e,a)}function Rn(){let e,t={element:void 0,href:void 0},n;x.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)}x.addEventListener("mousedown",r),x.addEventListener("touchstart",r,{passive:!0});const a=new IntersectionObserver(c=>{for(const i of c)i.isIntersecting&&(Ae(new URL(i.target.href)),a.unobserve(i.target))},{threshold:0});async function s(c,i){const l=at(c,x),u=l===t.element&&l?.href===t.href&&i>=n;if(!l||u)return;const{url:d,external:p,download:h}=Ee(l,U,A.hash);if(p||h)return;const f=se(l),g=d&&he(w.url)===he(d);if(!(f.reload||g))if(i<=f.preload_data){t={element:l,href:l.href},n=B.tap;const b=await me(d,!1);if(!b)return;yn(b)}else i<=f.preload_code&&(t={element:l,href:l.href},n=i,Ae(d))}function o(){a.disconnect();for(const c of x.querySelectorAll("a")){const{url:i,external:l,download:u}=Ee(c,U,A.hash);if(l||u)continue;const d=se(c);d.reload||(d.preload_code===B.viewport&&a.observe(c),d.preload_code===B.eager&&Ae(i))}}J.add(o),o()}function G(e,t){if(e instanceof pe)return e.body;const n=ie(e),r=ln(e);return A.hooks.handleError({error:e,event:t,status:n,message:r})??{message:r}}function Dn(e,t={}){return e=new URL(Ne(e)),e.origin!==re?Promise.reject(new Error("goto: invalid URL")):pt(e,t,0)}function Sn(e){if(typeof e=="function")le.push(e);else{const{href:t}=new URL(e,location.href);le.push(n=>n.href===t)}}function In(){history.scrollRestoration="manual",addEventListener("beforeunload",t=>{let n=!1;if(ze(),!ne){const r=Fe(w,void 0,null,"leave"),a={...r.navigation,cancel:()=>{n=!0,r.reject(new Error("navigation cancelled"))}};lt.forEach(s=>s(a))}n?(t.preventDefault(),t.returnValue=""):history.scrollRestoration="auto"}),addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&ze()}),navigator.connection?.saveData||Rn(),x.addEventListener("click",async t=>{if(t.button||t.which!==1||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.defaultPrevented)return;const n=at(t.composedPath()[0],x);if(!n)return;const{url:r,external:a,target:s,download:o}=Ee(n,U,A.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,u]=(A.hash?r.hash.replace(/^#/,""):r.href).split("#"),d=l===ye(location);if(a||c.reload&&(!d||!u)){mt({url:r,type:"link",event:t})?ne=!0:t.preventDefault();return}if(u!==void 0&&d){const[,p]=w.url.href.split("#");if(p===u){if(t.preventDefault(),u===""||u==="top"&&n.ownerDocument.getElementById("top")===null)scrollTo({top:0});else{const h=n.ownerDocument.getElementById(decodeURIComponent(u));h&&(h.scrollIntoView(),h.focus())}return}if(X=!0,Oe(R),e(r),!c.replace_state)return;X=!1}t.preventDefault(),await new Promise(p=>{requestAnimationFrame(()=>{setTimeout(p,0)}),setTimeout(p,100)}),await Y({type:"link",url:r,keepfocus:c.keepfocus,noscroll:c.noscroll,replace_state:c.replace_state??r.href===location.href,event:t})}),x.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,U,!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(),Y({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(!Ue){if(t.state?.[V]){const n=t.state[V];if(F={},n===R)return;const r=D[n],a=t.state[nt]??{},s=new URL(t.state[Ft]??location.href),o=t.state[Q],c=w.url?ye(location)===ye(w.url):!1;if(o===I&&(ft||c)){a!==S.state&&(S.state=a),e(s),D[R]=M(),r&&scrollTo(r.x,r.y),R=n;return}const l=n-R;await Y({type:"popstate",url:s,popped:{state:a,scroll:r,delta:l},accept:()=>{R=n,I=o},block:()=>{history.go(-l)},nav_token:F,event:t})}else if(!X){const n=new URL(location.href);e(n),A.hash&&location.reload()}}}),addEventListener("hashchange",()=>{X&&(X=!1,history.replaceState({...history.state,[V]:++R,[Q]:I},"",location.href))});for(const t of document.querySelectorAll("link"))_n.has(t.rel)&&(t.href=t.href);addEventListener("pageshow",t=>{t.persisted&&C.navigating.set(ee.current=null)});function e(t){w.url=S.url=t,C.page.set(Me(S)),C.page.notify()}}async function Un(e,{status:t=200,error:n,node_ids:r,params:a,route:s,server_route:o,data:c,form:i}){Ce=!0;const l=new URL(location.href);let u;({params:a={},route:s={id:null}}=await me(l,!1)||{}),u=xe.find(({id:h})=>h===s.id);let d,p=!0;try{const h=r.map(async(g,b)=>{const _=c[b];return _?.uses&&(_.uses=vt(_.uses)),$e({loader:A.nodes[g],url:l,params:a,route:s,parent:async()=>{const T={};for(let m=0;m<b;m+=1)Object.assign(T,(await h[m]).data);return T},server_data_node:Be(_)})}),f=await Promise.all(h);if(u){const g=u.layouts;for(let b=0;b<g.length;b++)g[b]||f.splice(b,0,void 0)}d=await de({url:l,params:a,branch:f,status:t,error:n,errors:u?.errors,form:i,route:u??null})}catch(h){if(h instanceof Le){await K(new URL(h.location,location.href));return}d=await ge({status:ie(h),error:await G(h,{url:l,params:a,route:s}),url:l,route:s}),e.textContent="",p=!1}d.props.page&&(d.props.page.state={}),await _t(d,e,p)}async function yt(e,t){const n=new URL(e);n.pathname=pn(e.pathname),e.pathname.endsWith("/")&&n.searchParams.append(cn,"1"),n.searchParams.append(sn,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(u){return rn(u,{...A.decoders,Promise:d=>new Promise((p,h)=>{o.set(d,{fulfil:p,reject:h})})})}let l="";for(;;){const{done:u,value:d}=await c.read();if(u&&!l)break;for(l+=!d&&l?`
|
|
2
|
-
`:It.decode(d,{stream:!0});;){const p=l.indexOf(`
|
|
3
|
-
`);if(p===-1)break;const h=JSON.parse(l.slice(0,p));if(l=l.slice(p+1),h.type==="redirect")return s(h);if(h.type==="data")h.nodes?.forEach(f=>{f?.type==="data"&&(f.uses=vt(f.uses),f.data=i(f.data))}),s(h);else if(h.type==="chunk"){const{id:f,data:g,error:b}=h,_=o.get(f);o.delete(f),b?_.reject(i(b)):_.fulfil(i(g))}}}})}function vt(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 Ue=!1;function Tn(e,t=!0){const n=document.querySelector("[autofocus]");if(n)n.focus();else{const r=bt(e);if(r&&document.getElementById(r)){const{x:s,y:o}=M();setTimeout(()=>{const c=history.state;Ue=!0,location.replace(new URL(`#${r}`,location.href)),history.replaceState(c,"",e),t&&scrollTo(s,o),Ue=!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 Fe(e,t,n,r,a=null){let s,o;const c=new Promise((l,u)=>{s=l,o=u});return c.catch(()=>{}),{navigation:{from:{params:e.params,route:{id:e.route?.id??null},url:e.url,scroll:M()},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 Me(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 Ln(e){const t=new URL(e);return t.hash=decodeURIComponent(e.hash),t}function bt(e){let t;if(A.hash){const[,,n]=e.hash.split("#",3);t=n??""}else t=e.hash.slice(1);return decodeURIComponent(t)}export{Cn as a,Dn as g,jn as l,S as p,C as s};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{p as ge,a as r,f as i,d as kt,i as g,g as yt,h as bt,s as R,j as U,b as L}from"./Cg3dlX05.js";import{c as s,O as wt,r as a,t as A,p as Et,s as Se,q as St,F as Tt,g as e,P as It,d as o,b as pe,w as Dt,B as Me,A as P,x as c}from"./DYuMZGL5.js";import{a as zt,s as ce,P as ye,B as Ge,e as be,i as He,A as Ve,I as Ct,h as Te}from"./DZvnhU_8.js";import{r as Ie}from"./BDcFu3l7.js";import{S as Ye}from"./C_9BZILB.js";var Pt=i('<div><div class="accordion-content svelte-14pncvc"><!></div></div>');function De(B,n){let $=ge(n,"expand",3,!1);var ee=Pt();let te;var we=s(ee),ze=s(we);zt(ze,()=>n.children??wt),a(we),a(ee),A(()=>te=ce(ee,1,`accordion ${n.classes??""??""}`,"svelte-14pncvc",te,{expanded:$()})),r(B,ee)}function At(B,n){return B==="Bash"?n.command||n.description||"":B==="Read"||B==="Edit"||B==="Write"?n.file_path||"":B==="Grep"||B==="Glob"?n.pattern||"":B==="Agent"?n.description||n.prompt?.slice(0,50)||"":JSON.stringify(n).slice(0,60)}var Bt=i('<div class="chatview-header svelte-1tpzk7f"><div class="chatview-header-left svelte-1tpzk7f"><!> <span class="chatview-title svelte-1tpzk7f">Session</span></div> <div class="chatview-header-right svelte-1tpzk7f"><span><span class="connection-status-dot"></span> </span> <!></div></div>'),Gt=i('<div class="chatview-empty svelte-1tpzk7f"><p class="chatview-empty-text svelte-1tpzk7f">Waiting for session messages...</p></div>'),Ht=i('<div class="chat-bubble chat-bubble-user"></div>'),Ot=i('<div class="chat-message chat-message-user"><div><!> <div class="chat-timestamp"> </div></div> <!></div>'),Ut=i('<div class="chat-tool-body"> </div>'),Ft=i('<div class="chat-tool-card svelte-1tpzk7f"><div class="chat-tool-header" role="button" tabindex="0"><span>▶</span> <!> <span class="chat-tool-description"> </span></div> <!></div>'),Kt=i('<div class="chat-tool-group-body svelte-1tpzk7f"></div>'),Rt=i('<div class="chat-tool-group svelte-1tpzk7f"><div class="chat-tool-group-header svelte-1tpzk7f" role="button" tabindex="0"><span>▶</span> <span class="chat-tool-group-summary svelte-1tpzk7f"> </span></div> <!></div>'),Lt=i('<div class="chat-bubble chat-bubble-assistant"></div>'),Nt=i('<div class="chat-tool-body"> </div>'),Wt=i('<div class="chat-tool-card"><div class="chat-tool-header" role="button" tabindex="0"><span>▶</span> <!> <span class="chat-tool-description"> </span></div> <!></div>'),jt=i('<div class="chat-thinking-body"></div>'),qt=i('<div class="chat-thinking"><div class="chat-thinking-header" role="button" tabindex="0"> </div> <!></div>'),Jt=i('<div class="chat-message chat-message-assistant"><!> <div><!> <div class="chat-timestamp"> </div></div></div>'),Mt=i("<div> </div>"),Vt=i('<div class="chat-message chat-message-system"><div class="chat-tool-card"><div class="chat-tool-header" role="button" tabindex="0"><span>▶</span> <!></div> <!></div></div>'),Yt=i('<div class="chat-message chat-message-system"><div class="chat-bubble chat-bubble-system"></div></div>'),Qt=i('<div class="chatview-ended svelte-1tpzk7f"><!> <span>Session has ended</span></div>'),Xt=i('<div class="chatview-details-toggle svelte-1tpzk7f"><!></div> <!> <!>',1),Zt=i('<div class="chat-input-bar"><!> <!></div>'),$t=i('<div class="chatview-wrapper svelte-1tpzk7f"><!> <div class="chat-container chatview-scroll svelte-1tpzk7f"><!></div> <!></div>');function oa(B,n){Et(n,!0);const $=ge(n,"connectionState",3,"idle"),ee=ge(n,"newestFirst",3,!1),te=ge(n,"sessionEnded",3,!1),we=ge(n,"showHeader",3,!1),ze=ge(n,"showInput",3,!0),Oe=c(()=>te()||(n.sendDisabled!==void 0?n.sendDisabled:$()!=="connected"));let me=Se(""),q=Se(null),Ce=Se(!0);const ae=new Ye,Ee=new Ye,Ue="shooter:chatview:showDetails";let D=Se(St(localStorage.getItem(Ue)==="true"));function Qe(){pe(D,!e(D)),localStorage.setItem(Ue,String(e(D)))}function Xe(t,u){const _=[];let k=[],z=0;function G(){if(k.length!==0){if(k.length===1)_.push(k[0]);else{const N=k.map(C=>C.toolName),E=[...new Set(N)],l=`Used ${k.length} tools: ${E.join(", ")}`;_.push({groupId:`toolgroup-${u}-${z}`,summary:l,tools:k,type:"tool_group"}),z++}k=[]}}for(const N of t)N.type==="tool_use"?k.push(N):(G(),_.push(N));return G(),_}function Ze(t){return t.type==="tool_group"}function $e(t){return t.parts.every(u=>u.type==="tool_result")}Tt(()=>{n.messages,et()});async function et(){!e(Ce)||!e(q)||(await It(),ee()?e(q).scrollTop=0:e(q).scrollTop=e(q).scrollHeight)}function tt(){if(!e(q))return;const{clientHeight:t,scrollHeight:u,scrollTop:_}=e(q);ee()?pe(Ce,_<100):pe(Ce,u-_-t<100)}function Fe(){const t=e(me).trim();t&&(pe(me,""),n.onSendInput?.(t))}function at(t){t.key==="Enter"&&!t.shiftKey&&(t.preventDefault(),Fe())}function J(t){ae.has(t)?ae.delete(t):ae.add(t)}function Ke(t){Ee.has(t)?Ee.delete(t):Ee.add(t)}function Re(t){return new Date(t).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}function Le(t){return At(t.toolName,t.input)}function Ne(t){return JSON.stringify(t,null,2)}function st(t){return t.type==="tool_use"}var Pe=$t(),We=s(Pe);{var rt=t=>{var u=Bt(),_=s(u),k=s(_);ye(k,{text:"LIVE",classes:"pill-live"}),Me(2),a(_);var z=o(_,2),G=s(z),N=o(s(G));a(G);var E=o(G,2);{var l=C=>{Ge(C,{classes:"btn-danger btn-sm",onclick:()=>{n.onCancel()},text:"Cancel"})};g(E,C=>{!te()&&n.onCancel&&C(l)})}a(z),a(u),A(()=>{ce(G,1,`connection-status ${$()??""}`,"svelte-1tpzk7f"),R(N,` ${$()==="connected"?"Connected":$()==="connecting"||$()==="reconnecting"?"Connecting...":"Disconnected"}`)}),r(t,u)};g(We,t=>{we()&&t(rt)})}var xe=o(We,2),nt=s(xe);{var ot=t=>{var u=Gt();r(t,u)},it=t=>{var u=Xt(),_=P(u),k=s(_);{let E=c(()=>e(D)?"active":""),l=c(()=>e(D)?"▼":"▶"),C=c(()=>e(D)?"Hide details":"Show details");Ge(k,{get classes(){return`chatview-details-btn ${e(E)??""}`},onclick:Qe,get text(){return`${e(l)??""} ${e(C)??""}`}})}a(_);var z=o(_,2);be(z,17,()=>n.messages,E=>E.id,(E,l)=>{var C=U(),dt=P(C);{var ct=W=>{var F=Ot(),M=s(F),se=s(M);be(se,17,()=>e(l).parts,He,(j,d)=>{var m=U(),_e=P(m);{var ke=ne=>{var oe=Ht();Te(oe,()=>Ie(e(d).content),!0),a(oe),r(ne,oe)};g(_e,ne=>{e(d).type==="text"&&ne(ke)})}r(j,m)});var re=o(se,2),V=s(re,!0);a(re),a(M);var ue=o(M,2);Ve(ue,{alt:"User",name:"User",size:"small",classes:"avatar-user"}),a(F),A(j=>R(V,j),[()=>Re(e(l).timestamp)]),r(W,F)},ut=W=>{var F=Jt(),M=s(F);Ve(M,{alt:"Claude",name:"Claude",size:"small",classes:"avatar-assistant"});var se=o(M,2),re=s(se);be(re,17,()=>Xe(e(l).parts,e(l).id),He,(j,d)=>{var m=U(),_e=P(m);{var ke=y=>{const f=c(()=>e(D)||Ee.has(e(d).groupId));var x=Rt(),p=s(x),h=s(p);let K;var S=o(h,2),T=s(S,!0);a(S),a(p);var X=o(p,2);{var Z=I=>{var v=Kt();be(v,21,()=>e(d).tools,H=>H.id,(H,b)=>{const ie=c(()=>e(b).id),le=c(()=>e(D)||ae.has(e(ie)));var O=Ft(),w=s(O),ve=s(w);let he;var je=o(ve,2);ye(je,{get text(){return e(b).toolName},classes:"pill-tool-name"});var qe=o(je,2),ft=s(qe,!0);a(qe),a(w);var ht=o(w,2);De(ht,{get expand(){return e(le)},children:(de,ea)=>{var Je=U(),pt=P(Je);{var gt=Ae=>{var Be=Ut(),mt=s(Be,!0);a(Be),A(xt=>R(mt,xt),[()=>Ne(e(b).input)]),r(Ae,Be)};g(pt,Ae=>{e(le)&&Ae(gt)})}r(de,Je)},$$slots:{default:!0}}),a(O),A(de=>{he=ce(ve,1,"chat-tool-chevron",null,he,{expanded:e(le)}),R(ft,de)},[()=>Le(e(b))]),L("click",w,()=>{J(e(ie))}),L("keydown",w,de=>{(de.key==="Enter"||de.key===" ")&&(de.preventDefault(),J(e(ie)))}),r(H,O)}),a(v),r(I,v)};g(X,I=>{e(f)&&I(Z)})}a(x),A(()=>{K=ce(h,1,"chat-tool-group-chevron svelte-1tpzk7f",null,K,{expanded:e(f)}),R(T,e(d).summary)}),L("click",p,()=>{Ke(e(d).groupId)}),L("keydown",p,I=>{(I.key==="Enter"||I.key===" ")&&(I.preventDefault(),Ke(e(d).groupId))}),r(y,x)},ne=c(()=>Ze(e(d))),oe=y=>{var f=Lt();Te(f,()=>Ie(e(d).content),!0),a(f),r(y,f)},Y=y=>{const f=c(()=>e(d).id),x=c(()=>e(D)||ae.has(e(f)));var p=Wt(),h=s(p),K=s(h);let S;var T=o(K,2);ye(T,{get text(){return e(d).toolName},classes:"pill-tool-name"});var X=o(T,2),Z=s(X,!0);a(X),a(h);var I=o(h,2);De(I,{get expand(){return e(x)},children:(v,H)=>{var b=U(),ie=P(b);{var le=O=>{var w=Nt(),ve=s(w,!0);a(w),A(he=>R(ve,he),[()=>Ne(e(d).input)]),r(O,w)};g(ie,O=>{e(x)&&O(le)})}r(v,b)},$$slots:{default:!0}}),a(p),A(v=>{S=ce(K,1,"chat-tool-chevron",null,S,{expanded:e(x)}),R(Z,v)},[()=>Le(e(d))]),L("click",h,()=>{J(e(f))}),L("keydown",h,v=>{(v.key==="Enter"||v.key===" ")&&(v.preventDefault(),J(e(f)))}),r(y,p)},Q=c(()=>st(e(d))),fe=y=>{const f=c(()=>`thinking-${e(l).id}`),x=c(()=>e(D)||ae.has(e(f)));var p=qt(),h=s(p),K=s(h);a(h);var S=o(h,2);De(S,{get expand(){return e(x)},children:(T,X)=>{var Z=U(),I=P(Z);{var v=H=>{var b=jt();Te(b,()=>Ie(e(d).content),!0),a(b),r(H,b)};g(I,H=>{e(x)&&H(v)})}r(T,Z)},$$slots:{default:!0}}),a(p),A(()=>R(K,`💭 Thinking... ${e(x)?"▼":"▶"}`)),L("click",h,()=>{J(e(f))}),L("keydown",h,T=>{(T.key==="Enter"||T.key===" ")&&(T.preventDefault(),J(e(f)))}),r(y,p)};g(_e,y=>{e(ne)?y(ke):e(d).type==="text"?y(oe,1):e(Q)?y(Y,2):e(d).type==="thinking"&&y(fe,3)})}r(j,m)});var V=o(re,2),ue=s(V,!0);a(V),a(se),a(F),A(j=>R(ue,j),[()=>Re(e(l).timestamp)]),r(W,F)},_t=W=>{var F=U(),M=P(F);{var se=V=>{var ue=U(),j=P(ue);be(j,17,()=>e(l).parts,He,(d,m)=>{var _e=U(),ke=P(_e);{var ne=Y=>{var Q=U(),fe=P(Q);{var y=f=>{const x=c(()=>`result-${e(m).toolUseId}`),p=c(()=>ae.has(e(x)));var h=Vt(),K=s(h),S=s(K),T=s(S);let X;var Z=o(T,2);{let v=c(()=>e(m).isError?"❌ Tool Error":"✅ Tool Result"),H=c(()=>e(m).isError?"pill-tool-error":"pill-tool-success");ye(Z,{get text(){return e(v)},get classes(){return e(H)}})}a(S);var I=o(S,2);De(I,{get expand(){return e(p)},children:(v,H)=>{var b=U(),ie=P(b);{var le=O=>{var w=Mt();let ve;var he=s(w,!0);a(w),A(()=>{ve=ce(w,1,"chat-tool-result",null,ve,{"chat-tool-result-success":!e(m).isError,"chat-tool-result-error":e(m).isError}),R(he,e(m).output)}),r(O,w)};g(ie,O=>{e(p)&&O(le)})}r(v,b)},$$slots:{default:!0}}),a(K),a(h),A(()=>X=ce(T,1,"chat-tool-chevron",null,X,{expanded:e(p)})),L("click",S,()=>{J(e(x))}),L("keydown",S,v=>{(v.key==="Enter"||v.key===" ")&&(v.preventDefault(),J(e(x)))}),r(f,h)};g(fe,f=>{e(D)&&f(y)})}r(Y,Q)},oe=Y=>{var Q=Yt(),fe=s(Q);Te(fe,()=>Ie(e(m).content),!0),a(fe),a(Q),r(Y,Q)};g(ke,Y=>{e(m).type==="tool_result"?Y(ne):e(m).type==="text"&&Y(oe,1)})}r(d,_e)}),r(V,ue)},re=c(()=>e(D)||!$e(e(l)));g(M,V=>{e(re)&&V(se)})}r(W,F)};g(dt,W=>{e(l).role==="user"?W(ct):e(l).role==="assistant"?W(ut,1):e(l).role==="system"&&W(_t,2)})}r(E,C)});var G=o(z,2);{var N=E=>{var l=Qt(),C=s(l);ye(C,{text:"ENDED",classes:"pill-badge-ended"}),Me(2),a(l),r(E,l)};g(G,E=>{te()&&E(N)})}r(t,u)};g(nt,t=>{n.messages.length===0?t(ot):t(it,-1)})}a(xe),yt(xe,t=>pe(q,t),()=>e(q));var lt=o(xe,2);{var vt=t=>{var u=Zt(),_=s(u);{let z=c(()=>te()?"Session ended":"Send a message... (Shift+Enter for new line)");Ct(_,{dataType:"text",useTextArea:!0,get placeholder(){return e(z)},get disable(){return e(Oe)},onKeyDown:at,classes:"chat-input-field",get value(){return e(me)},set value(G){pe(me,G,!0)}})}var k=o(_,2);{let z=c(()=>e(Oe)||!e(me).trim());Ge(k,{classes:"btn-primary btn-sm",get disabled(){return e(z)},onclick:Fe,text:"Send"})}a(u),r(t,u)};g(lt,t=>{ze()&&t(vt)})}a(Pe),bt("scroll",xe,tt),r(B,Pe),Dt()}kt(["click","keydown"]);export{oa as C};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{l as o,a as r}from"../chunks/ByzqAuXw.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
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"_server.ts-B1z0q6qZ.js","sources":["../../../.svelte-kit/adapter-node/entries/endpoints/api/terminals/_server.ts.js"],"sourcesContent":["import { v as validateAuth } from \"../../../../chunks/auth.js\";\nimport { P as PROVIDER_COMMANDS } from \"../../../../chunks/registry.js\";\nimport { p as ptyManager } from \"../../../../chunks/pty-manager.js\";\nimport { t as toErrorMessage } from \"../../../../chunks/error.js\";\nimport { json } from \"@sveltejs/kit\";\nimport { realpathSync, statSync } from \"fs\";\nimport { relative, isAbsolute } from \"path\";\nconst ALLOWED_COMMANDS = [\"zsh\", \"bash\", \"sh\", \"fish\", ...PROVIDER_COMMANDS];\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 = ({ request }) => {\n const authError = validateAuth(request);\n if (authError) {\n return authError;\n }\n try {\n const terminals = ptyManager.list().map((t) => ({\n args: t.args,\n clientCount: t.clients.size,\n command: t.command,\n createdAt: t.createdAt.toISOString(),\n currentCwd: t.currentCwd,\n cwd: t.cwd,\n exitCode: t.exitCode,\n exitedAt: t.exitedAt?.toISOString() ?? null,\n id: t.id,\n isActive: t.isActive,\n lastOutput: lastScrollbackLine(t.scrollback),\n pid: t.pid,\n status: t.status\n }));\n return json({\n count: terminals.length,\n terminals,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n });\n } catch (error) {\n console.error(\"[terminals] Failed to list terminals:\", toErrorMessage(error));\n return json({ error: \"Failed to list terminals\" }, { status: 500 });\n }\n};\nconst POST = async ({ request }) => {\n const authError = validateAuth(request);\n if (authError) {\n return authError;\n }\n let body;\n try {\n body = await request.json();\n } catch {\n return json({ error: \"Invalid JSON in request body\" }, { status: 400 });\n }\n try {\n const { args, cols, command, cwd, rows } = body;\n if (!command) {\n return json({ error: \"command is required\" }, { status: 400 });\n }\n if (command.includes(\"/\") || command.includes(\"\\\\\") || !ALLOWED_COMMANDS.includes(command)) {\n return json(\n { error: `Command not allowed. Allowed: ${ALLOWED_COMMANDS.join(\", \")}` },\n { status: 400 }\n );\n }\n if (!cwd) {\n return json({ error: \"cwd is required\" }, { status: 400 });\n }\n let realCwd;\n try {\n realCwd = realpathSync(cwd);\n if (!statSync(realCwd).isDirectory()) {\n return json({ error: \"cwd must be a directory\" }, { status: 400 });\n }\n } catch {\n return json({ error: \"cwd must be a directory\" }, { status: 400 });\n }\n const home = process.env.HOME || \"\";\n if (home) {\n const rel = relative(home, realCwd);\n if (rel.startsWith(\"..\") || isAbsolute(rel)) {\n return json({ error: \"Working directory must be under home directory\" }, { status: 400 });\n }\n }\n if (args !== void 0 && !Array.isArray(args)) {\n return json({ error: \"args must be an array of strings\" }, { status: 400 });\n }\n if (args && !args.every((a) => typeof a === \"string\")) {\n return json({ error: \"All args must be strings\" }, { status: 400 });\n }\n if (cols !== void 0 && (typeof cols !== \"number\" || cols < 1)) {\n return json({ error: \"cols must be a positive number\" }, { status: 400 });\n }\n if (rows !== void 0 && (typeof rows !== \"number\" || rows < 1)) {\n return json({ error: \"rows must be a positive number\" }, { status: 400 });\n }\n const terminal = await ptyManager.create(command, args ?? [], realCwd, cols ?? 80, rows ?? 24);\n console.log(\n `[terminals] Created terminal ${terminal.id} (pid=${terminal.pid}, command=${command})`\n );\n return json(\n {\n command: terminal.command,\n createdAt: terminal.createdAt instanceof Date ? terminal.createdAt.toISOString() : terminal.createdAt,\n cwd: terminal.cwd,\n id: terminal.id,\n pid: terminal.pid,\n sessionWs: `/ws/session/${terminal.id}`,\n ws: `/ws/terminal/${terminal.id}`\n },\n { status: 201 }\n );\n } catch (error) {\n console.error(\"[terminals] Failed to create terminal:\", toErrorMessage(error));\n return json({ error: \"Failed to create terminal\" }, { status: 500 });\n }\n};\nexport {\n GET,\n POST\n};\n"],"names":[],"mappings":"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"}
|