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.
- package/dist/{chunk-DPNPQG2D.js → chunk-7OL53RZ7.js} +35 -17
- package/dist/{chunk-PIHJTCPQ.js → chunk-BZPGK4ZH.js} +10 -10
- package/dist/{chunk-GYYNOMA5.js → chunk-ECYZGNL3.js} +4 -4
- package/dist/{chunk-QY7U7U2K.js → chunk-G3ITCVKS.js} +3 -3
- package/dist/{chunk-TUCFONJW.js → chunk-HOYW7OPN.js} +1 -1
- package/dist/{chunk-6KCQ6O4T.js → chunk-HRCEXDLT.js} +2 -2
- package/dist/{chunk-K7LA4DNU.js → chunk-J77LDB4Q.js} +325 -365
- package/dist/{chunk-PCOWK5BR.js → chunk-MJZ7FPJI.js} +4 -4
- package/dist/{chunk-U2FODXMR.js → chunk-QDMSPX34.js} +1 -2
- package/dist/{chunk-IPF3C3B2.js → chunk-QO2YENTD.js} +5 -5
- package/dist/priiisk-host.js +347 -373
- package/dist/priiisk.js +2 -2
- package/package.json +13 -13
- /package/dist/{chunk-DPNPQG2D.js.LEGAL.txt → chunk-7OL53RZ7.js.LEGAL.txt} +0 -0
- /package/dist/{chunk-IPF3C3B2.js.LEGAL.txt → chunk-QO2YENTD.js.LEGAL.txt} +0 -0
package/dist/priiisk-host.js
CHANGED
|
@@ -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
|
|
81159
|
-
|
|
81160
|
-
|
|
81161
|
-
|
|
81162
|
-
|
|
81163
|
-
|
|
81164
|
-
|
|
81165
|
-
|
|
81166
|
-
|
|
81167
|
-
|
|
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
|
-
|
|
81176
|
-
|
|
81177
|
-
|
|
81178
|
-
|
|
81179
|
-
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
102766
|
-
|
|
102767
|
-
|
|
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
|
-
|
|
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:
|
|
103077
|
-
rightMinimumWidth:
|
|
103078
|
-
leftTrackWidthThreshold:
|
|
103079
|
-
rightTrackWidthThreshold:
|
|
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
|
|
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
|
|
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
|
-
|
|
103328
|
-
|
|
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.
|
|
103331
|
-
|
|
103332
|
-
bodyY
|
|
103333
|
-
|
|
103334
|
-
|
|
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.
|
|
103338
|
-
|
|
103339
|
-
bodyY +
|
|
103340
|
-
|
|
103341
|
-
|
|
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
|
-
*
|
|
103347
|
-
*
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
104591
|
-
import { truncateToWidth as truncateToWidth4, visibleWidth as
|
|
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 =
|
|
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(
|
|
104699
|
-
const left3 = Math.min(
|
|
104700
|
-
return { left: left3, pulse: Math.max(0, width - left3 - 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 -
|
|
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
|
|
104733
|
-
|
|
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
|
|
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
|
-
|
|
104745
|
-
return 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)}
|
|
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,
|
|
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
|
|
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 [
|
|
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
|
-
|
|
104713
|
+
const card = renderWorkerCard(
|
|
104828
104714
|
entry,
|
|
104829
104715
|
model.state.selectedWorkerId,
|
|
104830
|
-
model.state
|
|
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
|
|
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 =
|
|
104857
|
-
const workerId = model.state
|
|
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
|
|
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 =
|
|
104883
|
-
return
|
|
104884
|
-
|
|
104885
|
-
|
|
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 =
|
|
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
|
|
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(
|
|
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
|
|
104932
|
-
import { sliceByColumn
|
|
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
|
|
104945
|
-
|
|
104946
|
-
|
|
104947
|
-
|
|
104948
|
-
|
|
104949
|
-
|
|
104950
|
-
const
|
|
104951
|
-
|
|
104952
|
-
|
|
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
|
|
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 (
|
|
104854
|
+
if (visibleWidth4(value5) <= available) return value5;
|
|
104962
104855
|
if (available === 1) return "\u2026";
|
|
104963
104856
|
const kept = available - 1;
|
|
104964
|
-
return `\u2026${
|
|
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 =
|
|
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: [
|
|
104982
|
-
{ right: [
|
|
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 =
|
|
104989
|
-
const room = viewport.width - rightWidth - 3 -
|
|
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 -
|
|
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 -
|
|
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
|
|
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 =
|
|
105044
|
-
const mcpTone = failedMcp ? CampUiTone.error : pendingMcp || partialMcp || missingMcpHealth ? CampUiTone.attention :
|
|
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" :
|
|
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
|
|
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 =
|
|
105132
|
-
const selectTheme =
|
|
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
|
-
...
|
|
105166
|
-
|
|
105167
|
-
|
|
105168
|
-
|
|
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
|
-
|
|
105238
|
-
|
|
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
|
|
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:
|
|
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
|
-
|
|
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.
|
|
105503
|
-
CampUiIntents.FocusSlot({
|
|
105504
|
-
|
|
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
|
|
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,
|