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.
Files changed (87) hide show
  1. package/mcp/dist/src/tools/agent-packages.d.ts.map +1 -1
  2. package/mcp/dist/src/tools/agent-packages.js +34 -14
  3. package/mcp/dist/src/tools/agent-packages.js.map +1 -1
  4. package/package.json +2 -2
  5. package/tui/src/node-sdk-transport.js +138 -18
  6. package/ui/core/src/controller.js +133 -37
  7. package/ui/core/src/history.js +5 -1
  8. package/ui/core/src/index.js +1 -0
  9. package/ui/core/src/layout.js +10 -0
  10. package/ui/core/src/portal-links.js +46 -0
  11. package/ui/core/src/reducer.js +140 -7
  12. package/ui/core/src/selectors.js +51 -7
  13. package/ui/react/src/web-app.js +445 -53
  14. package/web/README.md +28 -0
  15. package/web/api/canvas-plane.js +116 -0
  16. package/web/api/ws.js +120 -5
  17. package/web/config.js +60 -0
  18. package/web/dist/assets/{abnfDiagram-VRR7QNED-DrJhXhSQ.js → abnfDiagram-VRR7QNED-C6FaYMB7.js} +1 -1
  19. package/web/dist/assets/{arc-BEaG9DWd.js → arc-iZBUHcPs.js} +1 -1
  20. package/web/dist/assets/{architectureDiagram-ZJ3FMSHR-D9fc1Imx.js → architectureDiagram-ZJ3FMSHR-D4-wnpAG.js} +1 -1
  21. package/web/dist/assets/{blockDiagram-677ZJIJ3-rS5Eikvt.js → blockDiagram-677ZJIJ3-Dz-s103f.js} +1 -1
  22. package/web/dist/assets/{c4Diagram-LMCZKHZV-HKLlX5cR.js → c4Diagram-LMCZKHZV-DE7sGdHE.js} +1 -1
  23. package/web/dist/assets/channel-Bk68hLPV.js +1 -0
  24. package/web/dist/assets/{chunk-2Q5K7J3B-kq0TyLSB.js → chunk-2Q5K7J3B-DSFs_jRM.js} +1 -1
  25. package/web/dist/assets/{chunk-32BRIVSS-O-LMarT5.js → chunk-32BRIVSS-8sBVtZ4f.js} +1 -1
  26. package/web/dist/assets/{chunk-5VM5RSS4-Di4h0CAu.js → chunk-5VM5RSS4-CbIX7k0G.js} +1 -1
  27. package/web/dist/assets/{chunk-EX3LRPZG-C8rgqUOt.js → chunk-EX3LRPZG-ZfmPtWF8.js} +1 -1
  28. package/web/dist/assets/{chunk-JWPE2WC7-BSH41q4T.js → chunk-JWPE2WC7-DifZrqsQ.js} +1 -1
  29. package/web/dist/assets/{chunk-MOJQB5TN-BAFuQHAC.js → chunk-MOJQB5TN-CEvg_lZT.js} +1 -1
  30. package/web/dist/assets/{chunk-RYQCIY6F-DAg6JOs7.js → chunk-RYQCIY6F-DmYOwk6-.js} +1 -1
  31. package/web/dist/assets/{chunk-V7JOEXUC-DbVrT8BG.js → chunk-V7JOEXUC-DOxG9Vxu.js} +1 -1
  32. package/web/dist/assets/{chunk-VR4S4FIN-C6f5_Grp.js → chunk-VR4S4FIN-ic-KB2tF.js} +1 -1
  33. package/web/dist/assets/{chunk-XXDRQBXY-CqcCYpqA.js → chunk-XXDRQBXY-BqeYnem3.js} +1 -1
  34. package/web/dist/assets/classDiagram-OUVF2IWQ-arTJL-2y.js +1 -0
  35. package/web/dist/assets/classDiagram-v2-EOCWNBFH-arTJL-2y.js +1 -0
  36. package/web/dist/assets/{cose-bilkent-JH36ORCC-DJw04eFh.js → cose-bilkent-JH36ORCC-uaIgs2-N.js} +1 -1
  37. package/web/dist/assets/{cynefin-VYW2F7L2-CpjwdEIU.js → cynefin-VYW2F7L2-DzFeugVQ.js} +1 -1
  38. package/web/dist/assets/{cynefinDiagram-TSTJHNR4-RqEIWoT0.js → cynefinDiagram-TSTJHNR4-NrAChuCW.js} +1 -1
  39. package/web/dist/assets/{dagre-VKFMJZFB-C1eGQNK2.js → dagre-VKFMJZFB-Djf9LD2t.js} +1 -1
  40. package/web/dist/assets/{diagram-FQU43EPY-BODLQ7dz.js → diagram-FQU43EPY-BpIP2iD9.js} +1 -1
  41. package/web/dist/assets/{diagram-G47NLZAW-DlhmukMC.js → diagram-G47NLZAW-D_DCw8Oy.js} +1 -1
  42. package/web/dist/assets/{diagram-NH7WQ7WH-Ba_jZoCN.js → diagram-NH7WQ7WH-BztvRvrM.js} +1 -1
  43. package/web/dist/assets/{diagram-OA4YK3LP-DnSiAJBG.js → diagram-OA4YK3LP-BGIwSnbM.js} +1 -1
  44. package/web/dist/assets/{diagram-WEI45ONY-B3KoQ7_W.js → diagram-WEI45ONY-Czj2ttCt.js} +1 -1
  45. package/web/dist/assets/{ebnfDiagram-CCIWWBDH-ChnFc5gf.js → ebnfDiagram-CCIWWBDH-0nqAhMvJ.js} +1 -1
  46. package/web/dist/assets/{erDiagram-Q63AITRT-D2KkJXLZ.js → erDiagram-Q63AITRT-uLoGb9TG.js} +1 -1
  47. package/web/dist/assets/{flowDiagram-23GEKE2U-CmybZufj.js → flowDiagram-23GEKE2U-Bgxy7CWO.js} +1 -1
  48. package/web/dist/assets/{ganttDiagram-NO4QXBWP-BzPurW_v.js → ganttDiagram-NO4QXBWP-5q8zYzbu.js} +1 -1
  49. package/web/dist/assets/{gitGraphDiagram-IHSO6WYX-DAbXl4gO.js → gitGraphDiagram-IHSO6WYX-D6-i59JZ.js} +1 -1
  50. package/web/dist/assets/index-B3WlYEvi.css +1 -0
  51. package/web/dist/assets/index-BFa_e8zL.js +24 -0
  52. package/web/dist/assets/{infoDiagram-FWYZ7A6U-C6qGjNA1.js → infoDiagram-FWYZ7A6U-bdx9GrWW.js} +1 -1
  53. package/web/dist/assets/{ishikawaDiagram-FXEZZL3T-D2d1tO-9.js → ishikawaDiagram-FXEZZL3T-xzL6Bssj.js} +1 -1
  54. package/web/dist/assets/{journeyDiagram-5HDEW3XC-fP13w1b7.js → journeyDiagram-5HDEW3XC-C1-18xOk.js} +1 -1
  55. package/web/dist/assets/{kanban-definition-HUTT4EX6-BJfWAXZ0.js → kanban-definition-HUTT4EX6-BS4KDL4_.js} +1 -1
  56. package/web/dist/assets/{linear-CltApkHf.js → linear-Dmv3ton3.js} +1 -1
  57. package/web/dist/assets/{mermaid.core-B1Dwetk3.js → mermaid.core-Nhzw7Fl2.js} +4 -4
  58. package/web/dist/assets/{mindmap-definition-LN4V7U3C-CdRUD7LF.js → mindmap-definition-LN4V7U3C-2DSMdlsp.js} +1 -1
  59. package/web/dist/assets/{papaparse.min-C1y3wBH1.js → papaparse.min-H4g6q6aH.js} +1 -1
  60. package/web/dist/assets/{pegDiagram-2B236MQR-CeQkqN6Q.js → pegDiagram-2B236MQR-CM_rgJ2s.js} +1 -1
  61. package/web/dist/assets/{pieDiagram-ENE6RG2P-Dqgc87jA.js → pieDiagram-ENE6RG2P-Cbo8FtuT.js} +1 -1
  62. package/web/dist/assets/pilotswarm-ClLipXts.js +97 -0
  63. package/web/dist/assets/{quadrantDiagram-ABIIQ3AL-CD7f-w6m.js → quadrantDiagram-ABIIQ3AL-CVsF_pZA.js} +1 -1
  64. package/web/dist/assets/{railroadDiagram-RFXS5EU6-CcsAijSC.js → railroadDiagram-RFXS5EU6-CauKYIfy.js} +1 -1
  65. package/web/dist/assets/{requirementDiagram-TGXJPOKE-BkzF80pL.js → requirementDiagram-TGXJPOKE-DoXh8EL8.js} +1 -1
  66. package/web/dist/assets/{sankeyDiagram-HTMAVEWB-D9XOFw7Y.js → sankeyDiagram-HTMAVEWB-gA_ej2MB.js} +1 -1
  67. package/web/dist/assets/{sequenceDiagram-DBY2YBRQ-BFfaS_Sz.js → sequenceDiagram-DBY2YBRQ-keYBa83Q.js} +1 -1
  68. package/web/dist/assets/{sizeCapture-X5ZJPWSS-CDJV16tP.js → sizeCapture-X5ZJPWSS-Y6NCdqw8.js} +1 -1
  69. package/web/dist/assets/{stateDiagram-2N3HPSRC-C0E-MPXO.js → stateDiagram-2N3HPSRC-MvJfZXqW.js} +1 -1
  70. package/web/dist/assets/stateDiagram-v2-6OUMAXLB-xTZh36yB.js +1 -0
  71. package/web/dist/assets/{swimlanes-5IMT3BWC-n5Vsv7n9.js → swimlanes-5IMT3BWC-D41i7zcr.js} +2 -2
  72. package/web/dist/assets/swimlanesDiagram-G3AALYLV-BjlBuuiD.js +8 -0
  73. package/web/dist/assets/{timeline-definition-FHXFAJF6-DW2gV8-n.js → timeline-definition-FHXFAJF6-CUA2ENV8.js} +1 -1
  74. package/web/dist/assets/{vennDiagram-L72KCM5P-D9dbDm08.js → vennDiagram-L72KCM5P-CBTp-2d6.js} +1 -1
  75. package/web/dist/assets/{wardleyDiagram-EHGQE667-CIcG7fiC.js → wardleyDiagram-EHGQE667-BIFjtpCg.js} +1 -1
  76. package/web/dist/assets/{xychartDiagram-FW5EYKEG-elEIFsc9.js → xychartDiagram-FW5EYKEG-DiamOwOI.js} +1 -1
  77. package/web/dist/index.html +3 -3
  78. package/web/runtime.js +101 -7
  79. package/web/server.js +51 -2
  80. package/web/dist/assets/channel-DRy7FvyF.js +0 -1
  81. package/web/dist/assets/classDiagram-OUVF2IWQ-C35RhB8X.js +0 -1
  82. package/web/dist/assets/classDiagram-v2-EOCWNBFH-C35RhB8X.js +0 -1
  83. package/web/dist/assets/index-CRY94nFp.js +0 -24
  84. package/web/dist/assets/index-DtL0lbis.css +0 -1
  85. package/web/dist/assets/pilotswarm-DayYdi39.js +0 -96
  86. package/web/dist/assets/stateDiagram-v2-6OUMAXLB-BMqXeMJu.js +0 -1
  87. package/web/dist/assets/swimlanesDiagram-G3AALYLV-CGl4gRnH.js +0 -8
@@ -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: admin.section === "packages" && pkgState.selectedName === pkg.name,
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 summary = pkgList.find((pkg) => pkg.name === pkgState.selectedName) || null;
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.installed?.[pkgState.selectedName]?.semver === activeVersion.semver
3824
- && worker.installed?.[pkgState.selectedName]?.status === "ok").length
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