priiisk 0.1.21 → 0.1.23

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.
@@ -81155,28 +81155,42 @@ var resolveDirectTools = (config3, role, override) => {
81155
81155
 
81156
81156
  // packages/config/src/resolvers/equipmentDescription.ts
81157
81157
  var names = (values4) => values4.length === 0 ? "none" : values4.join(", ");
81158
- var mcpGrants = (equipment) => names(
81159
- equipment.mcp.serverNames.map((serverName) => {
81160
- const toolNames = equipment.mcp.toolNamesByServer?.[serverName];
81161
- return toolNames === void 0 ? serverName : `${serverName} (${names(toolNames)})`;
81162
- })
81163
- );
81164
- var equipmentDescriptionLines = (equipment, revision) => [
81165
- `equipment r${String(revision)}: ${equipment.role ?? equipment.preset ?? "worker"}, ${equipment.readOnly ? "read-only" : "read/write"}`,
81166
- `model: ${equipment.model ?? "default"}${equipment.thinkingLevel === void 0 ? "" : `, thinking ${equipment.thinkingLevel}`}`,
81167
- `tools: ${names(
81168
- [
81158
+ var equipmentDescriptionGroups = (equipment, revision) => [
81159
+ {
81160
+ label: `equipment r${String(revision)}`,
81161
+ values: [
81162
+ equipment.role ?? equipment.preset ?? "worker",
81163
+ equipment.readOnly ? "read-only" : "read/write"
81164
+ ]
81165
+ },
81166
+ {
81167
+ label: "model",
81168
+ values: [
81169
+ equipment.model ?? "default",
81170
+ ...equipment.thinkingLevel === void 0 ? [] : [`thinking ${equipment.thinkingLevel}`]
81171
+ ]
81172
+ },
81173
+ {
81174
+ label: "tools",
81175
+ values: [
81169
81176
  .../* @__PURE__ */ new Set([
81170
81177
  ...equipment.builtinTools,
81171
81178
  ...equipment.customToolNames.filter((name) => directToolBin(name) === void 0)
81172
81179
  ])
81173
81180
  ].sort()
81174
- )}`,
81175
- `direct: ${names(
81176
- equipment.customToolNames.map((name) => directToolBin(name)).filter((bin) => bin !== void 0).sort()
81177
- )}`,
81178
- `mcp: ${mcpGrants(equipment)}`,
81179
- `skills: ${names(equipment.skillNames)}`
81181
+ },
81182
+ {
81183
+ label: "direct",
81184
+ values: equipment.customToolNames.map((name) => directToolBin(name)).filter((bin) => bin !== void 0).sort()
81185
+ },
81186
+ {
81187
+ label: "mcp",
81188
+ values: equipment.mcp.serverNames.map((serverName) => {
81189
+ const toolNames = equipment.mcp.toolNamesByServer?.[serverName];
81190
+ return toolNames === void 0 ? serverName : `${serverName} (${names(toolNames)})`;
81191
+ })
81192
+ },
81193
+ { label: "skills", values: [...equipment.skillNames] }
81180
81194
  ];
81181
81195
 
81182
81196
  // packages/config/src/resolvers/mcpConfigResolver.ts
@@ -82153,7 +82167,7 @@ var HOST_BOOTSTRAP_ENVIRONMENT_NAMES = [
82153
82167
  ];
82154
82168
 
82155
82169
  // packages/camp-state/src/bootstrap/campHostVersion.ts
82156
- var PRIIISK_HOST_VERSION = "0.1.21";
82170
+ var PRIIISK_HOST_VERSION = "0.1.23";
82157
82171
 
82158
82172
  // packages/camp-state/src/bootstrap/campLaunch.ts
82159
82173
  var CampBootstrapError = class extends TaggedError("CampBootstrapError") {
@@ -98092,7 +98106,7 @@ var Client = class extends Protocol2 {
98092
98106
  };
98093
98107
 
98094
98108
  // packages/mcp-backend/src/connections/clientIdentity.ts
98095
- var backendVersion = "0.1.21";
98109
+ var backendVersion = "0.1.23";
98096
98110
 
98097
98111
  // packages/mcp-backend/src/connections/mcpFailure.ts
98098
98112
  var McpFailure = class extends TaggedError("McpFailure") {
@@ -102630,13 +102644,30 @@ var CampUiScreen = {
102630
102644
  camp: "camp",
102631
102645
  worker: "worker"
102632
102646
  };
102647
+ var CampUiSidebarTab = { workers: "workers", equipment: "equip" };
102648
+ var CAMP_UI_SIDEBAR_TABS = [
102649
+ CampUiSidebarTab.workers,
102650
+ CampUiSidebarTab.equipment
102651
+ ];
102652
+ var nextCampUiSidebarTab = (current2, delta) => {
102653
+ const index = CAMP_UI_SIDEBAR_TABS.indexOf(current2);
102654
+ const size14 = CAMP_UI_SIDEBAR_TABS.length;
102655
+ const next3 = (((index < 0 ? 0 : index) + delta) % size14 + size14) % size14;
102656
+ return CAMP_UI_SIDEBAR_TABS[next3] ?? CampUiSidebarTab.workers;
102657
+ };
102633
102658
  var campUiAskBlockId = (askId) => `ask:${askId}`;
102659
+ var campUiOpenedWorkerId = (state) => state.openedWorkerId;
102634
102660
  var makeInitialCampUiState = (snapshot, presentationNow = 0) => ({
102661
+ /*
102662
+ * The cursor starts on the first worker, but nobody is opened: a camp that
102663
+ * opened someone by itself answered a question nobody asked and hid what a
102664
+ * fresh camp has to say about itself.
102665
+ */
102635
102666
  ...snapshot.workers[0] === void 0 ? {} : { selectedWorkerId: snapshot.workers[0].snapshot.worker.id },
102636
102667
  screen: CampUiScreen.camp,
102637
102668
  focusedSlotId: "roster",
102638
102669
  detailVisible: false,
102639
- inventoryVisible: false,
102670
+ sidebarTab: CampUiSidebarTab.workers,
102640
102671
  presentationNow,
102641
102672
  drafts: /* @__PURE__ */ new Map(),
102642
102673
  scrollOffsets: /* @__PURE__ */ new Map(),
@@ -102661,8 +102692,11 @@ var reconcileCampUiState = (current2, snapshot) => {
102661
102692
  );
102662
102693
  const fallbackIndex = Math.min(Math.max(previousIndex, 0), snapshot.workers.length - 1);
102663
102694
  const selectedWorkerId = previousId !== void 0 && workerIds.has(previousId) ? previousId : snapshot.workers[fallbackIndex]?.snapshot.worker.id;
102695
+ const previousOpenedId = current2.state.openedWorkerId;
102696
+ const openedWorkerId = previousOpenedId !== void 0 && workerIds.has(previousOpenedId) ? previousOpenedId : void 0;
102664
102697
  const {
102665
102698
  selectedWorkerId: _selectedWorkerId,
102699
+ openedWorkerId: _openedWorkerId,
102666
102700
  focusedDetailBlockId: previousFocusedBlockId,
102667
102701
  ...stableState
102668
102702
  } = current2.state;
@@ -102678,6 +102712,7 @@ var reconcileCampUiState = (current2, snapshot) => {
102678
102712
  return {
102679
102713
  ...stableState,
102680
102714
  ...selectedWorkerId === void 0 ? {} : { selectedWorkerId },
102715
+ ...openedWorkerId === void 0 ? {} : { openedWorkerId },
102681
102716
  ...focusedDetailBlockId === void 0 ? {} : { focusedDetailBlockId },
102682
102717
  screen: selectedWorkerId === void 0 ? CampUiScreen.camp : current2.state.screen,
102683
102718
  focusedSlotId: selectedWorkerId === void 0 ? "roster" : current2.state.focusedSlotId,
@@ -102733,12 +102768,17 @@ var makeCampUiStore = (initial, presentationNow = 0) => gen2(function* () {
102733
102768
  ...model,
102734
102769
  state: {
102735
102770
  ...model.state,
102771
+ openedWorkerId: workerId,
102736
102772
  selectedWorkerId: workerId,
102737
102773
  screen: CampUiScreen.worker
102738
102774
  }
102739
102775
  }
102740
102776
  ])
102741
102777
  ),
102778
+ closeWorker: updateState((state) => {
102779
+ const { openedWorkerId: _openedWorkerId, ...rest } = state;
102780
+ return { ...rest, screen: CampUiScreen.camp };
102781
+ }),
102742
102782
  activateScreen: (screen) => modifyEffect3(
102743
102783
  modelRef,
102744
102784
  (model) => screen === CampUiScreen.worker && model.state.selectedWorkerId === void 0 ? fail9(
@@ -102762,10 +102802,9 @@ var makeCampUiStore = (initial, presentationNow = 0) => gen2(function* () {
102762
102802
  if (state.detailVisible === detailVisible) return state;
102763
102803
  return { ...state, detailVisible };
102764
102804
  }),
102765
- setInventoryVisible: (inventoryVisible) => updateState((state) => {
102766
- if (state.inventoryVisible === inventoryVisible) return state;
102767
- return { ...state, inventoryVisible };
102768
- }),
102805
+ setSidebarTab: (sidebarTab) => updateState(
102806
+ (state) => state.sidebarTab === sidebarTab ? state : { ...state, sidebarTab }
102807
+ ),
102769
102808
  setDetailBlockExpanded: (blockId, expanded) => updateState((state) => ({
102770
102809
  ...state,
102771
102810
  expandedDetailBlockIds: updateCampUiStringSet(
@@ -102840,8 +102879,9 @@ var emptyCampUiComponent = {
102840
102879
  // packages/host-ui/src/composition/campUiSlots.ts
102841
102880
  var CampUiSlot = {
102842
102881
  campHeader: "camp-header",
102843
- activity: "activity",
102844
102882
  equipment: "equipment",
102883
+ sidebarTabs: "sidebar-tabs",
102884
+ overview: "overview",
102845
102885
  resources: "resources",
102846
102886
  roster: "roster",
102847
102887
  sessionHeader: "session-header",
@@ -102990,6 +103030,7 @@ var makeCampUiIntentHandler = (options2) => type2().pipe(
102990
103030
  );
102991
103031
  }),
102992
103032
  OpenWorker: ({ workerId }) => options2.controller.openWorker(workerId),
103033
+ CloseWorker: () => options2.controller.closeWorker,
102993
103034
  ScrollWorker: ({ workerId, delta }) => suspend4(() => {
102994
103035
  const offset = options2.readModel().state.scrollOffsets.get(workerId) ?? 0;
102995
103036
  return options2.controller.focusDetailBlock(void 0).pipe(
@@ -103011,7 +103052,11 @@ var makeCampUiIntentHandler = (options2) => type2().pipe(
103011
103052
  }),
103012
103053
  SelectWorker: ({ workerId }) => options2.controller.selectWorker(workerId),
103013
103054
  SetDraft: ({ workerId, draft }) => options2.controller.setDraft(workerId, draft),
103014
- SetInventoryVisible: ({ visible }) => options2.controller.setInventoryVisible(visible),
103055
+ CycleSidebarTab: ({ delta }) => suspend4(
103056
+ () => options2.controller.setSidebarTab(
103057
+ nextCampUiSidebarTab(options2.readModel().state.sidebarTab, delta)
103058
+ )
103059
+ ),
103015
103060
  SetScrollOffset: ({ workerId, offset }) => options2.controller.setScrollOffset(workerId, offset),
103016
103061
  SetTranscriptVisible: ({ visible }) => options2.controller.setDetailVisible(visible),
103017
103062
  Steer: ({ workerId, message }) => message.trim() === "" ? _void : options2.backend.steer({ workerId, message }).pipe(
@@ -103073,10 +103118,10 @@ var findCampUiSpatialFocusTarget = (frame, currentSlotId, focusableSlotIds, dire
103073
103118
 
103074
103119
  // packages/host-ui/src/layout/campUiLayoutPolicy.ts
103075
103120
  var defaultCampUiLayoutPolicy = {
103076
- leftMinimumWidth: 28,
103077
- rightMinimumWidth: 28,
103078
- leftTrackWidthThreshold: 82,
103079
- rightTrackWidthThreshold: 112,
103121
+ leftMinimumWidth: 44,
103122
+ rightMinimumWidth: 44,
103123
+ leftTrackWidthThreshold: 90,
103124
+ rightTrackWidthThreshold: 136,
103080
103125
  trackGapWidth: 1,
103081
103126
  wideMinimumHeight: 18,
103082
103127
  campHeaderHeight: 1,
@@ -103215,7 +103260,6 @@ var defaultCampUiLeftSectionSizes = {
103215
103260
  workers: { kind: CampUiSectionSizeKind.grow, weight: 1, minimumRows: 1 }
103216
103261
  };
103217
103262
  var defaultCampUiRightSectionSizes = {
103218
- activity: { kind: CampUiSectionSizeKind.grow, weight: 1, minimumRows: 2 },
103219
103263
  equipment: { kind: CampUiSectionSizeKind.fixed, rows: 7 }
103220
103264
  };
103221
103265
 
@@ -103235,15 +103279,6 @@ var leftSectionHeights = (bodyHeight, slots) => {
103235
103279
  size14(CampUiSlot.roster, defaultCampUiLeftSectionSizes.workers)
103236
103280
  ]);
103237
103281
  };
103238
- var rightSectionHeights = (bodyHeight, width, slots) => {
103239
- const minimumActivityRows = Math.min(units2(bodyHeight), 2);
103240
- const fallback = defaultCampUiRightSectionSizes.equipment.rows;
103241
- const preferred = units2(
103242
- slots?.get(CampUiSlot.equipment)?.preferredRows?.(units2(width)) ?? fallback
103243
- );
103244
- const equipmentHeight = fixedRows(Math.max(0, bodyHeight - minimumActivityRows), preferred);
103245
- return [Math.max(0, bodyHeight - equipmentHeight), equipmentHeight];
103246
- };
103247
103282
  var composerHeight = (availableHeight, width, policy, slots) => {
103248
103283
  const maximum = units2(policy.composerMaximumHeight);
103249
103284
  const minimum = Math.min(maximum, units2(policy.composerMinimumHeight));
@@ -103256,7 +103291,7 @@ var makeNarrowFrame = (viewport, state, policy, slots) => {
103256
103291
  const footerHeight = fixedRows(viewport.height, policy.footerHeight);
103257
103292
  const bodyHeight = Math.max(0, viewport.height - footerHeight);
103258
103293
  const footerY = bodyHeight;
103259
- const workerScreen = state.screen === CampUiScreen.worker && state.selectedWorkerId !== void 0;
103294
+ const workerScreen = state.screen === CampUiScreen.worker && campUiOpenedWorkerId(state) !== void 0;
103260
103295
  const [campHeight = 0, rosterHeight = 0] = workerScreen ? [] : leftSectionHeights(bodyHeight, slots);
103261
103296
  const sessionHeaderHeight = workerScreen ? fixedRows(bodyHeight, policy.sessionHeaderHeight) : 0;
103262
103297
  const inputHeight = workerScreen ? composerHeight(bodyHeight - sessionHeaderHeight, viewport.width, policy, slots) : 0;
@@ -103280,12 +103315,12 @@ var makeNarrowFrame = (viewport, state, policy, slots) => {
103280
103315
  ])
103281
103316
  };
103282
103317
  };
103283
- var makeWideFrame = (viewport, policy, slots) => {
103318
+ var makeWideFrame = (viewport, state, policy, slots) => {
103284
103319
  const campHeaderHeight = fixedRows(viewport.height, policy.campHeaderHeight);
103285
103320
  const footerHeight = fixedRows(viewport.height - campHeaderHeight, policy.footerHeight);
103286
103321
  const bodyHeight = Math.max(0, viewport.height - campHeaderHeight - footerHeight);
103287
103322
  const footerY = campHeaderHeight + bodyHeight;
103288
- const [leftWidth = 0, leftGap = 0, centerWidth = 0, rightGap = 0, rightWidth = 0] = allocateCampUiTrackColumns(viewport.width, [
103323
+ const [leftWidth = 0, leftGap = 0, centerWidth = 0] = allocateCampUiTrackColumns(viewport.width, [
103289
103324
  {
103290
103325
  kind: CampUiTrackSizeKind.min,
103291
103326
  minimumColumns: policy.leftMinimumWidth,
@@ -103296,57 +103331,67 @@ var makeWideFrame = (viewport, policy, slots) => {
103296
103331
  columns: policy.trackGapWidth,
103297
103332
  collapseBelow: policy.leftTrackWidthThreshold
103298
103333
  },
103299
- { kind: CampUiTrackSizeKind.fill, weight: 1 },
103300
- {
103301
- kind: CampUiTrackSizeKind.fixed,
103302
- columns: policy.trackGapWidth,
103303
- collapseBelow: policy.rightTrackWidthThreshold
103304
- },
103305
- {
103306
- kind: CampUiTrackSizeKind.min,
103307
- minimumColumns: policy.rightMinimumWidth,
103308
- collapseBelow: policy.rightTrackWidthThreshold
103309
- }
103334
+ { kind: CampUiTrackSizeKind.fill, weight: 1 }
103310
103335
  ]);
103311
103336
  const centerX2 = leftWidth + leftGap;
103312
- const rightX = centerX2 + centerWidth + rightGap;
103313
- const [activityHeight = 0, equipmentHeight = 0] = rightSectionHeights(
103314
- bodyHeight,
103315
- rightWidth,
103316
- slots
103317
- );
103318
103337
  const sessionHeaderHeight = fixedRows(bodyHeight, policy.sessionHeaderHeight);
103319
103338
  const inputHeight = composerHeight(bodyHeight - sessionHeaderHeight, centerWidth, policy, slots);
103320
103339
  const transcriptHeight = bodyHeight - sessionHeaderHeight - inputHeight;
103321
103340
  const bodyY = campHeaderHeight;
103341
+ const opened = campUiOpenedWorkerId(state);
103342
+ const sidebarTabsHeight = leftWidth === 0 ? 0 : fixedRows(bodyHeight, 1);
103322
103343
  return {
103323
103344
  mode: CampUiLayoutMode.wide,
103324
103345
  dividers: [],
103325
103346
  regions: compact2([
103326
103347
  region(CampUiSlot.campHeader, 0, 0, viewport.width, campHeaderHeight),
103327
- region(CampUiSlot.roster, 0, bodyY, leftWidth, bodyHeight),
103328
- region(CampUiSlot.sessionHeader, centerX2, bodyY, centerWidth, sessionHeaderHeight),
103348
+ /*
103349
+ * The tab row sits under the track it belongs to and takes one line; the
103350
+ * active tab is the content above it.
103351
+ */
103329
103352
  region(
103330
- CampUiSlot.transcript,
103331
- centerX2,
103332
- bodyY + sessionHeaderHeight,
103333
- centerWidth,
103334
- transcriptHeight
103353
+ state.sidebarTab === CampUiSidebarTab.equipment ? CampUiSlot.equipment : CampUiSlot.roster,
103354
+ 0,
103355
+ bodyY,
103356
+ leftWidth,
103357
+ Math.max(0, bodyHeight - sidebarTabsHeight)
103335
103358
  ),
103336
103359
  region(
103337
- CampUiSlot.composer,
103338
- centerX2,
103339
- bodyY + sessionHeaderHeight + transcriptHeight,
103340
- centerWidth,
103341
- inputHeight
103360
+ CampUiSlot.sidebarTabs,
103361
+ 0,
103362
+ bodyY + Math.max(0, bodyHeight - sidebarTabsHeight),
103363
+ leftWidth,
103364
+ sidebarTabsHeight
103342
103365
  ),
103343
- region(CampUiSlot.activity, rightX, bodyY, rightWidth, activityHeight),
103344
- region(CampUiSlot.equipment, rightX, bodyY + activityHeight, rightWidth, equipmentHeight),
103345
103366
  /*
103346
- * One line across the whole width: two footers pinned to the corners split
103347
- * along the track boundary and repeated what the worker cards already say.
103367
+ * With nobody open the middle answers about the camp itself what it
103368
+ * loaded and what it can reach instead of showing an empty transcript
103369
+ * above an input that has no addressee.
103348
103370
  */
103349
- region(CampUiSlot.footer, 0, footerY, viewport.width, footerHeight)
103371
+ ...opened === void 0 ? [region(CampUiSlot.overview, centerX2, bodyY, centerWidth, bodyHeight)] : [
103372
+ region(CampUiSlot.sessionHeader, centerX2, bodyY, centerWidth, sessionHeaderHeight),
103373
+ region(
103374
+ CampUiSlot.transcript,
103375
+ centerX2,
103376
+ bodyY + sessionHeaderHeight,
103377
+ centerWidth,
103378
+ transcriptHeight
103379
+ ),
103380
+ region(
103381
+ CampUiSlot.composer,
103382
+ centerX2,
103383
+ bodyY + sessionHeaderHeight + transcriptHeight,
103384
+ centerWidth,
103385
+ inputHeight
103386
+ )
103387
+ ],
103388
+ /*
103389
+ * The bottom line belongs to the conversation, not to the whole width: it
103390
+ * sits under the input and answers about the work happening there. Under
103391
+ * the side tracks there is nothing, so the eye is not dragged across the
103392
+ * screen by a rule that spans everything.
103393
+ */
103394
+ region(CampUiSlot.footer, centerX2, footerY, centerWidth, footerHeight)
103350
103395
  ])
103351
103396
  };
103352
103397
  };
@@ -103357,7 +103402,7 @@ var makeDefaultCampUiLayout = (policy = defaultCampUiLayoutPolicy) => ({
103357
103402
  width: units2(viewport.width),
103358
103403
  height: units2(viewport.height)
103359
103404
  };
103360
- return normalized.height >= policy.wideMinimumHeight ? makeWideFrame(normalized, policy, slots) : makeNarrowFrame(normalized, state, policy, slots);
103405
+ return normalized.height >= policy.wideMinimumHeight ? makeWideFrame(normalized, state, policy, slots) : makeNarrowFrame(normalized, state, policy, slots);
103361
103406
  }
103362
103407
  });
103363
103408
 
@@ -103764,7 +103809,7 @@ var makeCampUiComposerComponent = (context8, tui) => {
103764
103809
  };
103765
103810
  };
103766
103811
  const selectedEditor = () => {
103767
- const workerId = context8.readModel().state.selectedWorkerId;
103812
+ const workerId = campUiOpenedWorkerId(context8.readModel().state);
103768
103813
  if (workerId === void 0) return void 0;
103769
103814
  const existing = editors.get(workerId);
103770
103815
  if (existing !== void 0) return existing;
@@ -103774,7 +103819,7 @@ var makeCampUiComposerComponent = (context8, tui) => {
103774
103819
  };
103775
103820
  const renderSelectedEditor = (width) => {
103776
103821
  const model = context8.readModel();
103777
- const workerId = model.state.selectedWorkerId;
103822
+ const workerId = campUiOpenedWorkerId(model.state);
103778
103823
  const entry = selectedEditor();
103779
103824
  if (workerId === void 0 || entry === void 0) return void 0;
103780
103825
  const { editor } = entry;
@@ -104305,7 +104350,7 @@ var makeCampUiDetailComponent = (context8, registry2 = defaultCampUiDetailBlockR
104305
104350
  visibleRanges = [];
104306
104351
  const model = context8.readModel();
104307
104352
  const selectTheme = getSelectListTheme8();
104308
- const workerId = model.state.selectedWorkerId;
104353
+ const workerId = campUiOpenedWorkerId(model.state);
104309
104354
  if (workerId === void 0) return [selectTheme.description("No worker selected")];
104310
104355
  const worker = findCampUiWorker(model.snapshot, workerId);
104311
104356
  if (worker === void 0) return [selectTheme.noMatch("Selected worker is unavailable")];
@@ -104385,7 +104430,7 @@ var makeCampUiDetailComponent = (context8, registry2 = defaultCampUiDetailBlockR
104385
104430
  const delta = matchesKey2(input, Key3.up) ? -1 : matchesKey2(input, Key3.down) ? 1 : void 0;
104386
104431
  if (delta === void 0) return false;
104387
104432
  const model = context8.readModel();
104388
- const workerId = model.state.selectedWorkerId;
104433
+ const workerId = campUiOpenedWorkerId(model.state);
104389
104434
  if (workerId === void 0) return false;
104390
104435
  const focusedBlockId = model.state.focusedDetailBlockId;
104391
104436
  const current2 = renderedRanges.findIndex((range3) => range3.id === focusedBlockId);
@@ -104402,7 +104447,7 @@ var makeCampUiDetailComponent = (context8, registry2 = defaultCampUiDetailBlockR
104402
104447
  return true;
104403
104448
  },
104404
104449
  handlePointer: (pointer) => {
104405
- const workerId = context8.readModel().state.selectedWorkerId;
104450
+ const workerId = campUiOpenedWorkerId(context8.readModel().state);
104406
104451
  if (workerId === void 0) return [];
104407
104452
  if (pointer.action === "wheel") {
104408
104453
  return [
@@ -104426,169 +104471,9 @@ var makeCampUiDetailComponent = (context8, registry2 = defaultCampUiDetailBlockR
104426
104471
  };
104427
104472
  };
104428
104473
 
104429
- // packages/host-ui/src/pi/layout/campUiActivity.ts
104430
- import { getSelectListTheme as getSelectListTheme9 } from "@earendil-works/pi-coding-agent";
104431
- import { sliceByColumn, visibleWidth as visibleWidth3 } from "@earendil-works/pi-tui";
104432
- var CampUiActivityAccess = {
104433
- read: "read",
104434
- edit: "edit",
104435
- write: "write"
104436
- };
104437
- var accessByTool = /* @__PURE__ */ new Map([
104438
- ["read", CampUiActivityAccess.read],
104439
- ["edit", CampUiActivityAccess.edit],
104440
- ["write", CampUiActivityAccess.write]
104441
- ]);
104442
- var accessRank = {
104443
- read: 0,
104444
- edit: 1,
104445
- write: 2
104446
- };
104447
- var filePathArgument = (parameters3) => {
104448
- for (const name of ["path", "file_path"]) {
104449
- const value5 = parameters3[name];
104450
- if (typeof value5 === "string" && value5.trim() !== "") return value5.trim();
104451
- }
104452
- return void 0;
104453
- };
104454
- var splitPath2 = (path) => {
104455
- const separator = path.lastIndexOf("/");
104456
- if (separator < 0) return { directory: ".", name: path };
104457
- if (separator === 0) return { directory: "/", name: path.slice(1) || path };
104458
- return { directory: path.slice(0, separator), name: path.slice(separator + 1) || path };
104459
- };
104460
- var collectCampUiActivityTree = (transcript) => {
104461
- const directories = /* @__PURE__ */ new Map();
104462
- const nodes = /* @__PURE__ */ new Map();
104463
- for (const message of transcript) {
104464
- for (const content of message.content) {
104465
- if (content.kind !== "tool-call") continue;
104466
- const access3 = accessByTool.get(content.toolName);
104467
- if (access3 === void 0) continue;
104468
- const path = filePathArgument(content.arguments);
104469
- if (path === void 0) continue;
104470
- const existing = nodes.get(path);
104471
- if (existing !== void 0) {
104472
- existing.count += 1;
104473
- if (accessRank[access3] > accessRank[existing.access]) existing.access = access3;
104474
- continue;
104475
- }
104476
- const { directory, name } = splitPath2(path);
104477
- const node = { path, directory, name, access: access3, count: 1 };
104478
- nodes.set(path, node);
104479
- const group2 = directories.get(directory) ?? { path: directory, nodes: [] };
104480
- if (!directories.has(directory)) directories.set(directory, group2);
104481
- group2.nodes.push(node);
104482
- }
104483
- }
104484
- return [...directories.values()].map((directory) => ({
104485
- path: directory.path,
104486
- nodes: directory.nodes.map((node) => ({ ...node }))
104487
- }));
104488
- };
104489
- var CAMP_UI_ACTIVITY_MAX_VISIBLE_PATHS = 12;
104490
- var ACTIVITY_COLUMNS_PER_VISIBLE_PATH = 4;
104491
- var flattenedNodes = (tree) => tree.flatMap((directory) => directory.nodes);
104492
- var renderedRowCount = (tree, selected, hidden) => {
104493
- const directories = tree.filter(
104494
- (directory) => directory.nodes.some((node) => selected.has(node))
104495
- ).length;
104496
- return selected.size + directories + (hidden > 0 ? 1 : 0);
104497
- };
104498
- var selectVisibleNodes2 = (tree, width, height) => {
104499
- const nodes = flattenedNodes(tree);
104500
- const selected = /* @__PURE__ */ new Set();
104501
- const widthBudget = Math.max(
104502
- 1,
104503
- Math.floor(Math.max(0, width) / ACTIVITY_COLUMNS_PER_VISIBLE_PATH)
104504
- );
104505
- const nodeBudget = Math.min(CAMP_UI_ACTIVITY_MAX_VISIBLE_PATHS, widthBudget);
104506
- const mutations = nodes.filter((node) => node.access !== CampUiActivityAccess.read);
104507
- const reads = nodes.filter((node) => node.access === CampUiActivityAccess.read);
104508
- const addVisible = (node) => {
104509
- if (selected.size >= nodeBudget) return;
104510
- const candidate = new Set(selected).add(node);
104511
- const hidden = nodes.length - candidate.size;
104512
- if (renderedRowCount(tree, candidate, hidden) <= Math.max(0, height)) selected.add(node);
104513
- };
104514
- for (const node of mutations) addVisible(node);
104515
- if (mutations.some((node) => !selected.has(node))) return selected;
104516
- for (const node of reads) addVisible(node);
104517
- return selected;
104518
- };
104519
- var shortenTail = (value5, width) => {
104520
- const available = Math.max(0, Math.floor(width));
104521
- const valueWidth = visibleWidth3(value5);
104522
- if (valueWidth <= available) return value5;
104523
- if (available <= 0) return "";
104524
- if (available === 1) return "\u2026";
104525
- return `\u2026${sliceByColumn(value5, valueWidth - available + 1, available - 1, true)}`;
104526
- };
104527
- var accessPresentation = {
104528
- read: { label: "read", glyph: "r", tone: CampUiTone.neutral },
104529
- edit: { label: "edited", glyph: "~", tone: CampUiTone.attention },
104530
- write: { label: "created", glyph: "+", tone: CampUiTone.success }
104531
- };
104532
- var nodeLine2 = (node, last5, width) => {
104533
- const theme = getSelectListTheme9();
104534
- const presentation = accessPresentation[node.access];
104535
- const count4 = node.count > 1 ? ` \xD7${String(node.count)}` : "";
104536
- const suffix = ` \xB7 ${presentation.label}${count4}`;
104537
- const branch = last5 ? "\u2514\u2500" : "\u251C\u2500";
104538
- const nameWidth = Math.max(1, width - visibleWidth3(`${branch} ${presentation.glyph} ${suffix}`));
104539
- const name = shortenTail(node.name, nameWidth);
104540
- return fitCampUiLine(
104541
- `${theme.description(branch)} ${renderCampUiStatus(name, presentation.tone, presentation.glyph)}${theme.description(suffix)}`,
104542
- width
104543
- );
104544
- };
104545
- var hiddenSummary = (nodes) => {
104546
- const parts2 = Object.values(CampUiActivityAccess).flatMap((access3) => {
104547
- const count4 = nodes.filter((node) => node.access === access3).length;
104548
- if (count4 === 0) return [];
104549
- const label = accessPresentation[access3].label;
104550
- return [`${String(count4)} ${label} ${count4 === 1 ? "path" : "paths"}`];
104551
- });
104552
- return `... ${parts2.join(" \xB7 ")} hidden`;
104553
- };
104554
- var renderCampUiActivityTree = (transcript, width, height) => {
104555
- const theme = getSelectListTheme9();
104556
- const tree = collectCampUiActivityTree(transcript);
104557
- const nodes = flattenedNodes(tree);
104558
- if (height <= 0) return [];
104559
- if (nodes.length === 0) return [fitCampUiLine(theme.description("no file activity"), width)];
104560
- const selected = selectVisibleNodes2(tree, width, height);
104561
- const lines3 = [];
104562
- for (const directory of tree) {
104563
- const visible = directory.nodes.filter((node) => selected.has(node));
104564
- if (visible.length === 0) continue;
104565
- lines3.push(fitCampUiLine(theme.description(shortenTail(directory.path, width)), width));
104566
- visible.forEach((node, index) => {
104567
- lines3.push(nodeLine2(node, index === visible.length - 1, width));
104568
- });
104569
- }
104570
- const hidden = nodes.filter((node) => !selected.has(node));
104571
- if (hidden.length > 0) {
104572
- lines3.push(fitCampUiLine(theme.description(hiddenSummary(hidden)), width));
104573
- }
104574
- return lines3;
104575
- };
104576
- var makeCampUiActivity = (context8) => ({
104577
- render: (viewport) => {
104578
- const model = context8.readModel();
104579
- const workerId = model.state.selectedWorkerId;
104580
- const worker = workerId === void 0 ? void 0 : findCampUiWorker(model.snapshot, workerId);
104581
- return renderCampUiActivityTree(
104582
- worker?.snapshot.session?.transcript ?? [],
104583
- viewport.width,
104584
- viewport.height
104585
- );
104586
- }
104587
- });
104588
-
104589
104474
  // packages/host-ui/src/pi/layout/campUiChrome.ts
104590
- import { getSelectListTheme as getSelectListTheme10 } from "@earendil-works/pi-coding-agent";
104591
- import { truncateToWidth as truncateToWidth4, visibleWidth as visibleWidth4 } from "@earendil-works/pi-tui";
104475
+ import { getSelectListTheme as getSelectListTheme9 } from "@earendil-works/pi-coding-agent";
104476
+ import { truncateToWidth as truncateToWidth4, visibleWidth as visibleWidth3 } from "@earendil-works/pi-tui";
104592
104477
 
104593
104478
  // packages/host-ui/src/pi/shared/campUiPulse.ts
104594
104479
  var BRAILLE_BASE = 10240;
@@ -104680,7 +104565,7 @@ var campUiLevelMarkerText = (level, color) => level === CampUiLevel.resting ? le
104680
104565
  var makeCampUiCampHeader = (context8) => ({
104681
104566
  render: (viewport) => {
104682
104567
  const snapshot = context8.readModel().snapshot;
104683
- const theme = getSelectListTheme10();
104568
+ const theme = getSelectListTheme9();
104684
104569
  const mode = snapshot.placement === "external" ? "agentless" : "foreman";
104685
104570
  return [
104686
104571
  fitCampUiLine(theme.description(snapshot.displayName), viewport.width),
@@ -104695,13 +104580,13 @@ var PULSE_WINDOW_MS = 12e4;
104695
104580
  var PULSE_CEILING = 4;
104696
104581
  var PULSE_SAMPLES_PER_COLUMN = 2;
104697
104582
  var rosterWidths = (width) => {
104698
- const right3 = Math.min(17, Math.max(0, width - 17));
104699
- const left3 = Math.min(11, Math.max(0, width - right3 - 6));
104700
- return { left: left3, pulse: Math.max(0, width - left3 - right3 - 4), right: right3 };
104583
+ const right3 = Math.min(15, Math.max(0, width - 20));
104584
+ const left3 = Math.min(14, Math.max(0, width - right3 - 6));
104585
+ return { left: left3, pulse: Math.max(0, width - left3 - right3 - 3), right: right3 };
104701
104586
  };
104702
104587
  var rightColumn = (text4, width) => {
104703
104588
  const fitted = truncateToWidth4(text4, width);
104704
- return `${" ".repeat(Math.max(0, width - visibleWidth4(fitted)))}${fitted}`;
104589
+ return `${" ".repeat(Math.max(0, width - visibleWidth3(fitted)))}${fitted}`;
104705
104590
  };
104706
104591
  var pulseSamples = (timestamps, sampleCount, now2) => {
104707
104592
  if (sampleCount <= 0) return [];
@@ -104729,23 +104614,24 @@ var usageText = (entry, width) => {
104729
104614
  const usage = entry.snapshot.session?.usage;
104730
104615
  const context8 = percentText(usage?.context?.percent);
104731
104616
  const cache = usage?.latestCacheHitRate === void 0 ? usage === void 0 || usage.tokens.total === 0 ? "n/a" : "n/r" : percentText(usage.latestCacheHitRate);
104732
- const cost = usage === void 0 ? "\u2014" : `$${usage.cost.toFixed(3)}`;
104733
- const full = `${context8} ${cache} ${cost}`;
104734
- if (visibleWidth4(full) <= width || usage === void 0) return full;
104735
- const compactCost = `$${usage.cost.toFixed(2).replace(/^0/u, "")}`;
104736
- return `${context8}${cache}${compactCost}`;
104617
+ const full = `${context8} cache ${cache}`;
104618
+ return visibleWidth3(full) <= width ? full : `${context8} ${cache}`;
104737
104619
  };
104738
104620
  var stateText = (state, duration5, width) => {
104739
104621
  const full = `${state} ${duration5}`;
104740
- return visibleWidth4(full) <= width ? full : state;
104622
+ return visibleWidth3(full) <= width ? full : state;
104741
104623
  };
104742
- var modelText = (entry) => {
104624
+ var modelText = (entry, width) => {
104743
104625
  const model = entry.snapshot.session?.usage?.model ?? entry.snapshot.worker.equipment.model;
104744
- if (model === void 0) return "model unknown";
104745
- return model.split("/").at(-1) ?? model;
104626
+ const thinking = entry.snapshot.session?.thinkingLevel ?? entry.snapshot.worker.equipment.thinkingLevel;
104627
+ if (model === void 0) return thinking === void 0 ? "model unknown" : thinking;
104628
+ const short = model.split("/").at(-1) ?? model;
104629
+ if (thinking === void 0) return short;
104630
+ const full = `${short} ${thinking}`;
104631
+ return visibleWidth3(full) <= width ? full : short;
104746
104632
  };
104747
104633
  var cardLine = (marker, left3, pulse, right3, widths, width) => fitCampUiLine(
104748
- `${marker} ${fitCampUiLine(left3, widths.left)} ${fitCampUiLine(pulse, widths.pulse)} ${rightColumn(right3, widths.right)}`,
104634
+ `${marker} ${fitCampUiLine(left3, widths.left)}${fitCampUiLine(pulse, widths.pulse)} ${rightColumn(right3, widths.right)}`,
104749
104635
  width
104750
104636
  );
104751
104637
  var renderExternalControllerCard = (controllerConnected, width) => {
@@ -104772,10 +104658,10 @@ var renderExternalControllerCard = (controllerConnected, width) => {
104772
104658
  )
104773
104659
  ];
104774
104660
  };
104775
- var renderWorkerCard = (entry, selectedWorkerId, detailVisible, now2, width) => {
104661
+ var renderWorkerCard = (entry, cursorWorkerId, openedWorkerId, now2, width) => {
104776
104662
  const worker = entry.snapshot.worker;
104777
104663
  const session = entry.snapshot.session;
104778
- const level = worker.id !== selectedWorkerId ? CampUiLevel.resting : detailVisible ? CampUiLevel.selected : CampUiLevel.focused;
104664
+ const level = worker.id === openedWorkerId ? CampUiLevel.selected : worker.id === cursorWorkerId ? CampUiLevel.focused : CampUiLevel.resting;
104779
104665
  const roleColor = campUiRoleColor(worker.equipment.role);
104780
104666
  const widths = rosterWidths(width);
104781
104667
  const timestamps = (session?.transcript ?? []).flatMap(
@@ -104798,7 +104684,7 @@ var renderWorkerCard = (entry, selectedWorkerId, detailVisible, now2, width) =>
104798
104684
  campUiLevelMarkerText(level, roleColor),
104799
104685
  campUiText(name, roleColor, level),
104800
104686
  campUiPulseText(pulse[0], level, roleColor),
104801
- neutral(modelText(entry)),
104687
+ neutral(modelText(entry, widths.right)),
104802
104688
  widths,
104803
104689
  width
104804
104690
  ),
@@ -104818,19 +104704,20 @@ var makeCampUiRoster = (context8) => ({
104818
104704
  const model = context8.readModel();
104819
104705
  const external = model.snapshot.placement === CampUiPlacement.external;
104820
104706
  if (model.snapshot.workers.length === 0 && !external) {
104821
- return [getSelectListTheme10().description("No workers")];
104707
+ return [getSelectListTheme9().description("No workers")];
104822
104708
  }
104823
104709
  const controller = external ? renderExternalControllerCard(model.snapshot.controllerConnected, viewport.width) : [];
104824
- const workers = model.snapshot.workers.flatMap((entry) => {
104710
+ const workers = model.snapshot.workers.flatMap((entry, index) => {
104825
104711
  const candidateNow = model.state.presentationNow;
104826
104712
  const now2 = Number.isFinite(candidateNow) ? candidateNow : entry.snapshot.worker.updatedAt;
104827
- return renderWorkerCard(
104713
+ const card = renderWorkerCard(
104828
104714
  entry,
104829
104715
  model.state.selectedWorkerId,
104830
- model.state.detailVisible,
104716
+ campUiOpenedWorkerId(model.state),
104831
104717
  now2,
104832
104718
  viewport.width
104833
104719
  );
104720
+ return index === 0 ? card : ["", ...card];
104834
104721
  });
104835
104722
  return [...controller, ...workers];
104836
104723
  },
@@ -104841,7 +104728,8 @@ var makeCampUiRoster = (context8) => ({
104841
104728
  if (pointer.y < controllerRows) {
104842
104729
  return [CampUiIntents.FocusSlot({ slotId: CampUiSlot.roster })];
104843
104730
  }
104844
- const workerIndex = Math.floor((pointer.y - controllerRows) / 2);
104731
+ const offset = pointer.y - controllerRows;
104732
+ const workerIndex = offset < 2 ? 0 : Math.floor((offset + 1) / 3);
104845
104733
  const workerId = model.snapshot.workers[workerIndex]?.snapshot.worker.id;
104846
104734
  if (workerId === void 0) return [];
104847
104735
  return [
@@ -104853,8 +104741,8 @@ var makeCampUiRoster = (context8) => ({
104853
104741
  var makeCampUiSessionHeader = (context8) => ({
104854
104742
  render: (viewport) => {
104855
104743
  const model = context8.readModel();
104856
- const theme = getSelectListTheme10();
104857
- const workerId = model.state.selectedWorkerId;
104744
+ const theme = getSelectListTheme9();
104745
+ const workerId = campUiOpenedWorkerId(model.state);
104858
104746
  if (workerId === void 0) {
104859
104747
  return [fitCampUiLine(theme.description("Select a worker"), viewport.width)];
104860
104748
  }
@@ -104875,16 +104763,22 @@ var makeCampUiSessionHeader = (context8) => ({
104875
104763
  });
104876
104764
 
104877
104765
  // packages/host-ui/src/pi/layout/campUiEquipment.ts
104878
- import { getSelectListTheme as getSelectListTheme11 } from "@earendil-works/pi-coding-agent";
104766
+ import { getSelectListTheme as getSelectListTheme10 } from "@earendil-works/pi-coding-agent";
104879
104767
  import { wrapTextWithAnsi } from "@earendil-works/pi-tui";
104880
104768
  var fullEquipmentLines = (equipment, revision, width) => {
104881
104769
  if (width <= 0) return [];
104882
- const theme = getSelectListTheme11();
104883
- return equipmentDescriptionLines(equipment, revision).flatMap(
104884
- (line) => wrapTextWithAnsi(theme.description(line), width).map(
104885
- (wrapped) => fitCampUiLine(wrapped, width)
104886
- )
104887
- );
104770
+ const theme = getSelectListTheme10();
104771
+ return equipmentDescriptionGroups(equipment, revision).flatMap((group2) => {
104772
+ const values4 = group2.values.length === 0 ? ["none"] : group2.values;
104773
+ return [
104774
+ fitCampUiLine(theme.description(group2.label), width),
104775
+ ...values4.flatMap((value5, index) => {
104776
+ const branch = index === values4.length - 1 ? "\u2514\u2500" : "\u251C\u2500";
104777
+ const body = `${theme.description(branch)} ${value5}`;
104778
+ return wrapTextWithAnsi(body, width).map((wrapped) => fitCampUiLine(wrapped, width));
104779
+ })
104780
+ ];
104781
+ });
104888
104782
  };
104889
104783
  var renderCampUiEquipment = (equipment, revision, width, height) => {
104890
104784
  const lines3 = fullEquipmentLines(equipment, revision, width);
@@ -104893,7 +104787,7 @@ var renderCampUiEquipment = (equipment, revision, width, height) => {
104893
104787
  if (lines3.length <= available) return lines3;
104894
104788
  const shown = lines3.slice(0, Math.max(0, available - 1));
104895
104789
  const hidden = lines3.length - shown.length;
104896
- const summary5 = getSelectListTheme11().description(
104790
+ const summary5 = getSelectListTheme10().description(
104897
104791
  `... ${String(hidden)} equipment ${hidden === 1 ? "line" : "lines"} hidden`
104898
104792
  );
104899
104793
  return [...shown, fitCampUiLine(summary5, width)];
@@ -104901,18 +104795,20 @@ var renderCampUiEquipment = (equipment, revision, width, height) => {
104901
104795
  var makeCampUiEquipment = (context8) => {
104902
104796
  const selectedWorker = () => {
104903
104797
  const model = context8.readModel();
104904
- const workerId = model.state.selectedWorkerId;
104798
+ const workerId = campUiOpenedWorkerId(model.state);
104905
104799
  return workerId === void 0 ? void 0 : findCampUiWorker(model.snapshot, workerId);
104906
104800
  };
104907
104801
  const fullLines = (width) => {
104908
104802
  const worker = selectedWorker();
104909
- return worker === void 0 ? [fitCampUiLine(getSelectListTheme11().description("no worker selected"), width)] : fullEquipmentLines(
104803
+ return worker === void 0 ? [fitCampUiLine(getSelectListTheme10().description("no worker selected"), width)] : fullEquipmentLines(
104910
104804
  worker.snapshot.worker.equipment,
104911
104805
  worker.snapshot.worker.equipmentVersion,
104912
104806
  width
104913
104807
  );
104914
104808
  };
104915
104809
  return {
104810
+ /* A tab of the left track takes focus like the roster does. */
104811
+ focusable: true,
104916
104812
  preferredRows: (width) => fullLines(width).length,
104917
104813
  render: (viewport) => {
104918
104814
  const worker = selectedWorker();
@@ -104928,8 +104824,8 @@ var makeCampUiEquipment = (context8) => {
104928
104824
  };
104929
104825
 
104930
104826
  // packages/host-ui/src/pi/layout/campUiFooter.ts
104931
- import { getMarkdownTheme as getMarkdownTheme7, getSelectListTheme as getSelectListTheme12 } from "@earendil-works/pi-coding-agent";
104932
- import { sliceByColumn as sliceByColumn2, visibleWidth as visibleWidth5 } from "@earendil-works/pi-tui";
104827
+ import { getMarkdownTheme as getMarkdownTheme7, getSelectListTheme as getSelectListTheme11 } from "@earendil-works/pi-coding-agent";
104828
+ import { sliceByColumn, visibleWidth as visibleWidth4 } from "@earendil-works/pi-tui";
104933
104829
  var footerDivider = (width) => fitCampUiLine(getMarkdownTheme7().codeBlockBorder("\u2500".repeat(width)), width);
104934
104830
  var retryText = (retryAt, attempt, now2) => {
104935
104831
  if (retryAt === void 0) return attempt === void 0 ? "" : `attempt ${String(attempt)}`;
@@ -104941,32 +104837,29 @@ var diagnosticText = (value5) => {
104941
104837
  const normalized = value5?.replaceAll(/\s+/gu, " ").trim();
104942
104838
  return normalized === "" ? void 0 : normalized;
104943
104839
  };
104944
- var workerCountText = (workers) => {
104945
- if (workers.length === 0) return "no workers";
104946
- const working = workers.filter(
104947
- (worker) => worker.snapshot.worker.state === CampWorkerState.running
104948
- ).length;
104949
- const waiting = workers.filter((worker) => worker.asks.some(isPendingAsk)).length;
104950
- const parts2 = [
104951
- `${String(workers.length)} ${workers.length === 1 ? "worker" : "workers"}`,
104952
- ...working === 0 ? [] : [`${String(working)} working`],
104953
- ...waiting === 0 ? [] : [`${String(waiting)} waiting`]
104954
- ];
104955
- return parts2.join(" \xB7 ");
104840
+ var campCostText = (workers) => {
104841
+ const reported = workers.flatMap(
104842
+ (worker) => worker.snapshot.session?.usage === void 0 ? [] : [worker.snapshot.session.usage]
104843
+ );
104844
+ if (workers.length === 0) return "";
104845
+ if (reported.length === 0) return "cost unknown";
104846
+ const total = reported.reduce((sum3, usage) => sum3 + usage.cost, 0);
104847
+ const bound = reported.length < workers.length ? "\u2265" : "";
104848
+ return `${bound}$${total.toFixed(3)}`;
104956
104849
  };
104957
- var isPendingAsk = (ask) => ask.state === "pending";
104850
+ var workerCountText = (workers) => workers.length === 0 ? "no workers" : `${String(workers.length)} ${workers.length === 1 ? "worker" : "workers"}`;
104958
104851
  var shortenPath = (value5, width) => {
104959
104852
  const available = Math.max(0, Math.floor(width));
104960
104853
  if (available <= 0) return "";
104961
- if (visibleWidth5(value5) <= available) return value5;
104854
+ if (visibleWidth4(value5) <= available) return value5;
104962
104855
  if (available === 1) return "\u2026";
104963
104856
  const kept = available - 1;
104964
- return `\u2026${sliceByColumn2(value5, visibleWidth5(value5) - kept, kept, true)}`;
104857
+ return `\u2026${sliceByColumn(value5, visibleWidth4(value5) - kept, kept, true)}`;
104965
104858
  };
104966
104859
  var makeCampUiFooter = (context8) => ({
104967
104860
  render: (viewport) => {
104968
104861
  const model = context8.readModel();
104969
- const theme = getSelectListTheme12();
104862
+ const theme = getSelectListTheme11();
104970
104863
  const snapshot = model.snapshot;
104971
104864
  const health = snapshot.health;
104972
104865
  const actionError = diagnosticText(model.state.lastActionError);
@@ -104977,24 +104870,27 @@ var makeCampUiFooter = (context8) => ({
104977
104870
  const diagnostic = actionError !== void 0 ? `${renderCampUiStatus("action error", CampUiTone.error)} ${theme.description(`\xB7 ${actionError}`)}` : healthMessage !== void 0 ? styleCampUiTone(healthTone, healthMessage) : health.status === CampUiHealthStatus.ready ? "" : renderCampUiStatus(health.status, healthTone);
104978
104871
  const branch = snapshot.projectBranch === null ? "" : ` \xB7 ${snapshot.projectBranch}`;
104979
104872
  const version2 = `v${snapshot.hostVersion}`;
104873
+ const camp = [workerCountText(snapshot.workers), campCostText(snapshot.workers)].filter(
104874
+ (part) => part !== ""
104875
+ );
104980
104876
  const candidates = [
104981
- { right: [workerCountText(snapshot.workers), version2, retry5], branch },
104982
- { right: [workerCountText(snapshot.workers), version2], branch },
104877
+ { right: [...camp, version2, retry5], branch },
104878
+ { right: [...camp, version2], branch },
104983
104879
  { right: [version2], branch },
104984
104880
  { right: [version2], branch: "" }
104985
104881
  ];
104986
104882
  const MINIMUM_PATH_COLUMNS = 8;
104987
104883
  const chosen = candidates.find((candidate) => {
104988
- const rightWidth = visibleWidth5(candidate.right.filter((part) => part !== "").join(" \xB7 "));
104989
- const room = viewport.width - rightWidth - 3 - visibleWidth5(candidate.branch);
104884
+ const rightWidth = visibleWidth4(candidate.right.filter((part) => part !== "").join(" \xB7 "));
104885
+ const room = viewport.width - rightWidth - 3 - visibleWidth4(candidate.branch);
104990
104886
  return room >= MINIMUM_PATH_COLUMNS;
104991
104887
  }) ?? candidates[candidates.length - 1];
104992
104888
  const right3 = (chosen ?? candidates[0])?.right.filter((part) => part !== "").join(" \xB7 ") ?? "";
104993
104889
  const chosenBranch = chosen?.branch ?? "";
104994
- const leftBudget = Math.max(0, viewport.width - visibleWidth5(right3) - 3);
104890
+ const leftBudget = Math.max(0, viewport.width - visibleWidth4(right3) - 3);
104995
104891
  const path = shortenPath(
104996
104892
  snapshot.projectScope,
104997
- Math.max(0, leftBudget - visibleWidth5(chosenBranch))
104893
+ Math.max(0, leftBudget - visibleWidth4(chosenBranch))
104998
104894
  );
104999
104895
  const left3 = diagnostic === "" ? theme.description(`${path}${chosenBranch}`) : `${diagnostic} ${theme.description(`\xB7 ${path}${chosenBranch}`)}`;
105000
104896
  return [
@@ -105004,6 +104900,64 @@ var makeCampUiFooter = (context8) => ({
105004
104900
  }
105005
104901
  });
105006
104902
 
104903
+ // packages/host-ui/src/pi/layout/campUiOverview.ts
104904
+ import { getMarkdownTheme as getMarkdownTheme8, getSelectListTheme as getSelectListTheme12 } from "@earendil-works/pi-coding-agent";
104905
+ var resourceGroup = (label, values4, reported, width) => {
104906
+ const theme = getSelectListTheme12();
104907
+ const body = reported ? values4.length === 0 ? theme.description("none loaded") : values4.join(", ") : theme.description("not reported");
104908
+ return [
104909
+ styleCampUiTone(values4.length > 0 ? CampUiTone.attention : CampUiTone.neutral, `[${label}]`),
104910
+ ` ${body}`,
104911
+ ""
104912
+ ].map((line) => fitCampUiLine(line, width));
104913
+ };
104914
+ var mcpNames = (snapshot) => uniqueCampUiNames(
104915
+ snapshot.workers.flatMap((worker) => worker.snapshot.worker.equipment.mcp.serverNames)
104916
+ );
104917
+ var makeCampUiOverview = (context8) => ({
104918
+ render: (viewport) => {
104919
+ const model = context8.readModel();
104920
+ const snapshot = model.snapshot;
104921
+ const theme = getSelectListTheme12();
104922
+ const dim = getMarkdownTheme8().codeBlockBorder;
104923
+ const inventory = snapshot.resources;
104924
+ const reported = inventory.reportedWorkers > 0;
104925
+ const width = viewport.width;
104926
+ const workers = snapshot.workers.length;
104927
+ const lines3 = [
104928
+ fitCampUiLine(`${theme.selectedText("priiisk")} ${dim(`v${snapshot.hostVersion}`)}`, width),
104929
+ fitCampUiLine(dim("\u2190 workers \xB7 enter open \xB7 esc back here"), width),
104930
+ fitCampUiLine(
104931
+ dim(
104932
+ workers === 0 ? "\u041B\u0430\u0433\u0435\u0440\u044C \u043F\u0443\u0441\u0442. \u041E\u0440\u043A\u0435\u0441\u0442\u0440\u0430\u0442\u043E\u0440 \u043D\u0430\u043D\u0438\u043C\u0430\u0435\u0442 \u0432\u043E\u0440\u043A\u0435\u0440\u043E\u0432 \u0447\u0435\u0440\u0435\u0437 CLI: priiisk hire." : `\u0412 \u043B\u0430\u0433\u0435\u0440\u0435 ${String(workers)} ${workers === 1 ? "\u0432\u043E\u0440\u043A\u0435\u0440" : "\u0432\u043E\u0440\u043A\u0435\u0440\u0430"}. \u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0435\u0433\u043E \u0441\u043B\u0435\u0432\u0430 \u0438 \u043E\u0442\u043A\u0440\u043E\u0439\u0442\u0435, \u0447\u0442\u043E\u0431\u044B \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u0442\u044C \u0445\u043E\u0434 \u0440\u0430\u0431\u043E\u0442\u044B.`
104933
+ ),
104934
+ width
104935
+ ),
104936
+ "",
104937
+ ...resourceGroup(
104938
+ "Context",
104939
+ uniqueCampUiNames(inventory.contextFiles.map((item) => item.name)),
104940
+ reported,
104941
+ width
104942
+ ),
104943
+ ...resourceGroup(
104944
+ "Extensions",
104945
+ uniqueCampUiNames(inventory.extensions.map((item) => item.name)),
104946
+ reported,
104947
+ width
104948
+ ),
104949
+ ...resourceGroup(
104950
+ "Skills",
104951
+ uniqueCampUiNames(inventory.skills.map((item) => item.name)),
104952
+ reported,
104953
+ width
104954
+ ),
104955
+ ...resourceGroup("MCP", mcpNames(snapshot), snapshot.workers.length > 0, width)
104956
+ ];
104957
+ return lines3.slice(0, Math.max(0, viewport.height));
104958
+ }
104959
+ });
104960
+
105007
104961
  // packages/host-ui/src/pi/layout/campUiResources.ts
105008
104962
  import { getSelectListTheme as getSelectListTheme13 } from "@earendil-works/pi-coding-agent";
105009
104963
  var renderResourceTree = (label, value5, tone, width) => {
@@ -105030,7 +104984,7 @@ var makeCampUiResources = (context8) => ({
105030
104984
  const value5 = names2.length === 0 ? "none loaded" : names2.join(", ");
105031
104985
  return partial4 ? `${value5} \xB7 partial` : value5;
105032
104986
  };
105033
- const mcpNames = uniqueCampUiNames(equipment.flatMap((item) => item.mcp.serverNames));
104987
+ const mcpNames2 = uniqueCampUiNames(equipment.flatMap((item) => item.mcp.serverNames));
105034
104988
  const mcpHealth = snapshot.workers.flatMap((worker) => worker.snapshot.mcp);
105035
104989
  const healthNames = new Set(mcpHealth.map((item) => item.serverName));
105036
104990
  const failedMcp = mcpHealth.some(
@@ -105040,15 +104994,15 @@ var makeCampUiResources = (context8) => ({
105040
104994
  (item) => item.status === "connecting" || item.status === "retry-wait"
105041
104995
  );
105042
104996
  const partialMcp = mcpHealth.some((item) => !item.catalogComplete);
105043
- const missingMcpHealth = mcpNames.some((name) => !healthNames.has(name));
105044
- const mcpTone = failedMcp ? CampUiTone.error : pendingMcp || partialMcp || missingMcpHealth ? CampUiTone.attention : mcpNames.length > 0 ? CampUiTone.success : CampUiTone.neutral;
104997
+ const missingMcpHealth = mcpNames2.some((name) => !healthNames.has(name));
104998
+ const mcpTone = failedMcp ? CampUiTone.error : pendingMcp || partialMcp || missingMcpHealth ? CampUiTone.attention : mcpNames2.length > 0 ? CampUiTone.success : CampUiTone.neutral;
105045
104999
  const mcpNotes = [
105046
105000
  ...failedMcp ? ["down"] : [],
105047
105001
  ...pendingMcp ? ["connecting"] : [],
105048
105002
  ...partialMcp ? ["catalog partial"] : [],
105049
105003
  ...missingMcpHealth ? ["health not reported"] : []
105050
105004
  ];
105051
- const mcpText = !equipmentReported ? "not reported" : mcpNames.length === 0 ? "none configured" : `${mcpNames.join(", ")}${mcpNotes.length === 0 ? "" : ` \xB7 ${mcpNotes.join(", ")}`}`;
105005
+ const mcpText = !equipmentReported ? "not reported" : mcpNames2.length === 0 ? "none configured" : `${mcpNames2.join(", ")}${mcpNotes.length === 0 ? "" : ` \xB7 ${mcpNotes.join(", ")}`}`;
105052
105006
  const contentWidth = Math.max(1, viewport.width - 2);
105053
105007
  const body = [
105054
105008
  ...renderResourceTree(
@@ -105075,6 +105029,22 @@ var makeCampUiResources = (context8) => ({
105075
105029
  }
105076
105030
  });
105077
105031
 
105032
+ // packages/host-ui/src/pi/layout/campUiSidebarTabs.ts
105033
+ import { getMarkdownTheme as getMarkdownTheme9, getSelectListTheme as getSelectListTheme14 } from "@earendil-works/pi-coding-agent";
105034
+ import { visibleWidth as visibleWidth5 } from "@earendil-works/pi-tui";
105035
+ var makeCampUiSidebarTabs = (context8) => ({
105036
+ render: (viewport) => {
105037
+ const model = context8.readModel();
105038
+ const theme = getSelectListTheme14();
105039
+ const dim = getMarkdownTheme9().codeBlockBorder;
105040
+ const row = CAMP_UI_SIDEBAR_TABS.map(
105041
+ (tab) => tab === model.state.sidebarTab ? theme.selectedText(tab) : dim(tab)
105042
+ ).join(dim("\xB7"));
105043
+ const padding = Math.max(0, Math.floor((viewport.width - visibleWidth5(row)) / 2));
105044
+ return [fitCampUiLine(`${" ".repeat(padding)}${row}`, viewport.width)];
105045
+ }
105046
+ });
105047
+
105078
105048
  // packages/host-ui/src/pi/layout/campUiDefaultSlots.ts
105079
105049
  var makeDefaultCampUiContributions = (tui, detailBlocks) => [
105080
105050
  {
@@ -105082,11 +105052,6 @@ var makeDefaultCampUiContributions = (tui, detailBlocks) => [
105082
105052
  slotId: CampUiSlot.campHeader,
105083
105053
  mount: (context8) => succeed8(makeCampUiCampHeader(context8))
105084
105054
  },
105085
- {
105086
- id: "default-activity",
105087
- slotId: CampUiSlot.activity,
105088
- mount: (context8) => succeed8(makeCampUiActivity(context8))
105089
- },
105090
105055
  {
105091
105056
  id: "default-equipment",
105092
105057
  slotId: CampUiSlot.equipment,
@@ -105112,6 +105077,16 @@ var makeDefaultCampUiContributions = (tui, detailBlocks) => [
105112
105077
  slotId: CampUiSlot.composer,
105113
105078
  mount: (context8) => succeed8(makeCampUiComposerComponent(context8, tui))
105114
105079
  },
105080
+ {
105081
+ id: "default-overview",
105082
+ slotId: CampUiSlot.overview,
105083
+ mount: (context8) => succeed8(makeCampUiOverview(context8))
105084
+ },
105085
+ {
105086
+ id: "default-sidebar-tabs",
105087
+ slotId: CampUiSlot.sidebarTabs,
105088
+ mount: (context8) => succeed8(makeCampUiSidebarTabs(context8))
105089
+ },
105115
105090
  {
105116
105091
  id: "default-footer",
105117
105092
  slotId: CampUiSlot.footer,
@@ -105125,11 +105100,11 @@ var makeDefaultCampUiContributions = (tui, detailBlocks) => [
105125
105100
  ];
105126
105101
 
105127
105102
  // packages/host-ui/src/pi/layout/campUiSection.ts
105128
- import { getMarkdownTheme as getMarkdownTheme8, getSelectListTheme as getSelectListTheme14 } from "@earendil-works/pi-coding-agent";
105103
+ import { getMarkdownTheme as getMarkdownTheme10, getSelectListTheme as getSelectListTheme15 } from "@earendil-works/pi-coding-agent";
105129
105104
  import { visibleWidth as visibleWidth6 } from "@earendil-works/pi-tui";
105130
105105
  var renderHeader = (header, width) => {
105131
- const theme = getMarkdownTheme8();
105132
- const selectTheme = getSelectListTheme14();
105106
+ const theme = getMarkdownTheme10();
105107
+ const selectTheme = getSelectListTheme15();
105133
105108
  const rule2 = header.focused === true ? selectTheme.selectedPrefix : theme.codeBlockBorder;
105134
105109
  const title = header.focused === true ? selectTheme.selectedText : theme.heading;
105135
105110
  const ruleCharacter = header.focused === true ? "\u2501" : "\u2500";
@@ -105160,14 +105135,24 @@ var makeCampUiSection = (options2) => {
105160
105135
  options2.children.map((child) => child.size)
105161
105136
  )
105162
105137
  ];
105138
+ const body = options2.children.flatMap((child, index) => {
105139
+ const height = childHeights[index] ?? 0;
105140
+ const lines3 = child.component.render({ width: viewport.width, height }).slice(0, height);
105141
+ return options2.centerContent === true ? lines3 : [...lines3, ...Array.from({ length: height - lines3.length }, () => "")];
105142
+ });
105143
+ if (options2.centerContent !== true) {
105144
+ return [renderHeader(options2.header(), viewport.width), ...body];
105145
+ }
105146
+ const padding = Math.max(0, Math.floor((viewport.height - body.length - 1) / 2));
105163
105147
  return [
105148
+ ...Array.from({ length: padding }, () => ""),
105164
105149
  renderHeader(options2.header(), viewport.width),
105165
- ...options2.children.flatMap((child, index) => {
105166
- const height = childHeights[index] ?? 0;
105167
- const lines3 = child.component.render({ width: viewport.width, height }).slice(0, height);
105168
- return [...lines3, ...Array.from({ length: height - lines3.length }, () => "")];
105169
- })
105170
- ];
105150
+ ...body,
105151
+ ...Array.from(
105152
+ { length: Math.max(0, viewport.height - padding - body.length - 1) },
105153
+ () => ""
105154
+ )
105155
+ ].slice(0, viewport.height);
105171
105156
  },
105172
105157
  ...inputComponents ? {
105173
105158
  handleInput: (input) => [...components].reverse().some((component) => component.handleInput?.(input) === true)
@@ -105217,25 +105202,24 @@ var decorateDefaultCampUiSections = (context8, slots) => {
105217
105202
  ]
105218
105203
  })
105219
105204
  );
105220
- decorated.set(
105221
- CampUiSlot.activity,
105222
- makeCampUiSection({
105223
- header: () => ({ title: "Activity" }),
105224
- size: defaultCampUiRightSectionSizes.activity,
105225
- children: [
105226
- {
105227
- component: component(CampUiSlot.activity),
105228
- size: { kind: CampUiSectionSizeKind.grow, weight: 1 }
105229
- }
105230
- ]
105231
- })
105232
- );
105233
105205
  const equipment = component(CampUiSlot.equipment);
105234
105206
  decorated.set(
105235
105207
  CampUiSlot.equipment,
105236
105208
  makeCampUiSection({
105237
- header: () => ({ title: "Equipment" }),
105238
- size: defaultCampUiRightSectionSizes.equipment,
105209
+ /*
105210
+ * The worker's name lives in the section header instead of being repeated
105211
+ * inside: one line saying whose grant this is beats the same name printed
105212
+ * twice within a track that is narrow to begin with.
105213
+ */
105214
+ header: () => {
105215
+ const model = context8.readModel();
105216
+ const workerId = campUiOpenedWorkerId(model.state);
105217
+ const worker = workerId === void 0 ? void 0 : findCampUiWorker(model.snapshot, workerId);
105218
+ const name = worker?.snapshot.worker.alias ?? workerId?.slice(0, 8);
105219
+ return name === void 0 ? { title: "Equipment" } : { title: "Equipment", detail: name };
105220
+ },
105221
+ centerContent: true,
105222
+ size: defaultCampUiLeftSectionSizes.workers,
105239
105223
  children: [
105240
105224
  {
105241
105225
  component: equipment,
@@ -105253,6 +105237,7 @@ var decorateDefaultCampUiSections = (context8, slots) => {
105253
105237
  detail: String(context8.readModel().snapshot.workers.length),
105254
105238
  focused: context8.readModel().state.focusedSlotId === CampUiSlot.roster
105255
105239
  }),
105240
+ centerContent: true,
105256
105241
  size: defaultCampUiLeftSectionSizes.workers,
105257
105242
  children: [
105258
105243
  {
@@ -105270,7 +105255,7 @@ import { initTheme } from "@earendil-works/pi-coding-agent";
105270
105255
  import { ProcessTerminal, TUI } from "@earendil-works/pi-tui";
105271
105256
 
105272
105257
  // packages/host-ui/src/pi/piCampUiRoot.ts
105273
- import { getMarkdownTheme as getMarkdownTheme9 } from "@earendil-works/pi-coding-agent";
105258
+ import { getMarkdownTheme as getMarkdownTheme11 } from "@earendil-works/pi-coding-agent";
105274
105259
  import { Key as Key4, matchesKey as matchesKey3 } from "@earendil-works/pi-tui";
105275
105260
 
105276
105261
  // packages/host-ui/src/pi/runtime/campUiPointerInput.ts
@@ -105399,7 +105384,7 @@ var PiCampUiRoot = class {
105399
105384
  segments.push({
105400
105385
  x: divider.x,
105401
105386
  width: 1,
105402
- text: getMarkdownTheme9().codeBlockBorder("\u2502")
105387
+ text: getMarkdownTheme11().codeBlockBorder("\u2502")
105403
105388
  });
105404
105389
  }
105405
105390
  }
@@ -105446,19 +105431,19 @@ var PiCampUiRoot = class {
105446
105431
  if (focusedSlotId !== model.state.focusedSlotId) {
105447
105432
  this.context.emit(CampUiIntents.FocusSlot({ slotId: focusedSlotId }));
105448
105433
  }
105449
- if (model.state.inventoryVisible && matchesKey3(input, Key4.escape)) {
105450
- this.context.emit(CampUiIntents.SetInventoryVisible({ visible: false }));
105451
- return;
105452
- }
105453
- if (focusedSlotId !== CampUiSlot.composer && input === "i") {
105454
- this.context.emit(CampUiIntents.SetInventoryVisible({ visible: true }));
105455
- return;
105456
- }
105457
105434
  if (this.slots.get(focusedSlotId)?.handleInput?.(input) === true) return;
105458
105435
  if (matchesKey3(input, Key4.escape)) {
105459
105436
  if (focusedSlotId === CampUiSlot.composer) {
105460
105437
  this.context.emit(CampUiIntents.FocusSlot({ slotId: CampUiSlot.transcript }));
105461
- } else if (model.state.screen === CampUiScreen.worker) {
105438
+ return;
105439
+ }
105440
+ if (model.state.openedWorkerId !== void 0) {
105441
+ this.context.emit(CampUiIntents.CloseWorker());
105442
+ this.context.emit(CampUiIntents.FocusDetailBlock({}));
105443
+ this.context.emit(CampUiIntents.FocusSlot({ slotId: CampUiSlot.roster }));
105444
+ return;
105445
+ }
105446
+ if (model.state.screen === CampUiScreen.worker) {
105462
105447
  this.context.emit(CampUiIntents.ActivateScreen({ screen: CampUiScreen.camp }));
105463
105448
  this.context.emit(CampUiIntents.FocusDetailBlock({}));
105464
105449
  this.context.emit(CampUiIntents.FocusSlot({ slotId: CampUiSlot.roster }));
@@ -105485,6 +105470,16 @@ var PiCampUiRoot = class {
105485
105470
  );
105486
105471
  return;
105487
105472
  }
105473
+ if (focusedSlotId === CampUiSlot.roster || focusedSlotId === CampUiSlot.equipment) {
105474
+ if (matchesKey3(input, Key4.left)) {
105475
+ this.context.emit(CampUiIntents.CycleSidebarTab({ delta: 1 }));
105476
+ return;
105477
+ }
105478
+ if (matchesKey3(input, Key4.right)) {
105479
+ this.context.emit(CampUiIntents.FocusSlot({ slotId: CampUiSlot.transcript }));
105480
+ return;
105481
+ }
105482
+ }
105488
105483
  if (focusedSlotId === CampUiSlot.roster) {
105489
105484
  const delta = matchesKey3(input, Key4.up) ? -1 : matchesKey3(input, Key4.down) ? 1 : void 0;
105490
105485
  if (delta !== void 0) {
@@ -105499,11 +105494,9 @@ var PiCampUiRoot = class {
105499
105494
  }
105500
105495
  if (matchesKey3(input, Key4.enter) && model.state.selectedWorkerId !== void 0) {
105501
105496
  this.context.emit(CampUiIntents.OpenWorker({ workerId: model.state.selectedWorkerId }));
105502
- this.context.emit(
105503
- CampUiIntents.FocusSlot({
105504
- slotId: this.mode === CampUiLayoutMode.wide ? CampUiSlot.composer : CampUiSlot.transcript
105505
- })
105506
- );
105497
+ if (this.mode !== CampUiLayoutMode.wide) {
105498
+ this.context.emit(CampUiIntents.FocusSlot({ slotId: CampUiSlot.transcript }));
105499
+ }
105507
105500
  return;
105508
105501
  }
105509
105502
  }
@@ -105717,22 +105710,6 @@ var mountPiCampUi = (options2) => gen2(function* () {
105717
105710
  );
105718
105711
  tui.addChild(root);
105719
105712
  tui.setFocus(root);
105720
- const inventory = slots.get(CampUiSlot.overlay);
105721
- const inventoryOverlay = inventory === void 0 ? void 0 : tui.showOverlay(
105722
- {
105723
- render: (width) => [
105724
- ...inventory.render({ width, height: Math.max(0, terminal.rows) })
105725
- ],
105726
- invalidate: () => inventory.invalidate?.()
105727
- },
105728
- {
105729
- width: "60%",
105730
- minWidth: 36,
105731
- margin: 1,
105732
- visible: () => current2.state.inventoryVisible,
105733
- nonCapturing: true
105734
- }
105735
- );
105736
105713
  yield* sync4(() => {
105737
105714
  terminal.setTitle(initial.displayName);
105738
105715
  terminal.clearScreen();
@@ -105749,9 +105726,6 @@ var mountPiCampUi = (options2) => gen2(function* () {
105749
105726
  )
105750
105727
  )
105751
105728
  );
105752
- if (inventoryOverlay !== void 0) {
105753
- yield* addFinalizer3(() => sync4(() => inventoryOverlay.hide()));
105754
- }
105755
105729
  yield* forkScoped2(
105756
105730
  gen2(function* () {
105757
105731
  for (let attempt = 0; attempt < 25; attempt += 1) {
@@ -105829,7 +105803,7 @@ var mountPiCampUi = (options2) => gen2(function* () {
105829
105803
  });
105830
105804
 
105831
105805
  // packages/host-ui/src/pi/run-selector/campRunSelector.ts
105832
- import { getMarkdownTheme as getMarkdownTheme10, getSelectListTheme as getSelectListTheme15, initTheme as initTheme2 } from "@earendil-works/pi-coding-agent";
105806
+ import { getMarkdownTheme as getMarkdownTheme12, getSelectListTheme as getSelectListTheme16, initTheme as initTheme2 } from "@earendil-works/pi-coding-agent";
105833
105807
  import {
105834
105808
  Key as Key5,
105835
105809
  matchesKey as matchesKey4,