cli-jaw 2.2.11 → 2.2.13

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 (176) hide show
  1. package/dist/bin/commands/doctor.js +20 -0
  2. package/dist/bin/commands/doctor.js.map +1 -1
  3. package/dist/bin/commands/init.js +7 -0
  4. package/dist/bin/commands/init.js.map +1 -1
  5. package/dist/bin/commands/slack.js +47 -5
  6. package/dist/bin/commands/slack.js.map +1 -1
  7. package/dist/bin/commands/tui/slash-command-runner.js +11 -2
  8. package/dist/bin/commands/tui/slash-command-runner.js.map +1 -1
  9. package/dist/server.js +18 -2
  10. package/dist/server.js.map +1 -1
  11. package/dist/src/agent/error-classifier.js +11 -2
  12. package/dist/src/agent/error-classifier.js.map +1 -1
  13. package/dist/src/agent/events/claude.js +7 -1
  14. package/dist/src/agent/events/claude.js.map +1 -1
  15. package/dist/src/agent/events/fulltext-bound.js +32 -0
  16. package/dist/src/agent/events/fulltext-bound.js.map +1 -0
  17. package/dist/src/agent/events/grok.js +7 -1
  18. package/dist/src/agent/events/grok.js.map +1 -1
  19. package/dist/src/agent/events/helpers.js +17 -4
  20. package/dist/src/agent/events/helpers.js.map +1 -1
  21. package/dist/src/agent/lifecycle-handler.js +56 -5
  22. package/dist/src/agent/lifecycle-handler.js.map +1 -1
  23. package/dist/src/agent/pi-runtime.js +30 -1
  24. package/dist/src/agent/pi-runtime.js.map +1 -1
  25. package/dist/src/agent/spawn/exit-drain.js +96 -0
  26. package/dist/src/agent/spawn/exit-drain.js.map +1 -0
  27. package/dist/src/agent/spawn/line-buffer.js +26 -0
  28. package/dist/src/agent/spawn/line-buffer.js.map +1 -0
  29. package/dist/src/agent/spawn/process-kill.js +31 -0
  30. package/dist/src/agent/spawn/process-kill.js.map +1 -1
  31. package/dist/src/agent/spawn.js +80 -23
  32. package/dist/src/agent/spawn.js.map +1 -1
  33. package/dist/src/agent/watchdog.js +21 -5
  34. package/dist/src/agent/watchdog.js.map +1 -1
  35. package/dist/src/cli/commands.js +68 -15
  36. package/dist/src/cli/commands.js.map +1 -1
  37. package/dist/src/cli/opencodex-models.js +67 -14
  38. package/dist/src/cli/opencodex-models.js.map +1 -1
  39. package/dist/src/cli/registry-live.js +55 -2
  40. package/dist/src/cli/registry-live.js.map +1 -1
  41. package/dist/src/cli/registry.js +8 -2
  42. package/dist/src/cli/registry.js.map +1 -1
  43. package/dist/src/core/config.js +26 -1
  44. package/dist/src/core/config.js.map +1 -1
  45. package/dist/src/messaging/channel-health.js +6 -0
  46. package/dist/src/messaging/channel-health.js.map +1 -1
  47. package/dist/src/messaging/channel-validate.js +85 -0
  48. package/dist/src/messaging/channel-validate.js.map +1 -0
  49. package/dist/src/routes/link-preview.js +14 -0
  50. package/dist/src/routes/link-preview.js.map +1 -1
  51. package/dist/src/routes/messaging.js +9 -0
  52. package/dist/src/routes/messaging.js.map +1 -1
  53. package/dist/src/routes/system.js +5 -0
  54. package/dist/src/routes/system.js.map +1 -1
  55. package/dist/src/slack/api.js +32 -3
  56. package/dist/src/slack/api.js.map +1 -1
  57. package/dist/src/slack/bot.js +37 -1
  58. package/dist/src/slack/bot.js.map +1 -1
  59. package/dist/src/slack/events.js +23 -0
  60. package/dist/src/slack/events.js.map +1 -1
  61. package/dist/src/slack/hot-notify.js +33 -0
  62. package/dist/src/slack/hot-notify.js.map +1 -0
  63. package/dist/src/slack/manifest.js +2 -1
  64. package/dist/src/slack/manifest.js.map +1 -1
  65. package/dist/src/slack/progress.js +98 -0
  66. package/dist/src/slack/progress.js.map +1 -0
  67. package/dist/src/slack/send-only-client.js +3 -2
  68. package/dist/src/slack/send-only-client.js.map +1 -1
  69. package/dist/src/slack/slack-file.js +4 -2
  70. package/dist/src/slack/slack-file.js.map +1 -1
  71. package/package.json +3 -1
  72. package/public/css/sidebar.css +200 -0
  73. package/public/dist/assets/Agent-BjbZVZ9p.js +1 -0
  74. package/public/dist/assets/CodeCanvas-CbfPP7Ad.js +3 -0
  75. package/public/dist/assets/{DocPanel-DtYwv3n3.js → DocPanel-Dz-J_l5M.js} +1 -1
  76. package/public/dist/assets/{Heartbeat-vDGhPfct.js → Heartbeat-DDmZARWw.js} +1 -1
  77. package/public/dist/assets/MarkdownRenderer-CXrilOsG.js +15 -0
  78. package/public/dist/assets/MarkdownRenderer-DZVh_xX2.js +1 -0
  79. package/public/dist/assets/{Memory-B_UZ-iCA.js → Memory-CUbviW7N.js} +1 -1
  80. package/public/dist/assets/{MilkdownWysiwygEditor-BNoLGbFC.js → MilkdownWysiwygEditor-Em7iC6y9.js} +8 -8
  81. package/public/dist/assets/ModelProvider-ngg8xTuB.js +1 -0
  82. package/public/dist/assets/{agent-meta-C8DqYXM6.js → agent-meta-Y3DE6sxh.js} +1 -1
  83. package/public/dist/assets/app-BzD_ZLvt.js +55 -0
  84. package/public/dist/assets/{app-Nu2VPaO5.css → app-DX4e6isX.css} +1 -1
  85. package/public/dist/assets/bgtask-badge-Dqbp-Y4e.js +1 -0
  86. package/public/dist/assets/{bgtask-badge-DXca8E7c.js → bgtask-badge-qMkKOZx0.js} +1 -1
  87. package/public/dist/assets/{react-dom-AWKMTIe7.js → bounded-set-CFlZiEF4.js} +1 -1
  88. package/public/dist/assets/{constants-CSZ011-j.js → constants-Df7-7Rky.js} +1 -1
  89. package/public/dist/assets/{employees-BL4qMxJj.js → employees-BnobWM_2.js} +1 -1
  90. package/public/dist/assets/{iframe-renderer-DUI0LYBy.js → iframe-renderer-C5vRbbl9.js} +2 -2
  91. package/public/dist/assets/iframe-renderer-Df4KIVyx.js +1 -0
  92. package/public/dist/assets/manager-DaN201mN.js +13 -0
  93. package/public/dist/assets/memory-D-bULTHl.js +1 -0
  94. package/public/dist/assets/{memory-B_Y0L0KD.js → memory-DF4kPwwC.js} +1 -1
  95. package/public/dist/assets/{message-history-Dl8dJzez.js → message-history-C4WOisGx.js} +1 -1
  96. package/public/dist/assets/message-history-ZBoza6ew.js +1 -0
  97. package/public/dist/assets/{render-BI1aqKoc.js → render-DYX6GRQ0.js} +1 -1
  98. package/public/dist/assets/{settings-B0Sj4sUH.js → settings-DbJpGoaX.js} +1 -1
  99. package/public/dist/assets/settings-SreihUje.js +1 -0
  100. package/public/dist/assets/settings-core-B1Y5Nb4Z.js +1 -0
  101. package/public/dist/assets/settings-core-DobZWIZ7.js +140 -0
  102. package/public/dist/assets/{sidebar-DOR9fTgN.js → sidebar-Cp22g0Gv.js} +3 -3
  103. package/public/dist/assets/skills-DwPIP08e.js +1 -0
  104. package/public/dist/assets/{skills-wt0fkV9Y.js → skills-IGquen_j.js} +1 -1
  105. package/public/dist/assets/slash-commands-BBVfwcnW.js +1 -0
  106. package/public/dist/assets/{slash-commands-BZbqTg3v.js → slash-commands-ZRDOL99E.js} +1 -1
  107. package/public/dist/assets/{trace-drawer-kMYzaVFW.js → trace-drawer-D8To8fYt.js} +1 -1
  108. package/public/dist/assets/ui-CAicpUZc.js +1 -0
  109. package/public/dist/assets/{ui-D4D5HUfo.js → ui-Hx_mNoDf.js} +1 -1
  110. package/public/dist/assets/{wiki-link-resolver-BfNXN9px.js → wiki-link-resolver-DyFzBTIQ.js} +1 -1
  111. package/public/dist/index.html +90 -47
  112. package/public/dist/manager/index.html +1 -1
  113. package/public/index.html +88 -45
  114. package/public/js/constants.ts +50 -0
  115. package/public/js/features/channel-onboarding-flow.ts +197 -0
  116. package/public/js/features/channel-onboarding.ts +322 -0
  117. package/public/js/features/channel-setup-guide.ts +26 -0
  118. package/public/js/features/channel-setup-rules.ts +32 -0
  119. package/public/js/features/notifications.ts +38 -0
  120. package/public/js/features/settings-channel.ts +4 -0
  121. package/public/js/features/settings-core.ts +73 -9
  122. package/public/js/features/settings-discord.ts +2 -0
  123. package/public/js/features/settings-slack.ts +60 -2
  124. package/public/js/features/settings-telegram.ts +2 -0
  125. package/public/js/features/settings-types.ts +1 -1
  126. package/public/js/features/settings.ts +1 -1
  127. package/public/js/features/transport-status-row.ts +7 -3
  128. package/public/js/main.ts +5 -1
  129. package/public/locales/en.json +65 -3
  130. package/public/locales/ja.json +76 -3
  131. package/public/locales/ko.json +65 -3
  132. package/public/locales/zh.json +76 -3
  133. package/public/manager/src/SidebarRailRouter.tsx +9 -3
  134. package/public/manager/src/browser-panel/use-embedded-target-sync.ts +19 -1
  135. package/public/manager/src/code/CodeCanvas.tsx +14 -2
  136. package/public/manager/src/code/CodeTranscript.tsx +33 -9
  137. package/public/manager/src/code/CodeWorkbench.tsx +1 -1
  138. package/public/manager/src/code/code-event-dedupe.ts +27 -3
  139. package/public/manager/src/code/use-code-transcript-scroll.ts +28 -3
  140. package/public/manager/src/code/use-throttled-markdown.ts +75 -0
  141. package/public/manager/src/code/useCodeTranscriptVirtualRows.ts +19 -0
  142. package/public/manager/src/electron-metrics.tsx +7 -0
  143. package/public/manager/src/jaw-ceo/useJawCeo.ts +6 -1
  144. package/public/manager/src/jaw-ceo/useJawCeoVirtualTimeline.ts +5 -0
  145. package/public/manager/src/lib/bounded-set.ts +15 -0
  146. package/public/manager/src/lib/fnv1a.ts +14 -0
  147. package/public/manager/src/notes/rendering/CodeBlock.tsx +13 -4
  148. package/public/manager/src/notes/rendering/MarkdownRenderer.tsx +14 -2
  149. package/public/manager/src/notes/rendering/highlight-cache.ts +111 -0
  150. package/public/manager/src/notes/useNotesExternalSync.ts +6 -1
  151. package/public/manager/src/settings/pages/Agent.tsx +25 -4
  152. package/public/manager/src/settings/pages/components/PerCliRow.tsx +13 -5
  153. package/public/manager/src/settings/pages/components/agent/agent-meta.ts +98 -0
  154. package/scripts/bundle-sidecar.sh +8 -0
  155. package/scripts/check-electron-no-native.cjs +90 -4
  156. package/scripts/check-native-load.cjs +157 -0
  157. package/scripts/check-sidecar-smoke.mjs +151 -0
  158. package/scripts/ensure-native-modules.cjs +222 -18
  159. package/scripts/release-gates.mjs +29 -0
  160. package/public/dist/assets/Agent-BgkP4EnS.js +0 -1
  161. package/public/dist/assets/CodeCanvas-BZo3dohZ.js +0 -3
  162. package/public/dist/assets/MarkdownRenderer-CHacL2M_.js +0 -15
  163. package/public/dist/assets/MarkdownRenderer-DyrB9FbZ.js +0 -1
  164. package/public/dist/assets/ModelProvider-CgUvs6pE.js +0 -1
  165. package/public/dist/assets/app-BGIAy4he.js +0 -55
  166. package/public/dist/assets/bgtask-badge-GRSiNILQ.js +0 -1
  167. package/public/dist/assets/iframe-renderer-BUSk0Rw9.js +0 -1
  168. package/public/dist/assets/manager-B-gpf-3j.js +0 -13
  169. package/public/dist/assets/memory-CX6YahTc.js +0 -1
  170. package/public/dist/assets/message-history-Det7u76S.js +0 -1
  171. package/public/dist/assets/settings-C7NutP6X.js +0 -1
  172. package/public/dist/assets/settings-core-CyX-px6_.js +0 -100
  173. package/public/dist/assets/settings-core-DVpFmrhY.js +0 -1
  174. package/public/dist/assets/skills-BWhKreQ2.js +0 -1
  175. package/public/dist/assets/slash-commands-Di4NDA4w.js +0 -1
  176. package/public/dist/assets/ui-BghexWrB.js +0 -1
@@ -7,10 +7,16 @@
7
7
  * rebuild it in-place before build/test steps continue.
8
8
  */
9
9
  const { execFileSync } = require('child_process');
10
- const { existsSync, rmSync } = require('fs');
10
+ const { existsSync, mkdirSync, readFileSync, realpathSync, rmSync, statSync, writeFileSync } = require('fs');
11
11
  const { delimiter, dirname, join } = require('path');
12
+ const { createRequire } = require('module');
13
+ const { createHash } = require('crypto');
14
+ const { tmpdir } = require('os');
12
15
 
13
16
  const root = join(__dirname, '..');
17
+ // Resolve symlinks so launching through a symlinked bin shares one lock identity.
18
+ let realRoot = root;
19
+ try { realRoot = realpathSync(root); } catch { /* fall back to the literal path */ }
14
20
  const nodeBinDir = dirname(process.execPath);
15
21
 
16
22
  function npmCliCandidates() {
@@ -85,33 +91,231 @@ function loadBetterSqlite3() {
85
91
  }
86
92
  }
87
93
 
88
- function isRecoverableNativeMismatch(error) {
89
- const text = String(error && (error.stack || error.message || error));
90
- return (
91
- text.includes('better_sqlite3.node') ||
92
- text.includes('better-sqlite3') ||
93
- text.includes('NODE_MODULE_VERSION') ||
94
- text.includes('ERR_DLOPEN_FAILED')
95
- );
94
+ /**
95
+ * Can the dependency be RESOLVED at all?
96
+ *
97
+ * This is deliberately separate from loading it: resolution failure means the
98
+ * install is missing/pruned, while a resolvable-but-unloadable module means an
99
+ * ABI/native problem. Conflating the two makes a missing install look like an
100
+ * ABI mismatch and triggers a pointless rebuild (defect D1).
101
+ *
102
+ * Resolution is used rather than an existsSync('node_modules') check because
103
+ * other layouts (e.g. Plug'n'Play) resolve without that directory.
104
+ */
105
+ function canResolveBetterSqlite3() {
106
+ try {
107
+ createRequire(join(root, 'package.json')).resolve('better-sqlite3');
108
+ return true;
109
+ } catch {
110
+ return false;
111
+ }
112
+ }
113
+
114
+ /**
115
+ * Classify a native load failure.
116
+ *
117
+ * @param {unknown} error the error thrown while loading
118
+ * @param {boolean} resolved whether the package could be resolved at all
119
+ * @returns {'missing'|'abi'|'other'}
120
+ *
121
+ * `missing` is the only class that was narrowed; `abi` stays deliberately broad
122
+ * so the pre-existing auto-recovery for real ABI mismatches does not regress.
123
+ */
124
+ function classifyNativeError(error, resolved) {
125
+ if (!resolved) return 'missing';
126
+
127
+ const err = /** @type {{ code?: string } | null} */ (error);
128
+ const text = String(error && (/** @type {Error} */ (error).stack || /** @type {Error} */ (error).message || error));
129
+
130
+ if (err && err.code === 'MODULE_NOT_FOUND') return 'missing';
131
+ if (
132
+ (err && err.code === 'ERR_DLOPEN_FAILED')
133
+ || text.includes('NODE_MODULE_VERSION')
134
+ || text.includes('ERR_DLOPEN_FAILED')
135
+ || text.includes('better_sqlite3.node')
136
+ || text.includes('was compiled against a different Node.js version')
137
+ ) {
138
+ return 'abi';
139
+ }
140
+ return 'other';
141
+ }
142
+
143
+ function runtimeFacts() {
144
+ return `Node ${process.version} (ABI ${process.versions.modules}), ${process.platform}/${process.arch}`;
145
+ }
146
+
147
+ // ─── cross-process repair lock ──────────────────────
148
+ //
149
+ // Two processes rebuilding in the same directory race over one build/ tree,
150
+ // because node-gyp rebuild is clean + configure + build. jaw can hit this
151
+ // easily: the dashboard, the CLI and the Electron sidecar may all start at once.
152
+ //
153
+ // mkdir is atomic on POSIX and Windows, so it is used as the acquire primitive.
154
+ // No external dependency is taken: this script must run before install
155
+ // completes, so it can only rely on Node built-ins.
156
+ // The lock deliberately lives OUTSIDE node_modules: this script's own failure
157
+ // mode is a missing/pruned dependency tree, and a concurrent npm install can
158
+ // remove that directory while the lock is held. It is keyed by the resolved
159
+ // install root so every entry point into the same installation shares one lock.
160
+ const LOCK_DIR = join(
161
+ tmpdir(),
162
+ `jaw-native-rebuild-${createHash('sha256').update(realRoot).digest('hex').slice(0, 16)}.lock`,
163
+ );
164
+ // Liveness is decided by the owner PID, not by elapsed time: the rebuild runs
165
+ // synchronously (execFileSync blocks the event loop), so a timer-based heartbeat
166
+ // could never fire while the lock is actually held. The age check below is only a
167
+ // backstop for a PID that cannot be probed.
168
+ const LOCK_STALE_MS = 60 * 60 * 1000;
169
+
170
+ /** Block this process without spinning the CPU (this script is synchronous). */
171
+ function sleepSync(ms) {
172
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
173
+ }
174
+
175
+ function readLockAgeMs() {
176
+ try {
177
+ return Date.now() - statSync(LOCK_DIR).mtimeMs;
178
+ } catch {
179
+ return null;
180
+ }
181
+ }
182
+
183
+ /**
184
+ * Is the process that recorded ownership still alive?
185
+ *
186
+ * @returns {boolean|null} null when liveness cannot be determined
187
+ */
188
+ function isLockOwnerAlive() {
189
+ let pid;
190
+ try {
191
+ pid = Number.parseInt(readFileSync(join(LOCK_DIR, 'owner'), 'utf8').trim(), 10);
192
+ } catch {
193
+ return null;
194
+ }
195
+ if (!Number.isInteger(pid) || pid <= 0) return null;
196
+ if (pid === process.pid) return true;
197
+ try {
198
+ // Signal 0 performs the permission/existence check without delivering.
199
+ process.kill(pid, 0);
200
+ return true;
201
+ } catch (error) {
202
+ if (error && error.code === 'EPERM') return true; // alive, owned by another user
203
+ if (error && error.code === 'ESRCH') return false;
204
+ return null;
205
+ }
206
+ }
207
+
208
+ function acquireRepairLock(waitMs) {
209
+ const deadline = Date.now() + waitMs;
210
+ for (;;) {
211
+ try {
212
+ mkdirSync(LOCK_DIR, { recursive: false });
213
+ try {
214
+ writeFileSync(join(LOCK_DIR, 'owner'), String(process.pid));
215
+ } catch { /* ownership record is advisory only */ }
216
+ return true;
217
+ } catch (error) {
218
+ if (!error || error.code !== 'EEXIST') return false;
219
+
220
+ // Reclaim only a lock whose owner is provably gone. A slow but healthy
221
+ // rebuild must never have its lock stolen, so elapsed time alone is
222
+ // not sufficient grounds for reclaiming.
223
+ const ownerAlive = isLockOwnerAlive();
224
+ const age = readLockAgeMs();
225
+ const abandoned = ownerAlive === false
226
+ || (ownerAlive === null && age !== null && age > LOCK_STALE_MS);
227
+ if (abandoned) {
228
+ console.warn('[jaw:native] reclaiming repair lock abandoned by a dead process');
229
+ try { rmSync(LOCK_DIR, { recursive: true, force: true }); } catch { /* retry below */ }
230
+ continue;
231
+ }
232
+ if (Date.now() >= deadline) return false;
233
+ sleepSync(250);
234
+ }
235
+ }
236
+ }
237
+
238
+ function releaseRepairLock() {
239
+ try { rmSync(LOCK_DIR, { recursive: true, force: true }); } catch { /* best effort */ }
240
+ }
241
+
242
+ function reportMissing() {
243
+ console.error('[jaw:native] ❌ dependencies are not installed (cannot resolve better-sqlite3).');
244
+ console.error(`[jaw:native] install root: ${root}`);
245
+ console.error('[jaw:native] run: npm install');
246
+ }
247
+
248
+ module.exports = {
249
+ classifyNativeError,
250
+ // Exposed so the lock contract can be exercised for real rather than
251
+ // asserted against source text.
252
+ __testing: {
253
+ lockDir: LOCK_DIR,
254
+ acquire: acquireRepairLock,
255
+ release: releaseRepairLock,
256
+ },
257
+ };
258
+
259
+ // Importable for tests; only the direct-run path performs any repair.
260
+ if (require.main !== module) return;
261
+
262
+ const resolvedBefore = canResolveBetterSqlite3();
263
+ if (!resolvedBefore) {
264
+ reportMissing();
265
+ process.exit(1);
96
266
  }
97
267
 
98
268
  const firstError = loadBetterSqlite3();
99
269
  if (!firstError) process.exit(0);
100
270
 
101
- if (!isRecoverableNativeMismatch(firstError)) {
271
+ const diagnosis = classifyNativeError(firstError, resolvedBefore);
272
+
273
+ if (diagnosis === 'missing') {
274
+ reportMissing();
275
+ process.exit(1);
276
+ }
277
+
278
+ if (diagnosis === 'other') {
102
279
  console.error('[jaw:native] better-sqlite3 load failed with a non-recoverable error.');
280
+ console.error(`[jaw:native] ${runtimeFacts()}`);
103
281
  console.error(firstError);
104
282
  process.exit(1);
105
283
  }
106
284
 
107
- console.warn('[jaw:native] better-sqlite3 load failed rebuilding native module for current Node runtime...');
108
- rebuildBetterSqlite3();
109
-
110
- const secondError = loadBetterSqlite3();
111
- if (secondError) {
112
- console.error('[jaw:native] better-sqlite3 is still not loadable after rebuild.');
113
- console.error(secondError);
285
+ // Serialize repair across processes. Waiting is the normal outcome here, not an
286
+ // error: whoever holds the lock is fixing the very thing this process needs.
287
+ const locked = acquireRepairLock(5 * 60 * 1000);
288
+ if (!locked) {
289
+ console.error('[jaw:native] another process is repairing native modules and did not finish in time.');
290
+ console.error(`[jaw:native] if no such process is running, remove: ${LOCK_DIR}`);
114
291
  process.exit(1);
115
292
  }
116
293
 
117
- console.log('[jaw:native] better-sqlite3 is ready for this Node runtime.');
294
+ // process.exit() skips finally blocks, and a crash skips them too; the stale
295
+ // reclaim above is the backstop, but releasing on exit keeps the common case clean.
296
+ process.on('exit', releaseRepairLock);
297
+
298
+ try {
299
+ // Re-check under the lock: the process we waited for may already have fixed it.
300
+ if (!loadBetterSqlite3()) {
301
+ console.log('[jaw:native] better-sqlite3 was repaired by another process.');
302
+ releaseRepairLock();
303
+ process.exit(0);
304
+ }
305
+
306
+ console.warn('[jaw:native] better-sqlite3 load failed — rebuilding native module for current Node runtime...');
307
+ rebuildBetterSqlite3();
308
+
309
+ const secondError = loadBetterSqlite3();
310
+ if (secondError) {
311
+ console.error('[jaw:native] better-sqlite3 is still not loadable after rebuild.');
312
+ console.error(`[jaw:native] ${runtimeFacts()}`);
313
+ console.error(secondError);
314
+ releaseRepairLock();
315
+ process.exit(1);
316
+ }
317
+
318
+ console.log('[jaw:native] better-sqlite3 is ready for this Node runtime.');
319
+ } finally {
320
+ releaseRepairLock();
321
+ }
@@ -428,6 +428,35 @@ const GATES = {
428
428
  return { ok: true, detail: 'packaged sidecar keeps every runtime dependency' };
429
429
  },
430
430
  },
431
+ 'native-load': {
432
+ description: 'shipped native addons actually dlopen, and spawn-helper stays executable',
433
+ check() {
434
+ const r = run('node', ['scripts/check-native-load.cjs'], { timeout: 60_000 });
435
+ // Exit 3 means nothing was probed. Reporting that as a pass with a
436
+ // substantive detail would be a lie of exactly the kind this gate
437
+ // exists to catch, so say what actually happened.
438
+ if (r.status === 3) {
439
+ return { ok: true, detail: 'SKIPPED — electron/node_modules absent, nothing probed' };
440
+ }
441
+ if (r.status !== 0) {
442
+ return { ok: false, detail: (r.stdout || r.stderr || '').trim().slice(-800) };
443
+ }
444
+ return { ok: true, detail: 'node-pty loads under this runtime' };
445
+ },
446
+ },
447
+ 'sidecar-smoke': {
448
+ description: 'critical sidecar modules import from the bundled tree, not just resolve statically',
449
+ check() {
450
+ const r = run('node', ['scripts/check-sidecar-smoke.mjs'], { timeout: 120_000 });
451
+ if (r.status === 3) {
452
+ return { ok: true, detail: 'SKIPPED — sidecar not bundled, nothing imported' };
453
+ }
454
+ if (r.status !== 0) {
455
+ return { ok: false, detail: (r.stdout || r.stderr || '').trim().slice(-800) };
456
+ }
457
+ return { ok: true, detail: 'bundled sidecar imports its critical entry surfaces' };
458
+ },
459
+ },
431
460
  'gate-docs': {
432
461
  description: 'structure/INDEX.md documents exactly the gates that exist, and each is npm-addressable',
433
462
  check() {
@@ -1 +0,0 @@
1
- import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-gFMgZ0TQ.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-LF7vVVfG.js";import{i as c,s as l}from"./fields-zkeByFQW.js";import{a as u,n as d,o as f}from"./Permissions-CnKt44dN.js";import{a as p,i as m,n as h,o as g,r as _,s as v,t as y}from"./agent-meta-C8DqYXM6.js";import{t as b}from"./path-utils-LsJeDCKF.js";var x=e(t(),1),S=n();function C({cli:e,cliOptions:t,provider:n=``,providerOptions:r=[],model:a,modelOptions:o,effort:s,effortOptions:u,workingDir:d,workingDirError:f,cliMeta:m,onCliChange:g,onProviderChange:_,onModelChange:v,onEffortChange:b,onWorkingDirChange:x}){let C=p(t),w=C.filter(e=>y.includes(e)).length;return(0,S.jsx)(i,{title:`Agent runtime`,hint:`Active CLI, model, effort, and workspace used by this instance.`,children:(0,S.jsxs)(`div`,{className:`settings-agent-runtime-grid`,children:[(0,S.jsx)(c,{id:`agent-cli`,label:`Active CLI`,value:e,options:C.map(e=>({value:e,label:h(e,m).label||e})),collapsedAfter:w,onChange:g}),r.length>0?(0,S.jsx)(c,{id:`agent-${e}-provider`,label:`Provider`,value:n,options:r.map(e=>({value:e,label:e})),onChange:e=>_?.(e)}):null,(0,S.jsx)(c,{id:`agent-model`,label:`Active model`,value:a,options:o.length>0?o:[{value:``,label:`(default)`}],onChange:v}),(0,S.jsx)(c,{id:`agent-effort`,label:`Effort`,value:s,options:[{value:``,label:`(default)`},...u.map(e=>({value:e,label:e}))],disabled:u.length===0,onChange:b}),(0,S.jsx)(l,{id:`agent-workingDir`,label:`Working directory`,value:d,error:f,placeholder:`/path/to/project`,onChange:x})]})})}var w=[{value:`auto`,label:`Auto`},{value:`custom`,label:`Custom allowlist`}];function ee({value:e,onChange:t}){let n=u(e),r=n.mode===`custom`?`custom`:`auto`,a=n.mode===`custom`?n.tokens:[],o=n.mode===`custom`?`${a.length} explicit token${a.length===1?``:`s`}`:`Runtime resolves allowed capabilities`;return(0,S.jsxs)(i,{title:`Permissions`,hint:`Quick runtime mode. Open Permissions for detailed allowlist editing.`,children:[(0,S.jsx)(c,{id:`agent-permissions-mode`,label:`Mode`,value:r,options:w,onChange:e=>{t(e===`auto`?`auto`:a.length>0&&d(a)?a:f(null))}}),(0,S.jsx)(`p`,{className:`settings-agent-note`,children:o})]})}function te({activeCli:e,flushCli:t,flushModel:n,cliOptions:r,modelOptions:a,cliMeta:o,loading:s,error:l,onFlushCliChange:u,onFlushModelChange:d}){let f=t||e,p=f?h(f,o).label||f:`active`;return(0,S.jsx)(i,{title:`Flush Agent`,hint:`Separate summary agent used for context flush and compact work.`,children:(0,S.jsxs)(`details`,{className:`settings-agent-flush`,children:[(0,S.jsxs)(`summary`,{children:[(0,S.jsx)(`span`,{children:`Flush runtime`}),(0,S.jsxs)(`code`,{children:[p,n&&n!==`default`?` / ${n}`:``]})]}),s?(0,S.jsx)(`p`,{className:`settings-agent-note`,children:`Loading flush settings...`}):null,l?(0,S.jsx)(`p`,{className:`settings-field-error`,role:`alert`,children:l}):null,(0,S.jsxs)(`div`,{className:`settings-agent-runtime-grid`,children:[(0,S.jsx)(c,{id:`agent-flush-cli`,label:`Flush CLI`,value:t,options:[{value:``,label:`(active CLI)`},...r.map(e=>({value:e,label:h(e,o).label||e}))],onChange:u}),(0,S.jsx)(c,{id:`agent-flush-model`,label:`Flush model`,value:n,options:[{value:``,label:`(default)`},...a],onChange:d})]})]})})}function T(e){return e.source===`static`||e.id.startsWith(`static:`)}function E(){return`new:${Date.now().toString(36)}:${Math.random().toString(36).slice(2,8)}`}function D(e,t){let n=e[0]||`claude`,r=t?.[n]?.models?.[0]||`default`;return{id:E(),name:`New Agent`,cli:n,model:r,role:``,status:`idle`,source:`db`}}function ne(e){return Array.isArray(e)?e.map(O).filter(Boolean):e.data.map(O).filter(Boolean)}function O(e){if(!e||typeof e!=`object`)return null;let t=e,n=typeof t.id==`string`?t.id:``,r=typeof t.name==`string`?t.name:``;if(!n||!r)return null;let i=t.source===`static`||n.startsWith(`static:`)?`static`:`db`,a={id:n,name:r,cli:typeof t.cli==`string`&&t.cli?t.cli:`claude`,model:typeof t.model==`string`&&t.model?t.model:`default`,role:typeof t.role==`string`?t.role:``,source:i};return typeof t.status==`string`&&(a.status=t.status),a}function k(e){return e.name.trim()?e.cli.trim()?e.model.trim()?null:`Model is required`:`CLI is required`:`Name is required`}function A(e){return e.some(e=>k(e)!==null)}function re(e,t){return JSON.stringify(e.map(I))===JSON.stringify(t.map(I))}function j(e,t){let n=new Map(e.map(e=>[e.id,e])),r=new Set(t.map(e=>e.id)),i=[],a=[],o=[];for(let e of t){let t=n.get(e.id);if(!t||e.id.startsWith(`new:`)){i.push(e);continue}let r=P(t,e);Object.keys(r).length>0&&a.push({before:t,after:e,patch:r})}for(let t of e)!r.has(t.id)&&!T(t)&&o.push(t);return{added:i,updated:a,removed:o}}function M(e,t){let n=j(e,t);return{added:n.added.length,updated:n.updated.length,removed:n.removed.length}}async function N(e,t,n){let r=j(t,n);for(let t of r.removed)await e.delete(`/api/employees/${encodeURIComponent(t.id)}`);for(let t of r.added)await e.post(`/api/employees`,F(t));for(let t of r.updated)await e.put(`/api/employees/${encodeURIComponent(t.after.id)}`,t.patch)}function P(e,t){if(T(t))return e.model===t.model?{}:{model:t.model};let n={};for(let r of[`name`,`cli`,`model`,`role`,`status`])(e[r]||``)!==(t[r]||``)&&(n[r]=t[r]||``);return n}function F(e){return{name:e.name.trim()||`New Agent`,cli:e.cli.trim()||`claude`,model:e.model.trim()||`default`,role:e.role.trim()}}function I(e){let t={id:e.id,name:e.name,cli:e.cli,model:e.model,role:e.role,source:e.source};return e.status!==void 0&&(t.status=e.status),t}function L({employee:e,index:t,cliOptions:n,cliMeta:r,onChange:i,onRemove:a}){let o=T(e),s=m(h(e.cli,r).models,e.model),u=k(e),d=Array.from(new Set([...n,e.cli,`claude`])).filter(Boolean);return(0,S.jsxs)(`fieldset`,{className:`settings-runtime-employee-row`,children:[(0,S.jsxs)(`legend`,{children:[e.name||`Employee ${t+1}`,o?(0,S.jsx)(`span`,{children:`static`}):null]}),(0,S.jsxs)(`div`,{className:`settings-runtime-employee-grid`,children:[(0,S.jsx)(l,{id:`runtime-employee-${e.id}-name`,label:`Name`,value:e.name,disabled:o,error:u===`Name is required`?u:null,onChange:e=>i({name:e})}),(0,S.jsx)(c,{id:`runtime-employee-${e.id}-cli`,label:`CLI`,value:e.cli,disabled:o,options:d.map(e=>({value:e,label:h(e,r).label||e})),onChange:e=>{i({cli:e,model:h(e,r).models[0]||`default`})}}),(0,S.jsx)(c,{id:`runtime-employee-${e.id}-model`,label:`Model`,value:e.model,options:s.length>0?s:[{value:`default`,label:`default`}],onChange:e=>i({model:e})}),(0,S.jsx)(l,{id:`runtime-employee-${e.id}-role`,label:`Role`,value:e.role,disabled:o,onChange:e=>i({role:e})})]}),(0,S.jsxs)(`div`,{className:`settings-runtime-employee-footer`,children:[(0,S.jsxs)(`span`,{children:[e.source,e.status?` / ${e.status}`:``]}),(0,S.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,disabled:o,onClick:a,"aria-label":`Remove employee ${e.name||t+1}`,children:`Remove`})]})]})}function ie({roster:e,original:t,cliOptions:n,cliMeta:r,loading:a,error:o,onRosterChange:s}){let c=M(t,e),l=A(e);function u(t,n){s(e.map((e,r)=>r===t?{...e,...n}:e))}function d(t){s(e.filter((e,n)=>n!==t))}return(0,S.jsxs)(i,{title:`Employees`,hint:`Runtime dispatch roster. Static employees keep their locked identity; database employees can be edited.`,children:[(0,S.jsxs)(`div`,{className:`settings-runtime-employee-summary`,children:[(0,S.jsxs)(`span`,{children:[`+`,c.added]}),(0,S.jsxs)(`span`,{children:[`~`,c.updated]}),(0,S.jsxs)(`span`,{children:[`-`,c.removed]}),l?(0,S.jsx)(`strong`,{children:`Fix invalid rows before saving.`}):null]}),a?(0,S.jsx)(`p`,{className:`settings-agent-note`,children:`Loading employees...`}):null,o?(0,S.jsx)(`p`,{className:`settings-field-error`,role:`alert`,children:o}):null,e.length===0?(0,S.jsx)(`p`,{className:`settings-empty`,children:`No runtime employees configured.`}):(0,S.jsx)(`div`,{className:`settings-runtime-employee-list`,children:e.map((e,t)=>(0,S.jsx)(L,{employee:e,index:t,cliOptions:n,cliMeta:r??null,onChange:e=>u(t,e),onRemove:()=>d(t)},e.id))}),(0,S.jsx)(`div`,{className:`settings-employee-footer-bar`,children:(0,S.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,onClick:()=>s([...e,D(n,r)]),children:`+ Add employee`})})]})}var R=new Set([`runtimeEmployees`,`flushCli`,`flushModel`]);function z(e){let t={},n=null,r=null;for(let[i,a]of Object.entries(e))i===`runtimeEmployees`?r=a:i===`flushCli`||i===`flushModel`?(n??={},n[i===`flushCli`?`cli`:`model`]=String(a??``)):R.has(i)||(t[i]=a);return{settingsBundle:t,flushPatch:n,runtimeEmployeesNext:r}}async function ae(e){let{client:t,bundle:n,employeeDraft:r,employeeOriginal:i}=e;if(A(r))throw Error(`runtime employees: fix invalid rows before saving`);let{settingsBundle:a,flushPatch:o,runtimeEmployeesNext:s}=z(n),c=null;try{if(Object.keys(a).length>0){let e=await t.put(`/api/settings`,b(a));c=e&&typeof e==`object`&&`data`in e?e.data:e}}catch(e){throw Error(`settings save failed: ${e instanceof Error?e.message:String(e)}`)}try{o&&await t.put(`/api/memory-files/settings`,o)}catch(e){throw Error(`flush settings save failed: ${e instanceof Error?e.message:String(e)}`)}try{s&&await N(t,i,s)}catch(e){throw Error(`runtime employees save failed: ${e instanceof Error?e.message:String(e)}`)}return c}function B({port:e,client:t,dirty:n,registerSave:i}){let{state:c,refresh:l,setData:d}=r(t,`/api/settings`),[f,p]=(0,x.useState)({cli:``,provider:``,model:``,effort:``,workingDir:``,permissions:`auto`}),[y,b]=(0,x.useState)({}),[w,T]=(0,x.useState)({}),[E,D]=(0,x.useState)(!0),[O,k]=(0,x.useState)(null),[j,M]=(0,x.useState)([]),[N,P]=(0,x.useState)([]),[F,I]=(0,x.useState)(!0),[L,R]=(0,x.useState)(null),[z,B]=(0,x.useState)(null),V=(0,x.useCallback)(async()=>{try{let e=await t.get(`/api/cli-registry`);B(_(e&&typeof e==`object`&&`data`in e?e.data:e))}catch{B(null)}},[t]),H=(0,x.useCallback)(async()=>{D(!0),k(null);try{let e=await t.get(`/api/memory-files`),n={cli:e.cli||``,model:e.model||``};b(n),T(n)}catch(e){k(e instanceof Error?e.message:String(e))}finally{D(!1)}},[t]),U=(0,x.useCallback)(async()=>{I(!0),R(null);try{let e=ne(await t.get(`/api/employees`));M(e),P(e)}catch(e){R(e instanceof Error?e.message:String(e))}finally{I(!1)}},[t]);(0,x.useEffect)(()=>{V(),H(),U()},[V,U,H]),(0,x.useEffect)(()=>{if(c.kind!==`ready`)return;let e=Object.keys(c.data.perCli||{}),t=c.data.cli||e[0]||``,n=u(c.data.permissions),r=h(t,z);p({cli:t,provider:c.data.perCli?.[t]?.provider||r.defaultProvider||``,model:v(t,c.data.perCli,c.data.activeOverrides),effort:g(t,c.data.perCli,c.data.activeOverrides),workingDir:c.data.workingDir||``,permissions:n.mode===`custom`?n.tokens:`auto`})},[z,c]),(0,x.useEffect)(()=>()=>{for(let e of Array.from(n.pending.keys()))(e===`cli`||e===`workingDir`||e===`permissions`||e===`runtimeEmployees`||e===`flushCli`||e===`flushModel`||e.startsWith(`activeOverrides.`))&&n.remove(e)},[n]);let W=(0,x.useCallback)((e,t)=>n.set(e,t),[n]),G=(0,x.useCallback)(async()=>{let e=n.saveBundle();if(Object.keys(e).length===0)return;let r=await ae({client:t,bundle:e,employeeDraft:N,employeeOriginal:j});n.clear(),r&&d(r),await l(),await V(),await H(),await U()},[t,n,N,j,V,U,H,l,d]);(0,x.useEffect)(()=>{if(i)return i(G),()=>i(null)},[i,G]);let K=c.kind===`ready`?c.data:{},q=K.perCli||{},J=K.activeOverrides||{},Y=(0,x.useMemo)(()=>Object.keys(q),[q]),X=h(f.cli,z),Z=f.provider||X.defaultProvider||X.providers?.[0]||``,Q=f.cli===`pi`,oe=!Q&&(X.providers?.length??0)>0,se=m(oe&&X.modelsByProvider?.[Z]||X.models,f.model),ce=oe&&X.effortsByProvider?.[Z]||X.efforts,le=f.workingDir.trim()?null:`Required`;if(c.kind===`loading`)return(0,S.jsx)(a,{});if(c.kind===`offline`)return(0,S.jsx)(o,{port:e});if(c.kind===`error`)return(0,S.jsx)(s,{message:c.message});function ue(){for(let e of Array.from(n.pending.keys()))e.startsWith(`activeOverrides.`)&&n.remove(e)}function $(e){p(e)}return(0,S.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),G()},children:[(0,S.jsx)(C,{cli:f.cli,cliOptions:Y.length>0?Y:[f.cli||`claude`],provider:Z,providerOptions:Q?[]:X.providers||[],model:f.model,modelOptions:se,effort:f.effort,effortOptions:ce,workingDir:f.workingDir,workingDirError:le,cliMeta:z,onCliChange:e=>{let t=h(e,z),n={...f,cli:e,provider:q[e]?.provider||t.defaultProvider||``,model:v(e,q,J),effort:g(e,q,J)};ue(),$(n),W(`cli`,{value:e,original:K.cli||``,valid:!0})},onProviderChange:e=>{let t=X.modelsByProvider?.[e]||[],n=X.effortsByProvider?.[e]||[],r=t.includes(f.model)?f.model:t[0]||``,i=n.includes(f.effort)?f.effort:``;$({...f,provider:e,model:r,effort:i}),W(`perCli.${f.cli}.provider`,{value:e,original:q[f.cli]?.provider||X.defaultProvider||``,valid:!0}),W(`activeOverrides.${f.cli}.model`,{value:r,original:v(f.cli,q,J),valid:r.trim().length>0}),W(`activeOverrides.${f.cli}.effort`,{value:i,original:g(f.cli,q,J),valid:!0})},onModelChange:e=>{$({...f,model:e}),W(`activeOverrides.${f.cli}.model`,{value:e,original:v(f.cli,q,J),valid:e.trim().length>0})},onEffortChange:e=>{$({...f,effort:e}),W(`activeOverrides.${f.cli}.effort`,{value:e,original:g(f.cli,q,J),valid:!0})},onWorkingDirChange:e=>{$({...f,workingDir:e}),W(`workingDir`,{value:e,original:K.workingDir||``,valid:e.trim().length>0})}}),(0,S.jsx)(ee,{value:f.permissions,onChange:e=>{$({...f,permissions:e}),W(`permissions`,{value:e,original:K.permissions??`auto`,valid:e===`auto`||e.length>0})}}),(0,S.jsx)(te,{activeCli:f.cli,flushCli:w.cli||``,flushModel:w.model||``,cliOptions:Y,cliMeta:z,modelOptions:m(h(w.cli||f.cli,z).models,w.model||``),loading:E,error:O,onFlushCliChange:e=>{let t=e&&h(e,z).models[0]||``;T({cli:e,model:t}),W(`flushCli`,{value:e,original:y.cli||``,valid:!0}),W(`flushModel`,{value:t,original:y.model||``,valid:!0})},onFlushModelChange:e=>{T({...w,model:e}),W(`flushModel`,{value:e,original:y.model||``,valid:!0})}}),(0,S.jsx)(ie,{roster:N,original:j,cliOptions:Y,cliMeta:z,loading:F,error:L,onRosterChange:e=>{if(P(e),re(e,j)){n.remove(`runtimeEmployees`);return}n.set(`runtimeEmployees`,{value:e,original:j,valid:!A(e)})}})]})}export{B as default,z as splitAgentSaveBundle};
@@ -1,3 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/vendor-render-Bjnw0wQ6.css"])))=>i.map(i=>d[i]);
2
- import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{t}from"./preload-helper-DFYRRz9w.js";import{a as n,i as r,n as i,r as a,t as o}from"./esm-CT1xxdH5.js";import{n as s,t as c}from"./jsx-runtime-gFMgZ0TQ.js";import{t as l}from"./react-dom-AWKMTIe7.js";import{t as u}from"./desktop-bridge-CvdhnJQo.js";var d=e(s(),1),f=l();function p(e){let t=typeof window<`u`?window.location.origin:``,n=typeof window<`u`?window.location.port:``,r=t&&n===String(e)?t:`http://127.0.0.1:${e}`;async function i(e,t,n){let i={method:e};n&&(i.headers={"Content-Type":`application/json`},i.body=JSON.stringify(n));let a=await(await fetch(`${r}${t}`,i)).json();if(!a.ok)throw Error(a.error||`${e} ${t} failed`);return a}return{async listSessions(){return(await i(`GET`,`/api/code/sessions`)).sessions},async listStoredSessions(e={}){let t=e.scope??`all`,n=new URLSearchParams({scope:t});return t===`cwd`&&e.cwd&&n.set(`cwd`,e.cwd),(await i(`GET`,`/api/code/sessions/stored${`?${n.toString()}`}`)).sessions},async listModelOptions(){return i(`GET`,`/api/code/models`)},async setDefaultModel(e){return i(`POST`,`/api/code/model-default`,{modelId:e})},async listModelAssignments(){return i(`GET`,`/api/code/model-assignments`)},async setModelAssignment(e,t){let n=typeof t==`string`?{modelId:t}:t;return i(`PUT`,`/api/code/model-assignments/${encodeURIComponent(e)}`,n)},async clearModelAssignment(e){return i(`DELETE`,`/api/code/model-assignments/${encodeURIComponent(e)}`)},async listModelPresets(){return i(`GET`,`/api/code/model-presets`)},async getGitInfo(e){return await i(`GET`,`/api/code/git-info?cwd=${encodeURIComponent(e)}`)},async loadSession(e,t){return(await i(`POST`,`/api/code/sessions/load`,{sessionId:e,cwd:t})).session},async createSession(e,t){return(await i(`POST`,`/api/code/sessions`,{cwd:e,...t?{model:t}:{}})).session},async sendPrompt(e,t){return i(`POST`,`/api/code/sessions/${e}/prompt`,{text:t})},async cancelPrompt(e){await i(`POST`,`/api/code/sessions/${e}/cancel`)},async closeSession(e){await i(`DELETE`,`/api/code/sessions/${e}`)},async answerPermission(e,t){await i(`POST`,`/api/code/permissions/${e}`,{optionId:t})},async setSessionConfig(e,t,n){await i(`POST`,`/api/code/sessions/${e}/config`,{configId:t,valueId:n})},async extMethod(e,t,n){return(await i(`POST`,`/api/code/sessions/${e}/ext`,{method:t,params:n})).result},async forkSession(e,t){return(await i(`POST`,`/api/code/sessions/${e}/fork`,{cwd:t})).session},async setSessionModel(e,t){await i(`POST`,`/api/code/sessions/${e}/model`,{modelId:t})},pickWorkspace(){return i(`POST`,`/api/code/workspace/pick`)}}}var m=c();function h({client:e,activeSessionId:t,workingDir:n,onSelectSession:r,onLoadSession:i,onNewSession:a}){let[o,s]=(0,d.useState)([]),[c,l]=(0,d.useState)([]),[u,f]=(0,d.useState)(!0),[p,h]=(0,d.useState)(``),[g,_]=(0,d.useState)(``),[v,y]=(0,d.useState)(`all`),b=(0,d.useCallback)(async()=>{f(!0),h(``);let t=e=>e instanceof Error?e.message:String(e),r=v===`cwd`?{scope:`cwd`,cwd:n}:{scope:`all`},[i,a]=await Promise.allSettled([e.listSessions(),e.listStoredSessions(r)]),o=[];if(i.status===`fulfilled`){let e=i.value;s(e.filter(e=>e.status!==`closed`));let n=new Set(e.map(e=>e.sessionId));a.status===`fulfilled`?l(a.value.filter(e=>!n.has(e.sessionId))):(l([]),o.push(`History: ${t(a.reason)}`))}else s([]),o.push(`Live: ${t(i.reason)}`),a.status===`fulfilled`?l(a.value):(l([]),o.push(`History: ${t(a.reason)}`));o.length>0&&h(o.join(` · `)),f(!1)},[e,v,n]);(0,d.useEffect)(()=>{b()},[b]);let x=e=>e.split(`/`).pop()||e,S=e=>{let t=e.replayEvents?.find(e=>e.event===`code_user_message_chunk`)?.update??{},n=t.content;return String(n?.text??t.text??``).split(/\r?\n/)[0]?.replace(/\s+/g,` `).trim()||``},C=e=>e.title?.trim()||S(e)||x(e.cwd)||e.sessionId.slice(0,12)||`Untitled session`,w=e=>x(e.cwd),ee=e=>[e.sessionId,e.title??``,S(e),e.cwd].join(` `).toLowerCase(),T=e=>e.title?.trim()||e.firstMessage?.replace(/\s+/g,` `).trim()||e.sessionId.slice(0,12)||`Untitled session`,E=e=>{if(typeof e.lastModified==`number`)return e.lastModified;if(e.updatedAt){let t=Date.parse(e.updatedAt);if(Number.isFinite(t))return t}return 0},D=e=>{let t=[x(e.cwd)];return e.messageCount!==void 0&&t.push(`${e.messageCount} messages`),t.filter(Boolean).join(` · `)},O=e=>[e.sessionId,e.title??``,e.firstMessage??``,e.cwd].join(` `).toLowerCase(),k=c.filter(e=>!g||O(e).includes(g.toLowerCase())).sort((e,t)=>E(t)-E(e)).slice(0,20),A=k.reduce((e,t)=>{let n=e.find(e=>e.cwd===t.cwd);return n?n.sessions.push(t):e.push({cwd:t.cwd,sessions:[t]}),e},[]),j=p?`Session data could not fully load.`:v===`cwd`?`No sessions for this cwd. Switch to All to browse global history.`:`No JWC sessions found.`;return(0,m.jsxs)(`div`,{className:`code-session-list`,children:[(0,m.jsxs)(`div`,{className:`code-session-list-header`,children:[(0,m.jsx)(`span`,{className:`code-session-list-title`,children:`Sessions`}),(0,m.jsx)(`button`,{type:`button`,className:`code-session-new-btn`,onClick:a,"aria-label":`New code session`,children:`+`})]}),(0,m.jsxs)(`div`,{className:`code-session-view-toggle`,"aria-label":`Session view`,children:[(0,m.jsx)(`button`,{type:`button`,className:`code-session-view-btn${v===`all`?` active`:``}`,onClick:()=>y(`all`),children:`All`}),(0,m.jsx)(`button`,{type:`button`,className:`code-session-view-btn${v===`cwd`?` active`:``}`,onClick:()=>y(`cwd`),children:`This cwd`}),(0,m.jsx)(`button`,{type:`button`,className:`code-session-view-btn${v===`grouped`?` active`:``}`,onClick:()=>y(`grouped`),children:`Group`})]}),v===`cwd`&&(0,m.jsx)(`div`,{className:`code-session-view-hint`,children:x(n)}),p&&(0,m.jsx)(`div`,{className:`code-session-list-error`,role:`status`,children:p}),o.length+c.length>3&&(0,m.jsx)(`input`,{className:`code-session-search`,type:`text`,value:g,onChange:e=>_(e.target.value),placeholder:`Search sessions...`}),u?(0,m.jsx)(`div`,{className:`code-session-list-loading`,children:`Loading...`}):(0,m.jsxs)(m.Fragment,{children:[o.length>0&&(0,m.jsx)(`ul`,{className:`code-session-list-items`,children:o.filter(e=>!g||ee(e).includes(g.toLowerCase())).map(e=>(0,m.jsx)(`li`,{children:(0,m.jsxs)(`button`,{type:`button`,className:`code-session-item ${e.sessionId===t?`active`:``}`,onClick:()=>r(e),children:[(0,m.jsx)(`span`,{className:`code-session-cwd`,children:C(e)}),(0,m.jsx)(`span`,{className:`code-session-meta`,children:w(e)}),(0,m.jsx)(`span`,{className:`code-session-status code-session-status-${e.status}`,children:e.status})]})},e.sessionId))}),k.length>0&&v!==`grouped`&&(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(`div`,{className:`code-session-list-divider`,children:`History`}),(0,m.jsx)(`ul`,{className:`code-session-list-items`,children:k.map(e=>(0,m.jsx)(`li`,{children:(0,m.jsxs)(`button`,{type:`button`,className:`code-session-item`,onClick:()=>i(e.sessionId,e.cwd),children:[(0,m.jsx)(`span`,{className:`code-session-cwd`,children:T(e)}),(0,m.jsx)(`span`,{className:`code-session-meta`,children:D(e)}),(0,m.jsx)(`span`,{className:`code-session-status`,children:`stored`})]})},e.sessionId))})]}),k.length>0&&v===`grouped`&&(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(`div`,{className:`code-session-list-divider`,children:`History by cwd`}),A.map(e=>(0,m.jsxs)(`section`,{className:`code-session-group`,children:[(0,m.jsxs)(`div`,{className:`code-session-group-title`,title:e.cwd,children:[x(e.cwd),` `,(0,m.jsx)(`span`,{children:e.sessions.length})]}),(0,m.jsx)(`ul`,{className:`code-session-list-items`,children:e.sessions.map(e=>(0,m.jsx)(`li`,{children:(0,m.jsxs)(`button`,{type:`button`,className:`code-session-item`,onClick:()=>i(e.sessionId,e.cwd),children:[(0,m.jsx)(`span`,{className:`code-session-cwd`,children:T(e)}),(0,m.jsx)(`span`,{className:`code-session-meta`,children:D(e)}),(0,m.jsx)(`span`,{className:`code-session-status`,children:`stored`})]})},e.sessionId))})]},e.cwd))]}),o.length===0&&k.length===0&&(0,m.jsx)(`div`,{className:`code-session-list-empty`,children:j})]})]})}function g(e,t){for(let n=e.length-1;n>=0;n--){let r=e[n];if(r?.role===`tool`&&r.toolCallId===t)return n}return-1}function _(e,t){return e?`${e}/${t}`:t}var v=[`allow_once`,`allow_always`,`reject_once`,`reject_always`],y={allow_once:`Allow once`,allow_always:`Always allow`,reject_once:`Deny once`,reject_always:`Always deny`},b={allow_once:`allow-once`,allow_always:`allow-always`,reject_once:`deny-once`,reject_always:`deny-always`},x=[{value:`always-allow`,label:`Always allow`,detail:`Auto-allow gated tools`,tone:`allow`},{value:`ask`,label:`Ask first`,detail:`Review each gated tool`,tone:`ask`},{value:`always-deny`,label:`Always deny`,detail:`Auto-deny gated tools`,tone:`deny`}],S={ask:`Review each gated tool`,"always-allow":`Auto-allow gated tools`,"always-deny":`Auto-deny gated tools`},C={allow_once:/^(allow[_\s-]?once|allow once)$/i,allow_always:/^(allow[_\s-]?always|always allow|always approve)$/i,reject_once:/^(reject[_\s-]?once|deny[_\s-]?once|reject|deny)$/i,reject_always:/^(reject[_\s-]?always|deny[_\s-]?always|always reject|always deny)$/i};function w(e){return[e.kind,e.optionId,e.id,e.name,e.label].map(e=>String(e??``)).join(` `).trim()}function ee(e){let t=e.optionId??e.id;return t==null||t===``?null:String(t)}function T(e,t){let n=e.name??e.label;return n==null||n===``?y[t]:String(n)}function E(e,t){let n=e.find(e=>e.kind===t),r=e.find(e=>e.optionId===t||e.id===t),i=e.find(e=>C[t].test(w(e))),a=n??r??i;if(!a)return null;let o=ee(a);return o?{kind:t,optionId:o,label:T(a,t),raw:a}:null}function D(e){return String(e.toolName??e.title??e.name??`tool`)}function O(e,t){let n={permissionId:e.permissionId,toolName:D(e.toolCall),...t};return{role:`permission`,text:n.error??n.optionLabel??n.decision,permissionAudit:n}}function k(e){if(typeof e==`string`)return e;try{return JSON.stringify(e,null,2)}catch{return String(e)}}function A(e){if(!Array.isArray(e))return null;let t=[];for(let n of e){if(typeof n==`string`){n&&t.push(n);continue}if(!n||typeof n!=`object`||Array.isArray(n))continue;let e=n,r=typeof e.type==`string`?e.type.toLowerCase():``,i=e.text;(!r||r===`text`)&&typeof i==`string`&&i&&t.push(i)}return t.length>0?t.join(`
3
- `):null}function j(e){if(typeof e==`string`)return e;if(!e||typeof e!=`object`||Array.isArray(e))return null;let t=e,n=A(t.content);if(n)return n;let r=t.details;if(r&&typeof r==`object`&&!Array.isArray(r)){let e=r.displayContent;if(e&&typeof e==`object`&&!Array.isArray(e)){let t=e.text;if(typeof t==`string`&&t)return t}}return null}function te(e){return j(e)??k(e)}function M(e){if(typeof e==`string`)return{type:`text`,text:e};if(!e||typeof e!=`object`||Array.isArray(e))return null;let t=e,n=typeof t.type==`string`?t.type.toLowerCase():``,r=typeof t.label==`string`?t.label:void 0;if(n===`diff`&&typeof t.diff==`string`)return{type:`diff`,diff:t.diff,...r?{label:r}:{}};if(n===`error`)return{type:`error`,text:k(t.text??t.error??t.message??t),...r?{label:r}:{}};if(n===`args`||n===`arguments`||n===`input`)return{type:`args`,json:t.json??t.args??t.arguments??t.input??t,...r?{label:r}:{}};if(n===`output`)return{type:`output`,text:te(t.text??t.output??t),...r?{label:r}:{}};if(n===`json`)return{type:`json`,json:t.json??t.value??t,...r?{label:r}:{}};if(typeof t.diff==`string`)return{type:`diff`,diff:t.diff,...r?{label:r}:{}};if(typeof t.text==`string`)return{type:`text`,text:t.text,...r?{label:r}:{}};let i=j(t);return i?{type:`text`,text:i,...r?{label:r}:{}}:{type:`json`,json:t,...r?{label:r}:{}}}function N(e,t,n,r){r==null||r===``||(t===`args`||t===`json`?e.push({type:t,label:n,json:r}):e.push({type:t,label:n,text:t===`output`?te(r):k(r)}))}function P(e){let t=[],n=e.content;if(Array.isArray(n))for(let e of n){let n=M(e);n&&t.push(n)}else{let e=M(n);e&&t.push(e)}return N(t,`args`,`Args`,e.args??e.arguments??e.input??e.rawInput),N(t,`output`,`Output`,e.rawOutput??e.output),N(t,`error`,`Error`,e.error??e.errorMessage??e.reason),t}var F={settings:{category:`settings`,popupKind:`settings`},theme:{category:`settings`,popupKind:`settings`},identity:{category:`settings`,popupKind:`settings`},"identity-auto":{category:`settings`,popupKind:`settings`},model:{category:`model`,popupKind:`model`},provider:{category:`provider`,popupKind:`provider`},login:{category:`provider`,popupKind:`provider`}},I={session:`session`,orchestrate:`workflow`,pabcd:`workflow`,goal:`workflow`,mcp:`utility`,move:`utility`,compact:`utility`,dump:`utility`,help:`utility`};function L(e){return e.trim().replace(/^\/+/,``)}function ne(e,t){let n=typeof e.source==`string`?e.source:``,r=typeof e.path==`string`?e.path:``;return n.includes(`skill`)||t.includes(`:`)?`jwc-skill`:n.includes(`custom`)?`jwc-custom`:n.includes(`file`)||r?`jwc-file`:F[t]||I[t]?`jwc-builtin`:`unknown`}function R(e){let t=e.input;if(!t||typeof t!=`object`)return;let n=t.hint;return typeof n==`string`&&n.trim()?n:void 0}function z(e){if(!e||typeof e!=`object`)return null;let t=e,n=L(String(t.name??``));if(!n)return null;let r=F[n],i=r?.category??I[n]??`unknown`,a=ne(t,n),o=t.supported!==!1&&t.disabled!==!0?r?`popup`:i===`unknown`?`pass-through`:`insert`:`unsupported`,s=typeof t.description==`string`&&t.description.trim()?t.description:void 0,c=R(t),l={name:n,displayName:`/${n}`,category:i,actionType:o,source:a,raw:t};return s&&(l.description=s),c&&(l.inputHint=c),r&&(l.popupKind=r.popupKind),o===`unsupported`&&(l.disabledReason=typeof t.disabledReason==`string`&&t.disabledReason.trim()?t.disabledReason:`Unsupported in Code mode`),l}function re(e){let t=Array.isArray(e)?e:[],n=new Set,r=[];for(let e of t){let t=z(e);!t||n.has(t.name)||(n.add(t.name),r.push(t))}return r}function ie(e){return[e.name,e.displayName,e.description??``,e.inputHint??``,e.category,e.source].join(` `).toLowerCase()}function B(e,t){let n=L(t.split(/\s+/)[0]??``).toLowerCase();if(!n)return e;let r=[],i=[];for(let t of e)t.name.toLowerCase().startsWith(n)?r.push(t):ie(t).includes(n)&&i.push(t);return[...r,...i]}function ae({value:e,disabled:t,onChange:n}){let r=x.find(t=>t.value===e)??x[0];return(0,m.jsxs)(`div`,{className:`code-permission-mode-field`,children:[(0,m.jsxs)(`div`,{className:`code-permission-mode-label`,children:[(0,m.jsx)(`span`,{children:`Permission mode`}),(0,m.jsx)(`strong`,{children:`Default: Always allow`})]}),(0,m.jsx)(`div`,{className:`code-permission-mode-list`,role:`listbox`,"aria-label":`Permission mode`,children:x.map(r=>(0,m.jsxs)(`button`,{type:`button`,role:`option`,"aria-selected":r.value===e,disabled:t,className:`code-permission-mode-option is-${r.tone}${r.value===e?` is-selected`:``}`,title:r.detail,onClick:()=>n(r.value),children:[(0,m.jsxs)(`span`,{children:[(0,m.jsx)(`strong`,{children:r.label}),(0,m.jsx)(`small`,{children:r.detail})]}),r.value===e&&(0,m.jsx)(`em`,{"aria-hidden":`true`,children:`✓`})]},r.value))}),(0,m.jsx)(`p`,{className:`code-permission-mode-note is-${r?.tone??`ask`}`,children:`Automatic modes answer with JWC persistent options and write a transcript audit row.`})]})}function oe(e){return e===`provider`?`Provider`:e===`model`?`Model`:e===`permission`?`Permissions`:e===`session`?`Session`:`Settings`}function V(e){return e===`jwc-cache`?`JWC cache`:`static fallback`}function H({popupKind:e,command:t,modelOptions:n,provider:r,model:i,modelAssignments:a,modelPresets:o,permissionMode:s,disabled:c,activeSessionId:l,error:u,onClose:f,onRefreshProviders:p,onProviderChange:h,onUseModel:g,onUseForNewSessions:_,onSetDefaultModel:v,onSetModelAssignment:y,onClearModelAssignment:b,onPermissionModeChange:x}){let S=(0,d.useRef)(null),C=(0,d.useRef)(null),w=n.providers.find(e=>e.id===r)??n.providers[0],[ee,T]=(0,d.useState)(``),[E,D]=(0,d.useState)(`models`),[O,k]=(0,d.useState)(r),[A,j]=(0,d.useState)(i),[te,M]=(0,d.useState)({}),N=n.providers.find(e=>e.id===O)??w,P=ee.trim().toLowerCase(),F=(0,d.useMemo)(()=>n.providers.filter(e=>P?e.id.toLowerCase().includes(P)||e.models.some(e=>e.toLowerCase().includes(P)):!0),[n.providers,P]),I=(0,d.useMemo)(()=>{let e=N?.models??[];return P?e.filter(e=>e.toLowerCase().includes(P)):e},[N?.models,P]),L=oe(e),ne=(0,d.useMemo)(()=>{let e=n.providers.length;return`${e} authenticated provider${e===1?``:`s`}`},[n.providers.length]),R=!!(l&&O&&A&&!c),z=!!(O&&A&&!c),re=(0,d.useMemo)(()=>[`inherit`,...N?.efforts??[]].map(e=>e===`min`?`minimal`:e).filter((e,t,n)=>e&&n.indexOf(e)===t).map(e=>({value:e,label:e===`inherit`?`inherit`:e===`minimal`?`min`:e})),[N?.efforts]);return(0,d.useEffect)(()=>{S.current?.focus()},[e,t.name]),(0,d.useEffect)(()=>{let e=document.activeElement;return()=>{e?.focus?.()}},[]),(0,d.useEffect)(()=>{e===`model`&&(T(``),k(r),j(i))},[i,e,r]),(0,d.useEffect)(()=>{if(e!==`model`)return;let t=N?.models??[];t.length>0&&!t.includes(A)&&j(t[0]??``)},[A,N?.models,e]),(0,d.useEffect)(()=>{if(e!==`model`||!a)return;let t={};for(let e of a.roles){let n=e.thinkingLevel===`min`?`minimal`:e.thinkingLevel;t[e.role]=n||`inherit`}M(t)},[a,e]),(0,d.useEffect)(()=>{let e=e=>{if(e.key===`Escape`){e.preventDefault(),f();return}if(e.key===`Tab`&&C.current){let t=C.current.querySelectorAll(`a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])`),n=t[0],r=t[t.length-1];if(!n||!r)return;let i=document.activeElement;e.shiftKey&&i===n?(e.preventDefault(),r.focus()):!e.shiftKey&&i===r&&(e.preventDefault(),n.focus())}};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[f]),(0,m.jsx)(`div`,{className:`code-popup-backdrop`,role:`presentation`,onMouseDown:e=>{e.target===e.currentTarget&&f()},children:(0,m.jsxs)(`section`,{ref:C,className:`code-popup`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`code-command-popup-title`,children:[(0,m.jsxs)(`header`,{className:`code-popup-header`,children:[(0,m.jsxs)(`div`,{children:[(0,m.jsx)(`p`,{className:`code-popup-command`,children:t.displayName}),(0,m.jsx)(`h2`,{id:`code-command-popup-title`,children:L})]}),(0,m.jsx)(`button`,{ref:S,type:`button`,className:`code-popup-close`,onClick:f,"aria-label":`Close popup`,children:`x`})]}),e===`provider`&&(0,m.jsxs)(`div`,{className:`code-popup-section`,children:[(0,m.jsxs)(`div`,{className:`code-popup-section-head`,children:[(0,m.jsx)(`span`,{children:ne}),(0,m.jsx)(`button`,{type:`button`,className:`code-popup-secondary`,disabled:c,onClick:p,children:`Refresh`})]}),n.degraded&&(0,m.jsx)(`p`,{className:`code-popup-warning`,children:n.error??`Provider discovery is degraded.`}),u&&(0,m.jsx)(`p`,{className:`code-popup-error`,children:u}),(0,m.jsx)(`div`,{className:`code-provider-list`,role:`list`,children:n.providers.map(e=>(0,m.jsxs)(`button`,{type:`button`,className:`code-provider-row${e.id===r?` is-selected`:``}`,onClick:()=>h(e.id),disabled:c,children:[(0,m.jsx)(`span`,{className:`code-provider-name`,children:e.id}),(0,m.jsxs)(`span`,{className:`code-provider-meta`,children:[e.models.length,` models · `,V(e.modelSource)]})]},e.id))}),(0,m.jsxs)(`div`,{className:`code-popup-placeholder-actions`,children:[(0,m.jsx)(`button`,{type:`button`,disabled:!0,className:`code-popup-secondary`,children:`Add provider`}),(0,m.jsx)(`button`,{type:`button`,disabled:!0,className:`code-popup-secondary`,children:`Login`}),(0,m.jsx)(`span`,{children:`Provider add/login execution is next slice.`})]})]}),(e===`settings`||e===`permission`)&&(0,m.jsxs)(`div`,{className:`code-popup-section`,children:[(0,m.jsx)(ae,{value:s,disabled:!!c,onChange:x}),e===`settings`&&(0,m.jsxs)(`div`,{className:`code-popup-summary`,children:[(0,m.jsx)(`span`,{children:`Provider`}),(0,m.jsx)(`strong`,{children:r||`-`}),(0,m.jsx)(`span`,{children:`Model`}),(0,m.jsx)(`strong`,{children:i||`-`})]})]}),e===`model`&&(0,m.jsxs)(`div`,{className:`code-popup-section`,children:[u&&(0,m.jsx)(`p`,{className:`code-popup-error`,children:u}),(0,m.jsx)(`div`,{className:`code-model-tablist`,role:`tablist`,"aria-label":`Model settings tabs`,children:[`models`,`roles`,`profiles`].map(e=>(0,m.jsx)(`button`,{type:`button`,role:`tab`,id:`code-model-tab-${e}`,"aria-selected":E===e,"aria-controls":`code-model-panel-${e}`,tabIndex:E===e?0:-1,className:`code-model-tab${E===e?` is-active`:``}`,onClick:()=>D(e),onKeyDown:e=>{if(e.key!==`ArrowRight`&&e.key!==`ArrowLeft`)return;e.preventDefault();let t=[`models`,`roles`,`profiles`],n=e.key===`ArrowRight`?1:t.length-1;D(t[(t.indexOf(E)+n)%t.length]??`models`)},children:e===`models`?`Models`:e===`roles`?`Roles`:`Profiles`},e))}),E===`models`&&(0,m.jsxs)(`div`,{className:`code-popup-tabpanel`,role:`tabpanel`,id:`code-model-panel-models`,"aria-labelledby":`code-model-tab-models`,children:[(0,m.jsxs)(`label`,{className:`code-popup-field`,children:[(0,m.jsx)(`span`,{children:`Search models`}),(0,m.jsx)(`input`,{type:`search`,className:`code-model-search`,placeholder:`Search provider or model`,value:ee,onChange:e=>T(e.target.value),disabled:c})]}),n.usageOrder&&n.usageOrder.length>0&&(0,m.jsxs)(`div`,{className:`code-model-mru-strip`,"aria-label":`Recently used models`,children:[(0,m.jsx)(`span`,{children:`Recently used`}),n.usageOrder.slice(0,3).map(e=>(0,m.jsx)(`strong`,{children:e},e))]}),(0,m.jsxs)(`div`,{className:`code-model-layout`,children:[(0,m.jsx)(`div`,{className:`code-model-providers`,role:`list`,"aria-label":`Providers`,children:F.map(e=>(0,m.jsxs)(`button`,{type:`button`,className:`code-model-provider${e.id===O?` is-selected`:``}`,onClick:()=>{k(e.id),j(e.models[0]??``)},disabled:c,children:[(0,m.jsx)(`span`,{children:e.id}),(0,m.jsx)(`small`,{children:e.models.length})]},e.id))}),(0,m.jsxs)(`div`,{className:`code-model-list`,role:`list`,"aria-label":`Models`,children:[(0,m.jsxs)(`div`,{className:`code-model-list-head`,children:[(0,m.jsx)(`strong`,{children:N?.id??`No provider`}),(0,m.jsxs)(`span`,{children:[I.length,` models · `,V(N?.modelSource)]})]}),I.length===0?(0,m.jsx)(`p`,{className:`code-popup-note`,children:`No models match this search.`}):I.map(e=>{let t=O===r&&e===i,n=e===A;return(0,m.jsxs)(`button`,{type:`button`,className:`code-model-row${t?` is-active`:``}${n?` is-draft`:``}`,onClick:()=>j(e),disabled:c,children:[(0,m.jsx)(`span`,{children:e}),(0,m.jsx)(`small`,{children:t?`Active`:n?`Selected`:`Available`})]},e)})]})]}),(0,m.jsxs)(`div`,{className:`code-popup-action-row`,children:[(0,m.jsxs)(`div`,{className:`code-popup-summary code-popup-summary-compact`,children:[(0,m.jsx)(`span`,{children:`Active`}),(0,m.jsxs)(`strong`,{children:[r||`-`,` / `,i||`-`]}),(0,m.jsx)(`span`,{children:`Selected`}),(0,m.jsxs)(`strong`,{children:[O||`-`,` / `,A||`-`]}),(0,m.jsx)(`span`,{children:`Default`}),(0,m.jsxs)(`strong`,{children:[n.defaultProvider||`-`,` / `,n.defaultModel||`-`]})]}),(0,m.jsxs)(`div`,{className:`code-popup-action-stack`,children:[(0,m.jsx)(`button`,{type:`button`,className:`code-popup-primary`,disabled:!R,onClick:()=>{g(O,A)},children:`Use now`}),(0,m.jsx)(`button`,{type:`button`,className:`code-popup-secondary`,disabled:!z,onClick:()=>{_(O,A)},children:`Use for new sessions`}),(0,m.jsx)(`button`,{type:`button`,className:`code-popup-secondary`,disabled:!z,onClick:()=>{v(O,A)},children:`Set default`})]})]}),!l&&(0,m.jsx)(`p`,{className:`code-popup-note`,children:`Start or load a Code session to apply a live model. Use “Use for new sessions” to set the next session’s model.`})]}),E===`roles`&&(0,m.jsx)(`div`,{className:`code-popup-tabpanel`,role:`tabpanel`,id:`code-model-panel-roles`,"aria-labelledby":`code-model-tab-roles`,children:(0,m.jsxs)(`div`,{className:`code-role-assignment-panel`,"aria-label":`Model role assignments`,children:[(0,m.jsxs)(`div`,{className:`code-role-assignment-head`,children:[(0,m.jsx)(`strong`,{children:`Role assignments`}),(0,m.jsx)(`span`,{children:a?.activeModel.note??`Role assignments do not mutate the active Code session model.`})]}),(0,m.jsx)(`div`,{className:`code-role-assignment-grid`,role:`list`,children:(a?.roles??[]).map(e=>{let t=e.modelId?e.modelId:`Unset`,n=te[e.role]??(e.thinkingLevel===`min`?`minimal`:e.thinkingLevel)??`inherit`,r=!!(O&&A&&!c),i=!!(e.modelId&&!c);return(0,m.jsxs)(`article`,{className:`code-role-card`,role:`listitem`,children:[(0,m.jsxs)(`div`,{className:`code-role-card-head`,children:[(0,m.jsx)(`span`,{className:`code-role-tag`,children:e.tag}),(0,m.jsx)(`strong`,{children:e.name})]}),(0,m.jsx)(`p`,{className:`code-role-path`,children:e.settingsPath}),(0,m.jsx)(`p`,{className:`code-role-model`,title:t,children:t}),(0,m.jsxs)(`label`,{className:`code-role-thinking`,children:[(0,m.jsx)(`span`,{children:`Thinking`}),(0,m.jsx)(`select`,{value:n,disabled:c,onChange:t=>{let n=t.target.value;M(t=>({...t,[e.role]:n}))},children:re.map(e=>(0,m.jsx)(`option`,{value:e.value,children:e.label},e.value))})]}),(0,m.jsxs)(`div`,{className:`code-role-actions`,children:[(0,m.jsx)(`button`,{type:`button`,className:`code-popup-secondary`,disabled:!r,onClick:()=>{y(e.role,O,A,n===`inherit`?null:n)},children:`Assign selected`}),(0,m.jsx)(`button`,{type:`button`,className:`code-popup-secondary`,disabled:!i,onClick:()=>{b(e.role)},children:`Clear`})]})]},e.role)})}),!a&&(0,m.jsx)(`p`,{className:`code-popup-note`,children:`Loading role assignments.`})]})}),E===`profiles`&&(0,m.jsx)(`div`,{className:`code-popup-tabpanel`,role:`tabpanel`,id:`code-model-panel-profiles`,"aria-labelledby":`code-model-tab-profiles`,children:(0,m.jsxs)(`div`,{className:`code-model-preset-panel`,"aria-label":`Model profiles and presets`,children:[(0,m.jsxs)(`div`,{className:`code-role-assignment-head`,children:[(0,m.jsx)(`strong`,{children:`Profiles and presets`}),(0,m.jsx)(`span`,{children:o?.applyReason??`Loading JWC profile state.`})]}),(0,m.jsxs)(`div`,{className:`code-model-preset-summary`,children:[(0,m.jsx)(`span`,{children:`Startup profile`}),(0,m.jsx)(`strong`,{children:o?.defaultProfile??`Unset`}),(0,m.jsx)(`span`,{children:`Task presets`}),(0,m.jsx)(`strong`,{children:o?o.taskPresets.length:`-`}),(0,m.jsx)(`span`,{children:`Built-in profiles`}),(0,m.jsx)(`strong`,{children:o?o.builtinProfiles.length:`-`})]}),o&&o.taskPresets.length>0&&(0,m.jsx)(`div`,{className:`code-model-preset-list`,role:`list`,"aria-label":`Task model presets`,children:o.taskPresets.slice(0,4).map(e=>(0,m.jsxs)(`div`,{className:`code-model-preset-row`,role:`listitem`,children:[(0,m.jsx)(`strong`,{children:e.name}),(0,m.jsx)(`span`,{children:e.best?`best ${e.best}`:`best unset`}),(0,m.jsx)(`span`,{children:e.cheap?`cheap ${e.cheap}`:`cheap unset`})]},e.name))}),o&&(0,m.jsx)(`div`,{className:`code-model-profile-chips`,"aria-label":`Built-in profile candidates`,children:o.builtinProfiles.slice(0,8).map(e=>(0,m.jsx)(`span`,{children:e.name},e.name))}),(0,m.jsxs)(`div`,{className:`code-popup-placeholder-actions`,children:[(0,m.jsx)(`button`,{type:`button`,disabled:!0,className:`code-popup-secondary`,children:`Apply profile`}),(0,m.jsx)(`span`,{children:`Profile activation is read-only here; JWC runtime owns credential checks and rollback.`})]})]})})]})]})})}function se(e,t,n){return n<=0?0:(e+t+n)%n}function U(e){return e.disabledReason?`Disabled`:e.actionType===`popup`?e.popupKind?`${e.popupKind} popup`:`Popup`:e.actionType===`pass-through`?`Pass-through`:e.actionType===`unsupported`?`Unsupported`:`Insert`}function ce(e){let[t,n]=(0,d.useState)(0),r=(0,d.useMemo)(()=>B(e.availableCommands,e.inputText).slice(0,10),[e.availableCommands,e.inputText]),i=r[t],a=i?`code-command-option-${i.name.replace(/[^a-z0-9_-]/gi,`-`)}`:void 0;(0,d.useEffect)(()=>{n(0)},[e.inputText,e.availableCommands]),(0,d.useEffect)(()=>{t>=r.length&&n(Math.max(0,r.length-1))},[t,r.length]);let o=t=>{!t||t.disabledReason||e.onCommandSelect(t)};return(0,m.jsxs)(`div`,{className:`code-composer`,children:[e.showCommands&&r.length>0&&(0,m.jsx)(`div`,{className:`code-command-palette`,role:`listbox`,"aria-label":`Code commands`,id:`code-command-palette`,children:r.map((e,r)=>{let i=r===t;return(0,m.jsxs)(`button`,{id:`code-command-option-${e.name.replace(/[^a-z0-9_-]/gi,`-`)}`,type:`button`,role:`option`,"aria-selected":i,"aria-disabled":e.disabledReason?!0:void 0,className:`code-command-item${i?` is-active`:``}${e.disabledReason?` is-disabled`:``}`,onMouseEnter:()=>n(r),onClick:()=>o(e),children:[(0,m.jsxs)(`span`,{className:`code-command-row-main`,children:[(0,m.jsx)(`span`,{className:`code-command-name`,children:e.displayName}),e.description&&(0,m.jsx)(`span`,{className:`code-command-desc`,children:e.description})]}),(0,m.jsxs)(`span`,{className:`code-command-row-meta`,children:[(0,m.jsx)(`span`,{className:`code-command-chip`,children:e.category}),(0,m.jsx)(`span`,{className:`code-command-chip`,children:e.source}),(0,m.jsx)(`span`,{className:`code-command-chip`,children:U(e)})]})]},e.name)})}),(0,m.jsxs)(`div`,{className:`code-composer-input-shell`,children:[(0,m.jsx)(`textarea`,{className:`code-composer-input`,value:e.inputText,onChange:t=>e.onInputChange(t.target.value),onKeyDown:t=>{if(t.key===`Escape`&&e.showCommands){t.preventDefault(),e.onShowCommandsChange(!1);return}if(e.showCommands&&r.length>0){if(t.key===`ArrowDown`){t.preventDefault(),n(e=>se(e,1,r.length));return}if(t.key===`ArrowUp`){t.preventDefault(),n(e=>se(e,-1,r.length));return}if(t.key===`Enter`&&!t.shiftKey){t.preventDefault(),o(i);return}}t.key===`Enter`&&!t.shiftKey&&(t.preventDefault(),e.onSubmit())},"aria-controls":e.showCommands?`code-command-palette`:void 0,"aria-activedescendant":e.showCommands?a:void 0,"aria-expanded":e.showCommands,placeholder:`Describe a task or ask a question...`,rows:1,disabled:e.sending}),(0,m.jsx)(`span`,{className:`code-composer-hint`,children:`Enter to send · / for commands`})]}),(0,m.jsx)(`button`,{type:`button`,className:`code-composer-send`,onClick:e.onSubmit,disabled:!e.inputText.trim()||e.sending,"aria-label":`Send prompt`,children:`Send`})]})}function le({permissions:e,onAnswer:t}){return e.length===0?null:(0,m.jsx)(`div`,{className:`code-permissions`,children:e.map(e=>(0,m.jsxs)(`div`,{className:`code-permission-card`,children:[(0,m.jsxs)(`div`,{className:`code-permission-title`,children:[(0,m.jsx)(`span`,{children:`Permission request`}),(0,m.jsx)(`strong`,{children:D(e.toolCall)}),(0,m.jsxs)(`small`,{children:[e.options.length,` JWC options`]})]}),(0,m.jsx)(`div`,{className:`code-permission-actions`,children:v.map(n=>{let r=E(e.options,n),i=b[n];return(0,m.jsx)(`button`,{type:`button`,className:`code-permission-btn is-${i}`,disabled:!r,title:r?r.optionId:`${y[n]} option was not provided by JWC`,onClick:()=>t(e,n),children:r?.label??y[n]},n)})})]},e.permissionId))})}var W=92,ue=6;function de(e){let[{virtualItems:t,totalSize:s},c]=(0,d.useState)({virtualItems:[],totalSize:0}),l=(0,d.useRef)(null);l.current||=new o({count:e.count,getScrollElement:()=>e.scrollElementRef.current,estimateSize:e.estimateSize||(()=>W),overscan:ue,getItemKey:e.getItemKey,indexAttribute:`data-code-transcript-idx`,useAnimationFrameWithResizeObserver:!0,observeElementRect:n,observeElementOffset:r,scrollToFn:i,measureElement:a,onChange:e=>{c({virtualItems:e.getVirtualItems(),totalSize:e.getTotalSize()})}});let u=l.current;return(0,d.useEffect)(()=>u._didMount(),[u]),(0,d.useLayoutEffect)(()=>{u.setOptions({...u.options,count:e.count,getItemKey:e.getItemKey,estimateSize:e.estimateSize||(()=>W)}),u._willUpdate(),c({virtualItems:u.getVirtualItems(),totalSize:u.getTotalSize()})},[e.count,e.estimateSize,e.getItemKey,u]),{measureElement:e=>{e&&u.measureElement(e)},virtualItems:t,totalSize:s}}var fe=(0,d.lazy)(()=>t(()=>import(`./MarkdownRenderer-DyrB9FbZ.js`).then(e=>({default:e.MarkdownRenderer})),__vite__mapDeps([0])));function pe(e,t){let n=e.label??(e.type===`args`?`Args`:e.type===`output`?`Output`:e.type===`error`?`Error`:``),r=`code-tool-${e.type}`,i=e.type===`diff`&&e.diff?e.diff:e.type===`json`||e.type===`args`?JSON.stringify(e.json??e,null,2):e.text??JSON.stringify(e,null,2);return n?(0,m.jsxs)(`div`,{className:`code-tool-section`,children:[(0,m.jsx)(`span`,{className:`code-tool-section-label`,children:n}),(0,m.jsx)(`pre`,{className:r,children:i})]},t):e.type===`diff`&&e.diff?(0,m.jsx)(`pre`,{className:`code-tool-diff`,children:e.diff},t):e.text?(0,m.jsx)(`pre`,{className:`code-tool-text`,children:e.text},t):(0,m.jsx)(`pre`,{className:r,children:i},t)}function me(e){if(!(e instanceof HTMLElement))return!1;let t=e.tagName.toLowerCase();return t===`input`||t===`textarea`||t===`select`||e.isContentEditable}function G(e){return(e.toolContent?.find(e=>typeof e.text==`string`&&e.text.trim())?.text??e.toolOutput??``).replace(/\s+/g,` `).trim().slice(0,240)}function he(e){return e.split(/\r?\n/)[0]?.replace(/\s+/g,` `).trim()??``}function ge(e){let t=e.toolContent?.find(e=>e.type===`args`||e.type===`text`||e.type===`json`);if(!t)return null;if(typeof t.text==`string`){let e=he(t.text);return e?{text:e,...t.type===`args`?{name:`bash`}:/^https?:\/\//.test(e)||e.startsWith(`/`)?{name:`read`}:{}}:null}if(typeof t.json==`string`){let e=he(t.json);return e?{text:e,...t.type===`args`?{name:`bash`}:{}}:null}if(t.json&&typeof t.json==`object`&&!Array.isArray(t.json)){let e=t.json;for(let[t,n]of[[`command`,`bash`],[`cmd`,`bash`],[`path`,`read`],[`url`,`read`],[`file`,`read`],[`query`,`search`]]){let r=e[t];if(typeof r==`string`&&r.trim())return{name:n,text:he(r)}}}return null}function _e(e){let t=he(e.toolName||e.text||`tool`)||`tool`,n=ge(e);return t.includes(`:`)||!n?t:t===`tool`?n.name?`${n.name}: ${n.text}`:n.text:`${t}: ${n.text}`}function ve(e){return e===`pending`?`Pending`:e===`allow_once`?`Allow once`:e===`allow_always`?`Always allow`:e===`reject_once`?`Deny once`:e===`reject_always`?`Always deny`:e===`missing_option`?`Missing JWC option`:e===`answer_error`?`Answer failed`:`Cancelled`}function K(e,t){return`${t}:${e.toolCallId||e.permissionAudit?.permissionId||`${e.role}:${e.text.slice(0,48)}`}`}function ye(e){return e?e.role===`tool`?e.toolStatus===`running`?44:64+Math.min(320,(e.toolOutput?.length??0)/5):e.role===`permission`?72:e.role===`thinking`?48+Math.min(180,e.text.length/8):56+Math.min(420,e.text.length/6):48}function q(e,t,n){return(0,m.jsx)(`div`,{className:`code-message code-message-${e.role}`,children:e.role===`tool`?(()=>{let t=e.toolStatus??`done`,n=t===`failed`||t===`error`,r=n?G(e):``;return(0,m.jsxs)(`details`,{className:`code-tool-card code-tool-${t}`,open:t===`running`||n,children:[(0,m.jsxs)(`summary`,{className:`code-tool-summary`,children:[(0,m.jsx)(`span`,{className:`code-tool-chevron`,children:`>`}),(0,m.jsx)(`span`,{className:`code-tool-name`,children:_e(e)}),(0,m.jsx)(`span`,{className:`code-tool-status`,children:t})]}),r&&(0,m.jsx)(`div`,{className:`code-tool-error-snippet`,children:r}),(e.toolContent?.length??0)>0&&(0,m.jsx)(`div`,{className:`code-tool-content`,children:e.toolContent.map(pe)}),e.toolOutput&&(0,m.jsxs)(`pre`,{className:`code-tool-output`,children:[e.toolOutput.slice(0,2e3),e.toolOutput.length>2e3?`...`:``]})]})})():e.role===`permission`&&e.permissionAudit?(()=>{let t=e.permissionAudit,n=t.decision.startsWith(`allow`)?`is-allow`:t.decision.startsWith(`reject`)?`is-deny`:``;return(0,m.jsxs)(`div`,{className:`code-permission-audit is-${t.decision} ${n}`.trim(),children:[(0,m.jsxs)(`div`,{className:`code-permission-audit-head`,children:[(0,m.jsx)(`span`,{children:`Permission`}),(0,m.jsx)(`strong`,{children:t.toolName}),(0,m.jsx)(`em`,{children:ve(t.decision)})]}),(0,m.jsxs)(`div`,{className:`code-permission-audit-meta`,children:[(0,m.jsxs)(`span`,{children:[`mode `,t.mode]}),(0,m.jsx)(`span`,{children:t.decisionMode}),t.optionId&&(0,m.jsx)(`span`,{children:t.optionId})]}),t.error&&(0,m.jsx)(`div`,{className:`code-permission-audit-error`,children:t.error})]})})():e.role===`thinking`?(0,m.jsxs)(`details`,{className:`code-thinking`,children:[(0,m.jsx)(`summary`,{className:`code-thinking-summary`,children:`Thinking...`}),(0,m.jsx)(`div`,{className:`code-thinking-text`,children:e.text})]}):(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(`span`,{className:`code-message-role`,children:e.role===`user`?`You`:`JWC`}),(0,m.jsx)(`div`,{className:`code-message-text`,children:e.role===`assistant`?(0,m.jsx)(d.Suspense,{fallback:(0,m.jsx)(`span`,{children:e.text}),children:(0,m.jsx)(fe,{markdown:e.text,tableMode:`linear`,onLocalFileOpen:n})}):e.text})]})},t)}function J(){return(0,m.jsxs)(`div`,{className:`code-message code-message-assistant`,children:[(0,m.jsx)(`span`,{className:`code-message-role`,children:`JWC`}),(0,m.jsx)(`div`,{className:`code-message-text code-streaming`,children:`Thinking...`})]})}function Y({messages:e,sending:t,workingDir:n,transcriptRef:r,onOpenLocalFile:i}){let a=t&&e[e.length-1]?.role!==`assistant`,o=de({count:e.length+ +!!a,scrollElementRef:r,getItemKey:(0,d.useCallback)(t=>{let n=e[t];return n?K(n,t):`sending-${t}`},[e]),estimateSize:(0,d.useCallback)(t=>ye(e[t]),[e])});function s(e){if(me(e.target))return;let t=r.current;if(!t)return;let n=e.key.toLowerCase(),i=Math.max(160,Math.floor(t.clientHeight*.78));n===`d`||n===`j`||e.key===`PageDown`?(e.preventDefault(),t.scrollBy({top:i,behavior:`smooth`})):n===`u`||n===`k`||e.key===`PageUp`?(e.preventDefault(),t.scrollBy({top:-i,behavior:`smooth`})):e.key===`End`?(e.preventDefault(),t.scrollTo({top:t.scrollHeight,behavior:`smooth`})):e.key===`Home`&&(e.preventDefault(),t.scrollTo({top:0,behavior:`smooth`}))}return(0,m.jsx)(`div`,{className:`code-transcript`,ref:r,role:`log`,"aria-live":`polite`,tabIndex:0,onKeyDown:s,children:e.length===0?(0,m.jsxs)(`div`,{className:`code-transcript-empty`,children:[(0,m.jsx)(`p`,{children:`Start a Code session by typing a prompt below.`}),(0,m.jsxs)(`p`,{className:`code-transcript-cwd`,children:[`cwd: `,n||`not set`]})]}):(0,m.jsx)(`div`,{className:`code-transcript-virtual-spacer`,style:{height:`${o.totalSize}px`},children:o.virtualItems.map(t=>{let n=e[t.index];return(0,m.jsx)(`div`,{ref:o.measureElement,className:`code-transcript-virtual-row`,"data-code-transcript-idx":t.index,style:{transform:`translateY(${t.start}px)`},children:n?q(n,t.index,i):J()},t.key)})})})}function X(e){return e.split(`/`).filter(Boolean).slice(-2).join(`/`)||e}function be({workingDir:e,gitInfo:t,modelOptions:n,sessionTitle:r,usage:i,planEntries:a,onWorkingDirChange:o,cwdLocked:s=!1,workspaceFrozen:c=!1,onPickWorkingDir:l}){let[u,f]=(0,d.useState)(!1),[p,h]=(0,d.useState)(``),g=t?.status?.dirty,_=t?.worktrees.length??0,v=c||s,y=!!(!v&&l&&o);async function b(){if(!(!y||!l)){f(!0),h(``);try{let e=await l();e&&o?.(e)}catch(e){h(e instanceof Error?e.message:String(e))}finally{f(!1)}}}return(0,m.jsxs)(`div`,{className:`code-workspace-header`,children:[(0,m.jsxs)(`div`,{className:`code-workspace-primary`,children:[v?(0,m.jsx)(`span`,{className:`code-workspace-chip`,title:e,"aria-label":`Current Code workspace: ${e}`,children:X(e||`/tmp`)}):(0,m.jsxs)(`button`,{type:`button`,className:`code-workspace-picker`,disabled:!y||u,title:e||`Select Code workspace folder`,"aria-label":`Code workspace: ${e||`not set`}. Choose a folder.`,onClick:()=>void b(),children:[(0,m.jsx)(`span`,{className:`code-workspace-picker-label`,children:X(e||`/tmp`)}),(0,m.jsx)(`span`,{className:`code-workspace-picker-caret`,"aria-hidden":`true`,children:`▾`})]}),!v&&p&&(0,m.jsx)(`span`,{className:`code-workspace-cwd-error`,children:p}),t?.isRepo&&(0,m.jsxs)(m.Fragment,{children:[(0,m.jsxs)(`span`,{className:`code-workspace-pill`,children:[t.branch??`detached`,t.head?` · ${t.head}`:``]}),(0,m.jsx)(`span`,{className:`code-workspace-pill ${g?`is-dirty`:``}`,children:g?`${t.status?.changed??0} changed · ${t.status?.untracked??0} untracked`:`clean`}),(0,m.jsxs)(`span`,{className:`code-workspace-pill`,title:t.currentWorktree?.path??void 0,children:[`worktree `,_]})]}),n?.degraded&&(0,m.jsx)(`span`,{className:`code-workspace-pill is-warning`,title:n.error,children:`provider fallback`})]}),(r||i.contextTokens!==void 0||a.length>0)&&(0,m.jsxs)(`div`,{className:`code-session-header`,children:[r&&(0,m.jsx)(`span`,{className:`code-session-title`,children:r}),i.contextTokens!==void 0&&i.contextLimit?(0,m.jsx)(`span`,{className:`code-context-meter`,title:`${i.contextTokens.toLocaleString()} / ${i.contextLimit.toLocaleString()} tokens${i.cost===void 0?``:` · $${i.cost.toFixed(4)}`}`,children:(0,m.jsx)(`span`,{className:`code-context-bar`,style:{width:`${Math.min(100,i.contextTokens/i.contextLimit*100)}%`}})}):null,a.length>0&&(0,m.jsx)(`div`,{className:`code-plan-entries`,children:a.map((e,t)=>(0,m.jsxs)(`span`,{className:`code-plan-entry code-plan-${e.status}`,children:[e.status===`completed`?`✓`:e.status===`in_progress`?`↻`:`○`,` `,e.title]},t))})]})]})}function xe({label:e,value:t,options:n,disabled:r,title:i,className:a=``,onChange:o}){let s=(0,d.useId)(),c=(0,d.useRef)(null),[l,u]=(0,d.useState)(!1),f=n.find(e=>e.value===t)??n[0],p=Math.max(0,n.findIndex(e=>e.value===f?.value));(0,d.useEffect)(()=>{if(!l)return;let e=e=>{c.current?.contains(e.target)||u(!1)};return document.addEventListener(`pointerdown`,e),()=>document.removeEventListener(`pointerdown`,e)},[l]);let h=e=>{o(e),u(!1)};return(0,m.jsxs)(`div`,{ref:c,className:`code-footer-menu ${a}`.trim(),children:[(0,m.jsxs)(`button`,{type:`button`,className:`code-footer-menu-trigger`,disabled:r,title:i,"aria-label":e,"aria-haspopup":`listbox`,"aria-expanded":l,"aria-controls":s,onClick:()=>u(e=>!e),onKeyDown:e=>{if(!r){if(e.key===`Escape`){u(!1);return}if(e.key===`ArrowDown`||e.key===`ArrowUp`){e.preventDefault();let t=n[(p+(e.key===`ArrowDown`?1:-1)+n.length)%n.length];t&&h(t.value);return}(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),u(e=>!e))}},children:[(0,m.jsx)(`span`,{className:`code-footer-label`,children:e}),(0,m.jsx)(`strong`,{children:f?.label??t}),(0,m.jsx)(`span`,{className:`code-footer-chevron`,"aria-hidden":`true`,children:`⌃`})]}),l&&(0,m.jsx)(`div`,{id:s,className:`code-footer-dropup`,role:`listbox`,"aria-label":e,children:n.map(e=>(0,m.jsxs)(`button`,{type:`button`,className:`code-footer-dropup-option${e.value===t?` is-selected`:``}`,role:`option`,"aria-selected":e.value===t,onClick:()=>h(e.value),children:[(0,m.jsxs)(`span`,{children:[(0,m.jsx)(`strong`,{children:e.label}),e.detail&&(0,m.jsx)(`small`,{children:e.detail})]}),e.value===t&&(0,m.jsx)(`em`,{"aria-hidden":`true`,children:`✓`})]},e.value))})]})}function Se({provider:e,providerOptions:t,model:n,modelOptions:r,effort:i,effortOptions:a,permissionMode:o,disabled:s,onProviderChange:c,onModelChange:l,onEffortChange:u,onPermissionModeChange:d}){return(0,m.jsxs)(`div`,{className:`code-composer-footer`,children:[(0,m.jsx)(xe,{label:`Permission`,value:o,options:x,disabled:s,title:S[o],onChange:d}),t.length>0&&(0,m.jsx)(xe,{label:`Provider`,value:e,options:t.map(e=>({value:e,label:e})),disabled:s,title:e,onChange:c}),(0,m.jsx)(xe,{label:`Model`,value:n,options:r.map(e=>({value:e,label:e})),disabled:s,title:n,className:`code-footer-field-model`,onChange:l}),a.length>0&&(0,m.jsx)(xe,{label:`Effort`,value:i,options:a.map(e=>({value:e,label:e})),disabled:s,title:i,onChange:u})]})}function Ce(e){return(0,m.jsxs)(`div`,{className:`code-canvas-main`,children:[(0,m.jsx)(be,{gitInfo:e.gitInfo,modelOptions:e.modelOptions,sessionTitle:e.sessionTitle,usage:e.usage,planEntries:e.planEntries,workingDir:e.codeWorkingDir,cwdLocked:!!e.activeSessionId,onWorkingDirChange:e.onWorkingDirChange,workspaceFrozen:e.workspaceFrozen,onPickWorkingDir:e.onPickWorkingDir}),e.childRecovery&&(0,m.jsxs)(`section`,{className:`code-child-recovery`,role:`status`,"aria-live":`polite`,children:[(0,m.jsxs)(`div`,{children:[(0,m.jsx)(`span`,{children:`JWC child recovery`}),(0,m.jsxs)(`strong`,{children:[`ACP child exited: `,e.childRecovery.code]})]}),(0,m.jsx)(`p`,{children:e.childRecovery.message})]}),e.transportState!==`connected`&&(0,m.jsx)(`section`,{className:`code-transport-status is-${e.transportState}`,role:`status`,"aria-live":`polite`,children:e.transportState===`reconnecting`?`Live updates reconnecting…`:`Live updates disconnected — retrying.`}),(0,m.jsx)(Y,{messages:e.messages,sending:e.sending,workingDir:e.codeWorkingDir,transcriptRef:e.transcriptRef,onOpenLocalFile:e.onOpenLocalFile}),(0,m.jsx)(le,{permissions:e.permissions,onAnswer:e.onPermissionAnswer}),(0,m.jsx)(`div`,{className:`code-composer-dock`,children:(0,m.jsxs)(`div`,{className:`code-composer-surface`,"aria-label":`Code composer controls`,children:[(0,m.jsx)(ce,{inputText:e.inputText,sending:e.sending,showCommands:e.showCommands,availableCommands:e.availableCommands,onInputChange:e.onInputChange,onCommandSelect:e.onCommandSelect,onSubmit:e.onSubmit,onShowCommandsChange:e.onShowCommandsChange}),(0,m.jsx)(Se,{provider:e.provider,providerOptions:e.providerOptions,model:e.model,modelOptions:e.currentModelOptions,effort:e.effort,effortOptions:e.currentEffortOptions,permissionMode:e.permissionMode,disabled:e.disabled,onProviderChange:e.onFooterProviderChange,onModelChange:e.onModelChange,onEffortChange:e.onEffortChange,onPermissionModeChange:e.onPermissionModeChange})]})}),e.activePopup&&(0,m.jsx)(H,{popupKind:e.activePopup.kind,command:e.activePopup.command,modelOptions:e.modelOptions,provider:e.provider,model:e.model,modelAssignments:e.modelAssignments,modelPresets:e.modelPresets,permissionMode:e.permissionMode,disabled:e.disabled,activeSessionId:e.activeSessionId,error:e.error,onClose:e.onClosePopup,onRefreshProviders:e.onRefreshProviders,onProviderChange:e.onProviderChange,onUseModel:e.onUseModel,onUseForNewSessions:e.onUseForNewSessions,onSetDefaultModel:e.onSetDefaultModel,onSetModelAssignment:e.onSetModelAssignment,onClearModelAssignment:e.onClearModelAssignment,onPermissionModeChange:e.onPermissionModeChange})]})}var we={providers:[{id:`anthropic`,models:[`claude-sonnet-4-6`,`claude-opus-5`,`claude-opus-4-8`,`claude-opus-4-7`,`claude-opus-4-6`,`claude-haiku-4-5`,`claude-fable-5`],efforts:[`off`,`min`,`low`,`medium`,`high`,`xhigh`]}],defaultProvider:`anthropic`,defaultModel:`claude-sonnet-4-6`,degraded:!0},Te=re([{name:`/model`,description:`Choose provider, model, roles, thinking, profiles, and MRU state.`,source:`cli-jaw`},{name:`/provider`,description:`Review authenticated JWC providers.`,source:`cli-jaw`},{name:`/settings`,description:`Adjust Code mode session controls.`,source:`cli-jaw`}]);function Ee(e){let t=new Set,n=[];for(let r of[...e,...Te])t.has(r.name)||(t.add(r.name),n.push(r));return n}function De(e,t,n,r){if(r.appendMessage(O(n,{mode:t,decision:`pending`,decisionMode:t===`ask`?`pending`:`automatic`})),t===`ask`){r.enqueuePermission(n);return}let i=t===`always-allow`?`allow_always`:`reject_always`,a=E(n.options,i);if(!a){r.appendMessage(O(n,{mode:t,decision:`missing_option`,decisionMode:`system`,error:`${i} was not provided by JWC for this request.`})),r.enqueuePermission(n);return}(async()=>{try{await e.answerPermission(n.permissionId,a.optionId),r.appendMessage(O(n,{mode:t,decision:i,decisionMode:`automatic`,optionId:a.optionId,optionLabel:a.label}))}catch(e){r.appendMessage(O(n,{mode:t,decision:`answer_error`,decisionMode:`system`,optionId:a.optionId,optionLabel:a.label,error:e instanceof Error?e.message:String(e)}))}})()}async function Oe(e,t,n,r,i){let a=E(n.options,r);if(!a)return i(O(n,{mode:t,decision:`missing_option`,decisionMode:`system`,error:`${r} was not provided by JWC for this request.`})),!1;try{await e.answerPermission(n.permissionId,a.optionId),i(O(n,{mode:t,decision:r,decisionMode:`manual`,optionId:a.optionId,optionLabel:a.label}))}catch(e){i(O(n,{mode:t,decision:`answer_error`,decisionMode:`system`,optionId:a.optionId,optionLabel:a.label,error:e instanceof Error?e.message:String(e)}))}return!0}var ke=new Set([`code_user_message_chunk`,`code_agent_message_chunk`,`code_agent_thought_chunk`]);function Ae(e){let t=e?.content;return String(t?.text??e?.text??``)}function Z(e){let t=e?.messageId;return typeof t==`string`?t.trim():``}function je(e,t){if(!ke.has(e.event)||!t)return null;let n=Z(e.update??{}),r=typeof e.sseEventId==`string`&&e.sseEventId.trim()?e.sseEventId.trim():``,i=n?`msg:${n}`:r?`sse:${r}`:``;return i?`${e.sessionId??``}:${e.event}:${i}:${t}`:null}function Me(e,t){for(let n of t){let t=je(n,Ae(n.update));t&&e.add(t)}}function Ne(e,t,n){let r=je(t,n);return r?e.has(r)?!0:(e.add(r),!1):!1}function Pe(e,t){let n=e.trim(),r=t.trim();return r.length<80?!1:n===r}var Q=80,Fe=.7,Ie=.78,Le=32,Re=8;function ze(e){return e.replace(/\s+/g,` `).trim()}function Be(e){return e.split(/\r?\n/).map(e=>e.replace(/\s+/g,` `).trim()).filter(e=>e.length>=4)}function $(e,t){if(e.length===0)return 0;let n=0;for(let r of e)t.has(r)&&(n+=1);return n/e.length}function Ve(e){let t=ze(e);if(t.length<Le)return[];let n=[];for(let e=0;e<=t.length-Le;e+=Re)n.push(t.slice(e,e+Le));return n}function He(e,t){let n=ze(e),r=ze(t);if(n.length<Q||r.length<Q)return!1;if(r.includes(n))return!0;let i=Be(e),a=new Set(Be(t));if(i.length>=4&&$(i,a)>=Fe)return!0;let o=Ve(n);return o.length<3?!1:$(o,new Set(Ve(r)))>=Ie}function Ue(e,t){return!e||!t?`append`:e===t?`drop`:t.startsWith(e)?`replace`:e.startsWith(t)?`drop`:t.length>=e.length&&He(e,t)?`replace`:e.length>t.length&&He(t,e)?`drop`:`append`}function We(e){let t=e.toLowerCase();return t===`failed`||t===`error`||t===`errored`?`failed`:t===`completed`||t===`done`||t===`success`?`done`:`running`}function Ge(e){let t=[];for(let n of e){let e=n.update??{};if(n.event===`code_user_message_chunk`){let n=e.content,r=String(n?.text??e.text??``),i=Z(e);r&&t.push({role:`user`,text:r,...i?{messageId:i}:{}})}else if(n.event===`code_agent_message_chunk`){let n=e.content,r=String(n?.text??e.text??``);if(!r)continue;let i=Z(e),a=t[t.length-1];if(a?.role===`assistant`){let e=Ue(a.text,r);if(a.messageId&&i&&a.messageId!==i){if(e===`replace`){a.text=r,a.messageId=i;continue}t.push({role:`assistant`,text:r,messageId:i});continue}if(e===`drop`)continue;a.text=e===`replace`?r:a.text+r,i&&!a.messageId&&(a.messageId=i)}else t.push({role:`assistant`,text:r,...i?{messageId:i}:{}})}else if(n.event===`code_agent_thought_chunk`){let n=e.content,r=String(n?.text??e.text??``);if(!r)continue;let i=Z(e),a=t[t.length-1];a?.role===`thinking`&&(!a.messageId||!i||a.messageId===i)?(a.text+=r,i&&!a.messageId&&(a.messageId=i)):t.push({role:`thinking`,text:r,...i?{messageId:i}:{}})}else if(n.event===`code_tool_call`){let n=String(e.title??e.toolName??`tool`),r=String(e.toolCallId??``),i=String(e.status??`pending`),a=P(e);t.push({role:`tool`,text:n,toolName:n,toolCallId:r,toolContent:a,toolStatus:We(i)})}else if(n.event===`code_tool_call_update`){let n=String(e.toolCallId??``),r=String(e.status??``),i=P(e),a=g(t,n);if(a<0)continue;let o={...t[a]};r&&(o.toolStatus=We(r)),i.length>0&&(o.toolContent=i),t[a]=o}}return t}function Ke(e){if(!(e instanceof HTMLElement))return!1;let t=e.tagName.toLowerCase();return t===`input`||t===`textarea`||t===`select`||e.isContentEditable}function qe(e,t,n){let r=(0,d.useRef)(null),i=(0,d.useMemo)(()=>{let t=e[e.length-1];if(!t)return`empty`;let n=t.toolContent?.reduce((e,t)=>e+JSON.stringify(t).length,0)??0;return`${e.length}:${t.role}:${t.text.length}:${t.toolOutput?.length??0}:${n}:${t.toolStatus??``}`},[e]),a=(0,d.useCallback)((e=`smooth`)=>{window.requestAnimationFrame(()=>{let t=r.current;t&&(t.scrollTo({top:t.scrollHeight,behavior:e}),window.setTimeout(()=>{let e=r.current;e&&e.scrollTo({top:e.scrollHeight,behavior:`auto`})},80))})},[]),o=(0,d.useCallback)((e,t=`smooth`)=>{window.requestAnimationFrame(()=>{let n=r.current;n&&n.scrollBy({top:e,behavior:t})})},[]),s=(0,d.useCallback)((e=`smooth`)=>{window.requestAnimationFrame(()=>{let t=r.current;t&&t.scrollTo({top:0,behavior:e})})},[]);return(0,d.useEffect)(()=>{a(e.length>1?`smooth`:`auto`)},[i,e.length,t,a]),(0,d.useEffect)(()=>{let e=e=>{if(e.defaultPrevented||n||e.metaKey||e.ctrlKey||e.altKey||Ke(e.target))return;let t=r.current;if(!t)return;let i=e.key.toLowerCase(),c=Math.max(160,Math.floor(t.clientHeight*.78));i===`d`||i===`j`||e.key===`PageDown`?(e.preventDefault(),o(c)):i===`u`||i===`k`||e.key===`PageUp`?(e.preventDefault(),o(-c)):e.key===`End`?(e.preventDefault(),a(`smooth`)):e.key===`Home`&&(e.preventDefault(),s(`smooth`))};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[n,o,a,s]),{transcriptRef:r,scrollTranscriptToBottom:a}}function Je(e){return typeof window<`u`&&window.location.port===String(e)?`${window.location.origin}/api/events`:`http://127.0.0.1:${e}/api/events`}function Ye({port:e,sessionId:t,sessionIdRef:n,onEvent:r,onTransport:i}){let a=(0,d.useRef)(r);a.current=r;let o=(0,d.useRef)(i);o.current=i;let s=(0,d.useRef)(t);s.current=t,(0,d.useEffect)(()=>{if(!e)return;let t=new EventSource(Je(e));return t.onopen=()=>{o.current?.(`connected`)},t.onmessage=e=>{try{let t={...JSON.parse(e.data),sseEventId:e.lastEventId||void 0};if(t.topic!==`jwc`)return;let r=t.event===`code_child_exit`,i=n?.current??s.current;if(!i&&!r||!r&&t.sessionId&&t.sessionId!==i)return;a.current(t)}catch{}},t.onerror=()=>{o.current?.(t.readyState===EventSource.CLOSED?`disconnected`:`reconnecting`)},()=>t.close()},[e])}function Xe({port:e,workingDir:t,onWorkingDirChange:n,onOpenLocalFile:r}){let i=(0,d.useMemo)(()=>p(e),[e]),[a,o]=(0,d.useState)(t),[s,c]=(0,d.useState)(null),[l,v]=(0,d.useState)(!1),[y,b]=(0,d.useState)(``),[x,S]=(0,d.useState)(!1),[C,w]=(0,d.useState)([]),[ee,T]=(0,d.useState)([]),[E,D]=(0,d.useState)(Te),[O,k]=(0,d.useState)(!1),[A,j]=(0,d.useState)(null),[te,M]=(0,d.useState)(``),[N,F]=(0,d.useState)(``),[I,L]=(0,d.useState)({}),[ne,R]=(0,d.useState)([]),[z,ie]=(0,d.useState)(`anthropic`),[B,ae]=(0,d.useState)(`claude-sonnet-4-6`),[oe,V]=(0,d.useState)(`high`),[H,se]=(0,d.useState)(`always-allow`),[U,ce]=(0,d.useState)(we),[le,W]=(0,d.useState)(null),[ue,de]=(0,d.useState)(null),[fe,pe]=(0,d.useState)(null),[me,G]=(0,d.useState)(null),[he,ge]=(0,d.useState)(`connected`),[_e,ve]=(0,d.useState)(null),K=(0,d.useRef)(null),ye=(0,d.useRef)(!1),q=(0,d.useRef)(null),J=(0,d.useRef)(null),Y=(0,d.useRef)(new Set),X=(0,d.useRef)(new Set),be=(0,d.useMemo)(()=>B?_(z,B):``,[z,B]),{transcriptRef:xe,scrollTranscriptToBottom:Se}=qe(C,x,!!A);(0,d.useEffect)(()=>{K.current||s||o(t)},[s,t]);let ke=(0,d.useCallback)(e=>{K.current||s||l||(o(e??``),n?.(e))},[s,n,l]),je=(0,d.useCallback)(async()=>{let e=u();if(e?.folder?.pickFolder){let t=await e.folder.pickFolder();if(t.ok&&t.path)return t.path;if(t.error&&t.error!==`cancelled`)throw Error(t.error);return null}let t=await i.pickWorkspace();return t.ok&&t.path?t.path:null},[i]),Q=(0,d.useCallback)(e=>{ce(e);let t=e.providers.find(t=>t.id===e.defaultProvider)??e.providers[0],n=t?.models.includes(e.defaultModel)?e.defaultModel:t?.models[0]??``;ie(t?.id??`anthropic`),ae(n);let r=t?.efforts??[];r.length>0&&V(r.includes(`high`)?`high`:r[0]??``)},[]);(0,d.useEffect)(()=>{K.current=s},[s]),(0,d.useEffect)(()=>{if(typeof document>`u`){ve(null);return}return ve(document.getElementById(`code-session-sidebar-host`)),()=>ve(null)},[]);let Fe=(0,d.useCallback)(async()=>{Q(await i.listModelOptions())},[Q,i]),Ie=(0,d.useCallback)(async()=>{W(await i.listModelAssignments())},[i]);(0,d.useEffect)(()=>{let e=!1;return(async()=>{try{let[t,n,r]=await Promise.all([i.listModelOptions(),i.listModelAssignments(),i.listModelPresets()]);if(e)return;Q(t),W(n),de(r)}catch(t){e||(ce({...we,error:t instanceof Error?t.message:String(t)}),W(null),de(null))}})(),()=>{e=!0}},[Q,i]),(0,d.useEffect)(()=>{if(!a){pe(null);return}let e=!1;return i.getGitInfo(a).then(t=>{e||pe(t)},()=>{e||pe(null)}),()=>{e=!0}},[i,a]),(0,d.useEffect)(()=>{if(ye.current){ye.current=!1;return}c(null),K.current=null,w([]),T([]),R([]),F(``),L({}),S(!1),G(null),X.current=new Set},[a]),Ye({port:e,sessionId:s,sessionIdRef:K,onEvent:(0,d.useCallback)(e=>{let t=e.update??{},n=e.event;if(!(J.current&&e.sessionId===J.current&&n!==`code_child_exit`)){if(n===`code_agent_message_chunk`){let n=Ae(t);if(!n)return;let r=Z(t);if(Ne(X.current,e,n))return;w(e=>{if(Y.current.has(n)&&e[e.length-1]?.role===`user`)return Y.current.delete(n),e;let t=e[e.length-1];if(t?.role===`assistant`&&Pe(t.text,n))return e;if(t?.role===`assistant`){let i=Ue(t.text,n);if(t.messageId&&r&&t.messageId!==r)return i===`replace`?[...e.slice(0,-1),{...t,text:n,messageId:r}]:[...e,{role:`assistant`,text:n,messageId:r}];if(i===`drop`)return e;let a=i===`replace`?n:t.text+n;return[...e.slice(0,-1),{...t,text:a,...r&&!t.messageId?{messageId:r}:{}}]}return[...e,{role:`assistant`,text:n,...r?{messageId:r}:{}}]})}else if(n===`code_user_message_chunk`){let n=Ae(t);if(!n)return;let r=Z(t);if(Ne(X.current,e,n))return;w(e=>{if(q.current===n){let t=-1;for(let r=e.length-1;r>=0;--r){let i=e[r];if(i?.role===`user`&&i.text===n&&i.transient===`pending-user-echo`){t=r;break}}if(t>=0){q.current=null;let i=[...e];return i[t]={role:`user`,text:n,...r?{messageId:r}:{}},i}}return[...e,{role:`user`,text:n,...r?{messageId:r}:{}}]})}else if(n===`code_agent_thought_chunk`){let n=Ae(t);if(!n)return;let r=Z(t);if(Ne(X.current,e,n))return;w(e=>{let t=e[e.length-1];return t?.role===`thinking`&&(!t.messageId||!r||t.messageId===r)?[...e.slice(0,-1),{...t,text:t.text+n,...r&&!t.messageId?{messageId:r}:{}}]:[...e,{role:`thinking`,text:n,...r?{messageId:r}:{}}]})}else if(n===`code_tool_call`){let e=String(t.title??t.toolName??`tool`),n=String(t.toolCallId??``),r=String(t.status??`pending`),i=P(t);w(t=>[...t,{role:`tool`,text:e,toolName:e,toolCallId:n,toolContent:i,toolStatus:We(r)}])}else if(n===`code_tool_call_update`){let e=String(t.toolCallId??``),n=String(t.status??``),r=P(t);w(t=>{let i=g(t,e);if(i<0)return t;let a=[...t],o={...a[i]};return n&&(o.toolStatus=We(n)),r.length>0&&(o.toolContent=r),a[i]=o,a})}else if(n===`code_permission_request`){let t=String(e.permissionId??``),n=e.toolCall??{},r=e.options??[];t&&De(i,H,{permissionId:t,toolCall:n,options:r},{appendMessage:e=>w(t=>[...t,e]),enqueuePermission:e=>T(t=>[...t,e])})}else if(n===`code_session_info_update`){let e=t.title;typeof e==`string`&&F(e)}else if(n===`code_usage_update`){let e={};typeof t.contextTokens==`number`&&(e.contextTokens=t.contextTokens),typeof t.contextLimit==`number`&&(e.contextLimit=t.contextLimit),typeof t.totalCost==`number`&&(e.cost=t.totalCost),L(e)}else if(n===`code_plan`)R((t.entries??[]).filter(e=>e.title).map(e=>({title:String(e.title),status:String(e.status??`pending`)})));else if(n===`code_available_commands_update`)D(Ee(re(t.availableCommands)));else if(n===`code_child_exit`){let t=e.code===null||e.code===void 0?`unknown`:String(e.code),n=`JWC ACP child exited (code ${t}). Active Code sessions were closed. Send the prompt again to start a fresh session, or load a stored session from the sidebar.`;K.current=null,c(null),S(!1),T([]),G({code:t,message:n}),w(e=>[...e,{role:`assistant`,text:n}])}else n===`code_turn_done`?S(!1):n===`code_session_error`&&(w(t=>[...t,{role:`assistant`,text:`Error: ${e.reason??`unknown`}`}]),S(!1));setTimeout(()=>Se(`smooth`),50)}},[i,H,Se]),onTransport:ge});let Le=(0,d.useCallback)(async()=>{let e=y.trim();if(!(!e||x)){J.current=null,S(!0),v(!0),G(null),q.current=e,w(t=>[...t,{role:`user`,text:e,transient:`pending-user-echo`}]),b(``);try{let t=s;if(!t){let e=a||`/tmp`;t=(await i.createSession(e,be||void 0)).sessionId,K.current=t,c(t)}await i.sendPrompt(t,e)}catch(e){q.current=null,w(t=>[...t,{role:`assistant`,text:`Error: ${e instanceof Error?e.message:String(e)}`}]),S(!1)}}},[y,x,s,i,a,be]),Re=(0,d.useCallback)(e=>{b(e),k(e===`/`||e.startsWith(`/`)&&!e.includes(` `))},[]),ze=(0,d.useCallback)(e=>{if(!e.disabledReason){if(e.actionType===`popup`&&e.popupKind){M(``),j({kind:e.popupKind,command:e}),k(!1);return}b(`${e.displayName} `),k(!1)}},[]),Be=(0,d.useCallback)(async(e,t)=>{await Oe(i,H,e,t,e=>w(t=>[...t,e]))&&T(t=>t.filter(t=>t.permissionId!==e.permissionId))},[i,H]),$=(0,d.useCallback)(async(e,t,n)=>{M(``),ie(e),ae(t);let r=n?.closePopup??!0,a=n?.requireActiveSession??!0;if(!s){a&&M(`Start or load a Code session before applying a live model.`);return}try{await i.setSessionModel(s,_(e,t)),r&&j(null)}catch(e){M(e instanceof Error?e.message:String(e))}},[s,i]),Ve=(0,d.useCallback)(async(e,t)=>{M(``);try{Q(await i.setDefaultModel(_(e,t))),Ie()}catch(e){M(e instanceof Error?e.message:String(e))}},[Q,i,Ie]),He=(0,d.useCallback)(async(e,t,n,r)=>{M(``);try{W(await i.setModelAssignment(e,{provider:t,model:n,...r===void 0?{}:{thinkingLevel:r}}))}catch(e){M(e instanceof Error?e.message:String(e))}},[i]),Ke=(0,d.useCallback)(async e=>{M(``);try{W(await i.clearModelAssignment(e))}catch(e){M(e instanceof Error?e.message:String(e))}},[i]),Je=U.providers.find(e=>e.id===z)??U.providers[0],Xe=U.providers.map(e=>e.id),Ze=Je?.models??[],Qe=Je?.efforts??[],$e=e=>{let t=Ge(e.replayEvents??[]);X.current=new Set,Me(X.current,e.replayEvents??[]),Y.current=new Set(t.filter(e=>e.role===`assistant`&&e.text).map(e=>e.text)),K.current=e.sessionId,c(e.sessionId),e.cwd!==a&&(ye.current=!0,o(e.cwd)),w(t),T([]),R([]),F(e.title?.trim()||t.find(e=>e.role===`user`)?.text.split(/\r?\n/)[0]?.replace(/\s+/g,` `).trim()||``),L({}),S(!1),G(null)};if(!e)return(0,m.jsx)(`div`,{className:`code-canvas`,children:(0,m.jsx)(`div`,{className:`code-transcript-empty`,children:(0,m.jsx)(`p`,{children:`Server not available.`})})});let et=(0,m.jsx)(h,{client:i,activeSessionId:s,workingDir:a,onSelectSession:$e,onLoadSession:(e,t)=>{(async()=>{J.current=e,K.current=e,c(e),q.current=null,Y.current=new Set,X.current=new Set,w([]),R([]),F(``),S(!1);try{let n=await i.loadSession(e,t);if(K.current!==e)return;n.title&&F(n.title);let r=Ge(n.replayEvents??[]);X.current=new Set,Me(X.current,n.replayEvents??[]),Y.current=new Set(r.filter(e=>e.role===`assistant`&&e.text).map(e=>e.text)),w(r),S(!1)}catch(t){K.current===e&&(K.current=null,c(null)),w(e=>[...e,{role:`assistant`,text:`Failed to load session: ${t instanceof Error?t.message:String(t)}`}])}finally{J.current===e&&(J.current=null)}})()},onNewSession:()=>{K.current=null,J.current=null,q.current=null,Y.current=new Set,X.current=new Set,c(null),w([]),R([]),F(``),S(!1),v(!1)}}),tt=e=>{ie(e),ae(U.providers.find(t=>t.id===e)?.models[0]??``)},nt=(0,m.jsx)(Ce,{activePopup:A,activeSessionId:s,availableCommands:E,codeWorkingDir:a,currentEffortOptions:Qe,currentModelOptions:Ze,disabled:x,effort:oe,gitInfo:fe,childRecovery:me,transportState:he,inputText:y,messages:C,model:B,modelAssignments:le,modelOptions:U,modelPresets:ue,permissionMode:H,permissions:ee,planEntries:ne,error:te,provider:z,providerOptions:Xe,sending:x,sessionTitle:N,showCommands:O,transcriptRef:xe,usage:I,onClearModelAssignment:Ke,onClosePopup:()=>{M(``),j(null)},onCommandSelect:ze,onEffortChange:e=>{V(e),s&&i.setSessionConfig(s,`thinking`,e)},onFooterProviderChange:e=>{tt(e);let t=U.providers.find(t=>t.id===e),n=t?.models[0]??``;V(t?.efforts.includes(`high`)?`high`:t?.efforts[0]??``),n&&$(e,n,{closePopup:!1,requireActiveSession:!1})},onInputChange:Re,onModelChange:e=>{$(z,e,{closePopup:!1,requireActiveSession:!1})},onPermissionAnswer:Be,onPermissionModeChange:se,onProviderChange:tt,onRefreshProviders:()=>{Fe()},onSetDefaultModel:Ve,onSetModelAssignment:He,onShowCommandsChange:k,onSubmit:()=>{Le()},onUseModel:$,onUseForNewSessions:(e,t)=>{$(e,t,{requireActiveSession:!1,closePopup:!1}),j(null)},onWorkingDirChange:ke,onOpenLocalFile:r,workspaceFrozen:l,onPickWorkingDir:je});return _e?(0,m.jsxs)(m.Fragment,{children:[(0,f.createPortal)((0,m.jsx)(`div`,{className:`code-manager-session-navigator-content`,children:et}),_e),(0,m.jsx)(`div`,{className:`code-canvas code-canvas-workbench`,children:nt})]}):(0,m.jsxs)(`div`,{className:`code-canvas`,children:[(0,m.jsx)(`div`,{className:`code-canvas-sidebar`,children:et}),nt]})}export{Xe as CodeCanvas};