pilotswarm 0.5.65 → 0.5.67
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/controller.js +47 -24
- package/ui/core/src/index.js +1 -0
- package/ui/core/src/reducer.js +20 -5
- package/ui/core/src/selectors.js +154 -9
- package/ui/core/src/session-search.js +151 -0
- package/ui/react/src/web-app.js +114 -7
- package/web/dist/assets/{abnfDiagram-VRR7QNED-gIPHF2gV.js → abnfDiagram-VRR7QNED-rCdnr4Zk.js} +1 -1
- package/web/dist/assets/{arc-DMW_q5Ml.js → arc-DeoxxJ2S.js} +1 -1
- package/web/dist/assets/{architectureDiagram-ZJ3FMSHR-DAKsrxcB.js → architectureDiagram-ZJ3FMSHR-DAz2X6IV.js} +1 -1
- package/web/dist/assets/{blockDiagram-677ZJIJ3-BUjSLpP3.js → blockDiagram-677ZJIJ3-DPsxUKQJ.js} +1 -1
- package/web/dist/assets/{c4Diagram-LMCZKHZV-Dw2nPoes.js → c4Diagram-LMCZKHZV-Cl8IpoAZ.js} +1 -1
- package/web/dist/assets/channel-DCTjhzIq.js +1 -0
- package/web/dist/assets/{chunk-2Q5K7J3B-BAL28Rv0.js → chunk-2Q5K7J3B-WHxPHUqg.js} +1 -1
- package/web/dist/assets/{chunk-32BRIVSS-DDlt9K8s.js → chunk-32BRIVSS-9S1suaZM.js} +1 -1
- package/web/dist/assets/{chunk-5VM5RSS4-BLQGJGoP.js → chunk-5VM5RSS4-DmBwY4rK.js} +1 -1
- package/web/dist/assets/{chunk-EX3LRPZG-XFMb3HRy.js → chunk-EX3LRPZG-BbKMT5Il.js} +1 -1
- package/web/dist/assets/{chunk-JWPE2WC7-DWnKTQ72.js → chunk-JWPE2WC7-B9Qns4SI.js} +1 -1
- package/web/dist/assets/{chunk-MOJQB5TN-MltzhnwP.js → chunk-MOJQB5TN-G6hkDffb.js} +1 -1
- package/web/dist/assets/{chunk-RYQCIY6F-Ce3q0-mJ.js → chunk-RYQCIY6F-Ca38LebY.js} +1 -1
- package/web/dist/assets/{chunk-V7JOEXUC-ThXLYY88.js → chunk-V7JOEXUC-DPeEQDsB.js} +1 -1
- package/web/dist/assets/{chunk-VR4S4FIN-DbhAykiW.js → chunk-VR4S4FIN-DYuh7YGE.js} +1 -1
- package/web/dist/assets/{chunk-XXDRQBXY-BpkNB0mD.js → chunk-XXDRQBXY-BDRBkhU_.js} +1 -1
- package/web/dist/assets/classDiagram-OUVF2IWQ-Cfa6ZtJR.js +1 -0
- package/web/dist/assets/classDiagram-v2-EOCWNBFH-Cfa6ZtJR.js +1 -0
- package/web/dist/assets/{cose-bilkent-JH36ORCC-rctqAPvj.js → cose-bilkent-JH36ORCC-CpHdEFyS.js} +1 -1
- package/web/dist/assets/{cynefin-VYW2F7L2-Dg1cltg6.js → cynefin-VYW2F7L2-DRYxiNM0.js} +1 -1
- package/web/dist/assets/{cynefinDiagram-TSTJHNR4-Ci23Sv4Z.js → cynefinDiagram-TSTJHNR4-B8fSzWxH.js} +1 -1
- package/web/dist/assets/{dagre-VKFMJZFB-BpWTGhpv.js → dagre-VKFMJZFB-CnJyU6YF.js} +1 -1
- package/web/dist/assets/{diagram-FQU43EPY-B69JpiAe.js → diagram-FQU43EPY-BS2_uGW0.js} +1 -1
- package/web/dist/assets/{diagram-G47NLZAW-BHMk1TOO.js → diagram-G47NLZAW-DjKog-bE.js} +1 -1
- package/web/dist/assets/{diagram-NH7WQ7WH-CtvZIIsk.js → diagram-NH7WQ7WH-BaWtvMDL.js} +1 -1
- package/web/dist/assets/{diagram-OA4YK3LP-BFvKh800.js → diagram-OA4YK3LP-Z11ytyEX.js} +1 -1
- package/web/dist/assets/{diagram-WEI45ONY-CgB8sWPe.js → diagram-WEI45ONY-DiiH4Od8.js} +1 -1
- package/web/dist/assets/{ebnfDiagram-CCIWWBDH-DyqPNydM.js → ebnfDiagram-CCIWWBDH-xtE5CNkB.js} +1 -1
- package/web/dist/assets/{erDiagram-Q63AITRT-CwpvZQ3Q.js → erDiagram-Q63AITRT-Dj5wjLbd.js} +1 -1
- package/web/dist/assets/{flowDiagram-23GEKE2U-EBKSKxfC.js → flowDiagram-23GEKE2U-O_1XH_-x.js} +1 -1
- package/web/dist/assets/{ganttDiagram-NO4QXBWP-q5tMPAuC.js → ganttDiagram-NO4QXBWP-AuETTA_E.js} +1 -1
- package/web/dist/assets/{gitGraphDiagram-IHSO6WYX-DCRbi4KE.js → gitGraphDiagram-IHSO6WYX-gTS7mo_B.js} +1 -1
- package/web/dist/assets/{index-CO-D6M4t.js → index-29eY0ERe.js} +2 -2
- package/web/dist/assets/index-D4OiytLj.css +1 -0
- package/web/dist/assets/{infoDiagram-FWYZ7A6U-Bex5pSIX.js → infoDiagram-FWYZ7A6U-Fhv6oMjM.js} +1 -1
- package/web/dist/assets/{ishikawaDiagram-FXEZZL3T-Dj0li_TY.js → ishikawaDiagram-FXEZZL3T-BIWy0CgN.js} +1 -1
- package/web/dist/assets/{journeyDiagram-5HDEW3XC-BtEGEeVr.js → journeyDiagram-5HDEW3XC-0XQ9xC-A.js} +1 -1
- package/web/dist/assets/{kanban-definition-HUTT4EX6-BTFfZvYt.js → kanban-definition-HUTT4EX6-ChyhUUfr.js} +1 -1
- package/web/dist/assets/{linear-C3SQCsip.js → linear-CFXBfAtq.js} +1 -1
- package/web/dist/assets/{mermaid.core-DALDJDu8.js → mermaid.core-BPXpLhrQ.js} +4 -4
- package/web/dist/assets/{mindmap-definition-LN4V7U3C-BZf3uw0u.js → mindmap-definition-LN4V7U3C-HEv8CBmG.js} +1 -1
- package/web/dist/assets/{papaparse.min-Bh9MZ-fk.js → papaparse.min-zNHCLHbr.js} +1 -1
- package/web/dist/assets/{pegDiagram-2B236MQR-PuOleiMg.js → pegDiagram-2B236MQR-Ciaic9kL.js} +1 -1
- package/web/dist/assets/{pieDiagram-ENE6RG2P-CcFORUaW.js → pieDiagram-ENE6RG2P-CPBwQT7c.js} +1 -1
- package/web/dist/assets/pilotswarm-t7ZSHp3x.js +109 -0
- package/web/dist/assets/{quadrantDiagram-ABIIQ3AL-CEm0mp4y.js → quadrantDiagram-ABIIQ3AL-Bn1GbLE3.js} +1 -1
- package/web/dist/assets/{railroadDiagram-RFXS5EU6-DeH-uX0_.js → railroadDiagram-RFXS5EU6-DgbTuh6h.js} +1 -1
- package/web/dist/assets/{requirementDiagram-TGXJPOKE-CMbJVMc1.js → requirementDiagram-TGXJPOKE-C25kl_pE.js} +1 -1
- package/web/dist/assets/{sankeyDiagram-HTMAVEWB-C9gL5w_b.js → sankeyDiagram-HTMAVEWB-IXSFhGpB.js} +1 -1
- package/web/dist/assets/{sequenceDiagram-DBY2YBRQ-BUo8TT74.js → sequenceDiagram-DBY2YBRQ-BkLHDo50.js} +1 -1
- package/web/dist/assets/{sizeCapture-X5ZJPWSS-C5lqG0ei.js → sizeCapture-X5ZJPWSS-DYnL5G7X.js} +1 -1
- package/web/dist/assets/{stateDiagram-2N3HPSRC-DyeISrEU.js → stateDiagram-2N3HPSRC-Cyn7hAE7.js} +1 -1
- package/web/dist/assets/stateDiagram-v2-6OUMAXLB-CrXU-8_S.js +1 -0
- package/web/dist/assets/{swimlanes-5IMT3BWC-DawuBk_a.js → swimlanes-5IMT3BWC-CZ6EgHci.js} +2 -2
- package/web/dist/assets/swimlanesDiagram-G3AALYLV-QcV2Vg4L.js +8 -0
- package/web/dist/assets/{timeline-definition-FHXFAJF6-BZJ2YJcm.js → timeline-definition-FHXFAJF6-uvqzr_O1.js} +1 -1
- package/web/dist/assets/{vennDiagram-L72KCM5P-BMXBVCfe.js → vennDiagram-L72KCM5P-1ca2fSuA.js} +1 -1
- package/web/dist/assets/{wardleyDiagram-EHGQE667-DWedKsrQ.js → wardleyDiagram-EHGQE667-DLDKHVSh.js} +1 -1
- package/web/dist/assets/{xychartDiagram-FW5EYKEG--XdfYceC.js → xychartDiagram-FW5EYKEG-BcU1gt-_.js} +1 -1
- package/web/dist/index.html +3 -3
- package/web/dist/assets/channel-CcOa1LtY.js +0 -1
- package/web/dist/assets/classDiagram-OUVF2IWQ-B2VhHRSV.js +0 -1
- package/web/dist/assets/classDiagram-v2-EOCWNBFH-B2VhHRSV.js +0 -1
- package/web/dist/assets/index-uhc851H3.css +0 -1
- package/web/dist/assets/pilotswarm-B9rLtXpI.js +0 -109
- package/web/dist/assets/stateDiagram-v2-6OUMAXLB-5FZbaloZ.js +0 -1
- package/web/dist/assets/swimlanesDiagram-G3AALYLV-DL8PgtmM.js +0 -8
package/ui/react/src/web-app.js
CHANGED
|
@@ -5053,6 +5053,71 @@ function useAxisLockedPan(ref, enabled = true) {
|
|
|
5053
5053
|
}, [ref, enabled]);
|
|
5054
5054
|
}
|
|
5055
5055
|
|
|
5056
|
+
function SessionSearchControl({ query = "", onQuery, matchCount = 0, mobile = false, listRef = null }) {
|
|
5057
|
+
const [mobileOpen, setMobileOpen] = React.useState(Boolean(query));
|
|
5058
|
+
const inputRef = React.useRef(null);
|
|
5059
|
+
React.useEffect(() => {
|
|
5060
|
+
if (query) setMobileOpen(true);
|
|
5061
|
+
}, [query]);
|
|
5062
|
+
const open = () => {
|
|
5063
|
+
setMobileOpen(true);
|
|
5064
|
+
requestAnimationFrame(() => inputRef.current?.focus({ preventScroll: true }));
|
|
5065
|
+
};
|
|
5066
|
+
const closeOrClear = () => {
|
|
5067
|
+
if (query) onQuery?.("");
|
|
5068
|
+
else setMobileOpen(false);
|
|
5069
|
+
};
|
|
5070
|
+
const resultLabel = query
|
|
5071
|
+
? `${matchCount} ${matchCount === 1 ? "match" : "matches"}`
|
|
5072
|
+
: "";
|
|
5073
|
+
return React.createElement("div", {
|
|
5074
|
+
className: `ps-session-search${mobileOpen ? " is-open" : ""}`,
|
|
5075
|
+
"data-session-search": "true",
|
|
5076
|
+
},
|
|
5077
|
+
mobile ? React.createElement("button", {
|
|
5078
|
+
type: "button",
|
|
5079
|
+
className: "ps-session-search-trigger",
|
|
5080
|
+
"aria-label": "Search sessions",
|
|
5081
|
+
title: "Search sessions",
|
|
5082
|
+
onClick: open,
|
|
5083
|
+
}, React.createElement(SearchGlyph)) : null,
|
|
5084
|
+
React.createElement("div", { className: "ps-session-search-fields" },
|
|
5085
|
+
React.createElement(SearchGlyph),
|
|
5086
|
+
React.createElement("input", {
|
|
5087
|
+
ref: inputRef,
|
|
5088
|
+
type: "text",
|
|
5089
|
+
inputMode: "search",
|
|
5090
|
+
"aria-label": "Find a session",
|
|
5091
|
+
placeholder: "Find a session…",
|
|
5092
|
+
value: query,
|
|
5093
|
+
onChange: (event) => onQuery?.(event.target.value),
|
|
5094
|
+
onKeyDown: (event) => {
|
|
5095
|
+
if (event.key === "Escape") {
|
|
5096
|
+
event.preventDefault();
|
|
5097
|
+
closeOrClear();
|
|
5098
|
+
return;
|
|
5099
|
+
}
|
|
5100
|
+
if (event.key !== "ArrowDown") return;
|
|
5101
|
+
const first = listRef?.current?.querySelector?.(".ps-session-list-button");
|
|
5102
|
+
if (!first) return;
|
|
5103
|
+
event.preventDefault();
|
|
5104
|
+
first.focus({ preventScroll: true });
|
|
5105
|
+
},
|
|
5106
|
+
}),
|
|
5107
|
+
resultLabel ? React.createElement("span", {
|
|
5108
|
+
className: "ps-session-search-count",
|
|
5109
|
+
role: "status",
|
|
5110
|
+
"aria-live": "polite",
|
|
5111
|
+
}, resultLabel) : null,
|
|
5112
|
+
(query || mobile) ? React.createElement("button", {
|
|
5113
|
+
type: "button",
|
|
5114
|
+
className: "ps-session-search-clear",
|
|
5115
|
+
"aria-label": query ? "Clear session search" : "Close session search",
|
|
5116
|
+
title: query ? "Clear" : "Close",
|
|
5117
|
+
onClick: closeOrClear,
|
|
5118
|
+
}, "×") : null));
|
|
5119
|
+
}
|
|
5120
|
+
|
|
5056
5121
|
function SessionPane({ controller, actions = null, panelClassName = "", structuredRows = false, showDetailBox = null, selection = null, actionsOnly = false, actionsHost = null, onAction = null, onDialogChange = null }) {
|
|
5057
5122
|
// Mobile keeps its inline detail line and normally gets no detail box — a
|
|
5058
5123
|
// reserved footer would eat a meaningful slice of a phone screen. The
|
|
@@ -5138,6 +5203,32 @@ function SessionPane({ controller, actions = null, panelClassName = "", structur
|
|
|
5138
5203
|
}), [viewState.activeSessionId, viewState.auth, viewState.branding, viewState.budgetPaused, viewState.canvasBySessionId, viewState.canvasPrefs, viewState.connectionMode, viewState.filterQuery, viewState.listDeselected, viewState.ownerFilter, viewState.pinnedIds, viewState.manualOrder, viewState.selectedIds, viewState.selectMode, viewState.sessionsById, viewState.sessionsFlat]);
|
|
5139
5204
|
// Hold the previous rows when a poll produced identical output.
|
|
5140
5205
|
const rows = useStableValue(computedRows);
|
|
5206
|
+
const searchScrollRef = React.useRef({ top: 0, left: 0, restore: false });
|
|
5207
|
+
const searchEnvRef = React.useRef(null);
|
|
5208
|
+
searchEnvRef.current = {
|
|
5209
|
+
query: viewState.filterQuery,
|
|
5210
|
+
setQuery: selection ? selection.onQuery : (value) => controller.setSessionFilterQuery(value),
|
|
5211
|
+
};
|
|
5212
|
+
const setSearchQuery = React.useCallback((value) => {
|
|
5213
|
+
const next = String(value || "");
|
|
5214
|
+
const current = String(searchEnvRef.current?.query || "");
|
|
5215
|
+
const list = sessionListRef.current;
|
|
5216
|
+
if (!current.trim() && next.trim() && list) {
|
|
5217
|
+
searchScrollRef.current = { top: list.scrollTop, left: list.scrollLeft, restore: false };
|
|
5218
|
+
} else if (current.trim() && !next.trim()) {
|
|
5219
|
+
searchScrollRef.current.restore = true;
|
|
5220
|
+
}
|
|
5221
|
+
searchEnvRef.current?.setQuery?.(next);
|
|
5222
|
+
}, []);
|
|
5223
|
+
React.useLayoutEffect(() => {
|
|
5224
|
+
if (viewState.filterQuery || !searchScrollRef.current.restore || !sessionListRef.current) return;
|
|
5225
|
+
sessionListRef.current.scrollTop = searchScrollRef.current.top;
|
|
5226
|
+
sessionListRef.current.scrollLeft = searchScrollRef.current.left;
|
|
5227
|
+
searchScrollRef.current.restore = false;
|
|
5228
|
+
}, [rows, viewState.filterQuery]);
|
|
5229
|
+
const searchMatchCount = viewState.filterQuery
|
|
5230
|
+
? rows.reduce((count, row) => count + (row.searchMatch ? 1 : 0), 0)
|
|
5231
|
+
: 0;
|
|
5141
5232
|
const activeSession = viewState.activeSessionId
|
|
5142
5233
|
? viewState.sessionsById[viewState.activeSessionId] || null
|
|
5143
5234
|
: null;
|
|
@@ -5845,7 +5936,6 @@ function SessionPane({ controller, actions = null, panelClassName = "", structur
|
|
|
5845
5936
|
}) : null, actions) : panelActions,
|
|
5846
5937
|
className: combinedPanelClassName,
|
|
5847
5938
|
},
|
|
5848
|
-
selection ? React.createElement("input", { className: "ps-modal-input", "aria-label": "Find a session", placeholder: "Find a session…", value: selection.query || "", onChange: e => selection.onQuery?.(e.target.value) }) : null,
|
|
5849
5939
|
React.createElement("div", {
|
|
5850
5940
|
ref: sessionListRef,
|
|
5851
5941
|
onKeyDown: selection ? event => {
|
|
@@ -5873,7 +5963,7 @@ function SessionPane({ controller, actions = null, panelClassName = "", structur
|
|
|
5873
5963
|
|
|
5874
5964
|
rows.length === 0
|
|
5875
5965
|
? React.createElement("div", { className: "ps-empty-state" }, viewState.filterQuery
|
|
5876
|
-
? `No sessions matched "
|
|
5966
|
+
? `No sessions matched "${viewState.filterQuery}".`
|
|
5877
5967
|
: "No sessions yet.")
|
|
5878
5968
|
: rows.map((row) => React.createElement(SessionListRow, {
|
|
5879
5969
|
key: row.sessionId,
|
|
@@ -5887,6 +5977,13 @@ function SessionPane({ controller, actions = null, panelClassName = "", structur
|
|
|
5887
5977
|
// touch hijacks the finger that should be scrolling the list.
|
|
5888
5978
|
drag: selection || touchInput ? null : dragHandlers,
|
|
5889
5979
|
}))),
|
|
5980
|
+
React.createElement(SessionSearchControl, {
|
|
5981
|
+
query: viewState.filterQuery,
|
|
5982
|
+
onQuery: setSearchQuery,
|
|
5983
|
+
matchCount: searchMatchCount,
|
|
5984
|
+
mobile: isMobilePane,
|
|
5985
|
+
listRef: sessionListRef,
|
|
5986
|
+
}),
|
|
5890
5987
|
(showDetailBox === null ? !isMobilePane : showDetailBox)
|
|
5891
5988
|
? React.createElement(SessionDetailBox, {
|
|
5892
5989
|
session: activeSession,
|
|
@@ -5994,6 +6091,12 @@ function FunnelGlyph() {
|
|
|
5994
6091
|
React.createElement("path", { d: "M21 4H3l7.2 8.5V19l3.6 2v-8.5L21 4z" }));
|
|
5995
6092
|
}
|
|
5996
6093
|
|
|
6094
|
+
function SearchGlyph() {
|
|
6095
|
+
return React.createElement(Glyph, null,
|
|
6096
|
+
React.createElement("circle", { cx: "11", cy: "11", r: "7" }),
|
|
6097
|
+
React.createElement("path", { d: "m20 20-4-4" }));
|
|
6098
|
+
}
|
|
6099
|
+
|
|
5997
6100
|
// Summary — a written summary. Was "≣", the same codepoint the Logs tab used.
|
|
5998
6101
|
|
|
5999
6102
|
// Back to the transcript. Replaces the 💬 emoji, which iOS force-renders in
|
|
@@ -14599,7 +14702,8 @@ export function PilotSwarmWebApp({ controller, suspended = false, moa = null })
|
|
|
14599
14702
|
const profileSettingsSaveTimerRef = React.useRef(null);
|
|
14600
14703
|
const profileSettingsPollTimerRef = React.useRef(null);
|
|
14601
14704
|
const profileSettingsPollInFlightRef = React.useRef(false);
|
|
14602
|
-
const profileSettingsSaveInFlightRef = React.useRef(
|
|
14705
|
+
const profileSettingsSaveInFlightRef = React.useRef(0);
|
|
14706
|
+
const profileSettingsEditRevisionRef = React.useRef(0);
|
|
14603
14707
|
const appliedProfileSettingsJsonRef = React.useRef(null);
|
|
14604
14708
|
const defaultProfileSettingsRef = React.useRef(null);
|
|
14605
14709
|
const [mobilePane, setMobilePane] = React.useState("workspace");
|
|
@@ -14726,7 +14830,7 @@ export function PilotSwarmWebApp({ controller, suspended = false, moa = null })
|
|
|
14726
14830
|
profileSettingsPollTimerRef.current = null;
|
|
14727
14831
|
}
|
|
14728
14832
|
profileSettingsPollInFlightRef.current = false;
|
|
14729
|
-
profileSettingsSaveInFlightRef.current =
|
|
14833
|
+
profileSettingsSaveInFlightRef.current = 0;
|
|
14730
14834
|
|
|
14731
14835
|
const transport = controller.transport;
|
|
14732
14836
|
if (typeof transport?.getCurrentUserProfile !== "function"
|
|
@@ -14740,6 +14844,7 @@ export function PilotSwarmWebApp({ controller, suspended = false, moa = null })
|
|
|
14740
14844
|
const pollProfileSettings = async () => {
|
|
14741
14845
|
if (!active || profileSettingsPollInFlightRef.current) return;
|
|
14742
14846
|
profileSettingsPollInFlightRef.current = true;
|
|
14847
|
+
const editRevision = profileSettingsEditRevisionRef.current;
|
|
14743
14848
|
try {
|
|
14744
14849
|
const profile = await transport.getCurrentUserProfile();
|
|
14745
14850
|
if (!active) return;
|
|
@@ -14789,7 +14894,8 @@ export function PilotSwarmWebApp({ controller, suspended = false, moa = null })
|
|
|
14789
14894
|
const hasUnpersistedLocalChange = profileSettingsHydratedRef.current
|
|
14790
14895
|
&& lastProfileSettingsJsonRef.current != null
|
|
14791
14896
|
&& currentSettingsBeforeApplyJson !== lastProfileSettingsJsonRef.current;
|
|
14792
|
-
const hasPendingLocalWrite =
|
|
14897
|
+
const hasPendingLocalWrite = editRevision !== profileSettingsEditRevisionRef.current
|
|
14898
|
+
|| Boolean(profileSettingsSaveTimerRef.current)
|
|
14793
14899
|
|| profileSettingsSaveInFlightRef.current
|
|
14794
14900
|
|| hasUnpersistedLocalChange
|
|
14795
14901
|
|| controller.getState().ui.moaDirty === true;
|
|
@@ -14865,12 +14971,13 @@ export function PilotSwarmWebApp({ controller, suspended = false, moa = null })
|
|
|
14865
14971
|
const settingsJson = JSON.stringify(settings);
|
|
14866
14972
|
if (lastProfileSettingsJsonRef.current === settingsJson) return undefined;
|
|
14867
14973
|
lastProfileSettingsJsonRef.current = settingsJson;
|
|
14974
|
+
profileSettingsEditRevisionRef.current += 1;
|
|
14868
14975
|
if (profileSettingsSaveTimerRef.current) {
|
|
14869
14976
|
clearTimeout(profileSettingsSaveTimerRef.current);
|
|
14870
14977
|
}
|
|
14871
14978
|
profileSettingsSaveTimerRef.current = setTimeout(() => {
|
|
14872
14979
|
profileSettingsSaveTimerRef.current = null;
|
|
14873
|
-
profileSettingsSaveInFlightRef.current
|
|
14980
|
+
profileSettingsSaveInFlightRef.current += 1;
|
|
14874
14981
|
const moaRevision = controller.getState().ui.moaRevision;
|
|
14875
14982
|
controller.dispatch({ type: "ui/moaSaveStatus", status: "saving" });
|
|
14876
14983
|
saveProfileSettings(controller, settings)
|
|
@@ -14880,7 +14987,7 @@ export function PilotSwarmWebApp({ controller, suspended = false, moa = null })
|
|
|
14880
14987
|
controller.dispatch({ type: "ui/moaSaveStatus", status: "error" });
|
|
14881
14988
|
})
|
|
14882
14989
|
.finally(() => {
|
|
14883
|
-
profileSettingsSaveInFlightRef.current =
|
|
14990
|
+
profileSettingsSaveInFlightRef.current = Math.max(0, profileSettingsSaveInFlightRef.current - 1);
|
|
14884
14991
|
});
|
|
14885
14992
|
}, 400);
|
|
14886
14993
|
return undefined;
|
package/web/dist/assets/{abnfDiagram-VRR7QNED-gIPHF2gV.js → abnfDiagram-VRR7QNED-rCdnr4Zk.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-G6hkDffb.js";import{p as f}from"./chunk-JWPE2WC7-B9Qns4SI.js";import{_ as n,l as o}from"./mermaid.core-BPXpLhrQ.js";import{M as c,b as d}from"./cynefin-VYW2F7L2-DRYxiNM0.js";import"./pilotswarm-t7ZSHp3x.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-BPXpLhrQ.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};
|