pilotswarm 0.5.38 → 0.5.40
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/mcp/dist/src/tools/agent-packages.d.ts.map +1 -1
- package/mcp/dist/src/tools/agent-packages.js +34 -14
- package/mcp/dist/src/tools/agent-packages.js.map +1 -1
- package/package.json +2 -2
- package/tui/src/node-sdk-transport.js +138 -18
- package/ui/core/src/controller.js +133 -37
- package/ui/core/src/history.js +5 -1
- package/ui/core/src/index.js +1 -0
- package/ui/core/src/layout.js +10 -0
- package/ui/core/src/portal-links.js +46 -0
- package/ui/core/src/reducer.js +140 -7
- package/ui/core/src/selectors.js +51 -7
- package/ui/react/src/web-app.js +445 -53
- package/web/README.md +28 -0
- package/web/api/canvas-plane.js +116 -0
- package/web/api/ws.js +120 -5
- package/web/config.js +60 -0
- package/web/dist/assets/{abnfDiagram-VRR7QNED-DrJhXhSQ.js → abnfDiagram-VRR7QNED-C6FaYMB7.js} +1 -1
- package/web/dist/assets/{arc-BEaG9DWd.js → arc-iZBUHcPs.js} +1 -1
- package/web/dist/assets/{architectureDiagram-ZJ3FMSHR-D9fc1Imx.js → architectureDiagram-ZJ3FMSHR-D4-wnpAG.js} +1 -1
- package/web/dist/assets/{blockDiagram-677ZJIJ3-rS5Eikvt.js → blockDiagram-677ZJIJ3-Dz-s103f.js} +1 -1
- package/web/dist/assets/{c4Diagram-LMCZKHZV-HKLlX5cR.js → c4Diagram-LMCZKHZV-DE7sGdHE.js} +1 -1
- package/web/dist/assets/channel-Bk68hLPV.js +1 -0
- package/web/dist/assets/{chunk-2Q5K7J3B-kq0TyLSB.js → chunk-2Q5K7J3B-DSFs_jRM.js} +1 -1
- package/web/dist/assets/{chunk-32BRIVSS-O-LMarT5.js → chunk-32BRIVSS-8sBVtZ4f.js} +1 -1
- package/web/dist/assets/{chunk-5VM5RSS4-Di4h0CAu.js → chunk-5VM5RSS4-CbIX7k0G.js} +1 -1
- package/web/dist/assets/{chunk-EX3LRPZG-C8rgqUOt.js → chunk-EX3LRPZG-ZfmPtWF8.js} +1 -1
- package/web/dist/assets/{chunk-JWPE2WC7-BSH41q4T.js → chunk-JWPE2WC7-DifZrqsQ.js} +1 -1
- package/web/dist/assets/{chunk-MOJQB5TN-BAFuQHAC.js → chunk-MOJQB5TN-CEvg_lZT.js} +1 -1
- package/web/dist/assets/{chunk-RYQCIY6F-DAg6JOs7.js → chunk-RYQCIY6F-DmYOwk6-.js} +1 -1
- package/web/dist/assets/{chunk-V7JOEXUC-DbVrT8BG.js → chunk-V7JOEXUC-DOxG9Vxu.js} +1 -1
- package/web/dist/assets/{chunk-VR4S4FIN-C6f5_Grp.js → chunk-VR4S4FIN-ic-KB2tF.js} +1 -1
- package/web/dist/assets/{chunk-XXDRQBXY-CqcCYpqA.js → chunk-XXDRQBXY-BqeYnem3.js} +1 -1
- package/web/dist/assets/classDiagram-OUVF2IWQ-arTJL-2y.js +1 -0
- package/web/dist/assets/classDiagram-v2-EOCWNBFH-arTJL-2y.js +1 -0
- package/web/dist/assets/{cose-bilkent-JH36ORCC-DJw04eFh.js → cose-bilkent-JH36ORCC-uaIgs2-N.js} +1 -1
- package/web/dist/assets/{cynefin-VYW2F7L2-CpjwdEIU.js → cynefin-VYW2F7L2-DzFeugVQ.js} +1 -1
- package/web/dist/assets/{cynefinDiagram-TSTJHNR4-RqEIWoT0.js → cynefinDiagram-TSTJHNR4-NrAChuCW.js} +1 -1
- package/web/dist/assets/{dagre-VKFMJZFB-C1eGQNK2.js → dagre-VKFMJZFB-Djf9LD2t.js} +1 -1
- package/web/dist/assets/{diagram-FQU43EPY-BODLQ7dz.js → diagram-FQU43EPY-BpIP2iD9.js} +1 -1
- package/web/dist/assets/{diagram-G47NLZAW-DlhmukMC.js → diagram-G47NLZAW-D_DCw8Oy.js} +1 -1
- package/web/dist/assets/{diagram-NH7WQ7WH-Ba_jZoCN.js → diagram-NH7WQ7WH-BztvRvrM.js} +1 -1
- package/web/dist/assets/{diagram-OA4YK3LP-DnSiAJBG.js → diagram-OA4YK3LP-BGIwSnbM.js} +1 -1
- package/web/dist/assets/{diagram-WEI45ONY-B3KoQ7_W.js → diagram-WEI45ONY-Czj2ttCt.js} +1 -1
- package/web/dist/assets/{ebnfDiagram-CCIWWBDH-ChnFc5gf.js → ebnfDiagram-CCIWWBDH-0nqAhMvJ.js} +1 -1
- package/web/dist/assets/{erDiagram-Q63AITRT-D2KkJXLZ.js → erDiagram-Q63AITRT-uLoGb9TG.js} +1 -1
- package/web/dist/assets/{flowDiagram-23GEKE2U-CmybZufj.js → flowDiagram-23GEKE2U-Bgxy7CWO.js} +1 -1
- package/web/dist/assets/{ganttDiagram-NO4QXBWP-BzPurW_v.js → ganttDiagram-NO4QXBWP-5q8zYzbu.js} +1 -1
- package/web/dist/assets/{gitGraphDiagram-IHSO6WYX-DAbXl4gO.js → gitGraphDiagram-IHSO6WYX-D6-i59JZ.js} +1 -1
- package/web/dist/assets/index-B3WlYEvi.css +1 -0
- package/web/dist/assets/index-BFa_e8zL.js +24 -0
- package/web/dist/assets/{infoDiagram-FWYZ7A6U-C6qGjNA1.js → infoDiagram-FWYZ7A6U-bdx9GrWW.js} +1 -1
- package/web/dist/assets/{ishikawaDiagram-FXEZZL3T-D2d1tO-9.js → ishikawaDiagram-FXEZZL3T-xzL6Bssj.js} +1 -1
- package/web/dist/assets/{journeyDiagram-5HDEW3XC-fP13w1b7.js → journeyDiagram-5HDEW3XC-C1-18xOk.js} +1 -1
- package/web/dist/assets/{kanban-definition-HUTT4EX6-BJfWAXZ0.js → kanban-definition-HUTT4EX6-BS4KDL4_.js} +1 -1
- package/web/dist/assets/{linear-CltApkHf.js → linear-Dmv3ton3.js} +1 -1
- package/web/dist/assets/{mermaid.core-B1Dwetk3.js → mermaid.core-Nhzw7Fl2.js} +4 -4
- package/web/dist/assets/{mindmap-definition-LN4V7U3C-CdRUD7LF.js → mindmap-definition-LN4V7U3C-2DSMdlsp.js} +1 -1
- package/web/dist/assets/{papaparse.min-C1y3wBH1.js → papaparse.min-H4g6q6aH.js} +1 -1
- package/web/dist/assets/{pegDiagram-2B236MQR-CeQkqN6Q.js → pegDiagram-2B236MQR-CM_rgJ2s.js} +1 -1
- package/web/dist/assets/{pieDiagram-ENE6RG2P-Dqgc87jA.js → pieDiagram-ENE6RG2P-Cbo8FtuT.js} +1 -1
- package/web/dist/assets/pilotswarm-ClLipXts.js +97 -0
- package/web/dist/assets/{quadrantDiagram-ABIIQ3AL-CD7f-w6m.js → quadrantDiagram-ABIIQ3AL-CVsF_pZA.js} +1 -1
- package/web/dist/assets/{railroadDiagram-RFXS5EU6-CcsAijSC.js → railroadDiagram-RFXS5EU6-CauKYIfy.js} +1 -1
- package/web/dist/assets/{requirementDiagram-TGXJPOKE-BkzF80pL.js → requirementDiagram-TGXJPOKE-DoXh8EL8.js} +1 -1
- package/web/dist/assets/{sankeyDiagram-HTMAVEWB-D9XOFw7Y.js → sankeyDiagram-HTMAVEWB-gA_ej2MB.js} +1 -1
- package/web/dist/assets/{sequenceDiagram-DBY2YBRQ-BFfaS_Sz.js → sequenceDiagram-DBY2YBRQ-keYBa83Q.js} +1 -1
- package/web/dist/assets/{sizeCapture-X5ZJPWSS-CDJV16tP.js → sizeCapture-X5ZJPWSS-Y6NCdqw8.js} +1 -1
- package/web/dist/assets/{stateDiagram-2N3HPSRC-C0E-MPXO.js → stateDiagram-2N3HPSRC-MvJfZXqW.js} +1 -1
- package/web/dist/assets/stateDiagram-v2-6OUMAXLB-xTZh36yB.js +1 -0
- package/web/dist/assets/{swimlanes-5IMT3BWC-n5Vsv7n9.js → swimlanes-5IMT3BWC-D41i7zcr.js} +2 -2
- package/web/dist/assets/swimlanesDiagram-G3AALYLV-BjlBuuiD.js +8 -0
- package/web/dist/assets/{timeline-definition-FHXFAJF6-DW2gV8-n.js → timeline-definition-FHXFAJF6-CUA2ENV8.js} +1 -1
- package/web/dist/assets/{vennDiagram-L72KCM5P-D9dbDm08.js → vennDiagram-L72KCM5P-CBTp-2d6.js} +1 -1
- package/web/dist/assets/{wardleyDiagram-EHGQE667-CIcG7fiC.js → wardleyDiagram-EHGQE667-BIFjtpCg.js} +1 -1
- package/web/dist/assets/{xychartDiagram-FW5EYKEG-elEIFsc9.js → xychartDiagram-FW5EYKEG-DiamOwOI.js} +1 -1
- package/web/dist/index.html +3 -3
- package/web/runtime.js +101 -7
- package/web/server.js +51 -2
- package/web/dist/assets/channel-DRy7FvyF.js +0 -1
- package/web/dist/assets/classDiagram-OUVF2IWQ-C35RhB8X.js +0 -1
- package/web/dist/assets/classDiagram-v2-EOCWNBFH-C35RhB8X.js +0 -1
- package/web/dist/assets/index-CRY94nFp.js +0 -24
- package/web/dist/assets/index-DtL0lbis.css +0 -1
- package/web/dist/assets/pilotswarm-DayYdi39.js +0 -96
- package/web/dist/assets/stateDiagram-v2-6OUMAXLB-BMqXeMJu.js +0 -1
- package/web/dist/assets/swimlanesDiagram-G3AALYLV-CGl4gRnH.js +0 -8
package/ui/core/src/selectors.js
CHANGED
|
@@ -2769,6 +2769,8 @@ export function selectCanvasView(state) {
|
|
|
2769
2769
|
latestDataRev,
|
|
2770
2770
|
lastViewedDataRev,
|
|
2771
2771
|
dataPayload: entry?.dataPayload || null,
|
|
2772
|
+
dataPatch: entry?.dataPatch || null,
|
|
2773
|
+
planeSeq: entry?.planeSeq || 0,
|
|
2772
2774
|
unseen: exists && (latestRev > lastViewedRev || latestDataRev > lastViewedDataRev) && mode !== "canvas",
|
|
2773
2775
|
};
|
|
2774
2776
|
}
|
|
@@ -3724,9 +3726,29 @@ export function selectAdminConsole(state) {
|
|
|
3724
3726
|
distinctPackageOwners.add(key);
|
|
3725
3727
|
}
|
|
3726
3728
|
const decoratePackageOwners = distinctPackageOwners.size > 1;
|
|
3729
|
+
// Copy-identity helpers: one NAME can be two packages (scope shadowing),
|
|
3730
|
+
// so row selection and highlighting key on (name, scope, owner) — never
|
|
3731
|
+
// the bare name.
|
|
3732
|
+
const packageCopyKey = (name, scope, owner) =>
|
|
3733
|
+
`${name}\u0001${scope === "shared" ? "shared" : "user"}\u0001${scope === "shared" ? "" : (owner?.subject ?? "")}`;
|
|
3734
|
+
const selectedCopyKey = pkgState.selectedName
|
|
3735
|
+
? packageCopyKey(
|
|
3736
|
+
pkgState.selectedName,
|
|
3737
|
+
pkgState.selectedSelector?.scope ?? null,
|
|
3738
|
+
pkgState.selectedSelector?.owner ?? principal ?? null,
|
|
3739
|
+
)
|
|
3740
|
+
: null;
|
|
3741
|
+
const rowMatchesSelection = (pkg) => {
|
|
3742
|
+
if (admin.section !== "packages" || pkgState.selectedName !== pkg.name) return false;
|
|
3743
|
+
// Legacy selection with no selector: fall back to name-only so an
|
|
3744
|
+
// in-flight selection from an older host still highlights something.
|
|
3745
|
+
if (!pkgState.selectedSelector?.scope) return true;
|
|
3746
|
+
return packageCopyKey(pkg.name, pkg.scope, pkg.owner) === selectedCopyKey;
|
|
3747
|
+
};
|
|
3727
3748
|
const packageRow = (pkg) => ({
|
|
3728
3749
|
name: pkg.name,
|
|
3729
3750
|
scope: pkg.scope === "shared" ? "shared" : "user",
|
|
3751
|
+
owner: pkg.owner ?? null,
|
|
3730
3752
|
enabled: Boolean(pkg.enabled),
|
|
3731
3753
|
semver: pkg.active?.semver || null,
|
|
3732
3754
|
sha7: pkg.active?.sha256 ? String(pkg.active.sha256).slice(0, 7) : null,
|
|
@@ -3742,7 +3764,7 @@ export function selectAdminConsole(state) {
|
|
|
3742
3764
|
: ownerBadgeFor(resolvePackageOwner(pkg, ownerDirectory)),
|
|
3743
3765
|
// Highlight only while the Agents section is active — otherwise the
|
|
3744
3766
|
// GitHub Keys screen shows a double selection.
|
|
3745
|
-
selected:
|
|
3767
|
+
selected: rowMatchesSelection(pkg),
|
|
3746
3768
|
});
|
|
3747
3769
|
// Admins are served every user-scope package, but another person's private
|
|
3748
3770
|
// agents are not part of YOUR workspace — keep them out of the main tree
|
|
@@ -3787,13 +3809,13 @@ export function selectAdminConsole(state) {
|
|
|
3787
3809
|
{ id: "ghcp", kind: "section", depth: 0, label: "GitHub Keys", selected: section === "ghcp" },
|
|
3788
3810
|
{ id: "agents", kind: "section", depth: 0, label: "Agents", selected: section === "packages" && !pkgState.selectedName },
|
|
3789
3811
|
{ id: "group:shared", kind: "group", depth: 1, label: "Shared", count: sharedRows.length },
|
|
3790
|
-
...sharedRows.map((row) => ({ id: `pkg:${row.name}`, kind: "package", depth: 2, label: row.name, ...row })),
|
|
3812
|
+
...sharedRows.map((row) => ({ id: `pkg:shared:${row.name}`, kind: "package", depth: 2, label: row.name, ...row })),
|
|
3791
3813
|
{ id: "group:user", kind: "group", depth: 1, label: "User", count: userRows.length },
|
|
3792
|
-
...userRows.map((row) => ({ id: `pkg:${row.name}`, kind: "package", depth: 2, label: row.name, ...row })),
|
|
3814
|
+
...userRows.map((row) => ({ id: `pkg:user:${row.name}`, kind: "package", depth: 2, label: row.name, ...row })),
|
|
3793
3815
|
...(otherUserRows.length > 0
|
|
3794
3816
|
? [
|
|
3795
3817
|
{ id: "group:others", kind: "group", depth: 1, label: "Other users", count: otherUserRows.length },
|
|
3796
|
-
...otherUserRows.map((row) => ({ id: `pkg:${row.name}`, kind: "package", depth: 2, label: row.name, ...row })),
|
|
3818
|
+
...otherUserRows.map((row) => ({ id: `pkg:user:${row.owner?.subject ?? "?"}:${row.name}`, kind: "package", depth: 2, label: row.name, ...row })),
|
|
3797
3819
|
]
|
|
3798
3820
|
: []),
|
|
3799
3821
|
// The worker registry is a hard-gated admin read; hide the section
|
|
@@ -3805,7 +3827,10 @@ export function selectAdminConsole(state) {
|
|
|
3805
3827
|
const detail = pkgState.detail || null;
|
|
3806
3828
|
let packageDetail = null;
|
|
3807
3829
|
if (pkgState.selectedName) {
|
|
3808
|
-
const
|
|
3830
|
+
const sameName = pkgList.filter((pkg) => pkg.name === pkgState.selectedName);
|
|
3831
|
+
const summary = (pkgState.selectedSelector?.scope
|
|
3832
|
+
? sameName.find((pkg) => packageCopyKey(pkg.name, pkg.scope, pkg.owner) === selectedCopyKey)
|
|
3833
|
+
: sameName[0]) ?? sameName[0] ?? null;
|
|
3809
3834
|
const activeVersion = detail?.versions?.find((v) => v.versionId === detail.activeVersionId) || null;
|
|
3810
3835
|
const manifest = activeVersion?.manifest || summary?.active?.manifest || {};
|
|
3811
3836
|
// Workers are ephemeral pods: rows for retired pod names linger until
|
|
@@ -3819,9 +3844,22 @@ export function selectAdminConsole(state) {
|
|
|
3819
3844
|
return !Number.isNaN(at.getTime()) && at.getTime() >= liveCutoff;
|
|
3820
3845
|
});
|
|
3821
3846
|
const fleetTotal = workerRows.length;
|
|
3847
|
+
// Workers report installed state by bare name — except when two
|
|
3848
|
+
// same-named copies are installed at once, where each row gets a
|
|
3849
|
+
// qualified key (name#scope[:owner8]) so the collision stays visible.
|
|
3850
|
+
// Read whichever key this copy answers to.
|
|
3851
|
+
const installedRowFor = (worker) => {
|
|
3852
|
+
const installed = worker.installed || {};
|
|
3853
|
+
const scope = detail?.scope || summary?.scope || pkgState.selectedSelector?.scope || null;
|
|
3854
|
+
const ownerSubject = (detail?.owner?.subject || summary?.owner?.subject || pkgState.selectedSelector?.owner?.subject || "");
|
|
3855
|
+
const qualified = scope === "user"
|
|
3856
|
+
? `${pkgState.selectedName}#user${ownerSubject ? `:${ownerSubject.slice(0, 8)}` : ""}`
|
|
3857
|
+
: `${pkgState.selectedName}#shared`;
|
|
3858
|
+
return installed[qualified] ?? installed[pkgState.selectedName];
|
|
3859
|
+
};
|
|
3822
3860
|
const fleetCurrent = activeVersion
|
|
3823
|
-
? workerRows.filter((worker) => worker
|
|
3824
|
-
&& worker
|
|
3861
|
+
? workerRows.filter((worker) => installedRowFor(worker)?.semver === activeVersion.semver
|
|
3862
|
+
&& installedRowFor(worker)?.status === "ok").length
|
|
3825
3863
|
: 0;
|
|
3826
3864
|
const canManage = detail ? ownsPackage(detail) : (summary ? ownsPackage(summary) : false);
|
|
3827
3865
|
packageDetail = {
|
|
@@ -3856,6 +3894,12 @@ export function selectAdminConsole(state) {
|
|
|
3856
3894
|
: null,
|
|
3857
3895
|
actionPending: pkgState.action?.pending || null,
|
|
3858
3896
|
actionError: pkgState.action?.error || null,
|
|
3897
|
+
// Which same-named copies exist, for the republish affordance and
|
|
3898
|
+
// the shadowing note. Counterparts the caller can SEE only —
|
|
3899
|
+
// exactly what the list already enforces.
|
|
3900
|
+
hasSharedCounterpart: sameName.some((pkg) => pkg.scope === "shared"),
|
|
3901
|
+
hasOwnUserCounterpart: sameName.some((pkg) => pkg.scope !== "shared" && isMinePackage(pkg)),
|
|
3902
|
+
copyCount: sameName.length,
|
|
3859
3903
|
};
|
|
3860
3904
|
}
|
|
3861
3905
|
|