pilotswarm 0.5.73 → 0.5.75

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 (73) hide show
  1. package/README.md +6 -0
  2. package/package.json +2 -2
  3. package/ui/core/src/controller.js +54 -8
  4. package/ui/core/src/reducer.js +1 -1
  5. package/ui/core/src/selectors.js +6 -6
  6. package/ui/react/src/components.js +5 -5
  7. package/ui/react/src/feature-flags-panel.js +2 -0
  8. package/ui/react/src/web-app.js +6 -4
  9. package/web/dist/assets/{abnfDiagram-VRR7QNED-BnkQIEhH.js → abnfDiagram-VRR7QNED-CRN_CPXb.js} +1 -1
  10. package/web/dist/assets/{arc-CGyB8bDx.js → arc-CXqBVBpG.js} +1 -1
  11. package/web/dist/assets/{architectureDiagram-ZJ3FMSHR-DWKmcDN1.js → architectureDiagram-ZJ3FMSHR-DOA41VEX.js} +1 -1
  12. package/web/dist/assets/{blockDiagram-677ZJIJ3-rn5c_Stz.js → blockDiagram-677ZJIJ3-BCa9kQVE.js} +1 -1
  13. package/web/dist/assets/{c4Diagram-LMCZKHZV-DyDQ7Ifb.js → c4Diagram-LMCZKHZV-CccO5uAf.js} +1 -1
  14. package/web/dist/assets/channel-Df1De1np.js +1 -0
  15. package/web/dist/assets/{chunk-2Q5K7J3B-C5VqT-KF.js → chunk-2Q5K7J3B-BOzOMW0c.js} +1 -1
  16. package/web/dist/assets/{chunk-32BRIVSS-DT-sPck4.js → chunk-32BRIVSS-DyeNS6EA.js} +1 -1
  17. package/web/dist/assets/{chunk-5VM5RSS4-yOTPomtB.js → chunk-5VM5RSS4-Cl2puolj.js} +1 -1
  18. package/web/dist/assets/{chunk-EX3LRPZG-DmFxJ0dk.js → chunk-EX3LRPZG-CU792nsG.js} +1 -1
  19. package/web/dist/assets/{chunk-JWPE2WC7-pjfQBm7p.js → chunk-JWPE2WC7-DI-c4Jvn.js} +1 -1
  20. package/web/dist/assets/{chunk-MOJQB5TN-CHa4SOoq.js → chunk-MOJQB5TN-CVuPn9RU.js} +1 -1
  21. package/web/dist/assets/{chunk-RYQCIY6F-DgRDTwUy.js → chunk-RYQCIY6F-CD34aFNh.js} +1 -1
  22. package/web/dist/assets/{chunk-V7JOEXUC-BdxruVNZ.js → chunk-V7JOEXUC-BwQU46DX.js} +1 -1
  23. package/web/dist/assets/{chunk-VR4S4FIN-DVyRDA0m.js → chunk-VR4S4FIN-CL1JK1sJ.js} +1 -1
  24. package/web/dist/assets/{chunk-XXDRQBXY-C_SZSWHx.js → chunk-XXDRQBXY-UOxFbxIp.js} +1 -1
  25. package/web/dist/assets/classDiagram-OUVF2IWQ-ee52oYsq.js +1 -0
  26. package/web/dist/assets/classDiagram-v2-EOCWNBFH-ee52oYsq.js +1 -0
  27. package/web/dist/assets/{cose-bilkent-JH36ORCC-B4ttgAJ8.js → cose-bilkent-JH36ORCC-CfQP19CB.js} +1 -1
  28. package/web/dist/assets/{cynefin-VYW2F7L2-B8cRqvMz.js → cynefin-VYW2F7L2-C9ifcKtK.js} +1 -1
  29. package/web/dist/assets/{cynefinDiagram-TSTJHNR4-CEubmFl-.js → cynefinDiagram-TSTJHNR4-IwcrpJT3.js} +1 -1
  30. package/web/dist/assets/{dagre-VKFMJZFB-CgRi7BXz.js → dagre-VKFMJZFB-BzTGLYBP.js} +1 -1
  31. package/web/dist/assets/{diagram-FQU43EPY-DfLMLNvB.js → diagram-FQU43EPY-D9X1NgQz.js} +1 -1
  32. package/web/dist/assets/{diagram-G47NLZAW-DMBnhSjJ.js → diagram-G47NLZAW-BkdiUvXU.js} +1 -1
  33. package/web/dist/assets/{diagram-NH7WQ7WH-CsVx_EMq.js → diagram-NH7WQ7WH-nCeiDJLN.js} +1 -1
  34. package/web/dist/assets/{diagram-OA4YK3LP-Cd8z9ubn.js → diagram-OA4YK3LP-CXdSE6QP.js} +1 -1
  35. package/web/dist/assets/{diagram-WEI45ONY-BIjozLvB.js → diagram-WEI45ONY-BNDoTBRl.js} +1 -1
  36. package/web/dist/assets/{ebnfDiagram-CCIWWBDH-BvEyKaUx.js → ebnfDiagram-CCIWWBDH-BSsQ9Do8.js} +1 -1
  37. package/web/dist/assets/{erDiagram-Q63AITRT-C1KyyEXS.js → erDiagram-Q63AITRT-BTkFSkJi.js} +1 -1
  38. package/web/dist/assets/{flowDiagram-23GEKE2U-8vv4Bw3F.js → flowDiagram-23GEKE2U-BGEZ9wur.js} +1 -1
  39. package/web/dist/assets/{ganttDiagram-NO4QXBWP-BQXnAu0k.js → ganttDiagram-NO4QXBWP-WUAUhEpP.js} +1 -1
  40. package/web/dist/assets/{gitGraphDiagram-IHSO6WYX-BGtXqY1X.js → gitGraphDiagram-IHSO6WYX-BQZQl2ZR.js} +1 -1
  41. package/web/dist/assets/{index-BixB0dRp.js → index-DQFBdVYX.js} +4 -4
  42. package/web/dist/assets/{infoDiagram-FWYZ7A6U-CVJezXGw.js → infoDiagram-FWYZ7A6U-BP9xJx0Z.js} +1 -1
  43. package/web/dist/assets/{ishikawaDiagram-FXEZZL3T-D_Fi5Rxo.js → ishikawaDiagram-FXEZZL3T-Kz3l0pEF.js} +1 -1
  44. package/web/dist/assets/{journeyDiagram-5HDEW3XC-Di1In_FH.js → journeyDiagram-5HDEW3XC-KA8zfX2j.js} +1 -1
  45. package/web/dist/assets/{kanban-definition-HUTT4EX6-ozcJ7MQ3.js → kanban-definition-HUTT4EX6-Cvy5U2tj.js} +1 -1
  46. package/web/dist/assets/{linear-BCHWKN_x.js → linear-DQ0Ynwre.js} +1 -1
  47. package/web/dist/assets/{mermaid.core-DPy_PtTG.js → mermaid.core-C_2W6ze2.js} +4 -4
  48. package/web/dist/assets/{mindmap-definition-LN4V7U3C-BUPXSGdc.js → mindmap-definition-LN4V7U3C-CPkdv3pS.js} +1 -1
  49. package/web/dist/assets/{papaparse.min-DLMQN21E.js → papaparse.min-gRC4B4xh.js} +1 -1
  50. package/web/dist/assets/{pegDiagram-2B236MQR-B0VRzHj8.js → pegDiagram-2B236MQR-BEmzoVBF.js} +1 -1
  51. package/web/dist/assets/{pieDiagram-ENE6RG2P-DJDr0spg.js → pieDiagram-ENE6RG2P-Cs-r2GVr.js} +1 -1
  52. package/web/dist/assets/{pilotswarm-BchtZfEr.js → pilotswarm-qQVUkWws.js} +62 -62
  53. package/web/dist/assets/{quadrantDiagram-ABIIQ3AL-D80hp41u.js → quadrantDiagram-ABIIQ3AL-D1SNNoOk.js} +1 -1
  54. package/web/dist/assets/{railroadDiagram-RFXS5EU6-BVZxxDDn.js → railroadDiagram-RFXS5EU6-BH9sxNL4.js} +1 -1
  55. package/web/dist/assets/{requirementDiagram-TGXJPOKE-BYBz1YgE.js → requirementDiagram-TGXJPOKE-ucbqSBch.js} +1 -1
  56. package/web/dist/assets/{sankeyDiagram-HTMAVEWB-Cm0EjuqP.js → sankeyDiagram-HTMAVEWB-9LzvC1Q9.js} +1 -1
  57. package/web/dist/assets/{sequenceDiagram-DBY2YBRQ-C08lIz44.js → sequenceDiagram-DBY2YBRQ-yVbJ1mbs.js} +1 -1
  58. package/web/dist/assets/{sizeCapture-X5ZJPWSS-xEVPLUiU.js → sizeCapture-X5ZJPWSS-aH-owuq8.js} +1 -1
  59. package/web/dist/assets/{stateDiagram-2N3HPSRC-C54U2MIf.js → stateDiagram-2N3HPSRC-eNxPWwbu.js} +1 -1
  60. package/web/dist/assets/stateDiagram-v2-6OUMAXLB-B5tcxao1.js +1 -0
  61. package/web/dist/assets/{swimlanes-5IMT3BWC-DRPOWaFR.js → swimlanes-5IMT3BWC-CUOaCY_Z.js} +2 -2
  62. package/web/dist/assets/swimlanesDiagram-G3AALYLV-Dz8gcrTg.js +8 -0
  63. package/web/dist/assets/{timeline-definition-FHXFAJF6-BUhUcJ_i.js → timeline-definition-FHXFAJF6-CP6SzyRW.js} +1 -1
  64. package/web/dist/assets/{vennDiagram-L72KCM5P-DFFa7JWQ.js → vennDiagram-L72KCM5P-ByPylANx.js} +1 -1
  65. package/web/dist/assets/{wardleyDiagram-EHGQE667-Bjv--ELM.js → wardleyDiagram-EHGQE667-QfPO6uUo.js} +1 -1
  66. package/web/dist/assets/{xychartDiagram-FW5EYKEG-BnGbWQJK.js → xychartDiagram-FW5EYKEG-CNvueYN7.js} +1 -1
  67. package/web/dist/index.html +2 -2
  68. package/web/runtime.js +15 -4
  69. package/web/dist/assets/channel-BTptNqYp.js +0 -1
  70. package/web/dist/assets/classDiagram-OUVF2IWQ-D_z8OghZ.js +0 -1
  71. package/web/dist/assets/classDiagram-v2-EOCWNBFH-D_z8OghZ.js +0 -1
  72. package/web/dist/assets/stateDiagram-v2-6OUMAXLB-CQXFWqsn.js +0 -1
  73. package/web/dist/assets/swimlanesDiagram-G3AALYLV-BuWCDUQa.js +0 -8
package/README.md CHANGED
@@ -12,6 +12,12 @@ surface of a [PilotSwarm](https://github.com/affandar/pilotswarm) deployment:
12
12
  Requires **Node 24+**. Everything below assumes you already have a deployment's
13
13
  portal URL — that URL is the only thing you need to configure.
14
14
 
15
+ PilotSwarm packages can distribute skills, worker tools, MCP servers, and
16
+ optional authored agent workflows. In deployments with Base Agent V2 enabled,
17
+ generic sessions discover these capabilities progressively and attach only the
18
+ ones needed for the current task. Named agents remain useful for complex,
19
+ prepackaged workflows and independent durable entry points.
20
+
15
21
  ---
16
22
 
17
23
  ## Quickstart
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pilotswarm",
3
- "version": "0.5.73",
3
+ "version": "0.5.75",
4
4
  "description": "PilotSwarm application package: terminal UI, browser portal + Web API server, and MCP server — one install, three bins.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -81,7 +81,7 @@
81
81
  "ink": "^6.8.0",
82
82
  "jose": "^6.2.2",
83
83
  "mermaid": "^11.16.0",
84
- "pilotswarm-sdk": "0.5.73",
84
+ "pilotswarm-sdk": "0.5.75",
85
85
  "react": "^19.2.4",
86
86
  "react-dom": "^19.2.4",
87
87
  "ws": "^8.18.2"
@@ -96,7 +96,6 @@ const FLEET_STATS_DEFAULT_WINDOW_DAYS = 30;
96
96
  const SESSION_REFRESH_FAILED_STATUS = "Session refresh failed";
97
97
  const AUTO_HISTORY_SCROLL_PAGE_COUNT = 3;
98
98
  const SESSION_REFRESH_PAGE_LIMIT = 200;
99
- const SESSION_REFRESH_MAX_PAGES = 5;
100
99
  const FULLSCREENABLE_PANES = new Set([
101
100
  FOCUS_REGIONS.SESSIONS,
102
101
  FOCUS_REGIONS.CHAT,
@@ -191,26 +190,59 @@ function isSessionGoneError(error) {
191
190
  return status === 404 || status === 403 || code === "NOT_FOUND" || code === "FORBIDDEN";
192
191
  }
193
192
 
194
- async function loadSessionCatalogPageWindow(transport) {
193
+ async function loadSessionCatalogPages(transport, systemFilter) {
195
194
  if (typeof transport.listSessionsPage !== "function") {
196
195
  return transport.listSessions();
197
196
  }
198
197
 
199
198
  const sessions = [];
200
199
  let cursor = null;
201
- for (let pageIndex = 0; pageIndex < SESSION_REFRESH_MAX_PAGES; pageIndex += 1) {
200
+ const seenCursors = new Set();
201
+ for (;;) {
202
202
  const page = await transport.listSessionsPage({
203
203
  limit: SESSION_REFRESH_PAGE_LIMIT,
204
204
  cursor,
205
+ systemFilter,
206
+ viewerOnly: true,
205
207
  });
206
208
  const pageSessions = Array.isArray(page?.sessions) ? page.sessions : [];
207
209
  sessions.push(...pageSessions);
208
- if (!page?.hasMore || !page?.nextCursor) break;
210
+ if (!page?.hasMore) break;
211
+ if (!page?.nextCursor) {
212
+ throw new Error("Session catalog page reported more rows without a next cursor");
213
+ }
214
+ const cursorKey = `${Number(page.nextCursor.updatedAt)}\0${String(page.nextCursor.sessionId || "")}`;
215
+ if (seenCursors.has(cursorKey)) {
216
+ throw new Error("Session catalog page repeated its next cursor");
217
+ }
218
+ seenCursors.add(cursorKey);
209
219
  cursor = page.nextCursor;
210
220
  }
211
221
  return sessions;
212
222
  }
213
223
 
224
+ async function loadSessionCatalog(transport) {
225
+ if (typeof transport.listSessionsPage !== "function") {
226
+ return transport.listSessions();
227
+ }
228
+
229
+ // System roots must not depend on where they happen to fall in the main
230
+ // catalog's recency order. Fetch both server-filtered streams
231
+ // independently, then combine them without changing either stream's
232
+ // order. Every page still goes through the transport's viewer-scoped API.
233
+ const [systemSessions, regularSessions] = await Promise.all([
234
+ loadSessionCatalogPages(transport, "only"),
235
+ loadSessionCatalogPages(transport, "exclude"),
236
+ ]);
237
+ const byId = new Set();
238
+ return [...systemSessions, ...regularSessions].filter((session) => {
239
+ const sessionId = String(session?.sessionId || "");
240
+ if (!sessionId || byId.has(sessionId)) return false;
241
+ byId.add(sessionId);
242
+ return true;
243
+ });
244
+ }
245
+
214
246
  function groupModelsByProvider(models = []) {
215
247
  const groups = [];
216
248
  const byProvider = new Map();
@@ -2641,7 +2673,7 @@ export class PilotSwarmUiController {
2641
2673
  return null;
2642
2674
  })
2643
2675
  : Promise.resolve(null);
2644
- let sessions = (await loadSessionCatalogPageWindow(this.transport)).map(normalizeSessionListRow);
2676
+ let sessions = (await loadSessionCatalog(this.transport)).map(normalizeSessionListRow);
2645
2677
  // Folders are NOT merged into the session payload any more: they live
2646
2678
  // in their own state slice, so a session refresh cannot drop them. A
2647
2679
  // failed fetch is "no news" and simply leaves the slice alone.
@@ -3745,7 +3777,7 @@ export class PilotSwarmUiController {
3745
3777
  : this.clearAdminSystemAgentModel(route.agentId);
3746
3778
  }
3747
3779
 
3748
- // ── Agent packages (Admin → Agents) ──────────────────────────
3780
+ // ── Packages (Admin → Packages) ──────────────────────────────
3749
3781
 
3750
3782
  setAdminSection(section) {
3751
3783
  this.dispatch({ type: "admin/section", section });
@@ -3978,8 +4010,22 @@ export class PilotSwarmUiController {
3978
4010
  updated.source = allowUser && updated.user ? "user" : updated.cluster ? "cluster" : "default";
3979
4011
  updated.userOverrideIgnored = Boolean(updated.user && !allowUser);
3980
4012
  const data = this.getState().admin.features.data;
4013
+ const flags = data.flags.map(flag => flag.featureKey === featureKey ? updated : flag);
4014
+ // Preserve independent saved preferences, but do not display
4015
+ // Base V2 as active when the native prerequisite is Off.
4016
+ // Recompute both when either setting changes; the following
4017
+ // refresh may fail after a successfully saved mutation.
4018
+ const nativeEnabled = flags.find(flag => flag.featureKey === "copilot.native_tasks")?.effective === true;
4019
+ const effectiveFlags = flags.map(flag => {
4020
+ if (flag.featureKey !== "agents.base_v2") return flag;
4021
+ const { reason: _reason, ...baseFlag } = flag;
4022
+ const allowPersonal = flag.cluster?.allowUserOverride ?? flag.defaultAllowUserOverride;
4023
+ const configured = allowPersonal && flag.user ? flag.user.enabled : flag.cluster?.enabled ?? flag.defaultEnabled;
4024
+ return { ...baseFlag, effective: configured && nativeEnabled,
4025
+ ...(configured && !nativeEnabled ? { reason: "requires_native_tasks" } : {}) };
4026
+ });
3981
4027
  this.dispatch({ type: "admin/features", patch: { data: { ...data,
3982
- flags: data.flags.map(flag => flag.featureKey === featureKey ? updated : flag) } } });
4028
+ flags: effectiveFlags } } });
3983
4029
  }
3984
4030
  if (draft && this.getState().admin.features.drafts?.[draftKey] === draft) {
3985
4031
  const drafts = { ...this.getState().admin.features.drafts };
@@ -4046,7 +4092,7 @@ export class PilotSwarmUiController {
4046
4092
  /** Reload the package list + sources (+ fleet state when permitted). */
4047
4093
  async refreshAdminAgentPackages() {
4048
4094
  if (typeof this.transport.listAgentPackages !== "function") {
4049
- this.dispatch({ type: "admin/packages/loadFailed", error: "Agent packages are not available on this deployment." });
4095
+ this.dispatch({ type: "admin/packages/loadFailed", error: "Packages are not available on this deployment." });
4050
4096
  return;
4051
4097
  }
4052
4098
  this.dispatch({ type: "admin/packages/loading" });
@@ -3067,7 +3067,7 @@ function baseReducer(state, action) {
3067
3067
  };
3068
3068
  }
3069
3069
  case "admin/packages/loadFailed": {
3070
- return { ...state, admin: { ...state.admin, packages: { ...state.admin.packages, loading: false, error: action.error || "Failed to load agent packages" } } };
3070
+ return { ...state, admin: { ...state.admin, packages: { ...state.admin.packages, loading: false, error: action.error || "Failed to load packages" } } };
3071
3071
  }
3072
3072
  case "admin/packages/select": {
3073
3073
  return {
@@ -4520,7 +4520,7 @@ export function selectAdminConsole(state) {
4520
4520
  ? "Configured (overrides env GITHUB_TOKEN for this user)"
4521
4521
  : "Not configured (using env GITHUB_TOKEN fallback)");
4522
4522
 
4523
- // ── Agent packages view-model (Admin → Agents) ───────────────
4523
+ // ── Package view-model (Admin → Packages) ────────────────────
4524
4524
  const pkgState = admin.packages || {};
4525
4525
  const pkgList = Array.isArray(pkgState.list) ? pkgState.list : [];
4526
4526
  const ownsPackage = (pkg) => Boolean(
@@ -4634,7 +4634,7 @@ export function selectAdminConsole(state) {
4634
4634
  { id: "myProviders", kind: "subsection", depth: 1, label: "My Providers", selected: section === "providers" && providerPage === "mine" },
4635
4635
  ...(isAdmin ? [{ id: "sharedProviders", kind: "subsection", depth: 1, label: "Shared Providers", selected: section === "providers" && providerPage === "shared" }] : []),
4636
4636
  { id: "features", kind: "section", depth: 0, label: "Feature flags", selected: section === "features" },
4637
- { id: "agents", kind: "section", depth: 0, label: "Agents", selected: section === "packages" && !pkgState.selectedName },
4637
+ { id: "agents", kind: "section", depth: 0, label: "Packages", selected: section === "packages" && !pkgState.selectedName },
4638
4638
  { id: "group:shared", kind: "group", depth: 1, label: "Shared", count: sharedRows.length },
4639
4639
  ...sharedRows.map((row) => ({ id: `pkg:shared:${row.name}`, kind: "package", depth: 2, label: row.name, ...row })),
4640
4640
  { id: "group:user", kind: "group", depth: 1, label: "User", count: userRows.length },
@@ -4910,7 +4910,7 @@ export function selectAdminConsole(state) {
4910
4910
  const actions = [];
4911
4911
  if (section === "workers") {
4912
4912
  actions.push({ id: "workersRefresh", label: "Refresh workers", key: "r" });
4913
- actions.push({ id: "showPackages", label: "Agents", key: "a" });
4913
+ actions.push({ id: "showPackages", label: "Packages", key: "a" });
4914
4914
  actions.push({ id: "showProviders", label: "Model Providers", key: "m" });
4915
4915
  actions.push({ id: "close", label: "Close console", key: "Esc" });
4916
4916
  return {
@@ -4999,7 +4999,7 @@ export function selectAdminConsole(state) {
4999
4999
  actions.push({ id: "cycleSystemOverride", label: "Cycle system-agent override", key: "o" });
5000
5000
  }
5001
5001
  actions.push({ id: "refreshProviders", label: "Refresh", key: "r" });
5002
- actions.push({ id: "showPackages", label: "Agents", key: "a" });
5002
+ actions.push({ id: "showPackages", label: "Packages", key: "a" });
5003
5003
  actions.push({ id: "close", label: "Close console", key: "Esc" });
5004
5004
  return {
5005
5005
  visible: Boolean(admin.visible),
@@ -5049,7 +5049,7 @@ export function selectAdminConsole(state) {
5049
5049
  actions.push({ id: "close", label: "Close console", key: ghcpKey.editing ? "Ctrl+Esc" : "Esc" });
5050
5050
 
5051
5051
  if (section === "ghcp") {
5052
- actions.splice(actions.length - 1, 0, { id: "showPackages", label: "Agents", key: "a" });
5052
+ actions.splice(actions.length - 1, 0, { id: "showPackages", label: "Packages", key: "a" });
5053
5053
  }
5054
5054
  return {
5055
5055
  visible: Boolean(admin.visible),
@@ -7255,7 +7255,7 @@ export function selectSessionAgentPickerModal(state, maxWidth = 76) {
7255
7255
  : [[{
7256
7256
  text: selectedItem.sectionKind === "builtin"
7257
7257
  ? "Agents baked into this deployment."
7258
- : "Agent packages installed on this deployment.",
7258
+ : "Packages installed on this deployment.",
7259
7259
  color: "gray",
7260
7260
  }]]),
7261
7261
  [{ text: "", color: "gray" }],
@@ -1922,7 +1922,7 @@ function formatAdminPrincipalLabelTui(principal) {
1922
1922
  }
1923
1923
 
1924
1924
  function buildAdminPackagesLines(view) {
1925
- // TUI parity for Admin → Agents: the same selector view-model the web
1925
+ // TUI parity for Admin → Packages: the same selector view-model the web
1926
1926
  // workspace renders, as text — settings tree, selected package detail,
1927
1927
  // files, and a preview head. Keys: a/g switch sections, j/k select,
1928
1928
  // r refresh (wired via the ADMIN_* commands).
@@ -2029,7 +2029,7 @@ function buildAdminPackagesLines(view) {
2029
2029
  }
2030
2030
  } else {
2031
2031
  lines.push([{ text: packages.empty
2032
- ? "No agent packages yet — add one in the portal or `pilotswarm agents push ./dir`."
2032
+ ? "No packages yet — add skills, tools, MCP integrations, or agents in the portal or `pilotswarm agents push ./dir`."
2033
2033
  : "Select a package (j/k) to see detail and files.", color: "gray" }]);
2034
2034
  }
2035
2035
  lines.push([{ text: "", color: "gray" }]);
@@ -2083,7 +2083,7 @@ function buildAdminWorkersLines(view) {
2083
2083
  lines.push([{ text: "Actions", color: "cyan", bold: true }]);
2084
2084
  lines.push([
2085
2085
  { text: " r ", color: "cyan", bold: true }, { text: "refresh ", color: "gray" },
2086
- { text: "a ", color: "yellow", bold: true }, { text: "Agents ", color: "gray" },
2086
+ { text: "a ", color: "yellow", bold: true }, { text: "Packages ", color: "gray" },
2087
2087
  { text: "m ", color: "yellow", bold: true }, { text: "Model Providers ", color: "gray" },
2088
2088
  { text: "Esc ", color: "red", bold: true }, { text: "close", color: "gray" },
2089
2089
  ]);
@@ -2173,7 +2173,7 @@ function buildAdminModelProviderLines(view) {
2173
2173
  lines.push([
2174
2174
  { text: " r ", color: "cyan", bold: true }, { text: "refresh ", color: "gray" },
2175
2175
  { text: "m/M ", color: "cyan", bold: true }, { text: "my/shared ", color: "gray" },
2176
- { text: "a ", color: "yellow", bold: true }, { text: "Agents ", color: "gray" },
2176
+ { text: "a ", color: "yellow", bold: true }, { text: "Packages ", color: "gray" },
2177
2177
  { text: "Esc ", color: "red", bold: true }, { text: "close", color: "gray" },
2178
2178
  ]);
2179
2179
  return lines;
@@ -2248,7 +2248,7 @@ function buildAdminConsoleLines(view) {
2248
2248
  ]);
2249
2249
  lines.push([
2250
2250
  { text: " a ", color: "cyan", bold: true },
2251
- { text: "Agents (packages) ", color: "gray" },
2251
+ { text: "Packages ", color: "gray" },
2252
2252
  { text: "Esc ", color: "red", bold: true },
2253
2253
  { text: "close console and return to workspace", color: "gray" },
2254
2254
  ]);
@@ -103,6 +103,8 @@ function FeatureFlagRow({ flag, mode, busy, saving, controller, workers, workers
103
103
  mode !== "cluster" ? h("p", { className: "ps-feature-context" }, `Cluster setting: ${onOff(storedEnabled)}. Personal settings ${storedOverride ? "allowed" : "not allowed"}.`) : null,
104
104
  locked ? h("p", { className: "ps-feature-retained" }, `Saved future preference: ${savedChoice === "inherit" ? "Use cluster setting" : onOff(flag.user.enabled)}. This will apply if personal settings are allowed again.`) : null),
105
105
  !flag.supported ? h("p", { role: "status" }, "This server does not support changing this feature.") : null,
106
+ flag.reason === "requires_native_tasks" ? h("p", { className: "ps-feature-blocker", role: "status" },
107
+ "Base Agent V2 is currently Off because it requires Native Copilot tasks. The Base V2 preference is saved and will apply when native tasks are enabled for the same scope.") : null,
106
108
  knownBlocked ? h("p", { className: "ps-feature-blocker", role: "status" }, `The saved setting is On, but none of the ${status.eligible} reporting workers is configured for native tasks. Native tasks cannot run on those workers.`) : null,
107
109
  h("div", { className: "ps-feature-editor" }, mode === "cluster" ? [
108
110
  h(RadioChoices, { key: "enabled", legend: "Cluster setting", name: `${id}-cluster`, value: String(clusterDraft.enabled), disabled: editDisabled,
@@ -13904,10 +13904,10 @@ function AdminPackageDetailPane({ controller, view }) {
13904
13904
  const detail = packages.detail;
13905
13905
  if (!packages.selectedName) {
13906
13906
  return React.createElement("div", { className: "ps-admin-detail is-empty" },
13907
- React.createElement("h3", null, "Agents"),
13907
+ React.createElement("h3", null, "Packages"),
13908
13908
  React.createElement("p", { className: "ps-admin-console__hint" },
13909
13909
  packages.empty
13910
- ? "No agent packages yet. Add one from a GitHub/ADO repo, a tarball URL, or upload a folder — or push from a terminal with `pilotswarm agents push ./my-agents`."
13910
+ ? "No packages yet. Add reusable skills, tools, MCP integrations, or authored agent workflows from a repo or folder — or use `pilotswarm agents push ./my-kit`."
13911
13911
  : "Select a package from the tree to see its detail, versions, and files."));
13912
13912
  }
13913
13913
  const confirmDelete = () => {
@@ -14349,9 +14349,11 @@ function AdminAddPackageDialog({ controller, dialog }) {
14349
14349
  onSubmit,
14350
14350
  },
14351
14351
  React.createElement("div", { className: "ps-modal-header" },
14352
- React.createElement("span", null, dialog.updateName ? `Update ${dialog.updateName}` : "Add agent package"),
14352
+ React.createElement("span", null, dialog.updateName ? `Update ${dialog.updateName}` : "Add package"),
14353
14353
  React.createElement("button", { type: "button", className: "ps-mini-button", onClick: () => controller.closeAdminAddPackage() }, "✕")),
14354
14354
  React.createElement("div", { className: "ps-admin-add__body" },
14355
+ React.createElement("p", { className: "ps-admin-console__hint" },
14356
+ "Packages can contain reusable skills, tools, MCP integrations, and authored agent workflows. No agent is required."),
14355
14357
  React.createElement("div", { className: "ps-admin-add__tabs" },
14356
14358
  kinds.map(([kind, label]) => React.createElement("button", {
14357
14359
  key: kind,
@@ -14418,7 +14420,7 @@ function AdminAddPackageDialog({ controller, dialog }) {
14418
14420
  href: guideUrl,
14419
14421
  target: "_blank",
14420
14422
  rel: "noreferrer noopener",
14421
- }, "How to build an agent package"),
14423
+ }, "How to build a package"),
14422
14424
  " — a complete guide you can also hand straight to Claude or Copilot.")
14423
14425
  : null,
14424
14426
  React.createElement("p", { className: "ps-admin-console__hint" },
@@ -1 +1 @@
1
- import{g as p,r as u,d as a}from"./chunk-MOJQB5TN-CHa4SOoq.js";import{p as f}from"./chunk-JWPE2WC7-pjfQBm7p.js";import{_ as n,l as o}from"./mermaid.core-DPy_PtTG.js";import{M as c,b as d}from"./cynefin-VYW2F7L2-B8cRqvMz.js";import"./pilotswarm-BchtZfEr.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
+ import{g as p,r as u,d as a}from"./chunk-MOJQB5TN-CVuPn9RU.js";import{p as f}from"./chunk-JWPE2WC7-DI-c4Jvn.js";import{_ as n,l as o}from"./mermaid.core-C_2W6ze2.js";import{M as c,b as d}from"./cynefin-VYW2F7L2-C9ifcKtK.js";import"./pilotswarm-qQVUkWws.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-DPy_PtTG.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};
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-C_2W6ze2.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};