@aui.io/apollo 0.1.16 → 0.1.17

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 (52) hide show
  1. package/node_modules/@aui.io/apollo-cli/dist/src/commands/bundles.js +23 -1
  2. package/node_modules/@aui.io/apollo-cli/dist/src/commands/bundles.js.map +1 -1
  3. package/node_modules/@aui.io/apollo-cli/dist/src/commands/scenarios.d.ts +3 -0
  4. package/node_modules/@aui.io/apollo-cli/dist/src/commands/scenarios.js +124 -0
  5. package/node_modules/@aui.io/apollo-cli/dist/src/commands/scenarios.js.map +1 -0
  6. package/node_modules/@aui.io/apollo-cli/dist/src/index.js +2 -0
  7. package/node_modules/@aui.io/apollo-cli/dist/src/index.js.map +1 -1
  8. package/node_modules/@aui.io/apollo-cli/package.json +3 -3
  9. package/node_modules/@aui.io/apollo-core/dist/src/api/agent-settings.d.ts +177 -0
  10. package/node_modules/@aui.io/apollo-core/dist/src/api/agent-settings.js +67 -0
  11. package/node_modules/@aui.io/apollo-core/dist/src/api/agent-settings.js.map +1 -0
  12. package/node_modules/@aui.io/apollo-core/dist/src/api/client-types.d.ts +3 -0
  13. package/node_modules/@aui.io/apollo-core/dist/src/api/transport.d.ts +15 -0
  14. package/node_modules/@aui.io/apollo-core/dist/src/api/transport.js +27 -7
  15. package/node_modules/@aui.io/apollo-core/dist/src/api/transport.js.map +1 -1
  16. package/node_modules/@aui.io/apollo-core/dist/src/config/index.js +4 -0
  17. package/node_modules/@aui.io/apollo-core/dist/src/config/index.js.map +1 -1
  18. package/node_modules/@aui.io/apollo-core/dist/src/config/types.d.ts +2 -0
  19. package/node_modules/@aui.io/apollo-core/dist/src/index.d.ts +3 -1
  20. package/node_modules/@aui.io/apollo-core/dist/src/index.js +3 -1
  21. package/node_modules/@aui.io/apollo-core/dist/src/index.js.map +1 -1
  22. package/node_modules/@aui.io/apollo-core/dist/src/services/clients.d.ts +3 -0
  23. package/node_modules/@aui.io/apollo-core/dist/src/services/clients.js +10 -0
  24. package/node_modules/@aui.io/apollo-core/dist/src/services/clients.js.map +1 -1
  25. package/node_modules/@aui.io/apollo-core/dist/src/services/scenarios.d.ts +151 -0
  26. package/node_modules/@aui.io/apollo-core/dist/src/services/scenarios.js +459 -0
  27. package/node_modules/@aui.io/apollo-core/dist/src/services/scenarios.js.map +1 -0
  28. package/node_modules/@aui.io/apollo-core/package.json +1 -1
  29. package/node_modules/@aui.io/apollo-tui/dist/src/actions/registry.js +28 -0
  30. package/node_modules/@aui.io/apollo-tui/dist/src/actions/registry.js.map +1 -1
  31. package/node_modules/@aui.io/apollo-tui/dist/src/activity/operationStore.js +3 -0
  32. package/node_modules/@aui.io/apollo-tui/dist/src/activity/operationStore.js.map +1 -1
  33. package/node_modules/@aui.io/apollo-tui/dist/src/author/AuthorHome.d.ts +3 -1
  34. package/node_modules/@aui.io/apollo-tui/dist/src/author/AuthorHome.js +3 -3
  35. package/node_modules/@aui.io/apollo-tui/dist/src/author/AuthorHome.js.map +1 -1
  36. package/node_modules/@aui.io/apollo-tui/dist/src/author/ScenariosView.d.ts +22 -0
  37. package/node_modules/@aui.io/apollo-tui/dist/src/author/ScenariosView.js +99 -0
  38. package/node_modules/@aui.io/apollo-tui/dist/src/author/ScenariosView.js.map +1 -0
  39. package/node_modules/@aui.io/apollo-tui/dist/src/author/scenarios.d.ts +47 -0
  40. package/node_modules/@aui.io/apollo-tui/dist/src/author/scenarios.js +284 -0
  41. package/node_modules/@aui.io/apollo-tui/dist/src/author/scenarios.js.map +1 -0
  42. package/node_modules/@aui.io/apollo-tui/dist/src/lib/actions.js +80 -1
  43. package/node_modules/@aui.io/apollo-tui/dist/src/lib/actions.js.map +1 -1
  44. package/node_modules/@aui.io/apollo-tui/dist/src/lib/commands.js +43 -0
  45. package/node_modules/@aui.io/apollo-tui/dist/src/lib/commands.js.map +1 -1
  46. package/node_modules/@aui.io/apollo-tui/dist/src/opentui-app.js +159 -15
  47. package/node_modules/@aui.io/apollo-tui/dist/src/opentui-app.js.map +1 -1
  48. package/node_modules/@aui.io/apollo-tui/dist/src/shell/FooterHints.d.ts +1 -1
  49. package/node_modules/@aui.io/apollo-tui/dist/src/shell/FooterHints.js +1 -0
  50. package/node_modules/@aui.io/apollo-tui/dist/src/shell/FooterHints.js.map +1 -1
  51. package/node_modules/@aui.io/apollo-tui/package.json +2 -2
  52. package/package.json +4 -4
@@ -38,6 +38,8 @@ import { relativizeEvent, sessionCancel, sessionCreate, sessionEvent, sessionPro
38
38
  import { DiffView } from "./author/DiffView.js";
39
39
  import { loadResources, resourceRows as buildResourceRows, resourcesSummary, } from "./author/resources.js";
40
40
  import { ResourcesView } from "./author/ResourcesView.js";
41
+ import { loadScenariosData, scenarioRows as buildScenarioRows, scenariosSummary, } from "./author/scenarios.js";
42
+ import { ScenariosView } from "./author/ScenariosView.js";
41
43
  import { treeRows } from "./author/tree.js";
42
44
  import { ValidationViewPane } from "./author/ValidationView.js";
43
45
  import { VersionsViewPane } from "./author/VersionsView.js";
@@ -82,6 +84,7 @@ const AUTHOR_QUICK = {
82
84
  r: "versions",
83
85
  o: "ide",
84
86
  m: "resources",
87
+ s: "scenarios",
85
88
  };
86
89
  const OLD_NAV_NAMES = new Set(["chat", "bundle", "mockdb", "scope", "overview"]);
87
90
  const AUTHOR_VIEW_FOCUS = {
@@ -89,6 +92,7 @@ const AUTHOR_VIEW_FOCUS = {
89
92
  validation: "author-validation",
90
93
  versions: "author-versions",
91
94
  resources: "author-resources",
95
+ scenarios: "author-scenarios",
92
96
  };
93
97
  function App({ context: initialContext, initialScope, onQuit }) {
94
98
  const [context, setContext] = useState(initialContext);
@@ -150,6 +154,13 @@ function App({ context: initialContext, initialScope, onQuit }) {
150
154
  const [resourcesJsonExpanded, setResourcesJsonExpanded] = useState(() => new Set());
151
155
  /** Monotonic guard: a stale load must not clobber a newer one. */
152
156
  const resourcesLoadRef = useRef(0);
157
+ // Scenarios subview: evaluation suite + last score (local checkout files).
158
+ const [scenariosData, setScenariosData] = useState();
159
+ const [scenariosCursor, setScenariosCursor] = useState(0);
160
+ /** Full-width report (Enter on a row); Esc collapses back to the list. */
161
+ const [scenariosDetail, setScenariosDetail] = useState(false);
162
+ /** Monotonic guard for scenario file reloads. */
163
+ const scenariosLoadRef = useRef(0);
153
164
  // Author copilot (Phase 5): pluggable backend behind the AuthorBackend seam.
154
165
  const authorBackend = useMemo(() => resolveAuthorBackend(), []);
155
166
  const [backendDetection, setBackendDetection] = useState();
@@ -299,6 +310,9 @@ function App({ context: initialContext, initialScope, onQuit }) {
299
310
  function toggleResourcesJsonRow(row) {
300
311
  setResourcesJsonExpanded((prev) => toggleJsonPath(prev, row.path));
301
312
  }
313
+ /** Scenarios subview rows (suite ∪ scores ∪ action rows). */
314
+ const scenarioRowsView = useMemo(() => buildScenarioRows(scenariosData), [scenariosData]);
315
+ const scenariosCursorClamped = clampPickerCursor(scenariosCursor, scenarioRowsView.length);
302
316
  const talkCursorClamped = clampPickerCursor(talkCursor, chat.length);
303
317
  /** What sends run against, for the composer label and inspector (^B picks). */
304
318
  const talkVersionLabel = talkTag === "latest"
@@ -334,6 +348,9 @@ function App({ context: initialContext, initialScope, onQuit }) {
334
348
  resourceRows: resourceRowsView,
335
349
  resourcesCursor,
336
350
  resourcesDetail,
351
+ scenarioRows: scenarioRowsView,
352
+ scenariosCursor,
353
+ scenariosDetail,
337
354
  orderedOps,
338
355
  authorSession,
339
356
  sessionCursor,
@@ -376,6 +393,9 @@ function App({ context: initialContext, initialScope, onQuit }) {
376
393
  resourceRows: resourceRowsView,
377
394
  resourcesCursor,
378
395
  resourcesDetail,
396
+ scenarioRows: scenarioRowsView,
397
+ scenariosCursor,
398
+ scenariosDetail,
379
399
  orderedOps,
380
400
  authorSession,
381
401
  sessionCursor,
@@ -436,6 +456,12 @@ function App({ context: initialContext, initialScope, onQuit }) {
436
456
  setResourcesCollapsed(new Set());
437
457
  setResourcesDetail(false);
438
458
  resourcesLoadRef.current += 1;
459
+ // Scenario files too — reload from the new checkout (fs-only, cheap),
460
+ // so the home card shows real numbers immediately.
461
+ setScenariosData(undefined);
462
+ setScenariosCursor(0);
463
+ setScenariosDetail(false);
464
+ loadScenariosLocal();
439
465
  setAuthorView("home");
440
466
  remoteFilesRef.current = undefined;
441
467
  // The session belongs to the previous checkout — stop and clear it.
@@ -884,6 +910,20 @@ function App({ context: initialContext, initialScope, onQuit }) {
884
910
  setResourcesCursor((c) => clampPickerCursor(c + delta, rows.length));
885
911
  return;
886
912
  }
913
+ // Scenarios list navigation (no modal open, list visible).
914
+ if (arrow &&
915
+ !current.sheet &&
916
+ !current.confirm &&
917
+ current.mode === "author" &&
918
+ current.authorView === "scenarios" &&
919
+ !current.scenariosDetail) {
920
+ const rows = current.scenarioRows;
921
+ if (rows.length === 0)
922
+ return;
923
+ const delta = arrow === "down" ? 1 : -1;
924
+ setScenariosCursor((c) => clampPickerCursor(c + delta, rows.length));
925
+ return;
926
+ }
887
927
  // Session unit cursor (Author home): ↑↓ walk the work units; the pane
888
928
  // follows the cursor. Enter (empty input) expands the selected unit.
889
929
  if (arrow &&
@@ -915,6 +955,7 @@ function App({ context: initialContext, initialScope, onQuit }) {
915
955
  current.mode === "author" &&
916
956
  ((current.authorView === "diff" && current.fileDiff) ||
917
957
  (current.authorView === "resources" && current.resourcesDetail) ||
958
+ (current.authorView === "scenarios" && current.scenariosDetail) ||
918
959
  current.authorView === "validation" ||
919
960
  current.authorView === "versions")) {
920
961
  contentScrollRef.current?.scrollBy({ x: 0, y: arrow === "down" ? 1 : -1 });
@@ -1065,6 +1106,9 @@ function App({ context: initialContext, initialScope, onQuit }) {
1065
1106
  else if (current.authorView === "resources" && current.resourcesDetail) {
1066
1107
  setResourcesDetail(false);
1067
1108
  }
1109
+ else if (current.authorView === "scenarios" && current.scenariosDetail) {
1110
+ setScenariosDetail(false);
1111
+ }
1068
1112
  else
1069
1113
  setAuthorView("home");
1070
1114
  }
@@ -1335,6 +1379,30 @@ function App({ context: initialContext, initialScope, onQuit }) {
1335
1379
  loadResourcesData();
1336
1380
  }
1337
1381
  }
1382
+ /** Re-read scenarios/ from the checkout (pure fs — cheap, offline-safe). */
1383
+ function loadScenariosLocal() {
1384
+ const seq = ++scenariosLoadRef.current;
1385
+ const root = agentRootOf(stateRef.current.context);
1386
+ if (!root) {
1387
+ setScenariosData(undefined);
1388
+ return;
1389
+ }
1390
+ void loadScenariosData(root).then((data) => {
1391
+ if (scenariosLoadRef.current === seq)
1392
+ setScenariosData(data);
1393
+ });
1394
+ }
1395
+ function openScenariosView() {
1396
+ setMode("author");
1397
+ setAuthorView("scenarios");
1398
+ setScenariosDetail(false);
1399
+ loadScenariosLocal();
1400
+ }
1401
+ /** Commands that move scenario files re-read them (view + home card). */
1402
+ function refreshScenariosAfter(commandName) {
1403
+ if (/^(scenarios-|scores-)/.test(commandName))
1404
+ loadScenariosLocal();
1405
+ }
1338
1406
  // --- Operation tracking (TUI_DESIGN §13): real work lands in the store ---
1339
1407
  /** Start a tracked operation for whitelisted commands; else undefined. */
1340
1408
  function trackOperation(name, retry) {
@@ -1666,6 +1734,14 @@ function App({ context: initialContext, initialScope, onQuit }) {
1666
1734
  await openVersionsView();
1667
1735
  return;
1668
1736
  }
1737
+ if (command.name === "scenarios") {
1738
+ if (!agentRootOf(stateRef.current.context)) {
1739
+ setToast("Enter an agent checkout first — scenarios live in <checkout>/scenarios");
1740
+ return;
1741
+ }
1742
+ openScenariosView();
1743
+ return;
1744
+ }
1669
1745
  if (command.name === "trace") {
1670
1746
  setTrace((v) => {
1671
1747
  setToast(`trace ${v ? "off" : "on"}`);
@@ -1736,6 +1812,7 @@ function App({ context: initialContext, initialScope, onQuit }) {
1736
1812
  finishOperation(opId, result);
1737
1813
  await applyResult(result);
1738
1814
  refreshResourcesIfOpen(command.name);
1815
+ refreshScenariosAfter(command.name);
1739
1816
  }
1740
1817
  catch (error) {
1741
1818
  failOperation(opId, error);
@@ -1759,6 +1836,7 @@ function App({ context: initialContext, initialScope, onQuit }) {
1759
1836
  finishOperation(opId, result);
1760
1837
  await applyResult(result);
1761
1838
  refreshResourcesIfOpen(command.name);
1839
+ refreshScenariosAfter(command.name);
1762
1840
  }
1763
1841
  catch (err) {
1764
1842
  failOperation(opId, err);
@@ -2060,6 +2138,35 @@ function App({ context: initialContext, initialScope, onQuit }) {
2060
2138
  if (row.json !== undefined)
2061
2139
  setResourcesDetail(true);
2062
2140
  }
2141
+ /** Enter/second click on a scenarios row: expand report or run action. */
2142
+ function activateScenarioRow(index) {
2143
+ const rows = stateRef.current.scenarioRows;
2144
+ const row = rows[clampPickerCursor(index, rows.length)];
2145
+ if (!row)
2146
+ return;
2147
+ if (row.kind === "action" && row.command) {
2148
+ const command = SLASH_COMMANDS.find((c) => c.name === row.command);
2149
+ if (command)
2150
+ void runCommand(command, "");
2151
+ return;
2152
+ }
2153
+ if (row.blocks.length > 0)
2154
+ setScenariosDetail(true);
2155
+ }
2156
+ /** `t` on a scored row: jump to its graded transcript in Talk. */
2157
+ function openScenarioTranscript() {
2158
+ const current = stateRef.current;
2159
+ const row = current.scenarioRows[clampPickerCursor(current.scenariosCursor, current.scenarioRows.length)];
2160
+ const sessionId = row?.sessionIds[0];
2161
+ if (!row || sessionId === undefined) {
2162
+ setToast("No transcript recorded for this row");
2163
+ return;
2164
+ }
2165
+ if (row.sessionIds.length > 1) {
2166
+ setToast(`Opening 1 of ${String(row.sessionIds.length)} transcripts`);
2167
+ }
2168
+ void openThread(sessionId);
2169
+ }
2063
2170
  /** `x` on a resources row: delete exactly that target (typed confirm). */
2064
2171
  function deleteSelectedResource() {
2065
2172
  const current = stateRef.current;
@@ -2263,6 +2370,14 @@ function App({ context: initialContext, initialScope, onQuit }) {
2263
2370
  activateResourceRow(clampPickerCursor(current.resourcesCursor, current.resourceRows.length));
2264
2371
  return;
2265
2372
  }
2373
+ // Enter on a scenarios row: expand the report, or run an action row.
2374
+ if (line === "" &&
2375
+ current.mode === "author" &&
2376
+ current.authorView === "scenarios" &&
2377
+ !current.scenariosDetail) {
2378
+ activateScenarioRow(clampPickerCursor(current.scenariosCursor, current.scenarioRows.length));
2379
+ return;
2380
+ }
2266
2381
  // Enter on a session unit: expand/collapse its body (tool input/result).
2267
2382
  if (line === "" &&
2268
2383
  current.mode === "author" &&
@@ -2294,6 +2409,18 @@ function App({ context: initialContext, initialScope, onQuit }) {
2294
2409
  return;
2295
2410
  }
2296
2411
  }
2412
+ // Scenarios view: r re-reads the files, t opens the graded transcript.
2413
+ if (current.mode === "author" && current.authorView === "scenarios") {
2414
+ if (line.toLowerCase() === "r") {
2415
+ loadScenariosLocal();
2416
+ setToast("Reloading scenarios…");
2417
+ return;
2418
+ }
2419
+ if (line.toLowerCase() === "t") {
2420
+ openScenarioTranscript();
2421
+ return;
2422
+ }
2423
+ }
2297
2424
  // Talk mode never reaches here without an overlay — the composer owns
2298
2425
  // sending, and ^T/^D/^N replaced the old typed t/d lines.
2299
2426
  // Author mode: single-letter quick actions; free text on the home
@@ -2362,19 +2489,23 @@ function App({ context: initialContext, initialScope, onQuit }) {
2362
2489
  ? resourcesDetail
2363
2490
  ? "↑↓/PgUp/PgDn scroll · Esc back to list"
2364
2491
  : "↑↓ move · Enter open/run · x delete · r refresh · Esc back"
2365
- : authorViewEffective === "validation"
2366
- ? "v re-run · ↑↓ scroll · p push · Esc back"
2367
- : authorViewEffective === "versions"
2368
- ? "↑↓ scroll · publish/archive via ^K · Esc back"
2369
- : authorSession?.running
2370
- ? "type to queue a follow-up · ↑↓ units · Esc/^C cancel"
2371
- : authorSession
2372
- ? "describe the next change · ↑↓ units · Enter expand"
2373
- : backendDetection?.available &&
2374
- scope.loggedIn &&
2375
- hasAgent
2376
- ? `describe a change for ${authorBackend.label} · v d p l r o quick · ^K`
2377
- : "v d p l r o quick actions · ^K all actions";
2492
+ : authorViewEffective === "scenarios"
2493
+ ? scenariosDetail
2494
+ ? "↑↓/PgUp/PgDn scroll · Esc back to list"
2495
+ : "↑↓ move · Enter detail/run · t transcript · r reload · Esc back"
2496
+ : authorViewEffective === "validation"
2497
+ ? "v re-run · ↑↓ scroll · p push · Esc back"
2498
+ : authorViewEffective === "versions"
2499
+ ? "↑↓ scroll · publish/archive via ^K · Esc back"
2500
+ : authorSession?.running
2501
+ ? "type to queue a follow-up · ↑↓ units · Esc/^C cancel"
2502
+ : authorSession
2503
+ ? "describe the next change · ↑↓ units · Enter expand"
2504
+ : backendDetection?.available &&
2505
+ scope.loggedIn &&
2506
+ hasAgent
2507
+ ? `describe a change for ${authorBackend.label} · v d p l r o quick · ^K`
2508
+ : "v d p l r o quick actions · ^K all actions";
2378
2509
  const pickerFilter = picker ? effectivePickerFilter(input) : undefined;
2379
2510
  const pickerVisible = picker
2380
2511
  ? filterPickerItems(picker.items, pickerFilter)
@@ -2435,7 +2566,7 @@ function App({ context: initialContext, initialScope, onQuit }) {
2435
2566
  retryOperation(op);
2436
2567
  else
2437
2568
  setActivityCursor(index);
2438
- } })) : mode === "author" ? (authorViewEffective === "home" ? (_jsx(AuthorHome, { scope: scope, snapshot: snapshot, validation: validation, version: VERSION, paneTitle: paneTitle, paneLines: paneLines, resources: resourcesSummary(resourcesData), session: authorSession, sessionRows: sessionRowsView, sessionCursor: clampPickerCursor(sessionCursor, authorSession?.units.length ?? 0), sessionScrollRef: contentScrollRef, sessionUnitRefs: sessionUnitRefs, backendLabel: authorBackend.label, backendDetection: backendDetection, onSelectUnit: (unit) => {
2569
+ } })) : mode === "author" ? (authorViewEffective === "home" ? (_jsx(AuthorHome, { scope: scope, snapshot: snapshot, validation: validation, version: VERSION, paneTitle: paneTitle, paneLines: paneLines, resources: resourcesSummary(resourcesData), scenarios: scenariosSummary(scenariosData), session: authorSession, sessionRows: sessionRowsView, sessionCursor: clampPickerCursor(sessionCursor, authorSession?.units.length ?? 0), sessionScrollRef: contentScrollRef, sessionUnitRefs: sessionUnitRefs, backendLabel: authorBackend.label, backendDetection: backendDetection, onSelectUnit: (unit) => {
2439
2570
  const clamped = clampPickerCursor(sessionCursor, authorSession?.units.length ?? 0);
2440
2571
  // Click selects; clicking the selected unit toggles its body.
2441
2572
  if (unit === clamped)
@@ -2475,7 +2606,20 @@ function App({ context: initialContext, initialScope, onQuit }) {
2475
2606
  if (row?.kind === "section" || row?.kind === "action") {
2476
2607
  activateResourceRow(index);
2477
2608
  }
2478
- }, onJsonToggle: toggleResourcesJsonRow })) : authorViewEffective === "validation" ? (_jsx(ValidationViewPane, { record: validation, scrollRef: contentScrollRef })) : (_jsx(VersionsViewPane, { versions: versions ?? [], currentTag: scope.version, scrollRef: contentScrollRef }))) : (_jsx(TalkView, { chat: chat, rows: talkRowsView, cursor: talkCursorClamped, focusPane: talkFocus, layout: talkLayoutEffective, threads: threads, threadsLoading: threadsLoading, threadCursor: clampPickerCursor(threadCursor, threadsRowCount(threads)), threadId: threadId, localMode: localMode, trace: trace, vars: vars, inspectorMetaLines: inspectorMetaLines, inspectorFetch: inspectorFetch, paneTitle: paneTitle, paneLines: paneLines, overlayJson: overlayJsonRows, inspectorJson: inspectorJsonRows, onJsonToggle: toggleJsonRow, onSelectTurn: (turn) => {
2609
+ }, onJsonToggle: toggleResourcesJsonRow })) : authorViewEffective === "scenarios" ? (_jsx(ScenariosView, { rows: scenarioRowsView, cursor: scenariosCursorClamped, expanded: scenariosDetail, sidebarWidth: Math.max(34, Math.min(60, Math.floor(termWidth / 2))), pageSize: pickerPageSize(), scrollRef: contentScrollRef, loadedNote: scenariosData
2610
+ ? `loaded ${relativeTime(scenariosData.loadedAt)} · r reload`
2611
+ : "loading…", onRowClick: (index) => {
2612
+ const row = scenarioRowsView[index];
2613
+ // Click selects; actions run on first click, rows expand
2614
+ // their report on the second (same as resources items).
2615
+ if (index === scenariosCursorClamped) {
2616
+ activateScenarioRow(index);
2617
+ return;
2618
+ }
2619
+ setScenariosCursor(index);
2620
+ if (row?.kind === "action")
2621
+ activateScenarioRow(index);
2622
+ } })) : authorViewEffective === "validation" ? (_jsx(ValidationViewPane, { record: validation, scrollRef: contentScrollRef })) : (_jsx(VersionsViewPane, { versions: versions ?? [], currentTag: scope.version, scrollRef: contentScrollRef }))) : (_jsx(TalkView, { chat: chat, rows: talkRowsView, cursor: talkCursorClamped, focusPane: talkFocus, layout: talkLayoutEffective, threads: threads, threadsLoading: threadsLoading, threadCursor: clampPickerCursor(threadCursor, threadsRowCount(threads)), threadId: threadId, localMode: localMode, trace: trace, vars: vars, inspectorMetaLines: inspectorMetaLines, inspectorFetch: inspectorFetch, paneTitle: paneTitle, paneLines: paneLines, overlayJson: overlayJsonRows, inspectorJson: inspectorJsonRows, onJsonToggle: toggleJsonRow, onSelectTurn: (turn) => {
2479
2623
  setTalkFocus("chat");
2480
2624
  setTalkCursor(turn);
2481
2625
  }, onSelectThread: (row) => {