claude-mux 0.7.0 → 0.7.1

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 (115) hide show
  1. package/README.md +4 -2
  2. package/dist/cli.d.ts +1 -1
  3. package/dist/cli.js +1 -1
  4. package/dist/utils/version.d.ts +1 -1
  5. package/dist/utils/version.js +1 -1
  6. package/dist/web/client/_app/immutable/chunks/{DU91Ml7U.js → BGcEgn7w.js} +1 -1
  7. package/{web/.svelte-kit/output/client/_app/immutable/chunks/DmdO6ygw.js → dist/web/client/_app/immutable/chunks/By6CYjmE.js} +1 -1
  8. package/dist/web/client/_app/immutable/chunks/{HKNo9LID.js → CR5jMWGV.js} +1 -1
  9. package/{web/.svelte-kit/output/client/_app/immutable/entry/app.CGIBnoln.js → dist/web/client/_app/immutable/entry/app.DmtnygN7.js} +2 -2
  10. package/dist/web/client/_app/immutable/entry/start.fYmelGlC.js +1 -0
  11. package/dist/web/client/_app/immutable/nodes/{0.CqlJ9a31.js → 0.DGDAdwT5.js} +1 -1
  12. package/dist/web/client/_app/immutable/nodes/{1.BQUZh2-w.js → 1.Cg8dWgUN.js} +1 -1
  13. package/dist/web/client/_app/immutable/nodes/{2.CCV1YdgF.js → 2.DItUEo3e.js} +1 -1
  14. package/dist/web/client/_app/immutable/nodes/{3.D9tDCdq8.js → 3.dHui0twF.js} +1 -1
  15. package/dist/web/client/_app/immutable/nodes/{4.BqPyNkFA.js → 4.CiEHP0cr.js} +1 -1
  16. package/dist/web/client/_app/version.json +1 -1
  17. package/dist/web/server/chunks/{0-BHWsmCJv.js → 0-BmRg-l2z.js} +5 -5
  18. package/dist/web/server/chunks/{0-BHWsmCJv.js.map → 0-BmRg-l2z.js.map} +1 -1
  19. package/dist/web/server/chunks/{1-YRx6A8Tm.js → 1-CPgO8U7d.js} +3 -3
  20. package/dist/web/server/chunks/{1-YRx6A8Tm.js.map → 1-CPgO8U7d.js.map} +1 -1
  21. package/dist/web/server/chunks/{2-eC6JuGAo.js → 2--ZO5fZp_.js} +5 -5
  22. package/dist/web/server/chunks/{2-eC6JuGAo.js.map → 2--ZO5fZp_.js.map} +1 -1
  23. package/dist/web/server/chunks/{3-Bk-wV20p.js → 3-7HqSep9c.js} +3 -3
  24. package/dist/web/server/chunks/{3-Bk-wV20p.js.map → 3-7HqSep9c.js.map} +1 -1
  25. package/dist/web/server/chunks/{4-nteBgDrW.js → 4-C1PCdmY0.js} +4 -4
  26. package/dist/web/server/chunks/{4-nteBgDrW.js.map → 4-C1PCdmY0.js.map} +1 -1
  27. package/dist/web/server/index.js +1 -1
  28. package/dist/web/server/index.js.map +1 -1
  29. package/dist/web/server/manifest.js +10 -10
  30. package/dist/web/server/manifest.js.map +1 -1
  31. package/docs/release-checklist.md +8 -34
  32. package/docs/removing-hooks.md +14 -14
  33. package/package.json +1 -1
  34. package/src/cli.ts +1 -1
  35. package/src/utils/version.ts +1 -1
  36. package/web/.svelte-kit/adapter-bun/chunks/internal.js +1 -1
  37. package/web/.svelte-kit/adapter-bun/manifest-full.js +1 -1
  38. package/web/.svelte-kit/adapter-bun/manifest.js +1 -1
  39. package/web/.svelte-kit/adapter-bun/nodes/0.js +1 -1
  40. package/web/.svelte-kit/adapter-bun/nodes/1.js +1 -1
  41. package/web/.svelte-kit/adapter-bun/nodes/2.js +1 -1
  42. package/web/.svelte-kit/adapter-bun/nodes/3.js +1 -1
  43. package/web/.svelte-kit/adapter-bun/nodes/4.js +1 -1
  44. package/web/.svelte-kit/adapter-node/.vite/manifest.json +200 -15
  45. package/web/.svelte-kit/adapter-node/_app/immutable/assets/AllSessionsPanel.BKhqOrbV.css +1 -0
  46. package/web/.svelte-kit/adapter-node/_app/immutable/assets/_layout.WptSHSUl.css +1 -0
  47. package/web/.svelte-kit/adapter-node/_app/immutable/assets/_page.DldLgTc-.css +1 -0
  48. package/web/.svelte-kit/adapter-node/_app/immutable/assets/_page.DoNWy7tW.css +1 -0
  49. package/web/.svelte-kit/adapter-node/chunks/AllSessionsPanel.svelte_svelte_type_style_lang.js +49 -0
  50. package/web/.svelte-kit/adapter-node/chunks/alert-dialog-description.js +2670 -0
  51. package/web/.svelte-kit/adapter-node/chunks/auth.js +59 -0
  52. package/web/.svelte-kit/adapter-node/chunks/button.js +82 -0
  53. package/web/.svelte-kit/adapter-node/chunks/client.js +29 -0
  54. package/web/.svelte-kit/adapter-node/chunks/context.js +28 -16
  55. package/web/.svelte-kit/adapter-node/chunks/events.js +121 -0
  56. package/web/.svelte-kit/adapter-node/chunks/index.js +1 -1
  57. package/web/.svelte-kit/adapter-node/chunks/index2.js +186 -68
  58. package/web/.svelte-kit/adapter-node/chunks/internal.js +5 -90
  59. package/web/.svelte-kit/adapter-node/chunks/pane.js +82 -0
  60. package/web/.svelte-kit/adapter-node/chunks/sessions-json.js +16 -1
  61. package/web/.svelte-kit/adapter-node/chunks/sessions.svelte.js +174 -12
  62. package/web/.svelte-kit/adapter-node/chunks/ws-handlers.js +782 -0
  63. package/web/.svelte-kit/adapter-node/entries/endpoints/api/auth/login/_server.ts.js +22 -0
  64. package/web/.svelte-kit/adapter-node/entries/endpoints/api/auth/logout/_server.ts.js +9 -0
  65. package/web/.svelte-kit/adapter-node/entries/endpoints/api/beads/_server.ts.js +22 -0
  66. package/web/.svelte-kit/adapter-node/entries/endpoints/api/chrome/_server.ts.js +30 -0
  67. package/web/.svelte-kit/adapter-node/entries/endpoints/api/files/image/_server.ts.js +53 -0
  68. package/web/.svelte-kit/adapter-node/entries/endpoints/api/sessions/_id_/kill/_server.ts.js +12 -6
  69. package/web/.svelte-kit/adapter-node/entries/endpoints/api/sessions/_id_/restart/_server.ts.js +40 -0
  70. package/web/.svelte-kit/adapter-node/entries/endpoints/api/sessions/_id_/screenshots/_server.ts.js +28 -0
  71. package/web/.svelte-kit/adapter-node/entries/endpoints/api/sessions/_id_/send/_server.ts.js +11 -4
  72. package/web/.svelte-kit/adapter-node/entries/endpoints/api/sessions/_server.ts.js +1 -78
  73. package/web/.svelte-kit/adapter-node/entries/endpoints/api/sessions/_target_/output/_server.ts.js +2 -2
  74. package/web/.svelte-kit/adapter-node/entries/endpoints/api/tmux/panes/_server.ts.js +21 -0
  75. package/web/.svelte-kit/adapter-node/entries/fallbacks/error.svelte.js +1 -18
  76. package/web/.svelte-kit/adapter-node/entries/hooks.server.js +105 -0
  77. package/web/.svelte-kit/adapter-node/entries/pages/_layout.svelte.js +493 -6
  78. package/web/.svelte-kit/adapter-node/entries/pages/_page.svelte.js +3024 -54
  79. package/web/.svelte-kit/adapter-node/entries/pages/login/_page.server.ts.js +15 -0
  80. package/web/.svelte-kit/adapter-node/entries/pages/login/_page.svelte.js +37 -0
  81. package/web/.svelte-kit/adapter-node/entries/pages/session/_target_/_page.svelte.js +623 -46
  82. package/web/.svelte-kit/adapter-node/manifest-full.js +67 -3
  83. package/web/.svelte-kit/adapter-node/manifest.js +67 -3
  84. package/web/.svelte-kit/adapter-node/nodes/0.js +2 -2
  85. package/web/.svelte-kit/adapter-node/nodes/1.js +1 -1
  86. package/web/.svelte-kit/adapter-node/nodes/2.js +2 -2
  87. package/web/.svelte-kit/adapter-node/nodes/3.js +6 -4
  88. package/web/.svelte-kit/adapter-node/nodes/4.js +8 -0
  89. package/web/.svelte-kit/ambient.d.ts +28 -2
  90. package/web/.svelte-kit/generated/server/internal.js +1 -1
  91. package/web/.svelte-kit/output/client/.vite/manifest.json +44 -44
  92. package/web/.svelte-kit/output/client/_app/immutable/chunks/{DU91Ml7U.js → BGcEgn7w.js} +1 -1
  93. package/{dist/web/client/_app/immutable/chunks/DmdO6ygw.js → web/.svelte-kit/output/client/_app/immutable/chunks/By6CYjmE.js} +1 -1
  94. package/web/.svelte-kit/output/client/_app/immutable/chunks/{HKNo9LID.js → CR5jMWGV.js} +1 -1
  95. package/{dist/web/client/_app/immutable/entry/app.CGIBnoln.js → web/.svelte-kit/output/client/_app/immutable/entry/app.DmtnygN7.js} +2 -2
  96. package/web/.svelte-kit/output/client/_app/immutable/entry/start.fYmelGlC.js +1 -0
  97. package/web/.svelte-kit/output/client/_app/immutable/nodes/{0.CqlJ9a31.js → 0.DGDAdwT5.js} +1 -1
  98. package/web/.svelte-kit/output/client/_app/immutable/nodes/{1.BQUZh2-w.js → 1.Cg8dWgUN.js} +1 -1
  99. package/web/.svelte-kit/output/client/_app/immutable/nodes/{2.CCV1YdgF.js → 2.DItUEo3e.js} +1 -1
  100. package/web/.svelte-kit/output/client/_app/immutable/nodes/{3.D9tDCdq8.js → 3.dHui0twF.js} +1 -1
  101. package/web/.svelte-kit/output/client/_app/immutable/nodes/{4.BqPyNkFA.js → 4.CiEHP0cr.js} +1 -1
  102. package/web/.svelte-kit/output/client/_app/version.json +1 -1
  103. package/web/.svelte-kit/output/server/chunks/internal.js +1 -1
  104. package/web/.svelte-kit/output/server/manifest-full.js +1 -1
  105. package/web/.svelte-kit/output/server/manifest.js +1 -1
  106. package/web/.svelte-kit/output/server/nodes/0.js +1 -1
  107. package/web/.svelte-kit/output/server/nodes/1.js +1 -1
  108. package/web/.svelte-kit/output/server/nodes/2.js +1 -1
  109. package/web/.svelte-kit/output/server/nodes/3.js +1 -1
  110. package/web/.svelte-kit/output/server/nodes/4.js +1 -1
  111. package/dist/web/client/_app/immutable/entry/start.CJk8zB1j.js +0 -1
  112. package/web/.svelte-kit/adapter-node/_app/immutable/assets/_layout.4NiX29PU.css +0 -1
  113. package/web/.svelte-kit/adapter-node/_app/immutable/assets/_page.BEMzYUGV.css +0 -1
  114. package/web/.svelte-kit/adapter-node/_app/immutable/assets/_page.DOJn7TG7.css +0 -1
  115. package/web/.svelte-kit/output/client/_app/immutable/entry/start.CJk8zB1j.js +0 -1
@@ -1,11 +1,498 @@
1
- import { Z as head } from "../../chunks/index2.js";
1
+ import { Z as attr_class, _ as attr_style, $ as stringify, a0 as attr, a1 as ensure_array_like, a2 as store_get, a3 as unsubscribe_stores, a4 as head } from "../../chunks/index2.js";
2
+ import { R as ReliableWebSocket, s as sessionStore, a as stateColor, p as page, o as onDestroy } from "../../chunks/sessions.svelte.js";
3
+ import { g as goto } from "../../chunks/client.js";
4
+ import { B as Badge } from "../../chunks/AllSessionsPanel.svelte_svelte_type_style_lang.js";
5
+ import { B as Button } from "../../chunks/button.js";
6
+ import "clsx";
7
+ import { B as BROWSER } from "../../chunks/false.js";
8
+ import { e as escape_html } from "../../chunks/context.js";
9
+ import "@sveltejs/kit/internal";
10
+ import "../../chunks/exports.js";
11
+ import "../../chunks/utils.js";
12
+ import "@sveltejs/kit/internal/server";
13
+ import "../../chunks/state.svelte.js";
14
+ const browser = BROWSER;
15
+ class BeadsStore extends ReliableWebSocket {
16
+ issues = [];
17
+ filter = "open";
18
+ currentProject = null;
19
+ loading = false;
20
+ error = null;
21
+ /**
22
+ * Get filtered issues based on current filter setting
23
+ */
24
+ get filteredIssues() {
25
+ const issues = this.issues;
26
+ const filter = this.filter;
27
+ switch (filter) {
28
+ case "ready":
29
+ return issues.filter((i) => i.status === "open" && (!i.dependencies || !i.dependencies.some((d) => d.type === "blocked_by")));
30
+ case "open":
31
+ return issues.filter((i) => i.status !== "closed" && i.status !== "deferred");
32
+ case "all":
33
+ default:
34
+ return issues;
35
+ }
36
+ }
37
+ /**
38
+ * Get issue count for badge display
39
+ */
40
+ get issueCount() {
41
+ return this.filteredIssues.length;
42
+ }
43
+ getWsUrl() {
44
+ const protocol = window.location.protocol === "https:" ? "wss:" : "ws:";
45
+ const project = encodeURIComponent(this.currentProject || "");
46
+ return `${protocol}//${window.location.host}/api/beads/stream?project=${project}`;
47
+ }
48
+ getLogPrefix() {
49
+ return "[beads]";
50
+ }
51
+ shouldReconnect() {
52
+ return !!this.currentProject;
53
+ }
54
+ handleMessage(event) {
55
+ try {
56
+ const data = JSON.parse(event.data);
57
+ if (data.issues) {
58
+ this.issues = data.issues;
59
+ this.error = null;
60
+ }
61
+ } catch (err) {
62
+ console.error("[beads] Failed to parse message:", err);
63
+ }
64
+ }
65
+ onConnected() {
66
+ this.loading = false;
67
+ this.error = null;
68
+ }
69
+ onDisconnected() {
70
+ }
71
+ /**
72
+ * Connect to a project's beads stream
73
+ */
74
+ setProject(project) {
75
+ if (project === this.currentProject) return;
76
+ if (this.currentProject) {
77
+ this.doDisconnect();
78
+ }
79
+ this.currentProject = project;
80
+ this.issues = [];
81
+ this.error = null;
82
+ }
83
+ /**
84
+ * Set the filter type
85
+ */
86
+ setFilter(filter) {
87
+ this.filter = filter;
88
+ }
89
+ /**
90
+ * Force refresh issues
91
+ */
92
+ refresh() {
93
+ if (this.currentProject) {
94
+ this.forceReconnect();
95
+ }
96
+ }
97
+ /**
98
+ * Manually connect (call from layout or page)
99
+ */
100
+ connect() {
101
+ if (this.currentProject && browser) ;
102
+ }
103
+ /**
104
+ * Manually disconnect
105
+ */
106
+ disconnect() {
107
+ this.doDisconnect();
108
+ }
109
+ }
110
+ const beadsStore = new BeadsStore();
111
+ function IssueItem($$renderer, $$props) {
112
+ $$renderer.component(($$renderer2) => {
113
+ let { issue } = $$props;
114
+ let expanded = false;
115
+ function statusColor(status) {
116
+ switch (status) {
117
+ case "in_progress":
118
+ return "#27ae60";
119
+ case // green
120
+ "open":
121
+ return "#f39c12";
122
+ case // yellow
123
+ "blocked":
124
+ return "#e74c3c";
125
+ case // red
126
+ "closed":
127
+ case "deferred":
128
+ default:
129
+ return "#888888";
130
+ }
131
+ }
132
+ function priorityColor(priority) {
133
+ switch (priority) {
134
+ case 0:
135
+ return "#e74c3c";
136
+ case // red - critical
137
+ 1:
138
+ return "#e67e22";
139
+ case // orange - high
140
+ 2:
141
+ return "#f39c12";
142
+ case // yellow - medium
143
+ 3:
144
+ return "#3498db";
145
+ case // blue - low
146
+ 4:
147
+ default:
148
+ return "#888888";
149
+ }
150
+ }
151
+ $$renderer2.push(`<div${attr_class("issue-wrapper svelte-1yk20pg", void 0, { "expanded": expanded })}><button class="issue-item svelte-1yk20pg" type="button"><span class="status-dot svelte-1yk20pg"${attr_style(`background: ${stringify(statusColor(issue.status))}`)}></span> <span class="issue-title svelte-1yk20pg">${escape_html(issue.title)}</span> <span class="priority-badge svelte-1yk20pg"${attr_style(`background: ${stringify(priorityColor(issue.priority))}`)}>P${escape_html(issue.priority)}</span> <iconify-icon${attr("icon", "mdi:chevron-down")} class="chevron svelte-1yk20pg"></iconify-icon></button> `);
152
+ {
153
+ $$renderer2.push("<!--[!-->");
154
+ }
155
+ $$renderer2.push(`<!--]--></div>`);
156
+ });
157
+ }
158
+ function BeadsPanel($$renderer, $$props) {
159
+ $$renderer.component(($$renderer2) => {
160
+ function setFilter(filter) {
161
+ beadsStore.setFilter(filter);
162
+ }
163
+ const filters = [
164
+ { label: "Ready", value: "ready" },
165
+ { label: "Open", value: "open" },
166
+ { label: "All", value: "all" }
167
+ ];
168
+ $$renderer2.push(`<div class="beads-panel svelte-ye9143"><button class="panel-header svelte-ye9143" type="button"><iconify-icon icon="mdi:checkbox-multiple-marked-outline"></iconify-icon> <span>Issues</span> `);
169
+ Badge($$renderer2, {
170
+ variant: "outline",
171
+ class: "ml-auto issue-count",
172
+ children: ($$renderer3) => {
173
+ $$renderer3.push(`<!---->${escape_html(beadsStore.issueCount)}`);
174
+ },
175
+ $$slots: { default: true }
176
+ });
177
+ $$renderer2.push(`<!----> <iconify-icon${attr("icon", "mdi:chevron-down")} class="chevron svelte-ye9143"></iconify-icon></button> `);
178
+ {
179
+ $$renderer2.push("<!--[-->");
180
+ $$renderer2.push(`<div class="panel-content svelte-ye9143"><div class="filter-buttons svelte-ye9143"><!--[-->`);
181
+ const each_array = ensure_array_like(filters);
182
+ for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
183
+ let f = each_array[$$index];
184
+ Button($$renderer2, {
185
+ variant: beadsStore.filter === f.value ? "default" : "ghost",
186
+ size: "sm",
187
+ onclick: () => setFilter(f.value),
188
+ class: "filter-btn",
189
+ children: ($$renderer3) => {
190
+ $$renderer3.push(`<!---->${escape_html(f.label)}`);
191
+ },
192
+ $$slots: { default: true }
193
+ });
194
+ }
195
+ $$renderer2.push(`<!--]--></div> <div>`);
196
+ if (beadsStore.loading) {
197
+ $$renderer2.push("<!--[-->");
198
+ $$renderer2.push(`<div class="loading svelte-ye9143">Loading issues...</div>`);
199
+ } else {
200
+ $$renderer2.push("<!--[!-->");
201
+ if (beadsStore.error) {
202
+ $$renderer2.push("<!--[-->");
203
+ $$renderer2.push(`<div class="error svelte-ye9143">${escape_html(beadsStore.error)}</div>`);
204
+ } else {
205
+ $$renderer2.push("<!--[!-->");
206
+ if (beadsStore.filteredIssues.length === 0) {
207
+ $$renderer2.push("<!--[-->");
208
+ $$renderer2.push(`<div class="empty svelte-ye9143">No issues</div>`);
209
+ } else {
210
+ $$renderer2.push("<!--[!-->");
211
+ $$renderer2.push(`<!--[-->`);
212
+ const each_array_1 = ensure_array_like(beadsStore.filteredIssues);
213
+ for (let $$index_1 = 0, $$length = each_array_1.length; $$index_1 < $$length; $$index_1++) {
214
+ let issue = each_array_1[$$index_1];
215
+ IssueItem($$renderer2, { issue });
216
+ }
217
+ $$renderer2.push(`<!--]-->`);
218
+ }
219
+ $$renderer2.push(`<!--]-->`);
220
+ }
221
+ $$renderer2.push(`<!--]-->`);
222
+ }
223
+ $$renderer2.push(`<!--]--></div></div>`);
224
+ }
225
+ $$renderer2.push(`<!--]--></div>`);
226
+ });
227
+ }
228
+ function ScreenshotsPanel($$renderer, $$props) {
229
+ $$renderer.component(($$renderer2) => {
230
+ let { sessionId, screenshots } = $$props;
231
+ let viewingScreenshot = null;
232
+ let touchStartX = 0;
233
+ let touchCurrentX = 0;
234
+ let isSwiping = false;
235
+ async function dismissScreenshot(path) {
236
+ await fetch(`/api/sessions/${encodeURIComponent(sessionId)}/screenshots?path=${encodeURIComponent(path)}`, { method: "DELETE" });
237
+ if (viewingScreenshot === path) {
238
+ viewingScreenshot = null;
239
+ }
240
+ }
241
+ function closeModal() {
242
+ viewingScreenshot = null;
243
+ resetSwipe();
244
+ }
245
+ function getFilename(path) {
246
+ return path.split("/").pop() || path;
247
+ }
248
+ function resetSwipe() {
249
+ isSwiping = false;
250
+ touchStartX = 0;
251
+ touchCurrentX = 0;
252
+ }
253
+ const swipeOffset = isSwiping ? Math.min(0, touchCurrentX - touchStartX) : 0;
254
+ $$renderer2.push(`<div class="screenshots-panel svelte-i8iwb7"><button class="panel-header svelte-i8iwb7" type="button"><iconify-icon icon="mdi:image-multiple"></iconify-icon> <span>Screenshots</span> `);
255
+ Badge($$renderer2, {
256
+ variant: "outline",
257
+ class: "ml-auto screenshot-count",
258
+ children: ($$renderer3) => {
259
+ $$renderer3.push(`<!---->${escape_html(screenshots.length)}`);
260
+ },
261
+ $$slots: { default: true }
262
+ });
263
+ $$renderer2.push(`<!----> <iconify-icon${attr("icon", "mdi:chevron-down")} class="chevron svelte-i8iwb7"></iconify-icon></button> `);
264
+ {
265
+ $$renderer2.push("<!--[-->");
266
+ $$renderer2.push(`<div class="panel-content svelte-i8iwb7">`);
267
+ if (screenshots.length === 0) {
268
+ $$renderer2.push("<!--[-->");
269
+ $$renderer2.push(`<div class="empty svelte-i8iwb7">No screenshots</div>`);
270
+ } else {
271
+ $$renderer2.push("<!--[!-->");
272
+ $$renderer2.push(`<div class="screenshots-grid svelte-i8iwb7"><!--[-->`);
273
+ const each_array = ensure_array_like(screenshots);
274
+ for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
275
+ let screenshot = each_array[$$index];
276
+ $$renderer2.push(`<div class="screenshot-item svelte-i8iwb7"><button class="thumbnail svelte-i8iwb7"${attr("title", getFilename(screenshot.path))}><img${attr("src", `/api/files/image?path=${stringify(encodeURIComponent(screenshot.path))}`)}${attr("alt", getFilename(screenshot.path))} loading="lazy" class="svelte-i8iwb7"/></button> `);
277
+ Button($$renderer2, {
278
+ variant: "ghost",
279
+ size: "icon-sm",
280
+ class: "dismiss-btn",
281
+ onclick: () => dismissScreenshot(screenshot.path),
282
+ title: "Dismiss screenshot",
283
+ children: ($$renderer3) => {
284
+ $$renderer3.push(`<iconify-icon icon="mdi:close"></iconify-icon>`);
285
+ },
286
+ $$slots: { default: true }
287
+ });
288
+ $$renderer2.push(`<!----></div>`);
289
+ }
290
+ $$renderer2.push(`<!--]--></div>`);
291
+ }
292
+ $$renderer2.push(`<!--]--></div>`);
293
+ }
294
+ $$renderer2.push(`<!--]--></div> `);
295
+ if (viewingScreenshot) {
296
+ $$renderer2.push("<!--[-->");
297
+ $$renderer2.push(`<div class="modal-overlay svelte-i8iwb7" role="dialog" aria-modal="true" tabindex="-1"><div class="modal-content svelte-i8iwb7"${attr_style(`transform: translateX(${stringify(swipeOffset)}px)`)} role="document"><img${attr("src", `/api/files/image?path=${stringify(encodeURIComponent(viewingScreenshot))}`)}${attr("alt", getFilename(viewingScreenshot))} class="modal-image svelte-i8iwb7"/> <div class="modal-actions svelte-i8iwb7">`);
298
+ Button($$renderer2, {
299
+ variant: "secondary",
300
+ size: "sm",
301
+ onclick: closeModal,
302
+ class: "modal-btn",
303
+ children: ($$renderer3) => {
304
+ $$renderer3.push(`<iconify-icon icon="mdi:close"></iconify-icon> <span>Close</span>`);
305
+ },
306
+ $$slots: { default: true }
307
+ });
308
+ $$renderer2.push(`<!----> `);
309
+ Button($$renderer2, {
310
+ variant: "destructive",
311
+ size: "sm",
312
+ onclick: () => dismissScreenshot(viewingScreenshot),
313
+ class: "modal-btn",
314
+ children: ($$renderer3) => {
315
+ $$renderer3.push(`<iconify-icon icon="mdi:delete"></iconify-icon> <span>Delete</span>`);
316
+ },
317
+ $$slots: { default: true }
318
+ });
319
+ $$renderer2.push(`<!----></div> <div class="swipe-hint svelte-i8iwb7"><iconify-icon icon="mdi:gesture-swipe-left"></iconify-icon> <span>Swipe left to close</span></div></div></div>`);
320
+ } else {
321
+ $$renderer2.push("<!--[!-->");
322
+ }
323
+ $$renderer2.push(`<!--]-->`);
324
+ });
325
+ }
326
+ function SessionsSidebar($$renderer, $$props) {
327
+ $$renderer.component(($$renderer2) => {
328
+ var $$store_subs;
329
+ let { onSelect, hideSessionsList = false } = $$props;
330
+ store_get($$store_subs ??= {}, "$page", page).url.pathname.startsWith("/session/");
331
+ const currentTarget = store_get($$store_subs ??= {}, "$page", page).params.target ? decodeURIComponent(store_get($$store_subs ??= {}, "$page", page).params.target) : null;
332
+ const currentSession = sessionStore.sessions.find((s) => s.tmux_target === currentTarget || s.id === currentTarget);
333
+ const projectName = (() => {
334
+ const cwd = currentSession?.cwd || currentSession?.git_root;
335
+ if (!cwd) return null;
336
+ const parts = cwd.split("/").filter(Boolean);
337
+ return parts[parts.length - 1] || null;
338
+ })();
339
+ const projectSessions = (() => {
340
+ const projectRoot = currentSession?.git_root || currentSession?.cwd;
341
+ if (!projectRoot) return sessionStore.sessions;
342
+ return sessionStore.sessions.filter((s) => s.git_root === projectRoot || s.cwd === projectRoot);
343
+ })();
344
+ async function newSession() {
345
+ const cwd = currentSession?.cwd || currentSession?.git_root;
346
+ if (!cwd) return;
347
+ const res = await fetch("/api/projects/new-session", {
348
+ method: "POST",
349
+ headers: { "Content-Type": "application/json" },
350
+ body: JSON.stringify({ cwd })
351
+ });
352
+ const data = await res.json();
353
+ if (data.ok && data.session) {
354
+ data.session + ":1.1";
355
+ onSelect?.();
356
+ goto();
357
+ }
358
+ }
359
+ $$renderer2.push(`<nav class="sidebar-sessions svelte-1wiqrar"><div class="sidebar-header svelte-1wiqrar"><a href="/" class="home-link svelte-1wiqrar"><iconify-icon icon="mdi:folder-outline"></iconify-icon> <span>${escape_html(projectName || "Sessions")}</span></a> `);
360
+ if (currentSession?.cwd) {
361
+ $$renderer2.push("<!--[-->");
362
+ Button($$renderer2, {
363
+ variant: "ghost",
364
+ size: "icon-sm",
365
+ onclick: newSession,
366
+ title: "New session in this project",
367
+ class: "new-session-btn",
368
+ children: ($$renderer3) => {
369
+ $$renderer3.push(`<iconify-icon icon="mdi:plus"></iconify-icon>`);
370
+ },
371
+ $$slots: { default: true }
372
+ });
373
+ } else {
374
+ $$renderer2.push("<!--[!-->");
375
+ }
376
+ $$renderer2.push(`<!--]--></div> <div class="scroll-content svelte-1wiqrar">`);
377
+ if (!hideSessionsList) {
378
+ $$renderer2.push("<!--[-->");
379
+ $$renderer2.push(`<div class="sessions-panel"><button class="panel-header svelte-1wiqrar" type="button"><iconify-icon icon="mdi:console"></iconify-icon> <span>Sessions</span> `);
380
+ Badge($$renderer2, {
381
+ variant: "outline",
382
+ class: "ml-auto session-count",
383
+ children: ($$renderer3) => {
384
+ $$renderer3.push(`<!---->${escape_html(projectSessions.length)}`);
385
+ },
386
+ $$slots: { default: true }
387
+ });
388
+ $$renderer2.push(`<!----> <iconify-icon${attr("icon", "mdi:chevron-down")} class="chevron svelte-1wiqrar"></iconify-icon></button> `);
389
+ {
390
+ $$renderer2.push("<!--[-->");
391
+ $$renderer2.push(`<div class="sessions-list svelte-1wiqrar">`);
392
+ const each_array = ensure_array_like(projectSessions);
393
+ if (each_array.length !== 0) {
394
+ $$renderer2.push("<!--[-->");
395
+ for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
396
+ let session = each_array[$$index];
397
+ if (session.tmux_target) {
398
+ $$renderer2.push("<!--[-->");
399
+ $$renderer2.push(`<a${attr("href", `/session/${stringify(encodeURIComponent(session.tmux_target))}`)}${attr_class("session-item svelte-1wiqrar", void 0, {
400
+ "active": session.tmux_target === currentTarget || session.id === currentTarget
401
+ })}><span class="icon-slot svelte-1wiqrar"><span class="state-dot svelte-1wiqrar"${attr_style(`background: ${stringify(stateColor(session.state))}`)}></span></span> <div class="session-info svelte-1wiqrar"><div class="session-name svelte-1wiqrar">${escape_html(session.pane_title || session.tmux_target)}</div> `);
402
+ if (session.current_action) {
403
+ $$renderer2.push("<!--[-->");
404
+ $$renderer2.push(`<div class="session-action svelte-1wiqrar">${escape_html(session.current_action)}</div>`);
405
+ } else {
406
+ $$renderer2.push("<!--[!-->");
407
+ }
408
+ $$renderer2.push(`<!--]--></div></a>`);
409
+ } else {
410
+ $$renderer2.push("<!--[!-->");
411
+ }
412
+ $$renderer2.push(`<!--]-->`);
413
+ }
414
+ } else {
415
+ $$renderer2.push("<!--[!-->");
416
+ $$renderer2.push(`<div class="empty svelte-1wiqrar">No active sessions</div>`);
417
+ }
418
+ $$renderer2.push(`<!--]--></div>`);
419
+ }
420
+ $$renderer2.push(`<!--]--></div>`);
421
+ } else {
422
+ $$renderer2.push("<!--[!-->");
423
+ }
424
+ $$renderer2.push(`<!--]--> `);
425
+ if (currentSession?.beads_enabled) {
426
+ $$renderer2.push("<!--[-->");
427
+ BeadsPanel($$renderer2, {
428
+ project: currentSession.git_root
429
+ });
430
+ } else {
431
+ $$renderer2.push("<!--[!-->");
432
+ }
433
+ $$renderer2.push(`<!--]--> `);
434
+ if (currentSession?.screenshots && currentSession.screenshots.length > 0) {
435
+ $$renderer2.push("<!--[-->");
436
+ ScreenshotsPanel($$renderer2, {
437
+ sessionId: currentSession.id,
438
+ screenshots: currentSession.screenshots
439
+ });
440
+ } else {
441
+ $$renderer2.push("<!--[!-->");
442
+ }
443
+ $$renderer2.push(`<!--]--></div></nav>`);
444
+ if ($$store_subs) unsubscribe_stores($$store_subs);
445
+ });
446
+ }
2
447
  function _layout($$renderer, $$props) {
3
- let { children } = $$props;
4
- head("12qhfyh", $$renderer, ($$renderer2) => {
5
- $$renderer2.push(`<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"/> <meta name="apple-mobile-web-app-capable" content="yes"/> <script src="https://code.iconify.design/iconify-icon/2.1.0/iconify-icon.min.js"><\/script>`);
448
+ $$renderer.component(($$renderer2) => {
449
+ var $$store_subs;
450
+ let { children } = $$props;
451
+ let drawerOpen = false;
452
+ let isDesktop = false;
453
+ const DEFAULT_WIDTH = 250;
454
+ let sidebarWidth = DEFAULT_WIDTH;
455
+ let isResizing = false;
456
+ let isResizingSplit = false;
457
+ const showSidebar = store_get($$store_subs ??= {}, "$page", page).url.pathname.startsWith("/session/");
458
+ onDestroy(() => {
459
+ sessionStore.disconnect();
460
+ });
461
+ function closeDrawer() {
462
+ drawerOpen = false;
463
+ }
464
+ head("12qhfyh", $$renderer2, ($$renderer3) => {
465
+ $$renderer3.push(`<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"/> <meta name="apple-mobile-web-app-capable" content="yes"/> <script src="https://code.iconify.design/iconify-icon/2.1.0/iconify-icon.min.js"><\/script>`);
466
+ });
467
+ if (showSidebar) {
468
+ $$renderer2.push("<!--[-->");
469
+ $$renderer2.push(`<div${attr_class("app-shell svelte-12qhfyh", void 0, {
470
+ "split-view": isDesktop,
471
+ "resizing-any": isResizingSplit
472
+ })}>`);
473
+ {
474
+ $$renderer2.push("<!--[!-->");
475
+ }
476
+ $$renderer2.push(`<!--]--> <main class="content svelte-12qhfyh"><button class="hamburger svelte-12qhfyh" aria-label="Toggle menu"><iconify-icon icon="mdi:menu"></iconify-icon></button> `);
477
+ children($$renderer2);
478
+ $$renderer2.push(`<!----></main> <aside${attr_class("sidebar svelte-12qhfyh", void 0, { "open": drawerOpen, "resizing": isResizing })}${attr_style(`--sidebar-width: ${stringify(sidebarWidth)}px`)}><div class="resize-handle resize-handle-left svelte-12qhfyh" role="separator" aria-orientation="vertical"></div> `);
479
+ SessionsSidebar($$renderer2, { onSelect: closeDrawer, hideSessionsList: isDesktop });
480
+ $$renderer2.push(`<!----> <div class="resize-handle resize-handle-right svelte-12qhfyh" role="separator" aria-orientation="vertical"></div></aside> `);
481
+ if (drawerOpen) {
482
+ $$renderer2.push("<!--[-->");
483
+ $$renderer2.push(`<button class="backdrop svelte-12qhfyh" aria-label="Close menu"></button>`);
484
+ } else {
485
+ $$renderer2.push("<!--[!-->");
486
+ }
487
+ $$renderer2.push(`<!--]--></div>`);
488
+ } else {
489
+ $$renderer2.push("<!--[!-->");
490
+ children($$renderer2);
491
+ $$renderer2.push(`<!---->`);
492
+ }
493
+ $$renderer2.push(`<!--]-->`);
494
+ if ($$store_subs) unsubscribe_stores($$store_subs);
6
495
  });
7
- children($$renderer);
8
- $$renderer.push(`<!---->`);
9
496
  }
10
497
  export {
11
498
  _layout as default