ima2-gen 1.1.19 → 1.1.20

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 (23) hide show
  1. package/README.md +9 -0
  2. package/bin/commands/grok.js +19 -21
  3. package/bin/commands/grok.ts +20 -21
  4. package/docs/migration/runtime-test-inventory.md +2 -1
  5. package/lib/agentGenerationPlanner.js +20 -1
  6. package/lib/agentGenerationPlanner.ts +25 -1
  7. package/lib/agentRuntime.js +5 -3
  8. package/lib/agentRuntime.ts +6 -3
  9. package/package.json +1 -1
  10. package/skills/ima2/SKILL.md +65 -0
  11. package/ui/dist/.vite/manifest.json +11 -11
  12. package/ui/dist/assets/{AgentWorkspace-DE_wg90f.js → AgentWorkspace-DS8uvoLI.js} +1 -1
  13. package/ui/dist/assets/{CardNewsWorkspace--Myc5pAp.js → CardNewsWorkspace-CYxMsE67.js} +1 -1
  14. package/ui/dist/assets/{NodeCanvas-4U5oOT2y.js → NodeCanvas-DccIc347.js} +1 -1
  15. package/ui/dist/assets/{PromptBuilderPanel-DNW1U8zI.js → PromptBuilderPanel-BvxxwSJp.js} +1 -1
  16. package/ui/dist/assets/{PromptImportDialog-o-4Sqki1.js → PromptImportDialog-u1_BFDRd.js} +2 -2
  17. package/ui/dist/assets/{PromptImportDiscoverySection-BAbrRP8B.js → PromptImportDiscoverySection-C5uvkVSz.js} +1 -1
  18. package/ui/dist/assets/{PromptImportFolderSection-L-XI2noz.js → PromptImportFolderSection-D3E_O1SD.js} +1 -1
  19. package/ui/dist/assets/{PromptLibraryPanel-CrW9LYGD.js → PromptLibraryPanel-4gyf9CB9.js} +2 -2
  20. package/ui/dist/assets/{SettingsWorkspace-Dn4SYTyZ.js → SettingsWorkspace-F3eNu3mJ.js} +1 -1
  21. package/ui/dist/assets/{index-CeSZ2L3-.js → index-DYOh6gQD.js} +5 -5
  22. package/ui/dist/assets/{index-BONbNNIi.js → index-DoKtXbod.js} +1 -1
  23. package/ui/dist/index.html +1 -1
package/README.md CHANGED
@@ -313,6 +313,15 @@ npm run build
313
313
 
314
314
  `npm run dev` builds the UI and starts the TypeScript server entry with `--watch` and verbose server diagnostics. `npm run typecheck`, `npm run build:server`, and `npm run build:cli` verify the TypeScript migration and package emit path. Node mode and Canvas Mode are part of the packaged UI by default.
315
315
 
316
+ ## Contributors
317
+
318
+ - [@lidge-jun](https://github.com/lidge-jun) — maintainer
319
+ - [@ree9622](https://github.com/ree9622) — moderation controls, Windows fixes, structured logging
320
+ - [@Charley-Peng](https://github.com/Charley-Peng) — API cache fix (#74)
321
+ - [@philiptaron](https://github.com/philiptaron) — Nix flake (#81)
322
+ - [@aorying](https://github.com/aorying) — upstream validation error surfacing (informed TS migration direction)
323
+ - [@PARKJONGMlN](https://github.com/PARKJONGMlN) — batch comparison matrix design (#80)
324
+
316
325
  ## License
317
326
 
318
327
  MIT
@@ -12,7 +12,7 @@ const HELP = `
12
12
  No separate progrok install is required.
13
13
 
14
14
  Subcommands:
15
- login [--device-code] Log in to xAI OAuth for the bundled proxy
15
+ login [options] Log in to xAI OAuth (default: --manual-paste)
16
16
  logout Remove stored xAI credentials
17
17
  status Show bundled progrok authentication status
18
18
  models List available Grok models
@@ -28,20 +28,13 @@ function localBinPath() {
28
28
  function spawnProgrok(argv, env) {
29
29
  return new Promise((resolve, reject) => {
30
30
  const progrokBin = join(localBinPath(), isWin ? "progrok.cmd" : "progrok");
31
- const child = isWin
32
- ? spawn(progrokBin, argv, {
33
- cwd: ROOT,
34
- env,
35
- stdio: "inherit",
36
- shell: true,
37
- windowsHide: true,
38
- })
39
- : spawn(progrokBin, argv, {
40
- cwd: ROOT,
41
- env,
42
- stdio: "inherit",
43
- windowsHide: true,
44
- });
31
+ const child = spawn(progrokBin, argv, {
32
+ cwd: ROOT,
33
+ env,
34
+ stdio: "inherit",
35
+ shell: isWin,
36
+ windowsHide: true,
37
+ });
45
38
  child.on("error", (err) => reject(err));
46
39
  child.on("close", resolve);
47
40
  });
@@ -57,15 +50,20 @@ export default async function grokCmd(argv) {
57
50
  PATH: `${localBinPath()}${delimiter}${process.env.PATH || ""}`,
58
51
  };
59
52
  try {
53
+ // Default to --manual-paste for login (most reliable across platforms).
54
+ // Users can still pass --device-code or --browser explicitly.
55
+ if (sub === "login" && !argv.includes("--device-code") && !argv.includes("--browser") && !argv.includes("--manual-paste")) {
56
+ argv = [...argv, "--manual-paste"];
57
+ }
60
58
  const code = await spawnProgrok(argv, env);
61
59
  if (code && code !== 0) {
62
- // Auto-fallback: if login (without --device-code) failed, retry with device-code
60
+ // progrok 0.1.1+ defaults to device-code flow already.
61
+ // Do NOT auto-retry with --device-code — it issues a NEW code that
62
+ // invalidates the one the user may already be looking at in their browser.
63
63
  if (sub === "login" && !argv.includes("--device-code")) {
64
- out(color.yellow("⚠ ") + "Browser login failed. Retrying with device-code flow...\n");
65
- const fallbackCode = await spawnProgrok(["login", "--device-code"], env);
66
- if (fallbackCode && fallbackCode !== 0) {
67
- die(fallbackCode, "bundled progrok device-code login also failed");
68
- }
64
+ out(color.yellow("⚠ ") + "Login failed. Try again with:\n");
65
+ out(" ima2 grok login --device-code\n");
66
+ die(code, "bundled progrok login failed");
69
67
  }
70
68
  else {
71
69
  die(code, `bundled progrok exited with code ${code}`);
@@ -13,7 +13,7 @@ const HELP = `
13
13
  No separate progrok install is required.
14
14
 
15
15
  Subcommands:
16
- login [--device-code] Log in to xAI OAuth for the bundled proxy
16
+ login [options] Log in to xAI OAuth (default: --manual-paste)
17
17
  logout Remove stored xAI credentials
18
18
  status Show bundled progrok authentication status
19
19
  models List available Grok models
@@ -31,20 +31,13 @@ function localBinPath() {
31
31
  function spawnProgrok(argv: string[], env: NodeJS.ProcessEnv): Promise<number | null> {
32
32
  return new Promise((resolve, reject) => {
33
33
  const progrokBin = join(localBinPath(), isWin ? "progrok.cmd" : "progrok");
34
- const child = isWin
35
- ? spawn(progrokBin, argv, {
36
- cwd: ROOT,
37
- env,
38
- stdio: "inherit",
39
- shell: true,
40
- windowsHide: true,
41
- })
42
- : spawn(progrokBin, argv, {
43
- cwd: ROOT,
44
- env,
45
- stdio: "inherit",
46
- windowsHide: true,
47
- });
34
+ const child = spawn(progrokBin, argv, {
35
+ cwd: ROOT,
36
+ env,
37
+ stdio: "inherit",
38
+ shell: isWin,
39
+ windowsHide: true,
40
+ });
48
41
  child.on("error", (err) => reject(err));
49
42
  child.on("close", resolve);
50
43
  });
@@ -63,15 +56,21 @@ export default async function grokCmd(argv: string[]) {
63
56
  };
64
57
 
65
58
  try {
59
+ // Default to --manual-paste for login (most reliable across platforms).
60
+ // Users can still pass --device-code or --browser explicitly.
61
+ if (sub === "login" && !argv.includes("--device-code") && !argv.includes("--browser") && !argv.includes("--manual-paste")) {
62
+ argv = [...argv, "--manual-paste"];
63
+ }
64
+
66
65
  const code = await spawnProgrok(argv, env);
67
66
  if (code && code !== 0) {
68
- // Auto-fallback: if login (without --device-code) failed, retry with device-code
67
+ // progrok 0.1.1+ defaults to device-code flow already.
68
+ // Do NOT auto-retry with --device-code — it issues a NEW code that
69
+ // invalidates the one the user may already be looking at in their browser.
69
70
  if (sub === "login" && !argv.includes("--device-code")) {
70
- out(color.yellow("⚠ ") + "Browser login failed. Retrying with device-code flow...\n");
71
- const fallbackCode = await spawnProgrok(["login", "--device-code"], env);
72
- if (fallbackCode && fallbackCode !== 0) {
73
- die(fallbackCode, "bundled progrok device-code login also failed");
74
- }
71
+ out(color.yellow("⚠ ") + "Login failed. Try again with:\n");
72
+ out(" ima2 grok login --device-code\n");
73
+ die(code, "bundled progrok login failed");
75
74
  } else {
76
75
  die(code, `bundled progrok exited with code ${code}`);
77
76
  }
@@ -4,7 +4,7 @@ Generated by `npm run test:inventory` (script: `scripts/classify-tests.mjs`).
4
4
 
5
5
  _Tests considered "runtime-importing" if they import from `../lib/`, `../routes/`, `../bin/`, `../server`, or `../config`._
6
6
 
7
- Total: 167 (runtime: 54, contract: 113)
7
+ Total: 168 (runtime: 55, contract: 113)
8
8
 
9
9
  ## Runtime-importing tests
10
10
  - `tests/agent-mode-auto-planner-contract.test.ts`
@@ -13,6 +13,7 @@ Total: 167 (runtime: 54, contract: 113)
13
13
  - `tests/agent-mode-queue-migration-contract.test.ts`
14
14
  - `tests/agent-mode-runtime-contract.test.ts`
15
15
  - `tests/agent-mode-slash-command-contract.test.ts`
16
+ - `tests/agent-video-intent.test.ts`
16
17
  - `tests/api-cache-policy.test.ts`
17
18
  - `tests/api-provider-parity.test.ts`
18
19
  - `tests/billing-source.test.ts`
@@ -196,7 +196,26 @@ function cleanCount(value, fallback, min, max) {
196
196
  function clampCount(value, max) {
197
197
  return Math.max(1, Math.min(max, Math.round(value)));
198
198
  }
199
- const VIDEO_INTENT_PATTERN = /\b(?:video|animate|animation|동영상|비디오|영상|애니메이트|움직이|클립)\b/iu;
199
+ const VIDEO_INTENT_PATTERN = /(?:^|\s|[^\p{L}])(?:video|animate|animation)(?:\s|[^\p{L}]|$)|(?:동영상|비디오|영상|애니메이트|움직이|클립)/iu;
200
200
  function isVideoIntent(prompt) {
201
201
  return VIDEO_INTENT_PATTERN.test(prompt);
202
202
  }
203
+ const DURATION_PATTERN = /(\d{1,2})\s*(?:s|sec|seconds?|초)/i;
204
+ const RESOLUTION_PATTERN = /(720p|480p)/i;
205
+ const ASPECT_PATTERN = /(16:9|9:16|4:3|3:4|3:2|2:3|1:1)/;
206
+ export function parseVideoParams(prompt) {
207
+ const params = {};
208
+ const durMatch = DURATION_PATTERN.exec(prompt);
209
+ if (durMatch) {
210
+ const d = parseInt(durMatch[1]);
211
+ if (d >= 1 && d <= 15)
212
+ params.duration = d;
213
+ }
214
+ const resMatch = RESOLUTION_PATTERN.exec(prompt);
215
+ if (resMatch)
216
+ params.resolution = resMatch[1].toLowerCase();
217
+ const aspMatch = ASPECT_PATTERN.exec(prompt);
218
+ if (aspMatch)
219
+ params.aspectRatio = aspMatch[1];
220
+ return params;
221
+ }
@@ -242,8 +242,32 @@ function clampCount(value: number, max: number): number {
242
242
  return Math.max(1, Math.min(max, Math.round(value)));
243
243
  }
244
244
 
245
- const VIDEO_INTENT_PATTERN = /\b(?:video|animate|animation|동영상|비디오|영상|애니메이트|움직이|클립)\b/iu;
245
+ const VIDEO_INTENT_PATTERN = /(?:^|\s|[^\p{L}])(?:video|animate|animation)(?:\s|[^\p{L}]|$)|(?:동영상|비디오|영상|애니메이트|움직이|클립)/iu;
246
246
 
247
247
  function isVideoIntent(prompt: string): boolean {
248
248
  return VIDEO_INTENT_PATTERN.test(prompt);
249
249
  }
250
+
251
+ export interface VideoParamsFromPrompt {
252
+ duration?: number;
253
+ resolution?: "480p" | "720p";
254
+ aspectRatio?: string;
255
+ }
256
+
257
+ const DURATION_PATTERN = /(\d{1,2})\s*(?:s|sec|seconds?|초)/i;
258
+ const RESOLUTION_PATTERN = /(720p|480p)/i;
259
+ const ASPECT_PATTERN = /(16:9|9:16|4:3|3:4|3:2|2:3|1:1)/;
260
+
261
+ export function parseVideoParams(prompt: string): VideoParamsFromPrompt {
262
+ const params: VideoParamsFromPrompt = {};
263
+ const durMatch = DURATION_PATTERN.exec(prompt);
264
+ if (durMatch) {
265
+ const d = parseInt(durMatch[1]);
266
+ if (d >= 1 && d <= 15) params.duration = d;
267
+ }
268
+ const resMatch = RESOLUTION_PATTERN.exec(prompt);
269
+ if (resMatch) params.resolution = resMatch[1].toLowerCase() as "480p" | "720p";
270
+ const aspMatch = ASPECT_PATTERN.exec(prompt);
271
+ if (aspMatch) params.aspectRatio = aspMatch[1];
272
+ return params;
273
+ }
@@ -10,6 +10,7 @@ import { resolveProviderOptions } from "./providerOptions.js";
10
10
  import { generateViaResponses } from "./responsesImageAdapter.js";
11
11
  import { generateViaGrok } from "./grokImageAdapter.js";
12
12
  import { generateVideoViaGrok } from "./grokVideoAdapter.js";
13
+ import { parseVideoParams } from "./agentGenerationPlanner.js";
13
14
  import { appendAgentTurn, buildImageContextManifest, getAgentImages, getAgentSession, importAgentImage, recordAgentWebFinding, restartAgentRuntimeSession, } from "./agentStore.js";
14
15
  import { AGENT_ALLOWED_TOOLS, } from "./agentTypes.js";
15
16
  import { errInfo } from "./errInfo.js";
@@ -338,13 +339,14 @@ export async function runAgentVideoGeneration(ctx, sessionId, prompt, options =
338
339
  catch { /* fallback to T2V */ }
339
340
  }
340
341
  }
342
+ const videoParams = parseVideoParams(prompt);
341
343
  const result = await generateVideoViaGrok(prompt, ctx, {
342
344
  model: "grok-imagine-video",
343
345
  mode,
344
346
  sourceImage,
345
- duration: 5,
346
- resolution: "480p",
347
- aspectRatio: "auto",
347
+ duration: videoParams.duration ?? 5,
348
+ resolution: videoParams.resolution ?? "480p",
349
+ aspectRatio: (videoParams.aspectRatio ?? "auto"),
348
350
  requestId,
349
351
  signal: options.signal ?? undefined,
350
352
  });
@@ -10,6 +10,7 @@ import { resolveProviderOptions } from "./providerOptions.js";
10
10
  import { generateViaResponses } from "./responsesImageAdapter.js";
11
11
  import { generateViaGrok, type GrokReferenceImage } from "./grokImageAdapter.js";
12
12
  import { generateVideoViaGrok } from "./grokVideoAdapter.js";
13
+ import { parseVideoParams } from "./agentGenerationPlanner.js";
13
14
  import {
14
15
  appendAgentTurn,
15
16
  buildImageContextManifest,
@@ -434,13 +435,15 @@ export async function runAgentVideoGeneration(
434
435
  }
435
436
  }
436
437
 
438
+ const videoParams = parseVideoParams(prompt);
439
+
437
440
  const result = await generateVideoViaGrok(prompt, ctx, {
438
441
  model: "grok-imagine-video",
439
442
  mode,
440
443
  sourceImage,
441
- duration: 5,
442
- resolution: "480p",
443
- aspectRatio: "auto",
444
+ duration: videoParams.duration ?? 5,
445
+ resolution: videoParams.resolution ?? "480p",
446
+ aspectRatio: (videoParams.aspectRatio ?? "auto") as "auto" | "1:1" | "16:9" | "9:16" | "4:3" | "3:4" | "3:2" | "2:3",
444
447
  requestId,
445
448
  signal: options.signal ?? undefined,
446
449
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ima2-gen",
3
- "version": "1.1.19",
3
+ "version": "1.1.20",
4
4
  "description": "Local OAuth image generation studio with classic and node workflows",
5
5
  "type": "module",
6
6
  "bin": {
@@ -272,3 +272,68 @@ ima2 config keys --json
272
272
  - Use `ima2 capabilities --json` before guessing model names.
273
273
  - Use `ima2 skill path` when an agent needs the installed Markdown skill path.
274
274
  - Use `ima2 inflight ls --json` or `ima2 ps --json` to inspect active jobs.
275
+
276
+ ## Video Generation
277
+
278
+ Generate AI videos via Grok (SuperGrok subscription required).
279
+
280
+ ### Quick Start
281
+
282
+ ```bash
283
+ ima2 video "a cat playing piano" # text-to-video
284
+ ima2 video "animate this" --ref photo.png # image-to-video
285
+ ima2 video "cinematic" --ref a.png --ref b.png # reference-to-video (max 7)
286
+ ```
287
+
288
+ ### Modes (auto-detected from --ref count)
289
+
290
+ | Refs | Mode | Max Duration |
291
+ |------|------|-------------|
292
+ | 0 | text-to-video | 15s |
293
+ | 1 | image-to-video | 15s |
294
+ | 2-7 | reference-to-video | 10s |
295
+
296
+ ### Parameters
297
+
298
+ | Flag | Values | Default |
299
+ |------|--------|---------|
300
+ | `--duration` | 1–15 (seconds) | 5 |
301
+ | `--resolution` | 480p, 720p | 480p |
302
+ | `--aspect-ratio` | auto, 1:1, 16:9, 9:16, 4:3, 3:4, 3:2, 2:3 | auto |
303
+ | `--model` | grok-imagine-video, grok-imagine-video-1.5-preview | grok-imagine-video |
304
+ | `--topic` | any string | (none) |
305
+ | `--session` | session ID | (none) |
306
+ | `-o, --out` | output file path | auto-named in CWD |
307
+ | `--json` | (flag) | false |
308
+
309
+ ### Series Continuity (--topic)
310
+
311
+ Use `--topic` to chain multiple video generations under a theme. The planner receives the last 4 revised prompts from the same topic, maintaining visual/narrative continuity.
312
+
313
+ ```bash
314
+ ima2 video "episode 1: morning routine" --topic "daily-vlog"
315
+ ima2 video "episode 2: commute" --topic "daily-vlog"
316
+ ```
317
+
318
+ ### Planning Layer
319
+
320
+ Prompts are NOT sent directly to the video model. A Grok planner (grok-4.3) rewrites your prompt with web search context for better results. The `revisedPrompt` in the response shows what was actually sent.
321
+
322
+ ### Prerequisites
323
+
324
+ ```bash
325
+ ima2 grok login # authenticate (device-code flow)
326
+ ima2 grok status # verify connection
327
+ ima2 serve # server must be running
328
+ ```
329
+
330
+ ### Output
331
+
332
+ SSE streaming events: `planning` → `submitted` → `progress` (0-100%) → `done`.
333
+ With `--json`, prints the final result object to stdout.
334
+
335
+ ### Discover Valid Parameters
336
+
337
+ ```bash
338
+ ima2 capabilities --json | jq '.valid.videoModels'
339
+ ```
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "index.html": {
3
- "file": "assets/index-CeSZ2L3-.js",
3
+ "file": "assets/index-DYOh6gQD.js",
4
4
  "name": "index",
5
5
  "src": "index.html",
6
6
  "isEntry": true,
@@ -20,7 +20,7 @@
20
20
  ]
21
21
  },
22
22
  "src/components/NodeCanvas.tsx": {
23
- "file": "assets/NodeCanvas-4U5oOT2y.js",
23
+ "file": "assets/NodeCanvas-DccIc347.js",
24
24
  "name": "NodeCanvas",
25
25
  "src": "src/components/NodeCanvas.tsx",
26
26
  "isDynamicEntry": true,
@@ -32,7 +32,7 @@
32
32
  ]
33
33
  },
34
34
  "src/components/PromptImportDialog.tsx": {
35
- "file": "assets/PromptImportDialog-o-4Sqki1.js",
35
+ "file": "assets/PromptImportDialog-u1_BFDRd.js",
36
36
  "name": "PromptImportDialog",
37
37
  "src": "src/components/PromptImportDialog.tsx",
38
38
  "isDynamicEntry": true,
@@ -45,7 +45,7 @@
45
45
  ]
46
46
  },
47
47
  "src/components/PromptImportDiscoverySection.tsx": {
48
- "file": "assets/PromptImportDiscoverySection-BAbrRP8B.js",
48
+ "file": "assets/PromptImportDiscoverySection-C5uvkVSz.js",
49
49
  "name": "PromptImportDiscoverySection",
50
50
  "src": "src/components/PromptImportDiscoverySection.tsx",
51
51
  "isDynamicEntry": true,
@@ -54,7 +54,7 @@
54
54
  ]
55
55
  },
56
56
  "src/components/PromptImportFolderSection.tsx": {
57
- "file": "assets/PromptImportFolderSection-L-XI2noz.js",
57
+ "file": "assets/PromptImportFolderSection-D3E_O1SD.js",
58
58
  "name": "PromptImportFolderSection",
59
59
  "src": "src/components/PromptImportFolderSection.tsx",
60
60
  "isDynamicEntry": true,
@@ -63,7 +63,7 @@
63
63
  ]
64
64
  },
65
65
  "src/components/PromptLibraryPanel.tsx": {
66
- "file": "assets/PromptLibraryPanel-CrW9LYGD.js",
66
+ "file": "assets/PromptLibraryPanel-4gyf9CB9.js",
67
67
  "name": "PromptLibraryPanel",
68
68
  "src": "src/components/PromptLibraryPanel.tsx",
69
69
  "isDynamicEntry": true,
@@ -75,7 +75,7 @@
75
75
  ]
76
76
  },
77
77
  "src/components/SettingsWorkspace.tsx": {
78
- "file": "assets/SettingsWorkspace-Dn4SYTyZ.js",
78
+ "file": "assets/SettingsWorkspace-F3eNu3mJ.js",
79
79
  "name": "SettingsWorkspace",
80
80
  "src": "src/components/SettingsWorkspace.tsx",
81
81
  "isDynamicEntry": true,
@@ -84,7 +84,7 @@
84
84
  ]
85
85
  },
86
86
  "src/components/agent/AgentWorkspace.tsx": {
87
- "file": "assets/AgentWorkspace-DE_wg90f.js",
87
+ "file": "assets/AgentWorkspace-DS8uvoLI.js",
88
88
  "name": "AgentWorkspace",
89
89
  "src": "src/components/agent/AgentWorkspace.tsx",
90
90
  "isDynamicEntry": true,
@@ -93,7 +93,7 @@
93
93
  ]
94
94
  },
95
95
  "src/components/canvas-mode/index.ts": {
96
- "file": "assets/index-BONbNNIi.js",
96
+ "file": "assets/index-DoKtXbod.js",
97
97
  "name": "index",
98
98
  "src": "src/components/canvas-mode/index.ts",
99
99
  "isDynamicEntry": true,
@@ -102,7 +102,7 @@
102
102
  ]
103
103
  },
104
104
  "src/components/card-news/CardNewsWorkspace.tsx": {
105
- "file": "assets/CardNewsWorkspace--Myc5pAp.js",
105
+ "file": "assets/CardNewsWorkspace-CYxMsE67.js",
106
106
  "name": "CardNewsWorkspace",
107
107
  "src": "src/components/card-news/CardNewsWorkspace.tsx",
108
108
  "isDynamicEntry": true,
@@ -111,7 +111,7 @@
111
111
  ]
112
112
  },
113
113
  "src/components/prompt-builder/PromptBuilderPanel.tsx": {
114
- "file": "assets/PromptBuilderPanel-DNW1U8zI.js",
114
+ "file": "assets/PromptBuilderPanel-BvxxwSJp.js",
115
115
  "name": "PromptBuilderPanel",
116
116
  "src": "src/components/prompt-builder/PromptBuilderPanel.tsx",
117
117
  "isDynamicEntry": true,
@@ -1,3 +1,3 @@
1
- import{a as d,j as e,u as p,i as Qe,s as Ge,t as J,D as Ke,b as B,U as je}from"./index-CeSZ2L3-.js";async function $(n,t){const s=await fetch(n,t);if(!s.ok){const r=await s.json().catch(()=>({})),l=r.error,a=typeof l=="string"?l:l?.message??`Request failed: ${s.status}`,o=new Error(a);throw o.status=s.status,o.code=typeof l=="object"?l?.code:r.code,o}return await s.json()}function Ve(n){return n.filename?`/generated/${n.filename}`:typeof n.url=="string"&&n.url?n.url:typeof n.thumb=="string"&&n.thumb?n.thumb:null}function He(n){const t=Ve(n);if(!t)return null;const s=n.filename??n.canvasEditableFilename??"current-image.png";return{id:`current-${s}`,filename:s,url:t,thumbUrl:n.thumb??t,prompt:n.prompt??n.userPrompt??null,revisedPrompt:n.revisedPrompt??null,createdAt:n.createdAt??Date.now()}}async function ie(n){const t=n?`?selectedSessionId=${encodeURIComponent(n)}`:"";return $(`/api/agent/sessions${t}`)}async function ce(n){const t=n.currentImage?He(n.currentImage):null;return $("/api/agent/sessions",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({title:n.title,currentImage:t,webSearchEnabled:n.webSearchEnabled??!0})})}async function X(n,t){return $(`/api/agent/sessions/${encodeURIComponent(n)}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)})}async function Je(n){return $(`/api/agent/sessions/${encodeURIComponent(n)}`,{method:"DELETE"})}async function Xe(n,t,s){return $(`/api/agent/sessions/${encodeURIComponent(n)}/queue`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({prompt:t,options:s})})}async function Ye(n){return $(`/api/agent/queue/${encodeURIComponent(n)}/cancel`,{method:"POST"})}async function Ze(n){return $(`/api/agent/queue/${encodeURIComponent(n)}/retry`,{method:"POST"})}const en={provider:"oauth",model:"gpt-5.4-mini",quality:"medium",size:"1024x1024",format:"png",moderation:"low",reasoningEffort:"medium",webSearchEnabled:!0,generationStrategy:"auto",variants:1,maxAutoVariants:8,parallelism:2};function ue(n){return{...en,...n??{}}}function de(n){const{width:t,height:s}=n;return s<560&&t<1280?"mobile-chat-image-sheet":t>=1280?"desktop-three-pane":t>=960&&s>=560?"desktop-rail":t>=768&&s>=700?"tablet-stacked":"mobile-chat-image-sheet"}function ge(){return typeof window>"u"?1440:window.innerWidth}function he(){return typeof window>"u"?900:window.innerHeight}function nn(){const[n,t]=d.useState(()=>de({width:ge(),height:he()}));return d.useEffect(()=>{const s=()=>t(de({width:ge(),height:he()}));return s(),window.addEventListener("resize",s),()=>window.removeEventListener("resize",s)},[]),n}function w({size:n=16,children:t}){return e.jsx("svg",{width:n,height:n,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:t})}function Z(n){return e.jsxs(w,{...n,children:[e.jsx("path",{d:"M12 5v14"}),e.jsx("path",{d:"M5 12h14"})]})}function fe(n){return e.jsxs(w,{...n,children:[e.jsx("circle",{cx:"11",cy:"11",r:"7"}),e.jsx("path",{d:"M21 21l-4.3-4.3"})]})}function D(n){return e.jsxs(w,{...n,children:[e.jsx("rect",{x:"3",y:"5",width:"18",height:"14",rx:"2"}),e.jsx("circle",{cx:"8",cy:"10",r:"1.5"}),e.jsx("path",{d:"M21 16l-5-5L5 19"})]})}function ee(n){return e.jsxs(w,{...n,children:[e.jsx("path",{d:"M18 6L6 18"}),e.jsx("path",{d:"M6 6l12 12"})]})}function tn(n){return e.jsxs(w,{...n,children:[e.jsx("path",{d:"M22 2L11 13"}),e.jsx("path",{d:"M22 2l-7 20-4-9-9-4 20-7z"})]})}function sn(n){return e.jsx(w,{...n,children:e.jsx("path",{d:"M21.4 11.1l-9.2 9.1a6 6 0 0 1-8.5-8.5l9.2-9.2a4 4 0 0 1 5.7 5.7l-9.2 9.2a2 2 0 0 1-2.8-2.8l8.5-8.5"})})}function an(n){return e.jsxs(w,{...n,children:[e.jsx("circle",{cx:"12",cy:"12",r:"10"}),e.jsx("path",{d:"M2 12h20"}),e.jsx("path",{d:"M12 2a15.3 15.3 0 0 1 0 20"}),e.jsx("path",{d:"M12 2a15.3 15.3 0 0 0 0 20"})]})}function be(n){return e.jsxs(w,{...n,children:[e.jsx("path",{d:"M4 6h16"}),e.jsx("path",{d:"M4 12h16"}),e.jsx("path",{d:"M4 18h16"})]})}function rn(n){return e.jsxs(w,{...n,children:[e.jsx("path",{d:"M3 6h18"}),e.jsx("path",{d:"M8 6V4h8v2"}),e.jsx("path",{d:"M19 6l-1 14H6L5 6"})]})}function ln(n){return e.jsxs(w,{...n,children:[e.jsx("path",{d:"M12 20h9"}),e.jsx("path",{d:"M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4 12.5-12.5z"})]})}function ye(n){return e.jsx(w,{...n,children:e.jsx("path",{d:"M6 9l6 6 6-6"})})}function Se(n){return e.jsx(w,{...n,children:e.jsx("path",{d:"M9 6l6 6-6 6"})})}const me=[{name:"question",display:"/question",aliases:["question","ask","q"],descriptionKey:"agent.slashDesc_question"},{name:"variants",display:"/variants <N>",aliases:["variants","variant","v","n"],descriptionKey:"agent.slashDesc_variants",hasValue:!0},{name:"generate",display:"/generate <N>",aliases:["generate","gen","g"],descriptionKey:"agent.slashDesc_generate",hasValue:!0},{name:"parallelism",display:"/parallelism <N>",aliases:["parallelism","parallel","p"],descriptionKey:"agent.slashDesc_parallelism",hasValue:!0},{name:"help",display:"/help",aliases:["help","h"],descriptionKey:"agent.slashDesc_help"}];function ve(n){const t=n.toLowerCase();return t?me.filter(s=>s.aliases.some(r=>r.startsWith(t))):me}function on({listboxId:n,query:t,highlightIndex:s,onSelect:r,onHighlightChange:l}){const{t:a}=p(),o=ve(t);return o.length===0?null:e.jsx("ul",{id:n,className:"slash-command-menu",role:"listbox","aria-label":a("agent.slashCommands"),children:o.map((i,c)=>e.jsxs("li",{id:`${n}-opt-${c}`,role:"option","aria-selected":c===s,className:`slash-command-menu__item${c===s?" is-highlighted":""}`,onMouseDown:u=>u.preventDefault(),onClick:()=>r(i),onMouseEnter:()=>l(c),children:[e.jsx("span",{className:"slash-command-menu__name",children:i.display}),e.jsx("span",{className:"slash-command-menu__desc",children:a(i.descriptionKey)})]},i.name))})}function cn({webSearchEnabled:n,insertedPrompt:t,onWebSearchChange:s,onSend:r}){const{t:l}=p(),[a,o]=d.useState(""),[i,c]=d.useState(0),[u,m]=d.useState(!1),h=d.useRef(null),x=d.useId(),j=a.trim().length>0,y=a.trimStart().match(/^\/([a-z]*)$/i),M=y!==null,I=M&&!u,T=y?.[1]??"",_=ve(T),q=I&&_.length>0,k=_.length>0?Math.min(i,_.length-1):0,O=q?`${x}-opt-${k}`:void 0;d.useEffect(()=>{c(0),m(!1)},[T]),d.useEffect(()=>{M&&m(!1)},[M]),d.useEffect(()=>{t?.text&&o(f=>f.trim()?`${f.trim()}
1
+ import{a as d,j as e,u as p,i as Qe,s as Ge,t as J,D as Ke,b as B,U as je}from"./index-DYOh6gQD.js";async function $(n,t){const s=await fetch(n,t);if(!s.ok){const r=await s.json().catch(()=>({})),l=r.error,a=typeof l=="string"?l:l?.message??`Request failed: ${s.status}`,o=new Error(a);throw o.status=s.status,o.code=typeof l=="object"?l?.code:r.code,o}return await s.json()}function Ve(n){return n.filename?`/generated/${n.filename}`:typeof n.url=="string"&&n.url?n.url:typeof n.thumb=="string"&&n.thumb?n.thumb:null}function He(n){const t=Ve(n);if(!t)return null;const s=n.filename??n.canvasEditableFilename??"current-image.png";return{id:`current-${s}`,filename:s,url:t,thumbUrl:n.thumb??t,prompt:n.prompt??n.userPrompt??null,revisedPrompt:n.revisedPrompt??null,createdAt:n.createdAt??Date.now()}}async function ie(n){const t=n?`?selectedSessionId=${encodeURIComponent(n)}`:"";return $(`/api/agent/sessions${t}`)}async function ce(n){const t=n.currentImage?He(n.currentImage):null;return $("/api/agent/sessions",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({title:n.title,currentImage:t,webSearchEnabled:n.webSearchEnabled??!0})})}async function X(n,t){return $(`/api/agent/sessions/${encodeURIComponent(n)}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)})}async function Je(n){return $(`/api/agent/sessions/${encodeURIComponent(n)}`,{method:"DELETE"})}async function Xe(n,t,s){return $(`/api/agent/sessions/${encodeURIComponent(n)}/queue`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({prompt:t,options:s})})}async function Ye(n){return $(`/api/agent/queue/${encodeURIComponent(n)}/cancel`,{method:"POST"})}async function Ze(n){return $(`/api/agent/queue/${encodeURIComponent(n)}/retry`,{method:"POST"})}const en={provider:"oauth",model:"gpt-5.4-mini",quality:"medium",size:"1024x1024",format:"png",moderation:"low",reasoningEffort:"medium",webSearchEnabled:!0,generationStrategy:"auto",variants:1,maxAutoVariants:8,parallelism:2};function ue(n){return{...en,...n??{}}}function de(n){const{width:t,height:s}=n;return s<560&&t<1280?"mobile-chat-image-sheet":t>=1280?"desktop-three-pane":t>=960&&s>=560?"desktop-rail":t>=768&&s>=700?"tablet-stacked":"mobile-chat-image-sheet"}function ge(){return typeof window>"u"?1440:window.innerWidth}function he(){return typeof window>"u"?900:window.innerHeight}function nn(){const[n,t]=d.useState(()=>de({width:ge(),height:he()}));return d.useEffect(()=>{const s=()=>t(de({width:ge(),height:he()}));return s(),window.addEventListener("resize",s),()=>window.removeEventListener("resize",s)},[]),n}function w({size:n=16,children:t}){return e.jsx("svg",{width:n,height:n,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:t})}function Z(n){return e.jsxs(w,{...n,children:[e.jsx("path",{d:"M12 5v14"}),e.jsx("path",{d:"M5 12h14"})]})}function fe(n){return e.jsxs(w,{...n,children:[e.jsx("circle",{cx:"11",cy:"11",r:"7"}),e.jsx("path",{d:"M21 21l-4.3-4.3"})]})}function D(n){return e.jsxs(w,{...n,children:[e.jsx("rect",{x:"3",y:"5",width:"18",height:"14",rx:"2"}),e.jsx("circle",{cx:"8",cy:"10",r:"1.5"}),e.jsx("path",{d:"M21 16l-5-5L5 19"})]})}function ee(n){return e.jsxs(w,{...n,children:[e.jsx("path",{d:"M18 6L6 18"}),e.jsx("path",{d:"M6 6l12 12"})]})}function tn(n){return e.jsxs(w,{...n,children:[e.jsx("path",{d:"M22 2L11 13"}),e.jsx("path",{d:"M22 2l-7 20-4-9-9-4 20-7z"})]})}function sn(n){return e.jsx(w,{...n,children:e.jsx("path",{d:"M21.4 11.1l-9.2 9.1a6 6 0 0 1-8.5-8.5l9.2-9.2a4 4 0 0 1 5.7 5.7l-9.2 9.2a2 2 0 0 1-2.8-2.8l8.5-8.5"})})}function an(n){return e.jsxs(w,{...n,children:[e.jsx("circle",{cx:"12",cy:"12",r:"10"}),e.jsx("path",{d:"M2 12h20"}),e.jsx("path",{d:"M12 2a15.3 15.3 0 0 1 0 20"}),e.jsx("path",{d:"M12 2a15.3 15.3 0 0 0 0 20"})]})}function be(n){return e.jsxs(w,{...n,children:[e.jsx("path",{d:"M4 6h16"}),e.jsx("path",{d:"M4 12h16"}),e.jsx("path",{d:"M4 18h16"})]})}function rn(n){return e.jsxs(w,{...n,children:[e.jsx("path",{d:"M3 6h18"}),e.jsx("path",{d:"M8 6V4h8v2"}),e.jsx("path",{d:"M19 6l-1 14H6L5 6"})]})}function ln(n){return e.jsxs(w,{...n,children:[e.jsx("path",{d:"M12 20h9"}),e.jsx("path",{d:"M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4 12.5-12.5z"})]})}function ye(n){return e.jsx(w,{...n,children:e.jsx("path",{d:"M6 9l6 6 6-6"})})}function Se(n){return e.jsx(w,{...n,children:e.jsx("path",{d:"M9 6l6 6-6 6"})})}const me=[{name:"question",display:"/question",aliases:["question","ask","q"],descriptionKey:"agent.slashDesc_question"},{name:"variants",display:"/variants <N>",aliases:["variants","variant","v","n"],descriptionKey:"agent.slashDesc_variants",hasValue:!0},{name:"generate",display:"/generate <N>",aliases:["generate","gen","g"],descriptionKey:"agent.slashDesc_generate",hasValue:!0},{name:"parallelism",display:"/parallelism <N>",aliases:["parallelism","parallel","p"],descriptionKey:"agent.slashDesc_parallelism",hasValue:!0},{name:"help",display:"/help",aliases:["help","h"],descriptionKey:"agent.slashDesc_help"}];function ve(n){const t=n.toLowerCase();return t?me.filter(s=>s.aliases.some(r=>r.startsWith(t))):me}function on({listboxId:n,query:t,highlightIndex:s,onSelect:r,onHighlightChange:l}){const{t:a}=p(),o=ve(t);return o.length===0?null:e.jsx("ul",{id:n,className:"slash-command-menu",role:"listbox","aria-label":a("agent.slashCommands"),children:o.map((i,c)=>e.jsxs("li",{id:`${n}-opt-${c}`,role:"option","aria-selected":c===s,className:`slash-command-menu__item${c===s?" is-highlighted":""}`,onMouseDown:u=>u.preventDefault(),onClick:()=>r(i),onMouseEnter:()=>l(c),children:[e.jsx("span",{className:"slash-command-menu__name",children:i.display}),e.jsx("span",{className:"slash-command-menu__desc",children:a(i.descriptionKey)})]},i.name))})}function cn({webSearchEnabled:n,insertedPrompt:t,onWebSearchChange:s,onSend:r}){const{t:l}=p(),[a,o]=d.useState(""),[i,c]=d.useState(0),[u,m]=d.useState(!1),h=d.useRef(null),x=d.useId(),j=a.trim().length>0,y=a.trimStart().match(/^\/([a-z]*)$/i),M=y!==null,I=M&&!u,T=y?.[1]??"",_=ve(T),q=I&&_.length>0,k=_.length>0?Math.min(i,_.length-1):0,O=q?`${x}-opt-${k}`:void 0;d.useEffect(()=>{c(0),m(!1)},[T]),d.useEffect(()=>{M&&m(!1)},[M]),d.useEffect(()=>{t?.text&&o(f=>f.trim()?`${f.trim()}
2
2
 
3
3
  ${t.text}`:t.text)},[t]);const N=()=>{const f=a.trim();f&&(r(f),o(""))},S=f=>{o(`/${f.name} `),h.current?.focus()};return e.jsxs("div",{className:"agent-composer",children:[q&&e.jsx(on,{listboxId:x,query:T,highlightIndex:k,onSelect:S,onHighlightChange:c}),e.jsx("textarea",{ref:h,value:a,"aria-autocomplete":"list","aria-haspopup":"listbox","aria-label":l("agent.composerPlaceholder"),...q?{"aria-controls":x}:{},"aria-activedescendant":O,autoCapitalize:"off",autoCorrect:"off",placeholder:l("agent.composerPlaceholder"),onChange:f=>o(f.target.value),onKeyDown:f=>{if(f.key==="Enter"&&(f.metaKey||f.ctrlKey)){f.preventDefault(),N();return}if(q)switch(f.key){case"Tab":{f.preventDefault(),S(_[k]);return}case"ArrowDown":{f.preventDefault(),c((k+1)%_.length);return}case"ArrowUp":{f.preventDefault(),c((k-1+_.length)%_.length);return}case"Enter":{f.preventDefault(),S(_[k]);return}case"Escape":{f.preventDefault(),m(!0);return}}}}),e.jsxs("div",{className:"agent-composer__actions",children:[e.jsx("button",{type:"button","aria-label":l("agent.attachReference"),title:l("agent.attachReference"),children:e.jsx(sn,{size:16})}),e.jsx("button",{type:"button",className:n?"is-active":"","aria-pressed":n,onClick:()=>s(!n),"aria-label":l("agent.webSearch"),title:l("agent.webSearch"),children:e.jsx(an,{size:16})}),e.jsxs("button",{type:"button",className:"agent-composer__send",onClick:N,disabled:!j,"aria-label":l("agent.send"),children:[e.jsx(tn,{size:16}),e.jsx("span",{children:l("agent.send")})]})]})]})}function z({src:n,alt:t,className:s,fallbackClassName:r,iconSize:l=18}){const[a,o]=d.useState(!1);return!n||a?e.jsx("span",{className:r??"agent-image-fallback","aria-label":t,role:"img",children:e.jsx(D,{size:l})}):Qe(n)?e.jsx("video",{className:s,src:n,controls:!0,loop:!0,playsInline:!0,muted:!0}):e.jsx("img",{className:s,src:n,alt:t,onError:()=>o(!0)})}const P=d.forwardRef(function({image:t,selected:s=!1,compact:r=!1,onSelect:l},a){const{t:o}=p(),i=`${o("agent.selectImage")}: ${t.prompt??t.filename}`,c=`${r?"agent-result-thumb agent-result-thumb--compact":"agent-result-thumb"}${s?" is-selected":""}`;return e.jsx("button",{ref:a,type:"button",className:c,"aria-label":i,"aria-current":s?"true":void 0,onClick:()=>l(t.id),title:o("agent.selectImage"),children:e.jsx(z,{src:t.thumbUrl??t.url,alt:t.prompt??o("agent.imageAlt"),iconSize:r?14:18})})});function un({turn:n,imagesById:t,currentImageId:s,onImageSelect:r}){const{t:l}=p(),a=n.role==="user"?l("agent.user"):l("agent.assistant"),o=n.imageIds??[],i=`agent-message agent-message--${n.role}${n.status==="streaming"?" is-streaming":""}`;return e.jsxs("article",{className:i,"aria-busy":n.status==="streaming"?"true":void 0,children:[e.jsx("div",{className:"agent-message__role",children:a}),e.jsx("p",{children:n.text}),o.length>0?e.jsx("div",{className:"agent-message__images",children:o.map(c=>{const u=t[c];return u?e.jsx(P,{image:u,selected:c===s,compact:!1,onSelect:r},c):null})}):null]})}const dn=["ima2.get_image_context","ima2.web_search","ima2.generate_image"];function gn(n){return n.replace(/\s+/g," ").trim()||"tool"}function hn(n){if(n.toolCalls?.length)return n.toolCalls;const t=gn(n.text);return dn.filter(s=>t.includes(s)).map((s,r)=>({id:`${n.id}-fallback-${r}`,name:s,status:n.status==="error"?"error":n.status==="streaming"?"running":"complete",outputSummary:t,imageIds:s==="ima2.generate_image"?n.imageIds??[]:[],webFindingIds:s==="ima2.web_search"?n.webFindingIds??[]:[]}))}function we(n){return!n||n<0?null:n<1e3?`${n}ms`:`${(n/1e3).toFixed(1)}s`}function mn({call:n,imagesById:t,currentImageId:s,onImageSelect:r}){const{t:l}=p(),a=n.imageIds??[],o=we(n.durationMs);return e.jsxs("div",{className:"agent-tool-call-details",children:[e.jsxs("dl",{children:[e.jsxs("div",{children:[e.jsx("dt",{children:l("agent.toolInput")}),e.jsx("dd",{children:n.inputSummary??"-"})]}),e.jsxs("div",{children:[e.jsx("dt",{children:l("agent.toolOutput")}),e.jsx("dd",{children:n.errorMessage??n.outputSummary??"-"})]}),n.requestId?e.jsxs("div",{children:[e.jsx("dt",{children:l("agent.requestId")}),e.jsx("dd",{children:n.requestId})]}):null,o?e.jsxs("div",{children:[e.jsx("dt",{children:l("agent.duration")}),e.jsx("dd",{children:o})]}):null]}),a.length>0?e.jsx("div",{className:"agent-tool-call-details__artifacts","aria-label":l("agent.toolArtifacts"),children:a.map(i=>{const c=t[i];return c?e.jsx(P,{image:c,selected:i===s,compact:!0,onSelect:r},i):null})}):null]})}function pn({call:n,imagesById:t,currentImageId:s,onImageSelect:r}){const{t:l}=p(),a=d.useId(),[o,i]=d.useState(!1),c=we(n.durationMs);return e.jsxs("li",{className:`agent-tool-call-row agent-tool-call-row--${n.status}`,children:[e.jsxs("button",{type:"button",className:"agent-tool-call-row__toggle","aria-expanded":o,"aria-controls":a,"aria-busy":n.status==="running"?"true":void 0,onClick:()=>i(u=>!u),children:[e.jsx("span",{className:"agent-tool-call-row__status","aria-label":l(`agent.toolStatus.${n.status}`)}),e.jsx("span",{className:"agent-tool-call-row__name",children:n.name}),n.imageIds?.length?e.jsx("span",{className:"agent-tool-call-row__meta",children:l("agent.toolImageCount",{count:n.imageIds.length})}):null,c?e.jsx("span",{className:"agent-tool-call-row__meta",children:c}):null,o?e.jsx(ye,{size:13}):e.jsx(Se,{size:13})]}),e.jsx("div",{id:a,hidden:!o,children:e.jsx(mn,{call:n,imagesById:t,currentImageId:s,onImageSelect:r})})]})}function xn(n){const t=[],s=new Set;let r=!1;const l=[];for(const a of n){const o=hn(a);t.push(...o);for(const i of a.imageIds??[])s.add(i);for(const i of o)for(const c of i.imageIds??[])s.add(c);a.status==="streaming"&&(r=!0);for(const i of o)l.includes(i.name)||l.push(i.name)}return{toolCalls:t,imageIds:[...s],isStreaming:r,label:l.join(" + ")||"tool"}}function jn({turns:n,imagesById:t,currentImageId:s,onImageSelect:r}){const{t:l}=p(),a=d.useId(),[o,i]=d.useState(!1),{toolCalls:c,imageIds:u,isStreaming:m,label:h}=d.useMemo(()=>xn(n),[n]),x=l(o?"agent.toolCollapse":"agent.toolExpand");return e.jsxs("article",{className:`agent-message agent-message--tool is-collapsible${m?" is-streaming":""}`,"aria-busy":m?"true":void 0,children:[e.jsxs("div",{className:"agent-message__tool-summary",children:[e.jsxs("button",{type:"button",className:"agent-message__tool-toggle","aria-expanded":o,"aria-controls":a,"aria-label":`${x}: ${h}`,onClick:()=>i(j=>!j),children:[e.jsxs("span",{className:"agent-message__tool-header",children:[e.jsx("span",{className:"agent-message__tool-dot","aria-hidden":"true"}),e.jsx("span",{className:"agent-message__role",children:l("agent.toolGroup")}),u.length>0?e.jsx("span",{className:"agent-message__tool-count",children:l("agent.toolImageCount",{count:u.length})}):null,c.length>0?e.jsx("span",{className:"agent-message__tool-count",children:l("agent.toolCallCount",{count:c.length})}):null,o?e.jsx(ye,{size:14}):e.jsx(Se,{size:14})]}),e.jsx("span",{className:"agent-message__tool-label",children:h})]}),u.length>0?e.jsx("div",{className:"agent-message__tool-thumbs",children:u.map(j=>{const y=t[j];return y?e.jsx(P,{image:y,selected:j===s,compact:!0,onSelect:r},j):null})}):null]}),e.jsx("div",{id:a,className:"agent-message__tool-details",hidden:!o,children:c.length>0?e.jsx("ul",{className:"agent-tool-call-list",children:c.map(j=>e.jsx(pn,{call:j,imagesById:t,currentImageId:s,onImageSelect:r},j.id))}):null})]})}function fn(n){const t=[];let s=[];const r=()=>{s.length!==0&&(t.push({kind:"tools",turns:s,key:s.map(l=>l.id).join("+")}),s=[])};for(const l of n)l.role==="tool"?s.push(l):(r(),t.push({kind:"single",turn:l}));return r(),t}function bn({turns:n,imagesById:t,currentImageId:s,onImageSelect:r}){const{t:l}=p(),a=d.useRef(null),o=d.useMemo(()=>fn(n),[n]);return d.useEffect(()=>{const i=a.current;i&&(i.scrollTop=i.scrollHeight)},[n.length]),e.jsxs("div",{ref:a,className:"agent-message-list",children:[n.length===0?e.jsx("div",{className:"agent-message-list__empty",children:l("agent.emptyChat")}):null,o.map(i=>i.kind==="tools"?e.jsx(jn,{turns:i.turns,imagesById:t,currentImageId:s,onImageSelect:r},i.key):e.jsx(un,{turn:i.turn,imagesById:t,currentImageId:s,onImageSelect:r},i.turn.id))]})}function yn({status:n,compacted:t=!1}){const{t:s}=p(),r=s(n==="generating"?"agent.statusGenerating":n==="reconnecting"?"agent.statusReconnecting":"agent.statusReady");return e.jsxs("span",{className:`agent-status agent-status--${n}`,"aria-live":n==="ready"?void 0:"polite",children:[n==="generating"?e.jsx("span",{className:"agent-status__dot","aria-hidden":"true"}):null,e.jsx("span",{children:r}),t?e.jsx("em",{children:s("agent.compacted")}):null]})}function Sn(n){const t=n.generationStrategy==="auto"?`auto<=${n.maxAutoVariants}`:`${n.variants}x`;return`${n.model} · ${n.quality} · ${t}/${n.parallelism}p`}function vn({session:n,turns:t,imagesById:s,currentImageId:r,runtimeStatus:l,settings:a,insertedPrompt:o,onOpenModelSettings:i,onWebSearchChange:c,onImageSelect:u,onSend:m}){const{t:h}=p(),x=a?Sn(a):null;return e.jsxs("section",{className:"agent-chat","aria-label":h("agent.chat"),children:[e.jsxs("header",{className:"agent-pane-header",children:[e.jsxs("div",{className:"agent-pane-header__title",children:[e.jsx("span",{children:h("agent.chat")}),e.jsx("strong",{children:n?.title??h("agent.newSession")})]}),e.jsxs("div",{className:"agent-pane-header__actions",children:[x?e.jsxs("button",{type:"button",className:"agent-model-chip","aria-label":h("agent.openModelSettings"),title:h("agent.openModelSettings"),onClick:i,children:[e.jsx("span",{children:h("agent.model")}),e.jsx("strong",{children:x})]}):null,e.jsx(yn,{status:l,compacted:n?.compacted})]})]}),e.jsx(bn,{turns:t,imagesById:s,currentImageId:r,onImageSelect:u}),e.jsx(cn,{webSearchEnabled:n?.webSearchEnabled??!1,insertedPrompt:o,onWebSearchChange:c,onSend:m})]})}const wn=["image","refs","web","memory"];function In({activeTab:n,onChange:t}){const{t:s}=p(),r={image:s("agent.imageTab"),refs:s("agent.refsTab"),web:s("agent.webTab"),memory:s("agent.memoryTab")};return e.jsx("div",{className:"agent-context-tabs",role:"tablist","aria-label":s("agent.contextTabs"),children:wn.map(l=>e.jsx("button",{type:"button",role:"tab","aria-selected":n===l,className:n===l?"active":"",onClick:()=>t(l),children:r[l]},l))})}function _n({activeTab:n,currentImage:t}){const{t:s}=p();return n==="refs"?e.jsx("div",{className:"agent-tab-empty",children:s("agent.noRefs")}):n==="web"?e.jsx("div",{className:"agent-tab-empty",children:s("agent.noWeb")}):n==="memory"?e.jsxs("ul",{className:"agent-memory-list",children:[e.jsx("li",{children:s("agent.memoryItemStyle")}),e.jsx("li",{children:s("agent.memoryItemSubject")})]}):e.jsxs("dl",{className:"agent-image-meta",children:[e.jsxs("div",{children:[e.jsx("dt",{children:s("agent.filename")}),e.jsx("dd",{children:t?.filename??"-"})]}),e.jsxs("div",{children:[e.jsx("dt",{children:s("agent.prompt")}),e.jsx("dd",{children:t?.prompt??t?.revisedPrompt??"-"})]})]})}function Ie({currentImage:n,images:t,activeTab:s,onTabChange:r,onImageSelect:l,headerAction:a}){const{t:o}=p(),i=d.useRef({}),c=d.useMemo(()=>t.findIndex(h=>h.id===n?.id),[n?.id,t]);d.useEffect(()=>{n?.id&&i.current[n.id]?.scrollIntoView({block:"nearest",inline:"nearest"})},[n?.id]);const u=d.useCallback(h=>{const x=t[h];x&&l(x.id)},[t,l]),m=d.useCallback(h=>{if(t.length===0)return;const x=c>=0?c:0;let j=null;(h.key==="ArrowLeft"||h.key==="ArrowUp")&&(j=Math.max(0,x-1)),(h.key==="ArrowRight"||h.key==="ArrowDown")&&(j=Math.min(t.length-1,x+1)),h.key==="Home"&&(j=0),h.key==="End"&&(j=t.length-1),!(j===null||j===x)&&(h.preventDefault(),u(j))},[c,t.length,u]);return e.jsxs("section",{className:"agent-image","aria-label":o("agent.imagePane"),children:[e.jsxs("header",{className:"agent-pane-header",children:[e.jsxs("div",{className:"agent-pane-header__title",children:[e.jsx("span",{children:o("agent.imagePane")}),e.jsx("strong",{children:o("agent.currentImage")})]}),a]}),e.jsx("div",{className:"agent-image__preview",tabIndex:t.length>1?0:void 0,onKeyDown:m,"aria-label":t.length>1?o("agent.variants"):void 0,children:n?e.jsx(z,{src:n.url,alt:n.prompt??o("agent.imageAlt"),fallbackClassName:"agent-image__empty",iconSize:34}):e.jsxs("div",{className:"agent-image__empty",children:[e.jsx(D,{size:34}),e.jsx("span",{children:o("agent.noImage")})]})}),e.jsx("div",{className:"agent-image__variants","aria-label":o("agent.variants"),onKeyDown:m,children:t.map(h=>e.jsx(P,{ref:x=>{i.current[h.id]=x},image:h,selected:h.id===n?.id,onSelect:l},h.id))}),e.jsx(In,{activeTab:s,onChange:r}),e.jsx(_n,{activeTab:s,currentImage:n})]})}const pe='button, [href], input, textarea, select, [tabindex]:not([tabindex="-1"])';function ne(n,t){const s=d.useRef(null),r=d.useRef(null);return d.useEffect(()=>{if(!n)return;r.current=document.activeElement;const l=window.setTimeout(()=>{s.current?.querySelector(pe)?.focus()},0),a=o=>{if(o.key==="Escape"){o.preventDefault(),t();return}if(o.key!=="Tab")return;const i=Array.from(s.current?.querySelectorAll(pe)??[]);if(i.length===0)return;const c=i[0],u=i[i.length-1];o.shiftKey&&document.activeElement===c?(o.preventDefault(),u.focus()):!o.shiftKey&&document.activeElement===u&&(o.preventDefault(),c.focus())};return document.addEventListener("keydown",a),()=>{window.clearTimeout(l),document.removeEventListener("keydown",a),r.current?.focus()}},[t,n]),s}function Nn({open:n,currentImage:t,images:s,activeTab:r,onTabChange:l,onImageSelect:a,onClose:o}){const{t:i}=p(),c=d.useCallback(()=>o(),[o]),u=ne(n,c);return n?e.jsxs("div",{className:"agent-dialog agent-dialog--image",role:"presentation",children:[e.jsx("button",{type:"button",className:"agent-dialog__backdrop",onClick:o,"aria-label":i("agent.closeImage")}),e.jsx("section",{ref:u,className:"agent-image-sheet",role:"dialog","aria-modal":"true","aria-label":i("agent.imagePane"),children:e.jsx(Ie,{currentImage:t,images:s,activeTab:r,onTabChange:l,onImageSelect:a,headerAction:e.jsx("button",{type:"button",onClick:o,"aria-label":i("agent.closeImage"),children:e.jsx(ee,{size:17})})})})]}):null}function _e({settings:n,onChange:t}){const{t:s}=p(),r=a=>{if(a==="grok"&&!J(n.model)){t({provider:a,model:"grok-imagine-image"});return}if(a!=="grok"&&J(n.model)){t({provider:a,model:Ke});return}t({provider:a})},l=a=>{if(J(a)){t({model:a,provider:"grok"});return}if(n.provider==="grok"){t({model:a,provider:"oauth"});return}t({model:a})};return e.jsxs("section",{className:"agent-settings-grid","aria-label":s("agent.model"),children:[e.jsxs("label",{children:[e.jsx("span",{children:s("agent.model")}),e.jsx("select",{value:n.model,onChange:a=>l(a.target.value),children:Ge.map(a=>e.jsx("option",{value:a.value,children:s(a.fullLabelKey)},a.value))})]}),e.jsxs("label",{children:[e.jsx("span",{children:s("agent.provider")}),e.jsxs("select",{value:n.provider,onChange:a=>r(a.target.value),children:[e.jsx("option",{value:"oauth",children:"OAuth"}),e.jsx("option",{value:"api",children:"API"}),e.jsx("option",{value:"grok",children:"Grok"})]})]}),e.jsxs("label",{children:[e.jsx("span",{children:s("agent.reasoningEffort")}),e.jsxs("select",{value:n.reasoningEffort,onChange:a=>t({reasoningEffort:a.target.value}),children:[e.jsx("option",{value:"low",children:"low"}),e.jsx("option",{value:"medium",children:"medium"}),e.jsx("option",{value:"high",children:"high"}),e.jsx("option",{value:"xhigh",children:"xhigh"})]})]})]})}function Cn({open:n,settings:t,onSettingsChange:s,onClose:r}){const{t:l}=p(),a=d.useCallback(()=>r(),[r]),o=ne(n,a);return n?e.jsxs("div",{className:"agent-dialog agent-dialog--model",role:"presentation",children:[e.jsx("button",{type:"button",className:"agent-dialog__backdrop",onClick:r,"aria-label":l("agent.closeModelSettings")}),e.jsxs("section",{ref:o,className:"agent-model-sheet",role:"dialog","aria-modal":"true","aria-label":l("agent.modelSettings"),children:[e.jsxs("header",{children:[e.jsx("strong",{children:l("agent.modelSettings")}),e.jsx("button",{type:"button",onClick:r,"aria-label":l("agent.closeModelSettings"),children:e.jsx(ee,{size:17})})]}),e.jsx(_e,{settings:t,onChange:s})]})]}):null}function Ne({mode:n,onInsert:t}){const{t:s}=p(),r=B(u=>u.promptLibrary),l=B(u=>u.promptLibraryLoading),a=B(u=>u.loadPromptLibrary),[o,i]=d.useState("");d.useEffect(()=>{a()},[a]);const c=d.useMemo(()=>{const u=o.trim().toLowerCase();return r.prompts.filter(m=>{const h=m.tags.map(x=>x.toLowerCase());return n==="forms"&&!h.includes("agent:form")?!1:u?m.name.toLowerCase().includes(u)||m.text.toLowerCase().includes(u)||h.some(x=>x.includes(u)):!0})},[r.prompts,n,o]);return e.jsxs("section",{className:"agent-sidebar-section","aria-label":s(n==="forms"?"agent.forms":"agent.promptLibrary"),children:[e.jsx("header",{children:e.jsxs("div",{children:[e.jsx("span",{children:s(n==="forms"?"agent.forms":"agent.promptLibrary")}),e.jsx("strong",{children:c.length})]})}),e.jsxs("label",{className:"agent-sidebar-search",children:[e.jsx("span",{children:s("promptLibrary.search")}),e.jsx("input",{value:o,onChange:u=>i(u.target.value),placeholder:s("promptLibrary.search")})]}),e.jsxs("div",{className:"agent-prompt-library-list",children:[l?e.jsx("div",{className:"agent-tab-empty",children:s("common.loading")}):null,!l&&c.length===0?e.jsx("div",{className:"agent-tab-empty",children:s(n==="forms"?"agent.noForms":"promptLibrary.empty")}):null,c.map(u=>e.jsxs("article",{className:"agent-prompt-library-row",children:[e.jsx("strong",{children:u.name||s("promptLibrary.untitled")}),e.jsx("p",{children:u.text}),e.jsx("button",{type:"button",onClick:()=>t(u.text),children:s("agent.insertPrompt")})]},u.id))]})]})}function kn({onInsert:n}){return e.jsx(Ne,{mode:"forms",onInsert:n})}function An({settings:n,onChange:t}){const{t:s}=p();return e.jsxs("section",{className:"agent-settings-grid","aria-label":s("agent.quality"),children:[e.jsxs("label",{children:[e.jsx("span",{children:s("agent.generationStrategy")}),e.jsxs("select",{value:n.generationStrategy,onChange:r=>t({generationStrategy:r.target.value}),children:[e.jsx("option",{value:"auto",children:s("agent.generationStrategyAuto")}),e.jsx("option",{value:"manual",children:s("agent.generationStrategyManual")})]})]}),e.jsxs("label",{children:[e.jsx("span",{children:s("agent.quality")}),e.jsxs("select",{value:n.quality,onChange:r=>t({quality:r.target.value}),children:[e.jsx("option",{value:"low",children:"low"}),e.jsx("option",{value:"medium",children:"medium"}),e.jsx("option",{value:"high",children:"high"})]})]}),e.jsxs("label",{children:[e.jsx("span",{children:s("agent.size")}),e.jsxs("select",{value:n.size,onChange:r=>t({size:r.target.value}),children:[e.jsx("option",{value:"1024x1024",children:"1024x1024"}),e.jsx("option",{value:"1536x1024",children:"1536x1024"}),e.jsx("option",{value:"1024x1536",children:"1024x1536"}),e.jsx("option",{value:"2048x2048",children:"2048x2048"})]})]}),e.jsxs("label",{children:[e.jsx("span",{children:s("agent.format")}),e.jsxs("select",{value:n.format,onChange:r=>t({format:r.target.value}),children:[e.jsx("option",{value:"png",children:"png"}),e.jsx("option",{value:"jpeg",children:"jpeg"}),e.jsx("option",{value:"webp",children:"webp"})]})]}),e.jsxs("label",{children:[e.jsx("span",{children:s("agent.moderation")}),e.jsxs("select",{value:n.moderation,onChange:r=>t({moderation:r.target.value}),children:[e.jsx("option",{value:"low",children:"low"}),e.jsx("option",{value:"auto",children:"auto"})]})]}),n.generationStrategy==="manual"?e.jsxs("label",{children:[e.jsx("span",{children:s("agent.variantsCount")}),e.jsx("input",{type:"number",min:1,max:8,value:n.variants,onChange:r=>t({variants:Number(r.target.value)})})]}):e.jsxs("label",{children:[e.jsx("span",{children:s("agent.maxAutoVariants")}),e.jsx("input",{type:"number",min:1,max:8,value:n.maxAutoVariants,onChange:r=>t({maxAutoVariants:Number(r.target.value)})})]}),e.jsxs("label",{children:[e.jsx("span",{children:s("agent.parallelism")}),e.jsx("input",{type:"number",min:1,max:8,value:n.parallelism,onChange:r=>t({parallelism:Number(r.target.value)})})]})]})}function Mn(n){return n.status==="queued"?`#${n.position}`:n.status==="running"?"running":n.status==="succeeded"?`${n.resultImageIds.length} img`:n.status==="failed"?n.errorCode??"failed":"canceled"}function Tn(n){if(!n)return"-";const t=Math.max(1,Math.round((Date.now()-n)/1e3));if(t<60)return`${t}s ago`;const s=Math.round(t/60);return s<60?`${s}m ago`:`${Math.round(s/60)}h ago`}function En({item:n,onCancel:t,onRetry:s}){const{t:r}=p(),l=n.status==="queued",a=n.status==="failed"||n.status==="canceled",o=`${n.plan.plannedVariants||n.plan.prompts.length||1}v/${n.plan.plannedParallelism||n.options.parallelism}p · ${n.plan.source}`;return e.jsxs("div",{className:`agent-queue-row agent-queue-row--${n.status}`,children:[e.jsxs("div",{className:"agent-queue-row__main",children:[e.jsx("strong",{children:n.prompt}),e.jsxs("span",{children:[r(`agent.queueStatus.${n.status}`)," · ",Mn(n)," · ",o," · ",Tn(n.createdAt)]}),n.plan.reason?e.jsx("small",{children:n.plan.reason}):null,n.errorMessage?e.jsx("small",{children:n.errorMessage}):null]}),e.jsxs("div",{className:"agent-queue-row__actions",children:[l?e.jsx("button",{type:"button",onClick:()=>t(n.id),children:r("agent.cancelQueue")}):null,a?e.jsx("button",{type:"button",onClick:()=>s(n.id),children:r("agent.retryQueue")}):null]})]})}function $n({items:n,summary:t,onCancel:s,onRetry:r}){const{t:l}=p();return e.jsxs("section",{className:"agent-sidebar-section","aria-label":l("agent.queue"),children:[e.jsx("header",{children:e.jsxs("div",{children:[e.jsx("span",{children:l("agent.queue")}),e.jsxs("strong",{children:[t?.runningCount??0," ",l("agent.runningShort")," · ",t?.queuedCount??0," ",l("agent.queuedShort")]})]})}),e.jsx("div",{className:"agent-queue-list",children:n.length===0?e.jsx("div",{className:"agent-tab-empty",children:l("agent.queueEmpty")}):n.map(a=>e.jsx(En,{item:a,onCancel:s,onRetry:r},a.id))})]})}const qn=["image","library","forms","quality","model","queue"];function Ln({activeTab:n,onChange:t}){const{t:s}=p();return e.jsx("div",{className:"agent-sidebar-tabs",role:"tablist","aria-label":s("agent.rightSidebar"),children:qn.map(r=>e.jsx("button",{type:"button",role:"tab",className:n===r?"active":"","aria-selected":n===r,onClick:()=>t(r),children:s(`agent.sidebarTabs.${r}`)},r))})}function Rn({currentImage:n,images:t,contextTab:s,sidebarTab:r,queueItems:l,runSummary:a,settings:o,onContextTabChange:i,onSidebarTabChange:c,onImageSelect:u,onSettingsChange:m,onInsertPrompt:h,onCancelQueue:x,onRetryQueue:j}){const{t:y}=p();return e.jsxs("aside",{className:"agent-right-sidebar",children:[e.jsx(Ln,{activeTab:r,onChange:c}),r==="image"?e.jsx(Ie,{currentImage:n,images:t,activeTab:s,onTabChange:i,onImageSelect:u}):null,r==="library"?e.jsx(Ne,{mode:"library",onInsert:h}):null,r==="forms"?e.jsx(kn,{onInsert:h}):null,r==="quality"?e.jsxs("section",{className:"agent-sidebar-section","aria-label":y("agent.quality"),children:[e.jsx("header",{children:e.jsxs("div",{children:[e.jsx("span",{children:y("agent.quality")}),e.jsx("strong",{children:o.generationStrategy==="auto"?y("agent.generationStrategyAuto"):y("agent.generationStrategyManual")})]})}),e.jsx(An,{settings:o,onChange:m})]}):null,r==="model"?e.jsxs("section",{className:"agent-sidebar-section","aria-label":y("agent.modelSettings"),children:[e.jsx("header",{children:e.jsxs("div",{children:[e.jsx("span",{children:y("agent.modelSettings")}),e.jsx("strong",{children:o.model})]})}),e.jsx(_e,{settings:o,onChange:m})]}):null,r==="queue"?e.jsx($n,{items:l,summary:a,onCancel:x,onRetry:j}):null]})}function Ce({summary:n}){const{t}=p();if(!n||n.status==="idle")return null;const s=n.status==="running"?t("agent.sessionRunning"):n.status==="queued"?t("agent.sessionQueued",{count:n.queuedCount}):t("agent.sessionError");return e.jsxs("span",{className:`agent-session-spinner agent-session-spinner--${n.status}`,"aria-label":s,title:s,children:[e.jsx("span",{"aria-hidden":"true"}),n.queuedCount>0?e.jsx("em",{children:n.queuedCount}):null]})}function Dn(n){const t=Math.max(1,Math.round((Date.now()-n)/6e4));if(t<60)return`${t}m`;const s=Math.round(t/60);return s<24?`${s}h`:`${Math.round(s/24)}d`}function ke({sessions:n,selectedId:t,imagesById:s,runSummaryBySession:r={},onSelect:l,onRename:a,onDelete:o}){const{t:i}=p();return e.jsx("div",{className:"agent-session-list",children:n.map(c=>{const u=c.lastImageId?s[c.lastImageId]:null;return e.jsxs("div",{className:`agent-session-row${c.id===t?" is-active":""}`,children:[e.jsxs("button",{type:"button","aria-current":c.id===t?"page":void 0,onClick:()=>l(c.id),children:[e.jsx("span",{className:"agent-session-row__thumb",children:u?e.jsx(z,{src:u.thumbUrl??u.url,alt:"",iconSize:17}):e.jsx(D,{size:17})}),e.jsxs("span",{className:"agent-session-row__body",children:[e.jsx("strong",{children:c.title}),e.jsxs("span",{children:[i("agent.imageCount",{count:c.imageCount})," · ",Dn(c.updatedAt)]})]}),e.jsxs("span",{className:"agent-session-row__badges",children:[e.jsx(Ce,{summary:r[c.id]}),c.webSearchEnabled?e.jsx("em",{title:i("agent.web"),children:"W"}):null,c.compacted?e.jsx("em",{title:i("agent.compacted"),children:"C"}):null]})]}),e.jsxs("div",{className:"agent-session-row__actions",children:[e.jsx("button",{type:"button",onClick:()=>a(c.id),"aria-label":i("agent.renameSession"),title:i("agent.renameSession"),children:e.jsx(ln,{size:14})}),e.jsx("button",{type:"button",onClick:()=>o(c.id),"aria-label":i("agent.deleteSession"),title:i("agent.deleteSession"),children:e.jsx(rn,{size:14})})]})]},c.id)})})}function zn({open:n,sessions:t,selectedId:s,imagesById:r,runSummaryBySession:l,onClose:a,onCreate:o,onSelect:i,onRename:c,onDelete:u}){const{t:m}=p(),[h,x]=d.useState(""),j=d.useCallback(()=>a(),[a]),y=ne(n,j),M=d.useMemo(()=>{const I=h.trim().toLowerCase();return I?t.filter(T=>T.title.toLowerCase().includes(I)):t},[h,t]);return n?e.jsxs("div",{className:"agent-dialog agent-dialog--drawer",role:"presentation",children:[e.jsx("button",{type:"button",className:"agent-dialog__backdrop",onClick:a,"aria-label":m("agent.closeSessions")}),e.jsxs("section",{ref:y,className:"agent-session-drawer",role:"dialog","aria-modal":"true","aria-label":m("agent.sessions"),children:[e.jsxs("header",{children:[e.jsx("strong",{children:m("agent.sessions")}),e.jsx("button",{type:"button",onClick:a,"aria-label":m("agent.closeSessions"),children:e.jsx(ee,{size:17})})]}),e.jsxs("button",{type:"button",className:"agent-sessions__create",onClick:o,children:[e.jsx(Z,{size:16}),e.jsx("span",{children:m("agent.newSession")})]}),e.jsxs("label",{className:"agent-sessions__search",children:[e.jsx(fe,{size:15}),e.jsx("input",{value:h,onChange:I=>x(I.target.value),placeholder:m("agent.sessionSearch")})]}),e.jsx(ke,{sessions:M,selectedId:s,imagesById:r,runSummaryBySession:l,onSelect:i,onRename:c,onDelete:u})]})]}):null}function Bn({sessions:n,selectedId:t,imagesById:s,runSummaryBySession:r={},onCreate:l,onSelect:a,onOpenDrawer:o}){const{t:i}=p();return e.jsxs("aside",{className:"agent-rail","aria-label":i("agent.sessions"),children:[e.jsx("button",{type:"button",onClick:o,"aria-label":i("agent.openSessions"),title:i("agent.openSessions"),children:e.jsx(be,{size:17})}),e.jsx("button",{type:"button",onClick:l,"aria-label":i("agent.newSession"),title:i("agent.newSession"),children:e.jsx(Z,{size:17})}),e.jsx("div",{className:"agent-rail__sessions",children:n.map(c=>{const u=c.lastImageId?s[c.lastImageId]:null;return e.jsxs("button",{type:"button",className:c.id===t?"is-active":"",onClick:()=>a(c.id),title:c.title,children:[u?e.jsx(z,{src:u.thumbUrl??u.url,alt:"",iconSize:17}):e.jsx(D,{size:17}),e.jsx(Ce,{summary:r[c.id]}),c.compacted?e.jsx("span",{"aria-label":i("agent.compacted")}):null]},c.id)})})]})}function Pn(n){const{t}=p(),[s,r]=d.useState(""),l=d.useMemo(()=>{const a=s.trim().toLowerCase();return a?n.sessions.filter(o=>o.title.toLowerCase().includes(a)):n.sessions},[n.sessions,s]);return e.jsxs("aside",{className:"agent-sessions","aria-label":t("agent.sessions"),children:[e.jsxs("div",{className:"agent-sessions__brand",children:[e.jsxs("div",{children:[e.jsx("span",{children:"ima2-gen"}),e.jsx("strong",{children:t("agent.title")})]}),e.jsx(je,{})]}),e.jsxs("button",{type:"button",className:"agent-sessions__create",onClick:n.onCreate,children:[e.jsx(Z,{size:16}),e.jsx("span",{children:t("agent.newSession")})]}),e.jsxs("label",{className:"agent-sessions__search",children:[e.jsx(fe,{size:15}),e.jsx("input",{value:s,onChange:a=>r(a.target.value),placeholder:t("agent.sessionSearch")})]}),e.jsx(ke,{...n,sessions:l})]})}function On({layoutMode:n,session:t,currentImage:s,onOpenSessions:r,onOpenImage:l}){const{t:a}=p(),o=n==="mobile-chat-image-sheet";return e.jsxs("header",{className:"agent-topbar",children:[e.jsx("button",{type:"button",className:"agent-topbar__icon",onClick:r,"aria-label":a("agent.openSessions"),title:a("agent.openSessions"),children:e.jsx(be,{size:18})}),e.jsxs("div",{className:"agent-topbar__title",children:[e.jsx("span",{children:a("agent.title")}),e.jsx("strong",{children:t?.title??a("agent.newSession")})]}),e.jsx(je,{}),o?e.jsx("button",{type:"button",className:"agent-topbar__image",onClick:l,"aria-label":a("agent.openImage"),title:a("agent.openImage"),children:s?e.jsx(z,{src:s.thumbUrl??s.url,alt:"",iconSize:18}):e.jsx(D,{size:18})}):null]})}const Ae="agent-local-";let xe=0;function Y(){return{sessions:[],turnsBySession:{},imagesById:{},imageIdsBySession:{},selectedSessionId:null,currentImageId:null,allowedTools:["ima2.get_image_context","ima2.web_search","ima2.generate_image"],manifest:null,queueBySession:{},runSummaryBySession:{}}}function te(n){return xe+=1,`${Ae}${n}-${Date.now()}-${xe}`}function Wn(n){return n.id.startsWith(Ae)}function Un(n,t){return{id:te("user"),role:"user",text:n,imageIds:[],webFindingIds:[],status:"complete",createdAt:t}}function Fn(n,t){return{id:te("pending"),role:"assistant",text:n,imageIds:[],webFindingIds:[],status:"streaming",createdAt:t}}function Qn(n){return{id:te("error"),role:"assistant",text:n,imageIds:[],webFindingIds:[],status:"error",createdAt:Date.now()}}function Gn(n,t,s){return{...n,turnsBySession:{...n.turnsBySession,[t]:[...n.turnsBySession[t]??[],...s]}}}function Kn(n,t,s,r){const l=n.turnsBySession[t]??[];return{...n,turnsBySession:{...n.turnsBySession,[t]:[...l.filter(a=>a.id!==s),Qn(r)]}}}function Vn(n,t,s){const r={...t.turnsBySession};for(const[l,a]of Object.entries(n.turnsBySession)){const o=r[l]??[],i=new Set(o.map(m=>m.id)),c=Math.max(0,...o.map(m=>m.createdAt??0)),u=a.filter(m=>s.has(m.id)||i.has(m.id)?!1:Wn(m)||m.status==="streaming"?!0:(m.createdAt??0)>=c);u.length>0&&(r[l]=[...o,...u])}return{...t,turnsBySession:r}}function Jn(){const{t:n}=p(),t=nn(),s=B(g=>g.currentImage),r=d.useRef(!1),l=d.useRef(0),[a,o]=d.useState(()=>Y()),[i,c]=d.useState(null),[u,m]=d.useState("image"),[h,x]=d.useState("image"),[j,y]=d.useState(null),[M,I]=d.useState(!1),[T,_]=d.useState(!1),[q,k]=d.useState(!1),[O,N]=d.useState("reconnecting"),S=d.useCallback(g=>{o({...Y(),...g}),c(g.selectedSessionId??null)},[]),f=d.useCallback((g,b)=>{const v={...Y(),...g};o(C=>Vn(C,v,b)),c(g.selectedSessionId??null)},[]),Me=()=>{l.current+=1,N("generating")},Te=()=>{l.current=Math.max(0,l.current-1),l.current===0&&N("ready")},W=d.useCallback(async g=>{N("reconnecting");const b=await ie(g);if(b.sessions.length>0){S(b),N("ready");return}const v=await ce({title:n("agent.newSession"),currentImage:s});S(v),N("ready")},[S,s,n]),se=d.useCallback(async g=>{const b=await ie(g);S(b),N("ready")},[S]);d.useEffect(()=>{r.current||(r.current=!0,W().catch(g=>{console.error(g),N("ready")}))},[W]);const L=a.sessions.find(g=>g.id===i)??null,U=a.currentImageId?a.imagesById[a.currentImageId]??null:null,ae=i?(a.imageIdsBySession[i]??[]).map(g=>a.imagesById[g]).filter(g=>!!g):[],Ee=L?a.turnsBySession[L.id]??[]:[],$e=i?a.queueBySession[i]??[]:[],A=i?a.runSummaryBySession[i]:void 0,R=ue(L?.generationSettings),qe=O==="reconnecting"?"reconnecting":l.current>0||A?.status==="queued"||A?.status==="running"?"generating":"ready",Le=t==="desktop-rail",re=t==="desktop-three-pane",F=t!=="mobile-chat-image-sheet";d.useEffect(()=>{if(!i||A?.status!=="queued"&&A?.status!=="running")return;const g=window.setInterval(()=>{se(i).catch(console.error)},1500);return()=>window.clearInterval(g)},[se,i,A?.queuedCount,A?.runningCount,A?.status]);const Q=g=>{I(!1),W(g).catch(console.error)},G=()=>{ce({title:n("agent.newSession"),currentImage:null}).then(S).catch(console.error)},le=g=>{const b=a.sessions.find(C=>C.id===g),v=window.prompt(n("agent.renameSession"),b?.title??"");v?.trim()&&X(g,{title:v.trim()}).then(S).catch(console.error)},oe=g=>{const b=a.sessions.find(v=>v.id===g);!b||!window.confirm(n("agent.deleteConfirm",{title:b.title}))||Je(g).then(S).catch(console.error)},K=g=>{if(!i)return;const b=ue({...R,...g});o(v=>({...v,sessions:v.sessions.map(C=>C.id===i?{...C,generationSettings:b,webSearchEnabled:b.webSearchEnabled}:C)})),X(i,{generationSettings:g}).then(S).catch(console.error)},Re=g=>{K({webSearchEnabled:g})},V=g=>{if(!i||a.currentImageId===g)return;const b=i;o(v=>({...v,currentImageId:g})),X(b,{currentImageId:g}).then(S).catch(console.error)},De=g=>{y({id:Date.now(),text:g})},ze=g=>{Ye(g).then(S).catch(console.error)},Be=g=>{Ze(g).then(S).catch(console.error)},Pe=()=>{if(F){x("model");return}k(!0)},Oe=g=>{if(!i)return;const b=i,v=Date.now(),C=Un(g,v),H=Fn(n("agent.pending"),v+1),We=new Set([C.id,H.id]);Me(),o(E=>Gn(E,b,[C,H])),Xe(b,g,R).then(E=>f(E.workspace,We)).catch(E=>{const Ue=E instanceof Error?E.message:String(E);o(Fe=>Kn(Fe,b,H.id,Ue))}).finally(Te)};return e.jsxs("main",{className:`agent-workspace agent-workspace--${t}`,"data-layout":t,"aria-label":n("agent.workspace"),children:[re?null:e.jsx(On,{layoutMode:t,session:L,currentImage:U,onOpenSessions:()=>I(!0),onOpenImage:()=>_(!0)}),e.jsxs("div",{className:"agent-workspace__body",children:[re?e.jsx(Pn,{sessions:a.sessions,selectedId:i??"",imagesById:a.imagesById,runSummaryBySession:a.runSummaryBySession,onCreate:G,onSelect:Q,onRename:le,onDelete:oe}):null,Le?e.jsx(Bn,{sessions:a.sessions,selectedId:i??"",imagesById:a.imagesById,runSummaryBySession:a.runSummaryBySession,onCreate:G,onSelect:Q,onOpenDrawer:()=>I(!0)}):null,e.jsx(vn,{session:L,turns:Ee,imagesById:a.imagesById,currentImageId:a.currentImageId,runtimeStatus:qe,settings:R,insertedPrompt:j,onOpenModelSettings:Pe,onWebSearchChange:Re,onImageSelect:V,onSend:Oe}),F?e.jsx(Rn,{currentImage:U,images:ae,contextTab:u,sidebarTab:h,queueItems:$e,runSummary:A,settings:R,onContextTabChange:m,onSidebarTabChange:x,onImageSelect:V,onSettingsChange:K,onInsertPrompt:De,onCancelQueue:ze,onRetryQueue:Be}):null]}),e.jsx(zn,{open:M,sessions:a.sessions,selectedId:i??"",imagesById:a.imagesById,runSummaryBySession:a.runSummaryBySession,onClose:()=>I(!1),onCreate:G,onSelect:Q,onRename:le,onDelete:oe}),e.jsx(Nn,{open:T,currentImage:U,images:ae,activeTab:u,onTabChange:m,onImageSelect:V,onClose:()=>_(!1)}),e.jsx(Cn,{open:q&&!F,settings:R,onSettingsChange:K,onClose:()=>k(!1)})]})}export{Jn as AgentWorkspace};