ima2-gen 1.1.21 → 1.1.23

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 (214) hide show
  1. package/README.md +44 -7
  2. package/bin/commands/video.js +14 -0
  3. package/bin/ima2.js +14 -4
  4. package/bin/lib/platform.js +34 -5
  5. package/docs/README.ko.md +43 -2
  6. package/lib/agentQueueWorker.js +6 -0
  7. package/lib/agentRuntime.js +3 -2
  8. package/lib/atomicWrite.js +14 -0
  9. package/lib/grokImageAdapter.js +6 -0
  10. package/lib/grokProxyLauncher.js +5 -3
  11. package/lib/grokVideoAdapter.js +1 -1
  12. package/lib/grokVideoPlannerPrompt.js +10 -0
  13. package/lib/inflight.js +1 -1
  14. package/lib/oauthLauncher.js +5 -0
  15. package/lib/videoFrameExtract.js +3 -3
  16. package/package.json +5 -7
  17. package/routes/capabilities.js +13 -0
  18. package/routes/edit.js +2 -1
  19. package/routes/generate.js +32 -6
  20. package/routes/health.js +4 -3
  21. package/routes/multimode.js +2 -1
  22. package/routes/video.js +35 -3
  23. package/server.js +29 -2
  24. package/skills/ima2/SKILL.md +48 -6
  25. package/ui/dist/.vite/manifest.json +12 -12
  26. package/ui/dist/assets/{AgentWorkspace-B_hq9CLg.js → AgentWorkspace-C21zqdTZ.js} +1 -1
  27. package/ui/dist/assets/{CardNewsWorkspace-wD12J7qk.js → CardNewsWorkspace-BN-ga1lG.js} +1 -1
  28. package/ui/dist/assets/{NodeCanvas-CI_wuPMf.js → NodeCanvas-BbMa4IhI.js} +1 -1
  29. package/ui/dist/assets/{PromptBuilderPanel-CUTujJUV.js → PromptBuilderPanel-DRwBJRDQ.js} +1 -1
  30. package/ui/dist/assets/{PromptImportDialog-CUi66jPK.js → PromptImportDialog-Dp85kHCq.js} +2 -2
  31. package/ui/dist/assets/{PromptImportDiscoverySection-Cm3vrjY4.js → PromptImportDiscoverySection-BE8Q8MLD.js} +1 -1
  32. package/ui/dist/assets/{PromptImportFolderSection-DOtWTD9n.js → PromptImportFolderSection-PtH5x0sc.js} +1 -1
  33. package/ui/dist/assets/{PromptLibraryPanel-BMjQegRa.js → PromptLibraryPanel-FnM9tHI9.js} +2 -2
  34. package/ui/dist/assets/SettingsWorkspace-MARPGyBL.js +1 -0
  35. package/ui/dist/assets/index-BAFI6htx.js +42 -0
  36. package/ui/dist/assets/{index-31uVIdt4.js → index-BSXxr_Bt.js} +1 -1
  37. package/ui/dist/assets/index-DS-ADE7U.css +1 -0
  38. package/ui/dist/index.html +2 -2
  39. package/bin/commands/annotate.ts +0 -119
  40. package/bin/commands/cancel.ts +0 -48
  41. package/bin/commands/canvas-versions.ts +0 -80
  42. package/bin/commands/capabilities.ts +0 -110
  43. package/bin/commands/cardnews.ts +0 -249
  44. package/bin/commands/comfy.ts +0 -54
  45. package/bin/commands/config.ts +0 -186
  46. package/bin/commands/defaults.ts +0 -192
  47. package/bin/commands/doctor.ts +0 -202
  48. package/bin/commands/edit.ts +0 -150
  49. package/bin/commands/gen.ts +0 -214
  50. package/bin/commands/grok.ts +0 -90
  51. package/bin/commands/history.ts +0 -146
  52. package/bin/commands/ls.ts +0 -64
  53. package/bin/commands/metadata.ts +0 -39
  54. package/bin/commands/multimode.ts +0 -196
  55. package/bin/commands/node.ts +0 -166
  56. package/bin/commands/observability.ts +0 -176
  57. package/bin/commands/ping.ts +0 -31
  58. package/bin/commands/prompt-sub/build.ts +0 -101
  59. package/bin/commands/prompt.ts +0 -492
  60. package/bin/commands/ps.ts +0 -81
  61. package/bin/commands/session.ts +0 -266
  62. package/bin/commands/show.ts +0 -72
  63. package/bin/commands/skill.ts +0 -70
  64. package/bin/commands/video.ts +0 -442
  65. package/bin/ima2.ts +0 -430
  66. package/bin/lib/args.ts +0 -92
  67. package/bin/lib/browser-id.ts +0 -16
  68. package/bin/lib/client.ts +0 -122
  69. package/bin/lib/config-store.ts +0 -120
  70. package/bin/lib/destructive-confirm.ts +0 -19
  71. package/bin/lib/doctor-checks.ts +0 -91
  72. package/bin/lib/error-hints.ts +0 -23
  73. package/bin/lib/files.ts +0 -39
  74. package/bin/lib/output.ts +0 -73
  75. package/bin/lib/platform.ts +0 -99
  76. package/bin/lib/recover-output.ts +0 -139
  77. package/bin/lib/sse.ts +0 -73
  78. package/bin/lib/star-prompt.ts +0 -97
  79. package/bin/lib/storage-doctor.ts +0 -39
  80. package/bin/lib/ui-build.ts +0 -85
  81. package/config.ts +0 -354
  82. package/lib/agentCommandParser.ts +0 -69
  83. package/lib/agentGenerationPlanner.ts +0 -273
  84. package/lib/agentQuestionResponder.ts +0 -266
  85. package/lib/agentQueueStore.ts +0 -270
  86. package/lib/agentQueueWorker.ts +0 -89
  87. package/lib/agentRuntime.ts +0 -604
  88. package/lib/agentSettings.ts +0 -72
  89. package/lib/agentStore.ts +0 -422
  90. package/lib/agentStoreRows.ts +0 -136
  91. package/lib/agentTypes.ts +0 -154
  92. package/lib/apiCachePolicy.ts +0 -11
  93. package/lib/assetLifecycle.ts +0 -146
  94. package/lib/canvasVersionStore.ts +0 -223
  95. package/lib/capabilities.ts +0 -126
  96. package/lib/cardNewsGenerator.ts +0 -271
  97. package/lib/cardNewsJobStore.ts +0 -142
  98. package/lib/cardNewsManifestStore.ts +0 -154
  99. package/lib/cardNewsPlanner.ts +0 -236
  100. package/lib/cardNewsPlannerClient.ts +0 -155
  101. package/lib/cardNewsPlannerPrompt.ts +0 -62
  102. package/lib/cardNewsPlannerSchema.ts +0 -321
  103. package/lib/cardNewsRoleTemplateStore.ts +0 -47
  104. package/lib/cardNewsTemplateStore.ts +0 -252
  105. package/lib/codexDetect.ts +0 -71
  106. package/lib/comfyBridge.ts +0 -235
  107. package/lib/composerSnapshot.ts +0 -33
  108. package/lib/configKeys.ts +0 -62
  109. package/lib/db.ts +0 -295
  110. package/lib/errInfo.ts +0 -43
  111. package/lib/errorClassify.ts +0 -100
  112. package/lib/generationCancel.ts +0 -28
  113. package/lib/generationErrors.ts +0 -238
  114. package/lib/grokImageAdapter.ts +0 -513
  115. package/lib/grokMultimodeAdapter.ts +0 -84
  116. package/lib/grokProxyLauncher.ts +0 -153
  117. package/lib/grokRuntime.ts +0 -23
  118. package/lib/grokSizeMapper.ts +0 -71
  119. package/lib/grokVideoAdapter.ts +0 -458
  120. package/lib/grokVideoCanvas.ts +0 -26
  121. package/lib/grokVideoDownload.ts +0 -59
  122. package/lib/grokVideoPlannerPrompt.ts +0 -67
  123. package/lib/historyIndex.ts +0 -51
  124. package/lib/historyList.ts +0 -181
  125. package/lib/imageMetadata.ts +0 -113
  126. package/lib/imageMetadataStore.ts +0 -67
  127. package/lib/imageModels.ts +0 -165
  128. package/lib/inflight.ts +0 -281
  129. package/lib/localImportStore.ts +0 -114
  130. package/lib/logger.ts +0 -161
  131. package/lib/nodeStore.ts +0 -91
  132. package/lib/oauthLauncher.ts +0 -94
  133. package/lib/oauthNormalize.ts +0 -30
  134. package/lib/oauthProxy/errors.ts +0 -128
  135. package/lib/oauthProxy/generators.ts +0 -494
  136. package/lib/oauthProxy/index.ts +0 -28
  137. package/lib/oauthProxy/prompts.ts +0 -123
  138. package/lib/oauthProxy/references.ts +0 -45
  139. package/lib/oauthProxy/runtime.ts +0 -115
  140. package/lib/oauthProxy/streams.ts +0 -232
  141. package/lib/oauthProxy/types.ts +0 -9
  142. package/lib/oauthProxy.ts +0 -3
  143. package/lib/openDirectory.ts +0 -47
  144. package/lib/pngInfo.ts +0 -26
  145. package/lib/promptBuilder/attachments.ts +0 -74
  146. package/lib/promptBuilder/client.ts +0 -130
  147. package/lib/promptBuilder/constants.ts +0 -9
  148. package/lib/promptBuilder/context.ts +0 -36
  149. package/lib/promptBuilder/errors.ts +0 -12
  150. package/lib/promptBuilder/requestSchema.ts +0 -56
  151. package/lib/promptBuilder/responseParser.ts +0 -219
  152. package/lib/promptBuilder/systemPrompt.ts +0 -135
  153. package/lib/promptBuilder/transport.ts +0 -94
  154. package/lib/promptBuilder/types.ts +0 -109
  155. package/lib/promptImport/curatedSources.ts +0 -141
  156. package/lib/promptImport/discoveryRegistry.ts +0 -329
  157. package/lib/promptImport/errors.ts +0 -18
  158. package/lib/promptImport/githubDiscovery.ts +0 -309
  159. package/lib/promptImport/githubFolder.ts +0 -397
  160. package/lib/promptImport/githubSource.ts +0 -257
  161. package/lib/promptImport/gptImageHints.ts +0 -70
  162. package/lib/promptImport/parsePromptCandidates.ts +0 -179
  163. package/lib/promptImport/promptIndex.ts +0 -326
  164. package/lib/promptImport/rankPromptCandidates.ts +0 -65
  165. package/lib/promptImport/types.ts +0 -103
  166. package/lib/promptSafetyPolicy.ts +0 -5
  167. package/lib/providerOptions.ts +0 -56
  168. package/lib/referenceImageCompress.ts +0 -84
  169. package/lib/refs.ts +0 -133
  170. package/lib/requestLogger.ts +0 -49
  171. package/lib/responsesDoctor.ts +0 -456
  172. package/lib/responsesErrors.ts +0 -83
  173. package/lib/responsesFallback.ts +0 -114
  174. package/lib/responsesImageAdapter.ts +0 -466
  175. package/lib/responsesParse.ts +0 -452
  176. package/lib/responsesTools.ts +0 -28
  177. package/lib/runtimeContext.ts +0 -146
  178. package/lib/runtimePorts.ts +0 -105
  179. package/lib/sessionStore.ts +0 -308
  180. package/lib/storageMigration.ts +0 -310
  181. package/lib/styleSheet.ts +0 -139
  182. package/lib/systemTrash.ts +0 -20
  183. package/lib/videoContinuity.ts +0 -180
  184. package/lib/videoFrameExtract.ts +0 -78
  185. package/lib/videoSeriesChain.ts +0 -29
  186. package/lib/visibleTextLanguagePolicy.ts +0 -7
  187. package/routes/agent.ts +0 -308
  188. package/routes/annotations.ts +0 -118
  189. package/routes/canvasVersions.ts +0 -69
  190. package/routes/capabilities.ts +0 -18
  191. package/routes/cardNews.ts +0 -211
  192. package/routes/comfy.ts +0 -43
  193. package/routes/edit.ts +0 -352
  194. package/routes/generate.ts +0 -492
  195. package/routes/grok.ts +0 -24
  196. package/routes/health.ts +0 -123
  197. package/routes/history.ts +0 -221
  198. package/routes/imageImport.ts +0 -37
  199. package/routes/index.ts +0 -52
  200. package/routes/metadata.ts +0 -77
  201. package/routes/multimode.ts +0 -499
  202. package/routes/nodes.ts +0 -578
  203. package/routes/promptBuilder.ts +0 -37
  204. package/routes/promptImport.ts +0 -379
  205. package/routes/prompts.ts +0 -428
  206. package/routes/quota.ts +0 -89
  207. package/routes/sessions.ts +0 -317
  208. package/routes/storage.ts +0 -47
  209. package/routes/video.ts +0 -300
  210. package/routes/videoExtended.ts +0 -284
  211. package/server.ts +0 -293
  212. package/ui/dist/assets/SettingsWorkspace-PiaVnsdA.js +0 -1
  213. package/ui/dist/assets/index-CjgnNtgt.css +0 -1
  214. package/ui/dist/assets/index-Da2s4_-5.js +0 -36
package/routes/health.js CHANGED
@@ -95,10 +95,11 @@ export function registerHealthRoutes(app, ctxRaw) {
95
95
  const headers = { Authorization: `Bearer ${ctx.apiKey}`, "Content-Type": "application/json" };
96
96
  const start = Math.floor(new Date(new Date().getFullYear(), new Date().getMonth(), 1).getTime() / 1000);
97
97
  const end = Math.floor(Date.now() / 1000);
98
+ const billingSignal = AbortSignal.timeout(10_000);
98
99
  const [subRes, usageRes, modelsRes] = await Promise.allSettled([
99
- fetch(`https://api.openai.com/v1/organization/costs?start_time=${start}&end_time=${end}&bucket_width=1d&limit=31`, { headers }),
100
- fetch("https://api.openai.com/dashboard/billing/credit_grants", { headers }),
101
- fetch("https://api.openai.com/v1/models", { headers }),
100
+ fetch(`https://api.openai.com/v1/organization/costs?start_time=${start}&end_time=${end}&bucket_width=1d&limit=31`, { headers, signal: billingSignal }),
101
+ fetch("https://api.openai.com/dashboard/billing/credit_grants", { headers, signal: billingSignal }),
102
+ fetch("https://api.openai.com/v1/models", { headers, signal: billingSignal }),
102
103
  ]);
103
104
  const billing = { apiKeySource: ctx.apiKeySource ?? "env" };
104
105
  if (subRes.status === "fulfilled" && subRes.value.ok)
@@ -1,4 +1,5 @@
1
1
  import { mkdir, writeFile } from "fs/promises";
2
+ import { safeWriteSidecar } from "../lib/atomicWrite.js";
2
3
  import { join } from "path";
3
4
  import { randomBytes } from "crypto";
4
5
  import { detectImageMimeFromB64, summarizeReferencePayload, validateAndNormalizeRefs } from "../lib/refs.js";
@@ -217,7 +218,7 @@ export function registerMultimodeRoutes(app, ctxRaw) {
217
218
  version: ctx.packageVersion,
218
219
  });
219
220
  await writeFile(join(ctx.config.storage.generatedDir, filename), embedded.buffer);
220
- await writeFile(join(ctx.config.storage.generatedDir, filename + ".json"), JSON.stringify(meta)).catch(() => { });
221
+ await safeWriteSidecar(join(ctx.config.storage.generatedDir, filename + ".json"), meta);
221
222
  invalidateHistoryIndex();
222
223
  const item = {
223
224
  image: `data:${resultMime};base64,${image.b64}`,
package/routes/video.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { mkdir, readFile, unlink, writeFile } from "fs/promises";
2
+ import { atomicWriteJson } from "../lib/atomicWrite.js";
2
3
  import { join } from "path";
3
4
  import { randomBytes } from "crypto";
4
5
  import { startJob, finishJob, registerJobAbortController, isJobCanceled, setJobPhase } from "../lib/inflight.js";
@@ -26,7 +27,7 @@ export async function saveGeneratedVideoArtifact(ctx, filename, buffer, metadata
26
27
  const filePath = join(ctx.config.storage.generatedDir, filename);
27
28
  await writeFile(filePath, buffer);
28
29
  try {
29
- await writeFile(`${filePath}.json`, JSON.stringify(metadata));
30
+ await atomicWriteJson(`${filePath}.json`, metadata);
30
31
  }
31
32
  catch (err) {
32
33
  await unlink(filePath).catch(() => { });
@@ -36,8 +37,9 @@ export async function saveGeneratedVideoArtifact(ctx, filename, buffer, metadata
36
37
  async function resolveSourceImage(ctx, sourceImage, sourceFilename) {
37
38
  if (typeof sourceFilename === "string" && sourceFilename) {
38
39
  const safe = sourceFilename.replace(/^\/+/, "");
39
- if (safe.includes(".."))
40
+ if (safe.includes("..") || safe.includes("/") || safe.includes("\\")) {
40
41
  throw { status: 400, code: "GROK_VIDEO_INVALID_MODE", message: "invalid source filename" };
42
+ }
41
43
  if (/\.mp4$/i.test(safe))
42
44
  throw { status: 400, code: "GROK_VIDEO_INVALID_MODE", message: "use continueFromVideo for generated video continuation" };
43
45
  const buf = await readFile(join(ctx.config.storage.generatedDir, safe));
@@ -80,6 +82,32 @@ export function registerVideoRoutes(app, ctxRaw) {
80
82
  const topic = typeof req.body?.topic === "string" ? req.body.topic.trim() : "";
81
83
  if (provider !== "grok")
82
84
  return fail(400, "VIDEO_PROVIDER_UNSUPPORTED", "video generation requires provider 'grok'");
85
+ const storyboardActive = req.body?.storyboard === true;
86
+ const storyboardPrefix = storyboardActive
87
+ ? [
88
+ "[STORYBOARD MODE — Sequential Video Clip]",
89
+ "This clip is part of a multi-shot video storyboard sequence.",
90
+ "The prompt and all injected instructions MUST be in English. Exception: dialogue lines keep original language.",
91
+ "",
92
+ "CHARACTER LOCK:",
93
+ "- Identify each character by 2-3 VISUAL identifiers (clothing + physique + position/props). Never by name alone.",
94
+ "- Copy character descriptions VERBATIM from prior clip context. Do NOT rephrase or drift.",
95
+ "",
96
+ "CONTINUITY:",
97
+ "- Continue from the previous frame's exact composition, pose, and spatial arrangement.",
98
+ "- Lock lighting direction, color palette, environment, and style.",
99
+ "- Describe ONLY what changes: action, camera movement, dialogue, sound.",
100
+ "",
101
+ "PROMPT STRUCTURE (layered caption format):",
102
+ "- Shot foundation: type + camera motion (dolly, pan, tracking, crane, static).",
103
+ "- Subject: action with intensity modifiers (crashes violently, drifts gently).",
104
+ "- Environment: setting details inherited from prior shots.",
105
+ "- Dialogue: who speaks (by appearance), exact line (original language), timing.",
106
+ "- Audio: music style/no-music, sound effects, room tone.",
107
+ "- Ending frame: final pose, camera state, last audio cue — must be stable for next shot.",
108
+ "",
109
+ ].join("\n") + "\n"
110
+ : "";
83
111
  const activePrompt = requireActiveVideoPrompt(prompt);
84
112
  if (!activePrompt)
85
113
  return fail(400, "PROMPT_REQUIRED", "Prompt is required", { guidance: ACTIVE_VIDEO_PROMPT_GUIDANCE });
@@ -172,9 +200,11 @@ export function registerVideoRoutes(app, ctxRaw) {
172
200
  };
173
201
  // Build prompt with series chain context
174
202
  const chain = !parentLineage && topic ? await getVideoSeriesChain(ctx.config.storage.generatedDir, topic) : [];
175
- const effectivePrompt = chain.length > 0
203
+ const basePrompt = chain.length > 0
176
204
  ? `[Series topic: ${topic}]\n[Previous prompts in series:\n${chain.map((p, i) => `${i + 1}. ${p}`).join("\n")}\n]\n\n${activePrompt}`
177
205
  : activePrompt;
206
+ const effectivePrompt = storyboardPrefix + basePrompt;
207
+ const plannerModel = typeof req.body?.plannerModel === "string" ? req.body.plannerModel.trim() : undefined;
178
208
  const result = await generateVideoViaGrok(effectivePrompt, ctx, {
179
209
  model: modelCheck.model,
180
210
  mode,
@@ -186,6 +216,7 @@ export function registerVideoRoutes(app, ctxRaw) {
186
216
  signal: cancelController.signal,
187
217
  requestId,
188
218
  continuityLineage: parentLineage,
219
+ plannerModel: plannerModel || undefined,
189
220
  onEvent,
190
221
  });
191
222
  const rand = randomBytes(ctx.config.ids.generatedHexBytes).toString("hex");
@@ -227,6 +258,7 @@ export function registerVideoRoutes(app, ctxRaw) {
227
258
  },
228
259
  videoContinuity,
229
260
  ...(topic ? { videoSeries: { topic, chainIndex: chain.length } } : {}),
261
+ ...(storyboardActive ? { storyboard: true } : {}),
230
262
  };
231
263
  await saveGeneratedVideoArtifact(ctx, filename, result.videoBuffer, meta);
232
264
  invalidateHistoryIndex();
package/server.js CHANGED
@@ -16,6 +16,10 @@ import { configureApiCachePolicy } from "./lib/apiCachePolicy.js";
16
16
  import { configureRoutes } from "./routes/index.js";
17
17
  import { config } from "./config.js";
18
18
  import { getServerPort, listenWithPortFallback } from "./lib/runtimePorts.js";
19
+ import { closeDb } from "./lib/db.js";
20
+ import { stopAgentQueueWorker } from "./lib/agentQueueWorker.js";
21
+ import { reapCardNewsJobs } from "./lib/cardNewsJobStore.js";
22
+ import { reapTerminalJobs } from "./lib/inflight.js";
19
23
  import { errInfo } from "./lib/errInfo.js";
20
24
  const rootDir = dirname(fileURLToPath(import.meta.url));
21
25
  async function loadApiKey() {
@@ -228,7 +232,9 @@ export async function startServer(overrides = {}) {
228
232
  },
229
233
  })
230
234
  : null;
231
- onShutdown(() => {
235
+ let server;
236
+ let reapTimer;
237
+ onShutdown(async () => {
232
238
  unadvertise(ctx);
233
239
  try {
234
240
  oauthChild?.stop?.();
@@ -246,9 +252,18 @@ export async function startServer(overrides = {}) {
246
252
  grokChild?.kill?.();
247
253
  }
248
254
  catch { }
255
+ stopAgentQueueWorker();
256
+ clearInterval(reapTimer);
257
+ await new Promise((resolve) => {
258
+ if (server)
259
+ server.close(() => resolve());
260
+ else
261
+ resolve();
262
+ });
263
+ closeDb();
249
264
  });
250
265
  process.on("exit", () => unadvertise(ctx));
251
- const server = await listenWithPortFallback(app, ctx.config.server.port, {
266
+ server = await listenWithPortFallback(app, ctx.config.server.port, {
252
267
  host: ctx.config.server.host,
253
268
  label: "server",
254
269
  onFallback: ({ requestedPort, actualPort }) => {
@@ -272,6 +287,18 @@ export async function startServer(overrides = {}) {
272
287
  console.error("[server] Failed to start:", err?.message || err);
273
288
  process.exit(1);
274
289
  });
290
+ reapTimer = setInterval(() => {
291
+ reapTerminalJobs();
292
+ reapCardNewsJobs();
293
+ }, 60_000);
294
+ reapTimer.unref?.();
295
+ process.on("uncaughtException", (err) => {
296
+ console.error("[fatal] uncaughtException:", err);
297
+ process.exit(1);
298
+ });
299
+ process.on("unhandledRejection", (reason) => {
300
+ console.error("[fatal] unhandledRejection:", reason);
301
+ });
275
302
  return { app, server, oauthChild, ctx };
276
303
  }
277
304
  if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
@@ -60,7 +60,7 @@ ima2 gen "cinematic mountain" --model gpt-5.5 --reasoning-effort high
60
60
  ```
61
61
 
62
62
  Use Grok when the request should run through bundled progrok, mandatory xAI Web
63
- Search, `grok-4.3` planning, and xAI Images API:
63
+ Search, planner pass (default: `grok-4.3`), and xAI Images API:
64
64
 
65
65
  ```bash
66
66
  ima2 grok login
@@ -324,7 +324,14 @@ ima2 video "episode 2: commute" --topic "daily-vlog"
324
324
 
325
325
  ### Planning Layer
326
326
 
327
- 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.
327
+ Prompts are NOT sent directly to the video model. A Grok planner rewrites your prompt with web search context for better results. The `revisedPrompt` in the response shows what was actually sent. Default planner model is `grok-4.3` (configurable in settings UI).
328
+
329
+ Override the planner model per-request:
330
+
331
+ ```bash
332
+ ima2 video "prompt" --planner-model gpt-5.5
333
+ ima2 video "prompt" --planner-model gpt-5.4
334
+ ```
328
335
 
329
336
  ### Grok 4.3 Prompt Surfaces
330
337
 
@@ -393,12 +400,22 @@ ima2 capabilities --json | jq '.valid.videoModels'
393
400
 
394
401
  Generate a high-quality still image first, then animate it. This produces better results than text-to-video alone because the video model has a concrete visual anchor.
395
402
 
403
+ **Critical rule for i2v**: Compose ALL characters and the environment together in ONE image. Do NOT use individual portrait refs for i2v — the video model needs a single composed scene to animate from.
404
+
405
+ **ref2v vs i2v decision**:
406
+
407
+ | Scenario | Use | Why |
408
+ |----------|-----|-----|
409
+ | Need 2+ character identity lock from separate refs | ref2v (`grok-imagine-video`, max 7 refs, max 10s) | Refs lock character appearance |
410
+ | Single composed scene with all elements | i2v (`1.5-preview` or base, 1 ref) | Better motion quality from composed start |
411
+ | Continue from previous video | `video continue` (last frame as i2v ref) | Lineage metadata preserved |
412
+
396
413
  ```bash
397
- # Step 1: Generate the key frame
398
- ima2 gen "cinematic wide shot of a mountain lake at sunset, 16:9" --size 1792x1024 -o keyframe.png
414
+ # Multi-character scene: compose BOTH characters in one image first
415
+ ima2 gen "cinematic wide shot of Bruce Lee in yellow tracksuit facing Elon Musk in dark gi, underground fight arena, dramatic lighting, 16:9" --quality high --size 1792x1024 -o scene.png
399
416
 
400
- # Step 2: Animate from that frame
401
- ima2 video "gentle water ripples, clouds drifting slowly, birds flying in distance" --ref keyframe.png --duration 10 --aspect-ratio 16:9
417
+ # Then animate from the composed scene
418
+ ima2 video "Bruce throws a rapid jeet kune do combination" --ref scene.png --duration 10 --resolution 720p --aspect-ratio 16:9
402
419
  ```
403
420
 
404
421
  #### Multi-Shot Video (connected scenes)
@@ -421,6 +438,31 @@ ima2 video "close-up of rain drops on a neon sign reflection" \
421
438
 
422
439
  The planner receives previous prompts from the same topic as continuity context. This is best-effort prompt guidance, not a guarantee that subjects, palette, or style will remain identical. For branch-local continuation, use `ima2 video continue` instead.
423
440
 
441
+ #### Storyboard-to-Video Chaining (image→video→lastframe loop)
442
+
443
+ For maximum control, generate each keyframe as a GPT Image 2 still, animate it, extract the last frame, and use it as the anchor for the next keyframe:
444
+
445
+ ```bash
446
+ # Step 1: Generate composed keyframe
447
+ ima2 gen "Bruce and Elon face off in underground arena, dramatic lighting" --quality high --size 1792x1024 -o frame1.png
448
+
449
+ # Step 2: Animate (i2v, 10s clip)
450
+ ima2 video "Bruce throws JKD combination" --ref frame1.png --duration 10 --resolution 720p
451
+
452
+ # Step 3: Continue from last frame (sequential, not parallel)
453
+ CLIP1=$(ima2 ls -n 1 --json | jq -r '.items[0].filename')
454
+ ima2 video continue "Elon counterattacks with haymaker" --video "$CLIP1" --duration 10
455
+
456
+ # Repeat: each clip's last frame seeds the next
457
+ ```
458
+
459
+ **GPT Image 2 storyboard prompting rules** (from production research):
460
+ - Copy character visual descriptions **verbatim** across all frame prompts — do not paraphrase
461
+ - First frame is the **anchor**: all subsequent frames inherit its composition, lighting, and character designs
462
+ - Change **one variable per step**: shot scale, action, or camera — keep everything else constant
463
+ - Use the `images.edit` API with `image[]` array or Responses API `input_image` content blocks for multi-ref
464
+ - ChatGPT Thinking mode (not API) can produce up to 8 consistent frames from one prompt; API users should generate frames sequentially with shared character descriptions
465
+
424
466
  #### Video Continuation (extend/sequel)
425
467
 
426
468
  To continue from an existing video's last frame:
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "index.html": {
3
- "file": "assets/index-Da2s4_-5.js",
3
+ "file": "assets/index-BAFI6htx.js",
4
4
  "name": "index",
5
5
  "src": "index.html",
6
6
  "isEntry": true,
@@ -16,11 +16,11 @@
16
16
  "src/components/PromptLibraryPanel.tsx"
17
17
  ],
18
18
  "css": [
19
- "assets/index-CjgnNtgt.css"
19
+ "assets/index-DS-ADE7U.css"
20
20
  ]
21
21
  },
22
22
  "src/components/NodeCanvas.tsx": {
23
- "file": "assets/NodeCanvas-CI_wuPMf.js",
23
+ "file": "assets/NodeCanvas-BbMa4IhI.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-CUi66jPK.js",
35
+ "file": "assets/PromptImportDialog-Dp85kHCq.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-Cm3vrjY4.js",
48
+ "file": "assets/PromptImportDiscoverySection-BE8Q8MLD.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-DOtWTD9n.js",
57
+ "file": "assets/PromptImportFolderSection-PtH5x0sc.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-BMjQegRa.js",
66
+ "file": "assets/PromptLibraryPanel-FnM9tHI9.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-PiaVnsdA.js",
78
+ "file": "assets/SettingsWorkspace-MARPGyBL.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-B_hq9CLg.js",
87
+ "file": "assets/AgentWorkspace-C21zqdTZ.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-31uVIdt4.js",
96
+ "file": "assets/index-BSXxr_Bt.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-wD12J7qk.js",
105
+ "file": "assets/CardNewsWorkspace-BN-ga1lG.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-CUTujJUV.js",
114
+ "file": "assets/PromptBuilderPanel-DRwBJRDQ.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 Ge,s as Qe,t as J,D as Ke,b as B,U as je}from"./index-Da2s4_-5.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 Ge,s as Qe,t as J,D as Ke,b as B,U as je}from"./index-BAFI6htx.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})}):Ge(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:Qe.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:"GPT 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 Gn(n){return{id:te("error"),role:"assistant",text:n,imageIds:[],webFindingIds:[],status:"error",createdAt:Date.now()}}function Qn(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),Gn(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 G=g=>{I(!1),W(g).catch(console.error)},Q=()=>{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=>Qn(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:Q,onSelect:G,onRename:le,onDelete:oe}):null,Le?e.jsx(Bn,{sessions:a.sessions,selectedId:i??"",imagesById:a.imagesById,runSummaryBySession:a.runSummaryBySession,onCreate:Q,onSelect:G,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:Q,onSelect:G,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};
@@ -1,2 +1,2 @@
1
- import{u,p as l,j as e,q as v,a as N,e as y}from"./index-Da2s4_-5.js";function f(s){const r=s.slots.filter(c=>c.kind==="text"||c.textKind).length,d=s.slots.filter(c=>c.kind==="image").length;return`${r} text / ${d} image`}function _(){const{t:s}=u(),r=l(t=>t.templates),d=l(t=>t.imageTemplateId),c=l(t=>t.setImageTemplate);return e.jsxs("section",{className:"card-news-panel",children:[e.jsxs("div",{className:"card-news-panel__head",children:[e.jsx("span",{children:s("cardNews.imageTemplate")}),e.jsx("button",{type:"button",disabled:!0,title:s("cardNews.newTemplateLater"),children:"+"})]}),e.jsx("div",{className:"card-news-template-grid",children:r.map(t=>e.jsxs("button",{type:"button",className:`card-news-template${d===t.id?" selected":""}`,onClick:()=>c(t.id),children:[e.jsx("img",{src:t.previewUrl,alt:""}),e.jsxs("span",{className:"card-news-template__body",children:[e.jsx("span",{className:"card-news-template__name",children:t.name}),e.jsx("span",{className:"card-news-template__meta",children:f(t)}),e.jsx("span",{className:"card-news-template__sizes",children:t.recommendedOutputSizes.join(" · ")})]})]},t.id))})]})}function k(){const{t:s}=u(),r=l(t=>t.roleTemplates),d=l(t=>t.roleTemplateId),c=l(t=>t.setRoleTemplate);return e.jsxs("section",{className:"card-news-panel",children:[e.jsx("div",{className:"card-news-panel__head",children:e.jsx("span",{children:s("cardNews.roleTemplate")})}),e.jsx("div",{className:"card-news-role-row",children:r.map(t=>e.jsx("button",{type:"button",className:d===t.id?"selected":"",onClick:()=>c(t.id),children:t.name},t.id))})]})}function C({status:s,locked:r}){const{t:d}=u(),c=r?"locked":s,t=c==="queued"||c==="generating";return e.jsxs("span",{className:`card-news-status-badge card-news-status-badge--${c}`,children:[t?e.jsx("span",{className:"card-news-spinner","aria-hidden":"true"}):null,d(`cardNews.status.${c}`)]})}function T(s,r){const d=`cardNews.roles.${s}`,c=r(d);return c===d?s:c}function F(){const{t:s}=u(),r=l(t=>t.activePlan),d=l(t=>t.selectedCardId),c=l(t=>t.selectCard);return r?e.jsx("div",{className:"card-news-deck","aria-label":"Card deck",onWheel:v,children:r.cards.map(t=>e.jsxs("button",{type:"button",className:`card-news-deck-card${d===t.id?" selected":""}`,onClick:()=>c(t.id),children:[e.jsx("span",{children:String(t.order).padStart(2,"0")}),t.url?e.jsx("img",{src:t.url,alt:"",className:"card-news-deck-card__thumb"}):null,e.jsx("strong",{children:T(t.role,s)}),e.jsx("small",{children:t.headline||t.textFields.find(p=>p.renderMode==="in-image")?.text}),e.jsx(C,{status:t.status,locked:t.locked})]},t.id))}):null}const I=[];function S(){const{t:s}=u(),r=l(t=>t.activePlan?.cards??I),d=l(t=>t.generating),c={total:r.length,done:r.filter(t=>t.status==="generated").length,queued:r.filter(t=>t.status==="queued").length,errors:r.filter(t=>t.status==="error").length,skipped:r.filter(t=>t.locked||t.status==="skipped").length};return c.total?e.jsxs("div",{className:"card-news-batch-bar","aria-live":"polite",children:[e.jsx("span",{children:d?s("cardNews.progress.generating",{done:c.done,total:c.total}):s("cardNews.progress.summary",{done:c.done,total:c.total})}),e.jsx("span",{children:s("cardNews.progress.detail",{queued:c.queued,errors:c.errors,skipped:c.skipped})})]}):null}function $({meta:s}){const{t:r}=u();if(!s)return null;const d=s.mode==="structured-output"?r("cardNews.planner.structured"):s.mode==="json-mode"?r("cardNews.planner.jsonMode"):r("cardNews.planner.fallback");return e.jsxs("span",{className:"card-news-planner-badge",children:[d," · ",s.model,s.repaired?` · ${r("cardNews.planner.repaired")}`:""]})}function M(s){const r=s.textFields.filter(d=>d.renderMode==="in-image"&&d.text).map(d=>`[${d.placement}] ${d.text}`);return[s.headline,...r].filter(Boolean).join(`
1
+ import{u,p as l,j as e,q as v,a as N,e as y}from"./index-BAFI6htx.js";function f(s){const r=s.slots.filter(c=>c.kind==="text"||c.textKind).length,d=s.slots.filter(c=>c.kind==="image").length;return`${r} text / ${d} image`}function _(){const{t:s}=u(),r=l(t=>t.templates),d=l(t=>t.imageTemplateId),c=l(t=>t.setImageTemplate);return e.jsxs("section",{className:"card-news-panel",children:[e.jsxs("div",{className:"card-news-panel__head",children:[e.jsx("span",{children:s("cardNews.imageTemplate")}),e.jsx("button",{type:"button",disabled:!0,title:s("cardNews.newTemplateLater"),children:"+"})]}),e.jsx("div",{className:"card-news-template-grid",children:r.map(t=>e.jsxs("button",{type:"button",className:`card-news-template${d===t.id?" selected":""}`,onClick:()=>c(t.id),children:[e.jsx("img",{src:t.previewUrl,alt:""}),e.jsxs("span",{className:"card-news-template__body",children:[e.jsx("span",{className:"card-news-template__name",children:t.name}),e.jsx("span",{className:"card-news-template__meta",children:f(t)}),e.jsx("span",{className:"card-news-template__sizes",children:t.recommendedOutputSizes.join(" · ")})]})]},t.id))})]})}function k(){const{t:s}=u(),r=l(t=>t.roleTemplates),d=l(t=>t.roleTemplateId),c=l(t=>t.setRoleTemplate);return e.jsxs("section",{className:"card-news-panel",children:[e.jsx("div",{className:"card-news-panel__head",children:e.jsx("span",{children:s("cardNews.roleTemplate")})}),e.jsx("div",{className:"card-news-role-row",children:r.map(t=>e.jsx("button",{type:"button",className:d===t.id?"selected":"",onClick:()=>c(t.id),children:t.name},t.id))})]})}function C({status:s,locked:r}){const{t:d}=u(),c=r?"locked":s,t=c==="queued"||c==="generating";return e.jsxs("span",{className:`card-news-status-badge card-news-status-badge--${c}`,children:[t?e.jsx("span",{className:"card-news-spinner","aria-hidden":"true"}):null,d(`cardNews.status.${c}`)]})}function T(s,r){const d=`cardNews.roles.${s}`,c=r(d);return c===d?s:c}function F(){const{t:s}=u(),r=l(t=>t.activePlan),d=l(t=>t.selectedCardId),c=l(t=>t.selectCard);return r?e.jsx("div",{className:"card-news-deck","aria-label":"Card deck",onWheel:v,children:r.cards.map(t=>e.jsxs("button",{type:"button",className:`card-news-deck-card${d===t.id?" selected":""}`,onClick:()=>c(t.id),children:[e.jsx("span",{children:String(t.order).padStart(2,"0")}),t.url?e.jsx("img",{src:t.url,alt:"",className:"card-news-deck-card__thumb"}):null,e.jsx("strong",{children:T(t.role,s)}),e.jsx("small",{children:t.headline||t.textFields.find(p=>p.renderMode==="in-image")?.text}),e.jsx(C,{status:t.status,locked:t.locked})]},t.id))}):null}const I=[];function S(){const{t:s}=u(),r=l(t=>t.activePlan?.cards??I),d=l(t=>t.generating),c={total:r.length,done:r.filter(t=>t.status==="generated").length,queued:r.filter(t=>t.status==="queued").length,errors:r.filter(t=>t.status==="error").length,skipped:r.filter(t=>t.locked||t.status==="skipped").length};return c.total?e.jsxs("div",{className:"card-news-batch-bar","aria-live":"polite",children:[e.jsx("span",{children:d?s("cardNews.progress.generating",{done:c.done,total:c.total}):s("cardNews.progress.summary",{done:c.done,total:c.total})}),e.jsx("span",{children:s("cardNews.progress.detail",{queued:c.queued,errors:c.errors,skipped:c.skipped})})]}):null}function $({meta:s}){const{t:r}=u();if(!s)return null;const d=s.mode==="structured-output"?r("cardNews.planner.structured"):s.mode==="json-mode"?r("cardNews.planner.jsonMode"):r("cardNews.planner.fallback");return e.jsxs("span",{className:"card-news-planner-badge",children:[d," · ",s.model,s.repaired?` · ${r("cardNews.planner.repaired")}`:""]})}function M(s){const r=s.textFields.filter(d=>d.renderMode==="in-image"&&d.text).map(d=>`[${d.placement}] ${d.text}`);return[s.headline,...r].filter(Boolean).join(`
2
2
  `)}function E(s,r){const d=s.slotId?r?.slots.find(c=>c.id===s.slotId):null;return d?{left:`${d.x/20.48}%`,top:`${d.y/20.48}%`,width:`${d.w/20.48}%`,minHeight:`${d.h/20.48}%`}:P(s)}const w={"top-left":{left:"10%",top:"10%",width:"34%"},"top-center":{left:"50%",top:"10%",width:"42%",transform:"translateX(-50%)"},"top-right":{right:"10%",top:"10%",width:"34%"},"center-left":{left:"10%",top:"50%",width:"34%",transform:"translateY(-50%)"},center:{left:"50%",top:"50%",width:"44%",transform:"translate(-50%, -50%)"},"center-right":{right:"10%",top:"50%",width:"34%",transform:"translateY(-50%)"},"bottom-left":{left:"10%",bottom:"10%",width:"34%"},"bottom-center":{left:"50%",bottom:"10%",width:"42%",transform:"translateX(-50%)"},"bottom-right":{right:"10%",bottom:"10%",width:"34%"},free:{left:"50%",top:"50%",width:"44%",transform:"translate(-50%, -50%)"}};function P(s){return w[s.placement]||w.center}function L(){const{t:s}=u(),r=l(a=>a.activePlan),d=l(a=>a.selectedCardId),c=l(a=>a.selectedTextFieldId),t=l(a=>a.templates),p=l(a=>a.plannerMeta),o=l(a=>a.retryCard),m=l(a=>a.selectTextField),i=r?.cards.find(a=>a.id===d)||r?.cards[0],x=r?t.find(a=>a.id===r.imageTemplateId):void 0,n=i?.textFields.filter(a=>a.renderMode==="in-image")||[];return!r||!i?e.jsxs("section",{className:"card-news-empty",children:[e.jsxs("div",{className:"card-news-empty__deck","aria-hidden":"true",children:[e.jsx("div",{className:"card-news-empty__card card-news-empty__card--back"}),e.jsx("div",{className:"card-news-empty__card card-news-empty__card--mid"}),e.jsxs("div",{className:"card-news-empty__card",children:[e.jsx("span",{}),e.jsx("strong",{}),e.jsx("em",{})]})]}),e.jsxs("div",{className:"card-news-empty__copy",children:[e.jsx("span",{children:s("uiMode.cardNews")}),e.jsx("h2",{children:s("cardNews.emptyTitle")}),e.jsx("p",{children:s("cardNews.emptyBody")})]})]}):e.jsxs("section",{className:"card-news-stage",children:[e.jsxs("div",{className:"card-news-stage__header",children:[e.jsxs("div",{children:[e.jsx("h2",{children:r.title}),e.jsx("p",{children:r.generationStrategy}),e.jsx($,{meta:p})]}),e.jsxs("span",{children:[i.order," / ",r.cards.length]})]}),e.jsx(S,{}),e.jsxs("div",{className:"card-news-preview",children:[i.status==="queued"||i.status==="generating"?e.jsx("div",{className:"card-news-preview__loading",children:s("cardNews.progress.cardGenerating")}):i.status==="error"?e.jsxs("div",{className:"card-news-preview__error",children:[e.jsx("span",{children:i.error||s("cardNews.error")}),i.locked?null:e.jsx("button",{type:"button",onClick:()=>{o(i.id)},children:s("cardNews.retryCard")})]}):i.url?e.jsx("img",{src:i.url,alt:i.headline}):e.jsx("div",{className:"card-news-preview__slot"}),n.length?e.jsx("div",{className:"card-news-stage-overlay",children:n.map(a=>e.jsx("button",{type:"button",className:`card-news-stage-overlay__field card-news-stage-overlay__field--${a.placement}${c===a.id?" selected":""}`,style:E(a,x),onClick:()=>m(a.id),"aria-label":s("cardNews.selectTextField",{text:a.text||a.kind}),children:e.jsx("span",{children:a.text||a.kind})},a.id))}):null]}),i.url?e.jsxs("div",{className:"card-news-result-actions",children:[e.jsx("button",{type:"button",onClick:()=>navigator.clipboard?.writeText(i.visualPrompt),children:s("cardNews.actions.copyPrompt")}),e.jsx("button",{type:"button",onClick:()=>navigator.clipboard?.writeText(M(i)),children:s("cardNews.actions.copyCopy")}),e.jsx("a",{href:i.url,target:"_blank",rel:"noreferrer",children:s("cardNews.actions.openImage")}),e.jsx("a",{href:i.url,download:!0,children:s("cardNews.actions.downloadCard")})]}):null]})}function g(s,r){const d=`cardNews.placements.${s}`,c=r(d);return c===d?s:c}function R({placement:s}){const{t:r}=u();return e.jsx("span",{className:"card-news-placement-chip",children:g(s,r)})}const B=["headline","body","caption","cta","badge","number"],D=["top-left","top-center","top-right","center-left","center","center-right","bottom-left","bottom-center","bottom-right","free"],q=["in-image","ui-only"],K=["primary","secondary","supporting"];function h(s,r,d){const c=`cardNews.${s}.${r}`,t=d(c);return t===c?r:t}function A({field:s,locked:r,selected:d=!1,onSelect:c,onChange:t,onRemove:p}){const{t:o}=u(),m=s.text.length,i=typeof s.maxChars=="number"&&m>s.maxChars,x=s.maxChars===null||s.maxChars>80;return e.jsxs("div",{className:`card-news-text-field-card${d?" selected":""}`,onClick:c,children:[e.jsxs("div",{className:"card-news-text-field-card__header",children:[e.jsx("span",{children:h("textKinds",s.kind,o)}),e.jsx(R,{placement:s.placement})]}),e.jsxs("label",{className:"card-news-field",children:[e.jsx("span",{children:o("cardNews.textFieldText")}),x?e.jsx("textarea",{value:s.text,disabled:r,onChange:n=>t({text:n.target.value,source:"user"})}):e.jsx("input",{value:s.text,disabled:r,onChange:n=>t({text:n.target.value,source:"user"})})]}),e.jsxs("div",{className:"card-news-text-field-card__grid",children:[e.jsxs("label",{className:"card-news-field",children:[e.jsx("span",{children:o("cardNews.textKind")}),e.jsx("select",{value:s.kind,disabled:r,onChange:n=>t({kind:n.target.value,source:"user"}),children:B.map(n=>e.jsx("option",{value:n,children:h("textKinds",n,o)},n))})]}),e.jsxs("label",{className:"card-news-field",children:[e.jsx("span",{children:o("cardNews.placement")}),e.jsx("select",{value:s.placement,disabled:r,onChange:n=>t({placement:n.target.value,source:"user"}),children:D.map(n=>e.jsx("option",{value:n,children:g(n,o)},n))})]}),e.jsxs("label",{className:"card-news-field",children:[e.jsx("span",{children:o("cardNews.renderMode")}),e.jsx("select",{value:s.renderMode,disabled:r,onChange:n=>t({renderMode:n.target.value,source:"user"}),children:q.map(n=>e.jsx("option",{value:n,children:h("renderModes",n,o)},n))})]}),e.jsxs("label",{className:"card-news-field",children:[e.jsx("span",{children:o("cardNews.hierarchyLabel")}),e.jsx("select",{value:s.hierarchy,disabled:r,onChange:n=>t({hierarchy:n.target.value,source:"user"}),children:K.map(n=>e.jsx("option",{value:n,children:h("hierarchy",n,o)},n))})]})]}),e.jsxs("div",{className:`card-news-text-field-card__meta${i?" over":""}`,children:[e.jsx("span",{children:s.maxChars===null?m:`${m}/${s.maxChars}`}),i?e.jsx("span",{children:o("cardNews.textTooLong")}):null,p?e.jsx("button",{type:"button",disabled:r,onClick:p,children:o("cardNews.removeTextField")}):null]})]})}function H(){return{id:`tf_${Date.now().toString(36)}`,kind:"body",text:"",renderMode:"in-image",placement:"center",slotId:null,hierarchy:"supporting",maxChars:null,language:null,source:"user"}}function Y(){const{t:s}=u(),r=l(a=>a.activePlan),d=l(a=>a.selectedCardId),c=l(a=>a.selectedTextFieldId),t=l(a=>a.updateCard),p=l(a=>a.updateTextField),o=l(a=>a.addTextField),m=l(a=>a.removeTextField),i=l(a=>a.selectTextField),x=l(a=>a.retryCard),n=r?.cards.find(a=>a.id===d)||r?.cards[0];return n?e.jsxs("aside",{className:"card-news-inspector",children:[e.jsx("div",{className:"section-title",children:s("cardNews.inspector")}),e.jsxs("div",{className:"card-news-inspector-group",children:[e.jsx("span",{className:"card-news-inspector-label",children:s("cardNews.cardTitle")}),e.jsxs("label",{className:"card-news-field",children:[e.jsx("span",{children:s("cardNews.headline")}),e.jsx("input",{value:n.headline,disabled:n.locked,onChange:a=>t(n.id,{headline:a.target.value})})]})]}),e.jsxs("div",{className:"card-news-inspector-group",children:[e.jsxs("div",{className:"card-news-inspector-row",children:[e.jsx("span",{className:"card-news-inspector-label",children:s("cardNews.textFields")}),e.jsx("button",{type:"button",className:"secondary-btn",disabled:n.locked,onClick:()=>o(n.id,H()),children:s("cardNews.addTextField")})]}),n.textFields.length?n.textFields.map(a=>e.jsx(A,{field:a,locked:n.locked,selected:c===a.id,onSelect:()=>i(a.id),onChange:b=>p(n.id,a.id,b),onRemove:()=>m(n.id,a.id)},a.id)):e.jsx("p",{className:"card-news-muted",children:s("cardNews.noTextFields")})]}),e.jsxs("details",{className:"card-news-inspector-group card-news-advanced-prompt",children:[e.jsx("summary",{children:s("cardNews.designPrompt")}),e.jsxs("label",{className:"card-news-field",children:[e.jsx("span",{children:s("cardNews.visualPrompt")}),e.jsx("textarea",{value:n.visualPrompt,disabled:n.locked,onChange:a=>t(n.id,{visualPrompt:a.target.value})})]})]}),n.imageFilename?e.jsxs("div",{className:"card-news-generated-meta",children:[e.jsx("span",{children:s("cardNews.generatedMeta")}),e.jsx("code",{children:n.imageFilename}),e.jsx("span",{children:n.status})]}):null,n.locked?e.jsx("p",{className:"card-news-locked-help",children:s("cardNews.lockedHelp")}):null,e.jsx("button",{type:"button",className:`secondary-btn${n.locked?" active":""}`,onClick:()=>t(n.id,{locked:!n.locked}),children:n.locked?s("cardNews.locked"):s("cardNews.unlocked")}),e.jsx("button",{type:"button",className:"secondary-btn",disabled:n.locked||!["draft","error"].includes(n.status),onClick:()=>{x(n.id)},children:s("cardNews.retryCard")})]}):e.jsxs("aside",{className:"card-news-inspector card-news-inspector-empty",children:[e.jsx("div",{className:"section-title",children:s("cardNews.inspector")}),e.jsxs("div",{className:"card-news-inspector-empty__mock","aria-hidden":"true",children:[e.jsx("span",{}),e.jsx("strong",{}),e.jsx("i",{}),e.jsx("i",{})]}),e.jsx("p",{children:s("cardNews.noCard")})]})}const j="ima2:cardNewsMobileNoticeShown";function z(){const{t:s}=u(),r=y(),[d,c]=N.useState(()=>{if(typeof window>"u")return!0;try{return localStorage.getItem(j)==="1"}catch{return!1}});if(!r||d)return null;const t=()=>{try{localStorage.setItem(j,"1")}catch{}c(!0)};return e.jsxs("div",{className:"card-news-mobile-notice",role:"status",children:[e.jsx("span",{children:s("mobile.cardNewsBanner")}),e.jsx("button",{type:"button",onClick:t,children:s("mobile.dismiss")})]})}function W(){const{t:s}=u(),r=l(c=>c.hydrate),d=l(c=>c.error);return N.useEffect(()=>{r()},[r]),e.jsxs("main",{className:"card-news-workspace","aria-label":s("cardNews.workspace"),children:[e.jsx(z,{}),e.jsxs("div",{className:"card-news-setup",children:[e.jsx(_,{}),e.jsx(k,{})]}),e.jsxs("div",{className:"card-news-main",children:[d?e.jsx("div",{className:"card-news-error",role:"alert",children:d}):null,e.jsx(L,{}),e.jsx(F,{})]}),e.jsx(Y,{})]})}export{W as CardNewsWorkspace};