@aui.io/apollo 0.1.15 → 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.
- package/node_modules/@aui.io/apollo-cli/dist/src/commands/bundles.js +38 -8
- package/node_modules/@aui.io/apollo-cli/dist/src/commands/bundles.js.map +1 -1
- package/node_modules/@aui.io/apollo-cli/dist/src/commands/hierarchy.js +25 -2
- package/node_modules/@aui.io/apollo-cli/dist/src/commands/hierarchy.js.map +1 -1
- package/node_modules/@aui.io/apollo-cli/dist/src/commands/scenarios.d.ts +3 -0
- package/node_modules/@aui.io/apollo-cli/dist/src/commands/scenarios.js +124 -0
- package/node_modules/@aui.io/apollo-cli/dist/src/commands/scenarios.js.map +1 -0
- package/node_modules/@aui.io/apollo-cli/dist/src/index.js +2 -0
- package/node_modules/@aui.io/apollo-cli/dist/src/index.js.map +1 -1
- package/node_modules/@aui.io/apollo-cli/package.json +3 -3
- package/node_modules/@aui.io/apollo-core/dist/src/api/agent-settings.d.ts +172 -1
- package/node_modules/@aui.io/apollo-core/dist/src/api/agent-settings.js +59 -15
- package/node_modules/@aui.io/apollo-core/dist/src/api/agent-settings.js.map +1 -1
- package/node_modules/@aui.io/apollo-core/dist/src/api/client-types.d.ts +3 -0
- package/node_modules/@aui.io/apollo-core/dist/src/api/transport.d.ts +15 -0
- package/node_modules/@aui.io/apollo-core/dist/src/api/transport.js +27 -7
- package/node_modules/@aui.io/apollo-core/dist/src/api/transport.js.map +1 -1
- package/node_modules/@aui.io/apollo-core/dist/src/config/index.js +4 -4
- package/node_modules/@aui.io/apollo-core/dist/src/config/index.js.map +1 -1
- package/node_modules/@aui.io/apollo-core/dist/src/config/types.d.ts +2 -1
- package/node_modules/@aui.io/apollo-core/dist/src/index.d.ts +4 -2
- package/node_modules/@aui.io/apollo-core/dist/src/index.js +4 -2
- package/node_modules/@aui.io/apollo-core/dist/src/index.js.map +1 -1
- package/node_modules/@aui.io/apollo-core/dist/src/schemas/install.d.ts +13 -0
- package/node_modules/@aui.io/apollo-core/dist/src/schemas/install.js +28 -0
- package/node_modules/@aui.io/apollo-core/dist/src/schemas/install.js.map +1 -0
- package/node_modules/@aui.io/apollo-core/dist/src/services/clients.d.ts +3 -2
- package/node_modules/@aui.io/apollo-core/dist/src/services/clients.js +10 -9
- package/node_modules/@aui.io/apollo-core/dist/src/services/clients.js.map +1 -1
- package/node_modules/@aui.io/apollo-core/dist/src/services/scenarios.d.ts +151 -0
- package/node_modules/@aui.io/apollo-core/dist/src/services/scenarios.js +459 -0
- package/node_modules/@aui.io/apollo-core/dist/src/services/scenarios.js.map +1 -0
- package/node_modules/@aui.io/apollo-core/package.json +1 -1
- package/node_modules/@aui.io/apollo-tui/dist/src/actions/registry.js +32 -0
- package/node_modules/@aui.io/apollo-tui/dist/src/actions/registry.js.map +1 -1
- package/node_modules/@aui.io/apollo-tui/dist/src/activity/operationStore.js +3 -0
- package/node_modules/@aui.io/apollo-tui/dist/src/activity/operationStore.js.map +1 -1
- package/node_modules/@aui.io/apollo-tui/dist/src/author/AuthorHome.d.ts +3 -1
- package/node_modules/@aui.io/apollo-tui/dist/src/author/AuthorHome.js +3 -3
- package/node_modules/@aui.io/apollo-tui/dist/src/author/AuthorHome.js.map +1 -1
- package/node_modules/@aui.io/apollo-tui/dist/src/author/ScenariosView.d.ts +22 -0
- package/node_modules/@aui.io/apollo-tui/dist/src/author/ScenariosView.js +99 -0
- package/node_modules/@aui.io/apollo-tui/dist/src/author/ScenariosView.js.map +1 -0
- package/node_modules/@aui.io/apollo-tui/dist/src/author/scenarios.d.ts +47 -0
- package/node_modules/@aui.io/apollo-tui/dist/src/author/scenarios.js +284 -0
- package/node_modules/@aui.io/apollo-tui/dist/src/author/scenarios.js.map +1 -0
- package/node_modules/@aui.io/apollo-tui/dist/src/lib/actions.js +100 -4
- package/node_modules/@aui.io/apollo-tui/dist/src/lib/actions.js.map +1 -1
- package/node_modules/@aui.io/apollo-tui/dist/src/lib/commands.js +44 -1
- package/node_modules/@aui.io/apollo-tui/dist/src/lib/commands.js.map +1 -1
- package/node_modules/@aui.io/apollo-tui/dist/src/opentui-app.js +159 -15
- package/node_modules/@aui.io/apollo-tui/dist/src/opentui-app.js.map +1 -1
- package/node_modules/@aui.io/apollo-tui/dist/src/shell/FooterHints.d.ts +1 -1
- package/node_modules/@aui.io/apollo-tui/dist/src/shell/FooterHints.js +1 -0
- package/node_modules/@aui.io/apollo-tui/dist/src/shell/FooterHints.js.map +1 -1
- package/node_modules/@aui.io/apollo-tui/package.json +2 -2
- 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 === "
|
|
2366
|
-
?
|
|
2367
|
-
|
|
2368
|
-
|
|
2369
|
-
|
|
2370
|
-
|
|
2371
|
-
|
|
2372
|
-
|
|
2373
|
-
|
|
2374
|
-
|
|
2375
|
-
|
|
2376
|
-
?
|
|
2377
|
-
:
|
|
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 === "
|
|
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) => {
|