pilotswarm 0.5.55 → 0.5.57
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/package.json +2 -2
- package/ui/core/src/reducer.js +177 -11
- package/ui/core/src/selectors.js +75 -9
- package/ui/core/src/state.js +65 -0
- package/ui/react/src/web-app.js +89 -8
- package/web/dist/assets/{abnfDiagram-VRR7QNED-Cccg5mUx.js → abnfDiagram-VRR7QNED-CJOR2hPi.js} +1 -1
- package/web/dist/assets/{arc-DFWp1OiI.js → arc-Yh3kc_KB.js} +1 -1
- package/web/dist/assets/{architectureDiagram-ZJ3FMSHR-o2B4-sJ1.js → architectureDiagram-ZJ3FMSHR-DLRlUeyk.js} +1 -1
- package/web/dist/assets/{blockDiagram-677ZJIJ3-Cf_7Cm38.js → blockDiagram-677ZJIJ3-x_TGH_fp.js} +1 -1
- package/web/dist/assets/{c4Diagram-LMCZKHZV-CKXuPB0d.js → c4Diagram-LMCZKHZV-C-j_bxeF.js} +1 -1
- package/web/dist/assets/channel-BIn92AzB.js +1 -0
- package/web/dist/assets/{chunk-2Q5K7J3B-CZC3HwzC.js → chunk-2Q5K7J3B-CaI5Xqwo.js} +1 -1
- package/web/dist/assets/{chunk-32BRIVSS-7_X1k3eB.js → chunk-32BRIVSS-Bh_Crac6.js} +1 -1
- package/web/dist/assets/{chunk-5VM5RSS4-E2rxT4um.js → chunk-5VM5RSS4-XM-3ajKG.js} +1 -1
- package/web/dist/assets/{chunk-EX3LRPZG-BbW37HWx.js → chunk-EX3LRPZG-ZwkulfFp.js} +1 -1
- package/web/dist/assets/{chunk-JWPE2WC7-dj0DOnPl.js → chunk-JWPE2WC7-CT3Q7T2A.js} +1 -1
- package/web/dist/assets/{chunk-MOJQB5TN-TeWalpvK.js → chunk-MOJQB5TN-_Uc0ksg3.js} +1 -1
- package/web/dist/assets/{chunk-RYQCIY6F-ClHcH2bN.js → chunk-RYQCIY6F-DosoId7u.js} +1 -1
- package/web/dist/assets/{chunk-V7JOEXUC-Dy5XEnNL.js → chunk-V7JOEXUC-KRjq1cwM.js} +1 -1
- package/web/dist/assets/{chunk-VR4S4FIN-Den_q-0P.js → chunk-VR4S4FIN-B6Ul1z3S.js} +1 -1
- package/web/dist/assets/{chunk-XXDRQBXY-DZ1s-8xB.js → chunk-XXDRQBXY-AikdVXm4.js} +1 -1
- package/web/dist/assets/classDiagram-OUVF2IWQ-B7ktW6XM.js +1 -0
- package/web/dist/assets/classDiagram-v2-EOCWNBFH-B7ktW6XM.js +1 -0
- package/web/dist/assets/{cose-bilkent-JH36ORCC-CKAukUTf.js → cose-bilkent-JH36ORCC-DTYwgEAa.js} +1 -1
- package/web/dist/assets/{cynefin-VYW2F7L2-CM8y129F.js → cynefin-VYW2F7L2-C_8v2wIz.js} +1 -1
- package/web/dist/assets/{cynefinDiagram-TSTJHNR4-DLryvwYt.js → cynefinDiagram-TSTJHNR4-1-nw1zbQ.js} +1 -1
- package/web/dist/assets/{dagre-VKFMJZFB-BO0LMWmO.js → dagre-VKFMJZFB-CAjwRpvT.js} +1 -1
- package/web/dist/assets/{diagram-FQU43EPY-DiFLu7v2.js → diagram-FQU43EPY-Bg41nQw_.js} +1 -1
- package/web/dist/assets/{diagram-G47NLZAW-DMkq9we0.js → diagram-G47NLZAW-Cp6P-qMn.js} +1 -1
- package/web/dist/assets/{diagram-NH7WQ7WH-CxVQL8Dq.js → diagram-NH7WQ7WH-DNdFuedg.js} +1 -1
- package/web/dist/assets/{diagram-OA4YK3LP-B5TrTlUc.js → diagram-OA4YK3LP-DcHpELG2.js} +1 -1
- package/web/dist/assets/{diagram-WEI45ONY-Ca38mf1v.js → diagram-WEI45ONY-B2_kyMw3.js} +1 -1
- package/web/dist/assets/{ebnfDiagram-CCIWWBDH-DZR_44LD.js → ebnfDiagram-CCIWWBDH-DztuAo3o.js} +1 -1
- package/web/dist/assets/{erDiagram-Q63AITRT-Ca8mmsU1.js → erDiagram-Q63AITRT-DNjKTOzp.js} +1 -1
- package/web/dist/assets/{flowDiagram-23GEKE2U-C0DFTCS6.js → flowDiagram-23GEKE2U-DWjfeUM1.js} +1 -1
- package/web/dist/assets/{ganttDiagram-NO4QXBWP-COqaqM45.js → ganttDiagram-NO4QXBWP-Y0MgGVmy.js} +1 -1
- package/web/dist/assets/{gitGraphDiagram-IHSO6WYX-Cwb9oGjZ.js → gitGraphDiagram-IHSO6WYX--lDKAKVz.js} +1 -1
- package/web/dist/assets/{index-DCx4DEMM.css → index-BxPfp0AO.css} +1 -1
- package/web/dist/assets/{index-B91BmvYM.js → index-rPji8Uud.js} +2 -2
- package/web/dist/assets/{infoDiagram-FWYZ7A6U-CdPnS1-j.js → infoDiagram-FWYZ7A6U-CKmH8_YO.js} +1 -1
- package/web/dist/assets/{ishikawaDiagram-FXEZZL3T-D4Muo2uw.js → ishikawaDiagram-FXEZZL3T-D88R7zUc.js} +1 -1
- package/web/dist/assets/{journeyDiagram-5HDEW3XC-0uVdJDiB.js → journeyDiagram-5HDEW3XC-Ck7EMrsY.js} +1 -1
- package/web/dist/assets/{kanban-definition-HUTT4EX6-DWQU6DYI.js → kanban-definition-HUTT4EX6-hc-mOfSG.js} +1 -1
- package/web/dist/assets/{linear-BOxgX8xV.js → linear-BVhU4csP.js} +1 -1
- package/web/dist/assets/{mermaid.core-C8tHn40J.js → mermaid.core-C9u4FOCX.js} +4 -4
- package/web/dist/assets/{mindmap-definition-LN4V7U3C-C8NH0hQq.js → mindmap-definition-LN4V7U3C-DatQu9Xp.js} +1 -1
- package/web/dist/assets/{papaparse.min-CwI0VkgN.js → papaparse.min-BdnoXc8M.js} +1 -1
- package/web/dist/assets/{pegDiagram-2B236MQR-CksEEUgN.js → pegDiagram-2B236MQR-Cr_nZ_jR.js} +1 -1
- package/web/dist/assets/{pieDiagram-ENE6RG2P-Bq2Bv0cw.js → pieDiagram-ENE6RG2P-CcAbSIcY.js} +1 -1
- package/web/dist/assets/pilotswarm--kvfB_6q.js +99 -0
- package/web/dist/assets/{quadrantDiagram-ABIIQ3AL-vvpwUrN5.js → quadrantDiagram-ABIIQ3AL-CgJw5laM.js} +1 -1
- package/web/dist/assets/{railroadDiagram-RFXS5EU6-yXGWn-zZ.js → railroadDiagram-RFXS5EU6-CHeun9SN.js} +1 -1
- package/web/dist/assets/{requirementDiagram-TGXJPOKE-Bt1Q6Y60.js → requirementDiagram-TGXJPOKE-D1kpDj8W.js} +1 -1
- package/web/dist/assets/{sankeyDiagram-HTMAVEWB-CPNAfqgE.js → sankeyDiagram-HTMAVEWB-C5vUSUaX.js} +1 -1
- package/web/dist/assets/{sequenceDiagram-DBY2YBRQ-Dz432FWB.js → sequenceDiagram-DBY2YBRQ-T1aPSxk1.js} +1 -1
- package/web/dist/assets/{sizeCapture-X5ZJPWSS-Cokz6gNF.js → sizeCapture-X5ZJPWSS-j-wh2LVX.js} +1 -1
- package/web/dist/assets/{stateDiagram-2N3HPSRC-ojQCUdRE.js → stateDiagram-2N3HPSRC-DfUZZR8N.js} +1 -1
- package/web/dist/assets/stateDiagram-v2-6OUMAXLB-ilKtTdHG.js +1 -0
- package/web/dist/assets/{swimlanes-5IMT3BWC-DyTOkc1R.js → swimlanes-5IMT3BWC-OpASJiRw.js} +2 -2
- package/web/dist/assets/swimlanesDiagram-G3AALYLV-C1PthnB4.js +8 -0
- package/web/dist/assets/{timeline-definition-FHXFAJF6-DmuhBBl6.js → timeline-definition-FHXFAJF6-BBnc_z1U.js} +1 -1
- package/web/dist/assets/{vennDiagram-L72KCM5P-gTxQuU5b.js → vennDiagram-L72KCM5P-BlPQe9p4.js} +1 -1
- package/web/dist/assets/{wardleyDiagram-EHGQE667-YNXbSRf2.js → wardleyDiagram-EHGQE667-DBcBFUx2.js} +1 -1
- package/web/dist/assets/{xychartDiagram-FW5EYKEG-D7loT9cv.js → xychartDiagram-FW5EYKEG-BQUSGL6g.js} +1 -1
- package/web/dist/index.html +3 -3
- package/web/dist/assets/channel-CIBN5O06.js +0 -1
- package/web/dist/assets/classDiagram-OUVF2IWQ-Bq-5VkDc.js +0 -1
- package/web/dist/assets/classDiagram-v2-EOCWNBFH-Bq-5VkDc.js +0 -1
- package/web/dist/assets/pilotswarm-uebRfMjg.js +0 -99
- package/web/dist/assets/stateDiagram-v2-6OUMAXLB-BliVrz4U.js +0 -1
- package/web/dist/assets/swimlanesDiagram-G3AALYLV-DmwmYUnc.js +0 -8
package/ui/react/src/web-app.js
CHANGED
|
@@ -63,6 +63,7 @@ import {
|
|
|
63
63
|
selectConfirmModal,
|
|
64
64
|
defaultOwnerFilterForPrincipal,
|
|
65
65
|
normalizeStoredLayoutAdjustments,
|
|
66
|
+
normalizeStoredSessionViews,
|
|
66
67
|
normalizeStoredPinnedSessionIds,
|
|
67
68
|
normalizeStoredSessionOrder,
|
|
68
69
|
computeFitWidthColumnLayout,
|
|
@@ -358,6 +359,12 @@ function normalizeProfileSettings(settings) {
|
|
|
358
359
|
if (hasOwn(candidate, "canvasPrefs")) {
|
|
359
360
|
normalized.canvasPrefs = normalizeStoredCanvasPrefs(candidate.canvasPrefs);
|
|
360
361
|
}
|
|
362
|
+
// Per-session desktop views: columns open + right-side sizes, per session
|
|
363
|
+
// and device slot. Whitelisted like everything else here, or the save
|
|
364
|
+
// would silently drop it.
|
|
365
|
+
if (hasOwn(candidate, "sessionViews")) {
|
|
366
|
+
normalized.sessionViews = normalizeStoredSessionViews(candidate.sessionViews);
|
|
367
|
+
}
|
|
361
368
|
// Phones and desktops keep SEPARATE view preferences: rich prose reads well
|
|
362
369
|
// on a wide transcript and poorly in a 390px column, so a single shared
|
|
363
370
|
// value would have each device overwriting the other's choice.
|
|
@@ -464,6 +471,10 @@ function profileSettingsFromViewState(state, preservedOtherTouchScale = null, pr
|
|
|
464
471
|
desktopPanes: { canvasOpen: state.canvasOpen === true, diagnosticsOpen: state.diagnosticsOpen === true, zen: state.canvasZen === true },
|
|
465
472
|
}),
|
|
466
473
|
canvasPrefs: state.canvasPrefs,
|
|
474
|
+
// Written from BOTH device classes: a phone carries the desktop's
|
|
475
|
+
// per-session views through its saves untouched (the reducer never
|
|
476
|
+
// records on a phone), so a phone save cannot erase them.
|
|
477
|
+
sessionViews: state.sessionViews,
|
|
467
478
|
// setCurrentUserProfileSettings REPLACES the settings object, so the
|
|
468
479
|
// other device class's slot has to be written back verbatim or saving
|
|
469
480
|
// from a desktop would wipe the phone's preference (and vice versa).
|
|
@@ -563,6 +574,9 @@ function materializeProfileSettings(remoteSettings, defaults) {
|
|
|
563
574
|
...(hasOwn(normalizedRemote, "desktopPanes")
|
|
564
575
|
? { desktopPanes: normalizedRemote.desktopPanes }
|
|
565
576
|
: {}),
|
|
577
|
+
...(hasOwn(normalizedRemote, "sessionViews")
|
|
578
|
+
? { sessionViews: normalizedRemote.sessionViews }
|
|
579
|
+
: {}),
|
|
566
580
|
...(hasOwn(normalizedRemote, "rightPaneMode")
|
|
567
581
|
? { rightPaneMode: normalizedRemote.rightPaneMode }
|
|
568
582
|
: {}),
|
|
@@ -3878,9 +3892,21 @@ function ScrollLinesPanel({ title, titleRight = null, color, focused, actions, l
|
|
|
3878
3892
|
if (!preserveHorizontalScroll || syncingHorizontalRef.current) return;
|
|
3879
3893
|
syncScrollLeft(event.currentTarget, stickyRef.current);
|
|
3880
3894
|
}, [onScroll, preserveHorizontalScroll, syncScrollLeft, updateScrollShadow]);
|
|
3895
|
+
// Re-read the shadow state when the CONTENT changes, not on every render:
|
|
3896
|
+
// reading scrollHeight is a forced layout, and with no dependency list
|
|
3897
|
+
// this ran on each keystroke's re-render of the pane.
|
|
3881
3898
|
React.useEffect(() => {
|
|
3882
3899
|
updateScrollShadow(ref.current);
|
|
3883
|
-
});
|
|
3900
|
+
}, [updateScrollShadow, normalizedLines, normalizedBottomSticky, normalizedSticky]);
|
|
3901
|
+
// A column drag or a window resize changes clientHeight with no new
|
|
3902
|
+
// content; the shadow has to follow that too.
|
|
3903
|
+
React.useEffect(() => {
|
|
3904
|
+
const node = ref.current;
|
|
3905
|
+
if (!node || typeof ResizeObserver === "undefined") return undefined;
|
|
3906
|
+
const observer = new ResizeObserver(() => updateScrollShadow(node));
|
|
3907
|
+
observer.observe(node);
|
|
3908
|
+
return () => observer.disconnect();
|
|
3909
|
+
}, [updateScrollShadow, ref]);
|
|
3884
3910
|
|
|
3885
3911
|
const handleStickyScroll = React.useCallback((event) => {
|
|
3886
3912
|
if (!preserveHorizontalScroll || syncingHorizontalRef.current) return;
|
|
@@ -6211,9 +6237,12 @@ function ChatPane({ controller, mobile = false, fullWidth = false, showComposer
|
|
|
6211
6237
|
return {
|
|
6212
6238
|
activeSessionId,
|
|
6213
6239
|
activeHistory: activeSessionId ? state.history.bySessionId.get(activeSessionId) || null : null,
|
|
6240
|
+
// A shared empty array, not a literal: a fresh [] per call failed
|
|
6241
|
+
// the shallow-equal check on every dispatch and re-rendered the
|
|
6242
|
+
// whole pane, transcript included, on every keystroke.
|
|
6214
6243
|
activeOutbox: activeSessionId && state.outbox?.bySessionId?.[activeSessionId]
|
|
6215
6244
|
? state.outbox.bySessionId[activeSessionId]
|
|
6216
|
-
:
|
|
6245
|
+
: EMPTY_ARRAY,
|
|
6217
6246
|
branding: state.branding,
|
|
6218
6247
|
connection: state.connection,
|
|
6219
6248
|
sessionsById: state.sessions.byId,
|
|
@@ -8463,20 +8492,43 @@ function PromptComposer({ controller, mobile, active = true, onAfterSend = null
|
|
|
8463
8492
|
// zeroes the height first — NOT "auto": iOS Safari keeps a textarea's
|
|
8464
8493
|
// scrollHeight at its high-water mark under "auto", so a box that grew
|
|
8465
8494
|
// never shrank back after the text was sent or deleted.
|
|
8466
|
-
|
|
8495
|
+
//
|
|
8496
|
+
// The zero-then-measure is two synchronous full-page layouts, and it ran
|
|
8497
|
+
// on EVERY keystroke. It is only needed when the box may have to shrink
|
|
8498
|
+
// (text removed, width changed). While text is being added the box can
|
|
8499
|
+
// only grow, and "does the content overflow the box" is one layout read.
|
|
8500
|
+
const lastPromptLengthRef = React.useRef(-1);
|
|
8501
|
+
const growInput = React.useCallback((force = false) => {
|
|
8467
8502
|
const node = inputRef.current;
|
|
8468
8503
|
if (!node) return;
|
|
8504
|
+
if (!force && node.scrollHeight <= node.clientHeight) return;
|
|
8469
8505
|
node.style.height = "0px";
|
|
8470
8506
|
node.style.height = `${node.scrollHeight + 2}px`;
|
|
8471
8507
|
}, []);
|
|
8472
8508
|
React.useLayoutEffect(() => {
|
|
8473
|
-
|
|
8509
|
+
const length = String(promptState.value || "").length;
|
|
8510
|
+
// Equal length can still drop a wrapped line (a selection replaced by
|
|
8511
|
+
// as many characters), so only strict growth takes the cheap path.
|
|
8512
|
+
const mayHaveShrunk = length <= lastPromptLengthRef.current;
|
|
8513
|
+
lastPromptLengthRef.current = length;
|
|
8514
|
+
growInput(mayHaveShrunk || length === 0);
|
|
8474
8515
|
}, [growInput, promptState.value]);
|
|
8475
8516
|
React.useEffect(() => {
|
|
8476
8517
|
// Width changes re-wrap the content; re-measure on viewport resizes
|
|
8477
8518
|
// (covers rotation and the on-screen keyboard shrinking the pane).
|
|
8478
|
-
|
|
8479
|
-
|
|
8519
|
+
const onResize = () => growInput(true);
|
|
8520
|
+
window.addEventListener("resize", onResize);
|
|
8521
|
+
// A pane-splitter drag or a font-size change re-wraps the text with
|
|
8522
|
+
// no window resize; watch the box itself.
|
|
8523
|
+
const node = inputRef.current;
|
|
8524
|
+
const observer = node && typeof ResizeObserver !== "undefined"
|
|
8525
|
+
? new ResizeObserver(() => growInput(true))
|
|
8526
|
+
: null;
|
|
8527
|
+
if (observer && node) observer.observe(node);
|
|
8528
|
+
return () => {
|
|
8529
|
+
window.removeEventListener("resize", onResize);
|
|
8530
|
+
observer?.disconnect();
|
|
8531
|
+
};
|
|
8480
8532
|
}, [growInput]);
|
|
8481
8533
|
|
|
8482
8534
|
const canAttachImages = typeof controller.transport?.supportsPromptImageAttachments === "function"
|
|
@@ -11067,6 +11119,16 @@ function AgentUsagePane({ controller }) {
|
|
|
11067
11119
|
if (next.has(name)) next.delete(name); else next.add(name);
|
|
11068
11120
|
return next;
|
|
11069
11121
|
});
|
|
11122
|
+
// The header checkbox: one click clears every agent out of the chart,
|
|
11123
|
+
// the next brings them all back. Half-filled while the rows disagree.
|
|
11124
|
+
const allNames = view.agents.map((a) => a.agent);
|
|
11125
|
+
const includedCount = allNames.filter((name) => included.has(name)).length;
|
|
11126
|
+
const allIncluded = allNames.length > 0 && includedCount === allNames.length;
|
|
11127
|
+
const noneIncluded = includedCount === 0;
|
|
11128
|
+
const toggleAll = () => setExcluded(() => (noneIncluded ? new Set() : new Set(allNames)));
|
|
11129
|
+
const headerCheckboxRef = React.useCallback((node) => {
|
|
11130
|
+
if (node) node.indeterminate = !allIncluded && !noneIncluded;
|
|
11131
|
+
}, [allIncluded, noneIncluded]);
|
|
11070
11132
|
const rows = React.useMemo(() => [...view.agents].sort(AGENT_SORTS[sortKey] || AGENT_SORTS.total), [view, sortKey]);
|
|
11071
11133
|
const setRange = (days) => controller.setUsageSummaryFilter({ days }).catch(() => {});
|
|
11072
11134
|
const setProviders = ({ preset, providers }) => controller.setUsageSummaryFilter({ preset, providers }).catch(() => {});
|
|
@@ -11111,7 +11173,12 @@ function AgentUsagePane({ controller }) {
|
|
|
11111
11173
|
: React.createElement("div", { className: "ps-summary__table-wrap" },
|
|
11112
11174
|
React.createElement("table", { className: "ps-summary__table" },
|
|
11113
11175
|
React.createElement("thead", null, React.createElement("tr", null,
|
|
11114
|
-
React.createElement("th", { title:
|
|
11176
|
+
React.createElement("th", { title: noneIncluded ? "Put every agent back in the chart" : "Clear every agent out of the chart" },
|
|
11177
|
+
React.createElement("input", {
|
|
11178
|
+
type: "checkbox", ref: headerCheckboxRef, checked: allIncluded,
|
|
11179
|
+
onChange: toggleAll,
|
|
11180
|
+
"aria-label": noneIncluded ? "Select all agents" : "Clear all agents",
|
|
11181
|
+
})),
|
|
11115
11182
|
sortableHead("agent", "Agent"),
|
|
11116
11183
|
React.createElement("th", { title: "Distinct model names this agent ran in the window" }, "Models"),
|
|
11117
11184
|
sortableHead("turns", "Turns"),
|
|
@@ -12383,6 +12450,12 @@ function DistillerModelPickers({ controller, extras }) {
|
|
|
12383
12450
|
function useKeyboardShortcuts(controller, mobile) {
|
|
12384
12451
|
React.useEffect(() => {
|
|
12385
12452
|
const handler = (event) => {
|
|
12453
|
+
// A focused control that handled the key owns it. The diagnostics
|
|
12454
|
+
// seam answers ArrowUp/ArrowDown itself; letting the same keydown
|
|
12455
|
+
// fall through here moved the session selection as well — which
|
|
12456
|
+
// went unnoticed until per-session views made the newly selected
|
|
12457
|
+
// session open with its own (default) columns.
|
|
12458
|
+
if (event.defaultPrevented) return;
|
|
12386
12459
|
const target = event.target;
|
|
12387
12460
|
const editable = target instanceof HTMLElement
|
|
12388
12461
|
&& (target.tagName === "TEXTAREA" || target.tagName === "INPUT" || target.tagName === "SELECT" || target.isContentEditable);
|
|
@@ -14019,6 +14092,7 @@ export function PilotSwarmWebApp({ controller }) {
|
|
|
14019
14092
|
canvasPaneAdjust: rootState.ui.layout?.canvasPaneAdjust ?? 0,
|
|
14020
14093
|
diagnosticsPaneAdjust: rootState.ui.layout?.diagnosticsPaneAdjust ?? 0,
|
|
14021
14094
|
diagnosticsSplitAdjust: rootState.ui.layout?.diagnosticsSplitAdjust ?? 0,
|
|
14095
|
+
sessionViews: rootState.ui.sessionViews,
|
|
14022
14096
|
focusRegion: rootState.ui.focusRegion,
|
|
14023
14097
|
requestedFocusRegion: rootState.ui.requestedFocusRegion,
|
|
14024
14098
|
inspectorTab: rootState.ui.inspectorTab,
|
|
@@ -14056,6 +14130,13 @@ export function PilotSwarmWebApp({ controller }) {
|
|
|
14056
14130
|
|
|
14057
14131
|
useKeyboardShortcuts(controller, mobile);
|
|
14058
14132
|
|
|
14133
|
+
// Tell the reducer which device slot of the per-session views this tab
|
|
14134
|
+
// owns. Only a desktop applies and records them; a phone keeps its
|
|
14135
|
+
// current layout behaviour and just carries the stored views through.
|
|
14136
|
+
React.useEffect(() => {
|
|
14137
|
+
controller.dispatch({ type: "ui/sessionViewDevice", device: mobile ? "mobile" : "desktop" });
|
|
14138
|
+
}, [controller, mobile]);
|
|
14139
|
+
|
|
14059
14140
|
// Keyboard takeover (phone): while the on-screen keyboard is up and the
|
|
14060
14141
|
// composer summoned it, the conversation owns the visual viewport — the
|
|
14061
14142
|
// portal header, toolbar and session list fold away via a body class and
|
|
@@ -14303,7 +14384,7 @@ export function PilotSwarmWebApp({ controller }) {
|
|
|
14303
14384
|
});
|
|
14304
14385
|
}, 400);
|
|
14305
14386
|
return undefined;
|
|
14306
|
-
}, [controller, state.activeSessionId, state.activityPaneAdjust, state.agentPickerUsage, state.canvasOpen, state.canvasPaneAdjust, state.canvasPrefs, state.canvasZen, state.collapsedSessionIds, state.diagnosticsOpen, state.diagnosticsPaneAdjust, state.diagnosticsSplitAdjust, state.ownerFilter, state.paneAdjust, state.manualOrder, state.pinnedIds, state.portalSessionColumnAdjust, state.rightPaneMode, state.sessionDetailCollapsed, state.sessionPaneAdjust, state.themeId, state.touchScale]);
|
|
14387
|
+
}, [controller, state.activeSessionId, state.activityPaneAdjust, state.agentPickerUsage, state.canvasOpen, state.canvasPaneAdjust, state.canvasPrefs, state.canvasZen, state.collapsedSessionIds, state.diagnosticsOpen, state.diagnosticsPaneAdjust, state.diagnosticsSplitAdjust, state.ownerFilter, state.paneAdjust, state.manualOrder, state.pinnedIds, state.portalSessionColumnAdjust, state.rightPaneMode, state.sessionDetailCollapsed, state.sessionPaneAdjust, state.sessionViews, state.themeId, state.touchScale]);
|
|
14307
14388
|
|
|
14308
14389
|
React.useEffect(() => {
|
|
14309
14390
|
applyDocumentTheme(state.themeId);
|
package/web/dist/assets/{abnfDiagram-VRR7QNED-Cccg5mUx.js → abnfDiagram-VRR7QNED-CJOR2hPi.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{g as p,r as u,d as a}from"./chunk-MOJQB5TN-
|
|
1
|
+
import{g as p,r as u,d as a}from"./chunk-MOJQB5TN-_Uc0ksg3.js";import{p as f}from"./chunk-JWPE2WC7-CT3Q7T2A.js";import{_ as n,l as o}from"./mermaid.core-C9u4FOCX.js";import{M as c,b as d}from"./cynefin-VYW2F7L2-C_8v2wIz.js";import"./pilotswarm--kvfB_6q.js";var v=d().RailroadAbnf.parser.LangiumParser,i=n(e=>{const r=e.alternatives.map(g);return r.length===1?r[0]:{type:"choice",alternatives:r}},"transformAlternation"),g=n(e=>{const r=e.elements.map(y);return r.length===1?r[0]:{type:"sequence",elements:r}},"transformConcatenation"),b=n(e=>{if(e.includes("*")){const[t,s]=e.split("*"),l=t?parseInt(t,10):0,m=s?parseInt(s,10):1/0;return{min:l,max:m}}const r=parseInt(e,10);return{min:r,max:r}},"parseRepeat"),y=n(e=>{const r=A(e.primary);if(!e.repeat)return r;const{min:t,max:s}=b(e.repeat);return t===0&&s===1?{type:"optional",element:r}:{type:"repetition",element:r,min:t,max:s}},"transformElement"),A=n(e=>{switch(e.$type){case"AbnfStringLiteral":return{type:"terminal",value:e.value};case"AbnfNumVal":return{type:"terminal",value:e.value};case"AbnfRuleName":return{type:"nonterminal",name:e.name};case"AbnfGroup":return i(e.element);case"AbnfOptionalGroup":return{type:"optional",element:i(e.element)};default:throw new Error(`Unsupported ABNF primary node: ${e.$type}`)}},"transformPrimary"),P=n(e=>({name:e.name,definition:i(e.definition)}),"transformRule"),h=n(e=>{f(e,a),e.title&&a.setTitle(e.title),e.rules.map(r=>a.addRule(P(r)))},"populateDb"),R={parse:n(e=>{a.clear(),o.debug("[ABNF Parser] Starting Langium parse");const r=v.parse(e);if(r.lexerErrors.length>0||r.parserErrors.length>0)throw new c(r);const t=r.value;o.debug("[ABNF Parser] Parsed rules:",t.rules.length),h(t),o.debug("[ABNF Parser] Parse complete")},"parse"),parser:{yy:a}},B={parser:R,db:a,renderer:u,styles:p};export{B as diagram};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Y as ln,$ as an,a0 as F,a1 as q,a2 as j,a3 as un,a4 as y,a5 as tn,a6 as J,a7 as _,a8 as rn,a9 as o,aa as on,ab as sn,ac as fn}from"./mermaid.core-
|
|
1
|
+
import{Y as ln,$ as an,a0 as F,a1 as q,a2 as j,a3 as un,a4 as y,a5 as tn,a6 as J,a7 as _,a8 as rn,a9 as o,aa as on,ab as sn,ac as fn}from"./mermaid.core-C9u4FOCX.js";function cn(l){return l.innerRadius}function yn(l){return l.outerRadius}function gn(l){return l.startAngle}function dn(l){return l.endAngle}function mn(l){return l&&l.padAngle}function pn(l,h,I,D,v,A,z,a){var O=I-l,i=D-h,n=z-v,d=a-A,u=d*O-n*i;if(!(u*u<y))return u=(n*(h-A)-d*(l-v))/u,[l+u*O,h+u*i]}function U(l,h,I,D,v,A,z){var a=l-I,O=h-D,i=(z?A:-A)/J(a*a+O*O),n=i*O,d=-i*a,u=l+n,s=h+d,f=I+n,c=D+d,B=(u+f)/2,t=(s+c)/2,m=f-u,g=c-s,R=m*m+g*g,T=v-A,P=u*c-f*s,S=(g<0?-1:1)*J(on(0,T*T*R-P*P)),Y=(P*g-m*S)/R,$=(-P*m-g*S)/R,w=(P*g+m*S)/R,p=(-P*m+g*S)/R,x=Y-B,e=$-t,r=w-B,C=p-t;return x*x+e*e>r*r+C*C&&(Y=w,$=p),{cx:Y,cy:$,x01:-n,y01:-d,x11:Y*(v/T-1),y11:$*(v/T-1)}}function hn(){var l=cn,h=yn,I=j(0),D=null,v=gn,A=dn,z=mn,a=null,O=ln(i);function i(){var n,d,u=+l.apply(this,arguments),s=+h.apply(this,arguments),f=v.apply(this,arguments)-un,c=A.apply(this,arguments)-un,B=rn(c-f),t=c>f;if(a||(a=n=O()),s<u&&(d=s,s=u,u=d),!(s>y))a.moveTo(0,0);else if(B>tn-y)a.moveTo(s*F(f),s*q(f)),a.arc(0,0,s,f,c,!t),u>y&&(a.moveTo(u*F(c),u*q(c)),a.arc(0,0,u,c,f,t));else{var m=f,g=c,R=f,T=c,P=B,S=B,Y=z.apply(this,arguments)/2,$=Y>y&&(D?+D.apply(this,arguments):J(u*u+s*s)),w=_(rn(s-u)/2,+I.apply(this,arguments)),p=w,x=w,e,r;if($>y){var C=sn($/u*q(Y)),K=sn($/s*q(Y));(P-=C*2)>y?(C*=t?1:-1,R+=C,T-=C):(P=0,R=T=(f+c)/2),(S-=K*2)>y?(K*=t?1:-1,m+=K,g-=K):(S=0,m=g=(f+c)/2)}var G=s*F(m),H=s*q(m),L=u*F(T),M=u*q(T);if(w>y){var N=s*F(g),Q=s*q(g),V=u*F(R),W=u*q(R),E;if(B<an)if(E=pn(G,H,V,W,N,Q,L,M)){var X=G-E[0],Z=H-E[1],b=N-E[0],k=Q-E[1],nn=1/q(fn((X*b+Z*k)/(J(X*X+Z*Z)*J(b*b+k*k)))/2),en=J(E[0]*E[0]+E[1]*E[1]);p=_(w,(u-en)/(nn-1)),x=_(w,(s-en)/(nn+1))}else p=x=0}S>y?x>y?(e=U(V,W,G,H,s,x,t),r=U(N,Q,L,M,s,x,t),a.moveTo(e.cx+e.x01,e.cy+e.y01),x<w?a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,s,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),!t),a.arc(r.cx,r.cy,x,o(r.y11,r.x11),o(r.y01,r.x01),!t))):(a.moveTo(G,H),a.arc(0,0,s,m,g,!t)):a.moveTo(G,H),!(u>y)||!(P>y)?a.lineTo(L,M):p>y?(e=U(L,M,N,Q,u,-p,t),r=U(G,H,V,W,u,-p,t),a.lineTo(e.cx+e.x01,e.cy+e.y01),p<w?a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,u,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),t),a.arc(r.cx,r.cy,p,o(r.y11,r.x11),o(r.y01,r.x01),!t))):a.arc(0,0,u,T,R,t)}if(a.closePath(),n)return a=null,n+""||null}return i.centroid=function(){var n=(+l.apply(this,arguments)+ +h.apply(this,arguments))/2,d=(+v.apply(this,arguments)+ +A.apply(this,arguments))/2-an/2;return[F(d)*n,q(d)*n]},i.innerRadius=function(n){return arguments.length?(l=typeof n=="function"?n:j(+n),i):l},i.outerRadius=function(n){return arguments.length?(h=typeof n=="function"?n:j(+n),i):h},i.cornerRadius=function(n){return arguments.length?(I=typeof n=="function"?n:j(+n),i):I},i.padRadius=function(n){return arguments.length?(D=n==null?null:typeof n=="function"?n:j(+n),i):D},i.startAngle=function(n){return arguments.length?(v=typeof n=="function"?n:j(+n),i):v},i.endAngle=function(n){return arguments.length?(A=typeof n=="function"?n:j(+n),i):A},i.padAngle=function(n){return arguments.length?(z=typeof n=="function"?n:j(+n),i):z},i.context=function(n){return arguments.length?(a=n??null,i):a},i}export{hn as d};
|