@f5xc-salesdemos/xcsh 18.91.0 → 18.91.2

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@f5xc-salesdemos/xcsh",
4
- "version": "18.91.0",
4
+ "version": "18.91.2",
5
5
  "description": "Coding agent CLI with read, bash, edit, write tools and session management",
6
6
  "homepage": "https://github.com/f5xc-salesdemos/xcsh",
7
7
  "author": "Can Boluk",
@@ -50,12 +50,12 @@
50
50
  "dependencies": {
51
51
  "@agentclientprotocol/sdk": "0.16.1",
52
52
  "@mozilla/readability": "^0.6",
53
- "@f5xc-salesdemos/xcsh-stats": "18.91.0",
54
- "@f5xc-salesdemos/pi-agent-core": "18.91.0",
55
- "@f5xc-salesdemos/pi-ai": "18.91.0",
56
- "@f5xc-salesdemos/pi-natives": "18.91.0",
57
- "@f5xc-salesdemos/pi-tui": "18.91.0",
58
- "@f5xc-salesdemos/pi-utils": "18.91.0",
53
+ "@f5xc-salesdemos/xcsh-stats": "18.91.2",
54
+ "@f5xc-salesdemos/pi-agent-core": "18.91.2",
55
+ "@f5xc-salesdemos/pi-ai": "18.91.2",
56
+ "@f5xc-salesdemos/pi-natives": "18.91.2",
57
+ "@f5xc-salesdemos/pi-tui": "18.91.2",
58
+ "@f5xc-salesdemos/pi-utils": "18.91.2",
59
59
  "@sinclair/typebox": "^0.34",
60
60
  "@xterm/headless": "^6.0",
61
61
  "ajv": "^8.18",
@@ -939,6 +939,7 @@ export interface RegisteredCommand {
939
939
 
940
940
  export interface ServiceStatusContribution {
941
941
  name: string;
942
+ group?: string;
942
943
  check: () => Promise<{ state: "connected" | "unauthenticated" | "unavailable"; hint?: string }>;
943
944
  fix?: {
944
945
  prompt: string;
@@ -17,17 +17,17 @@ export interface BuildInfo {
17
17
  }
18
18
 
19
19
  export const BUILD_INFO: BuildInfo = {
20
- "version": "18.91.0",
21
- "commit": "27b9dd3302fa2c9bed4786f6136d8e015c2168c1",
22
- "shortCommit": "27b9dd3",
20
+ "version": "18.91.2",
21
+ "commit": "20cf55f12270d2119a0d547fb1e0218ee2cb57fe",
22
+ "shortCommit": "20cf55f",
23
23
  "branch": "main",
24
- "tag": "v18.91.0",
25
- "commitDate": "2026-06-01T20:30:58Z",
26
- "buildDate": "2026-06-01T21:06:28.583Z",
24
+ "tag": "v18.91.2",
25
+ "commitDate": "2026-06-01T22:53:18Z",
26
+ "buildDate": "2026-06-01T23:18:04.618Z",
27
27
  "dirty": true,
28
28
  "prNumber": "",
29
29
  "repoUrl": "https://github.com/f5xc-salesdemos/xcsh",
30
30
  "repoSlug": "f5xc-salesdemos/xcsh",
31
- "commitUrl": "https://github.com/f5xc-salesdemos/xcsh/commit/27b9dd3302fa2c9bed4786f6136d8e015c2168c1",
32
- "releaseUrl": "https://github.com/f5xc-salesdemos/xcsh/releases/tag/v18.91.0"
31
+ "commitUrl": "https://github.com/f5xc-salesdemos/xcsh/commit/20cf55f12270d2119a0d547fb1e0218ee2cb57fe",
32
+ "releaseUrl": "https://github.com/f5xc-salesdemos/xcsh/releases/tag/v18.91.2"
33
33
  };
@@ -184,6 +184,8 @@ export interface ServiceStatus {
184
184
  name: string;
185
185
  state: ServiceState;
186
186
  hint?: string;
187
+ _isPlugin?: boolean;
188
+ _group?: string;
187
189
  }
188
190
 
189
191
  export function mapContextStatus(status: WelcomeContextStatus): ServiceStatus {
@@ -122,15 +122,37 @@ export class WelcomeComponent implements Component {
122
122
 
123
123
  #measureStatusWidth(): number {
124
124
  const lines: string[] = [" Model Provider", ...this.#renderModelStatus()];
125
- for (const svc of this.services) {
125
+ const coreServices = this.services.filter(s => !s._isPlugin);
126
+ const pluginServices = this.services.filter(s => s._isPlugin);
127
+ for (const svc of coreServices) {
126
128
  lines.push(this.#renderServiceLine(svc));
127
129
  }
130
+ if (pluginServices.length > 0) {
131
+ const groups = this.#groupPluginServices(pluginServices);
132
+ for (const [groupName] of groups) {
133
+ lines.push(` ${groupName}`);
134
+ }
135
+ for (const svc of pluginServices) {
136
+ lines.push(this.#renderServiceLine(svc));
137
+ }
138
+ }
128
139
  if (this.#showUpdateSection()) {
129
140
  lines.push(this.#renderUpdateLine());
130
141
  }
131
142
  return Math.max(...lines.map(l => visibleWidth(l)));
132
143
  }
133
144
 
145
+ #groupPluginServices(plugins: ServiceStatus[]): Map<string, ServiceStatus[]> {
146
+ const groups = new Map<string, ServiceStatus[]>();
147
+ for (const svc of plugins) {
148
+ const groupName = svc._group ?? "Plugins";
149
+ const list = groups.get(groupName) ?? [];
150
+ list.push(svc);
151
+ groups.set(groupName, list);
152
+ }
153
+ return groups;
154
+ }
155
+
134
156
  #buildStatusLines(rightCol: number): string[] {
135
157
  const lines: string[] = [];
136
158
  const separatorWidth = Math.max(0, rightCol - 2);
@@ -139,11 +161,24 @@ export class WelcomeComponent implements Component {
139
161
  lines.push(` ${theme.bold(theme.fg("contentAccent", "Model Provider"))}`);
140
162
  lines.push(...this.#renderModelStatus());
141
163
  lines.push("");
142
- if (this.services.length > 0 || this.#showUpdateSection()) {
164
+ const coreServices = this.services.filter(s => !s._isPlugin);
165
+ const pluginServices = this.services.filter(s => s._isPlugin);
166
+ const hasContent = coreServices.length > 0 || pluginServices.length > 0 || this.#showUpdateSection();
167
+ if (hasContent) {
143
168
  lines.push(separator);
144
- for (const svc of this.services) {
169
+ for (const svc of coreServices) {
145
170
  lines.push(this.#renderServiceLine(svc));
146
171
  }
172
+ if (pluginServices.length > 0) {
173
+ const groups = this.#groupPluginServices(pluginServices);
174
+ for (const [groupName, groupServices] of groups) {
175
+ lines.push("");
176
+ lines.push(` ${theme.fg("dim", groupName)}`);
177
+ for (const svc of groupServices) {
178
+ lines.push(this.#renderServiceLine(svc));
179
+ }
180
+ }
181
+ }
147
182
  if (this.#showUpdateSection()) {
148
183
  lines.push(this.#renderUpdateLine());
149
184
  }
@@ -345,9 +345,15 @@ export class InteractiveMode implements InteractiveModeContext {
345
345
  for (const contribution of pluginContributions) {
346
346
  try {
347
347
  const status = await contribution.check();
348
- services.push({ name: contribution.name, ...status });
348
+ services.push({ name: contribution.name, ...status, _isPlugin: true, _group: contribution.group });
349
349
  } catch {
350
- services.push({ name: contribution.name, state: "unavailable", hint: "check failed" });
350
+ services.push({
351
+ name: contribution.name,
352
+ state: "unavailable",
353
+ hint: "check failed",
354
+ _isPlugin: true,
355
+ _group: contribution.group,
356
+ });
351
357
  }
352
358
  }
353
359
  }
@@ -557,6 +563,12 @@ export class InteractiveMode implements InteractiveModeContext {
557
563
  finishPendingSubmission(input: SubmittedUserInput): void {
558
564
  if (this.#pendingSubmittedInput === input) {
559
565
  this.#pendingSubmittedInput = undefined;
566
+ this.#pendingWorkingMessage = undefined;
567
+ if (this.loadingAnimation) {
568
+ this.loadingAnimation.stop();
569
+ this.loadingAnimation = undefined;
570
+ this.statusContainer.clear();
571
+ }
560
572
  }
561
573
  }
562
574
 
@@ -625,9 +625,15 @@ export async function runRpcMode(session: AgentSession): Promise<never> {
625
625
  for (const contribution of pluginContributions) {
626
626
  try {
627
627
  const status = await contribution.check();
628
- services.push({ name: contribution.name, ...status });
628
+ services.push({ name: contribution.name, ...status, _isPlugin: true, _group: contribution.group });
629
629
  } catch {
630
- services.push({ name: contribution.name, state: "unavailable", hint: "check failed" });
630
+ services.push({
631
+ name: contribution.name,
632
+ state: "unavailable",
633
+ hint: "check failed",
634
+ _isPlugin: true,
635
+ _group: contribution.group,
636
+ });
631
637
  }
632
638
  }
633
639
  }