@f5-sales-demo/xcsh 19.64.0 → 19.64.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 +8 -8
- package/src/browser/capabilities.generated.ts +1 -0
- package/src/browser/capabilities.json +1 -0
- package/src/browser/chat-conformance.json +17 -0
- package/src/browser/chat-handler.ts +17 -7
- package/src/browser/chat-protocol.ts +8 -0
- package/src/internal-urls/build-info.generated.ts +8 -8
- package/src/internal-urls/console-catalog.generated.ts +2 -2
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
3
|
"name": "@f5-sales-demo/xcsh",
|
|
4
|
-
"version": "19.64.
|
|
4
|
+
"version": "19.64.2",
|
|
5
5
|
"description": "Coding agent CLI with read, bash, edit, write tools and session management",
|
|
6
6
|
"homepage": "https://github.com/f5-sales-demo/xcsh",
|
|
7
7
|
"author": "Can Boluk",
|
|
@@ -56,13 +56,13 @@
|
|
|
56
56
|
"dependencies": {
|
|
57
57
|
"@agentclientprotocol/sdk": "0.16.1",
|
|
58
58
|
"@mozilla/readability": "^0.6",
|
|
59
|
-
"@f5-sales-demo/xcsh-stats": "19.64.
|
|
60
|
-
"@f5-sales-demo/pi-agent-core": "19.64.
|
|
61
|
-
"@f5-sales-demo/pi-ai": "19.64.
|
|
62
|
-
"@f5-sales-demo/pi-natives": "19.64.
|
|
63
|
-
"@f5-sales-demo/pi-resource-management": "19.64.
|
|
64
|
-
"@f5-sales-demo/pi-tui": "19.64.
|
|
65
|
-
"@f5-sales-demo/pi-utils": "19.64.
|
|
59
|
+
"@f5-sales-demo/xcsh-stats": "19.64.2",
|
|
60
|
+
"@f5-sales-demo/pi-agent-core": "19.64.2",
|
|
61
|
+
"@f5-sales-demo/pi-ai": "19.64.2",
|
|
62
|
+
"@f5-sales-demo/pi-natives": "19.64.2",
|
|
63
|
+
"@f5-sales-demo/pi-resource-management": "19.64.2",
|
|
64
|
+
"@f5-sales-demo/pi-tui": "19.64.2",
|
|
65
|
+
"@f5-sales-demo/pi-utils": "19.64.2",
|
|
66
66
|
"@sinclair/typebox": "^0.34",
|
|
67
67
|
"@xterm/headless": "^6.0",
|
|
68
68
|
"ajv": "^8.20",
|
|
@@ -343,6 +343,19 @@
|
|
|
343
343
|
}
|
|
344
344
|
}
|
|
345
345
|
},
|
|
346
|
+
"set_host_tools_error": {
|
|
347
|
+
"type": "object",
|
|
348
|
+
"required": ["type", "error"],
|
|
349
|
+
"properties": {
|
|
350
|
+
"type": {
|
|
351
|
+
"const": "set_host_tools_error",
|
|
352
|
+
"type": "string"
|
|
353
|
+
},
|
|
354
|
+
"error": {
|
|
355
|
+
"type": "string"
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
},
|
|
346
359
|
"host_tool_call": {
|
|
347
360
|
"type": "object",
|
|
348
361
|
"required": ["type", "id", "toolCallId", "toolName", "arguments"],
|
|
@@ -696,6 +709,10 @@
|
|
|
696
709
|
"type": "set_host_tools_ack",
|
|
697
710
|
"toolNames": ["office_read_range"]
|
|
698
711
|
},
|
|
712
|
+
"set_host_tools_error": {
|
|
713
|
+
"type": "set_host_tools_error",
|
|
714
|
+
"error": "Host tool \"office_read_range\" must provide a non-empty description"
|
|
715
|
+
},
|
|
699
716
|
"host_tool_call": {
|
|
700
717
|
"type": "host_tool_call",
|
|
701
718
|
"id": "7295551234567890",
|
|
@@ -23,6 +23,7 @@ import {
|
|
|
23
23
|
type PageContextSnapshot,
|
|
24
24
|
type SetHostTools,
|
|
25
25
|
type SetHostToolsAck,
|
|
26
|
+
type SetHostToolsError,
|
|
26
27
|
} from "./chat-protocol";
|
|
27
28
|
import { CONSOLE_ROUTES } from "./console-routes.generated";
|
|
28
29
|
import type { BridgeServer } from "./extension-bridge";
|
|
@@ -268,13 +269,22 @@ export class ChatHandler {
|
|
|
268
269
|
* await registration before its first prompt. Mirrors the stdio `set_host_tools`
|
|
269
270
|
* command handler (rpc-mode.ts): normalize → bridge.setTools → refreshRpcHostTools. */
|
|
270
271
|
async #handleSetHostTools(msg: SetHostTools): Promise<void> {
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
272
|
+
try {
|
|
273
|
+
const tools = normalizeHostToolDefinitions(msg.tools);
|
|
274
|
+
const rpcTools = this.#hostToolBridge.setTools(tools);
|
|
275
|
+
await this.#session.refreshRpcHostTools(rpcTools);
|
|
276
|
+
this.#server.send({
|
|
277
|
+
type: "set_host_tools_ack",
|
|
278
|
+
toolNames: tools.map(tool => tool.name),
|
|
279
|
+
} satisfies SetHostToolsAck);
|
|
280
|
+
} catch (err) {
|
|
281
|
+
// Nack instead of throwing (stdio parity — rpc-mode nacks): a client
|
|
282
|
+
// awaiting set_host_tools_ack would otherwise hang on malformed input.
|
|
283
|
+
this.#server.send({
|
|
284
|
+
type: "set_host_tools_error",
|
|
285
|
+
error: err instanceof Error ? err.message : String(err),
|
|
286
|
+
} satisfies SetHostToolsError);
|
|
287
|
+
}
|
|
278
288
|
}
|
|
279
289
|
|
|
280
290
|
#handleChatStop(stop: { id: string }): void {
|
|
@@ -168,6 +168,14 @@ export interface SetHostToolsAck {
|
|
|
168
168
|
toolNames: string[];
|
|
169
169
|
}
|
|
170
170
|
|
|
171
|
+
/** Outbound: nacks a `set_host_tools` registration that failed to normalize (bad
|
|
172
|
+
* definition, name conflict). Emitted instead of the ack so a client awaiting
|
|
173
|
+
* registration gets a clear error rather than hanging (stdio-parity nack). */
|
|
174
|
+
export interface SetHostToolsError {
|
|
175
|
+
type: "set_host_tools_error";
|
|
176
|
+
error: string;
|
|
177
|
+
}
|
|
178
|
+
|
|
171
179
|
// ---------------------------------------------------------------------------
|
|
172
180
|
// Validators
|
|
173
181
|
// ---------------------------------------------------------------------------
|
|
@@ -17,17 +17,17 @@ export interface BuildInfo {
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
export const BUILD_INFO: BuildInfo = {
|
|
20
|
-
"version": "19.64.
|
|
21
|
-
"commit": "
|
|
22
|
-
"shortCommit": "
|
|
20
|
+
"version": "19.64.2",
|
|
21
|
+
"commit": "2f997ccc03d56bf0345a7cb56fefb94414ff3d8b",
|
|
22
|
+
"shortCommit": "2f997cc",
|
|
23
23
|
"branch": "main",
|
|
24
|
-
"tag": "v19.64.
|
|
25
|
-
"commitDate": "2026-07-
|
|
26
|
-
"buildDate": "2026-07-
|
|
24
|
+
"tag": "v19.64.2",
|
|
25
|
+
"commitDate": "2026-07-20T14:05:44Z",
|
|
26
|
+
"buildDate": "2026-07-20T14:31:59.136Z",
|
|
27
27
|
"dirty": true,
|
|
28
28
|
"prNumber": "",
|
|
29
29
|
"repoUrl": "https://github.com/f5-sales-demo/xcsh",
|
|
30
30
|
"repoSlug": "f5-sales-demo/xcsh",
|
|
31
|
-
"commitUrl": "https://github.com/f5-sales-demo/xcsh/commit/
|
|
32
|
-
"releaseUrl": "https://github.com/f5-sales-demo/xcsh/releases/tag/v19.64.
|
|
31
|
+
"commitUrl": "https://github.com/f5-sales-demo/xcsh/commit/2f997ccc03d56bf0345a7cb56fefb94414ff3d8b",
|
|
32
|
+
"releaseUrl": "https://github.com/f5-sales-demo/xcsh/releases/tag/v19.64.2"
|
|
33
33
|
};
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
import type { ConsoleCatalogData } from "./console-catalog-types";
|
|
4
4
|
|
|
5
|
-
export const CONSOLE_CATALOG_VERSION = "
|
|
5
|
+
export const CONSOLE_CATALOG_VERSION = "93e9666ce6cd4d91c8db96c60e94e8f093faeadd";
|
|
6
6
|
|
|
7
7
|
export const CONSOLE_CATALOG_DATA: ConsoleCatalogData = {
|
|
8
|
-
version: "
|
|
8
|
+
version: "93e9666ce6cd4d91c8db96c60e94e8f093faeadd",
|
|
9
9
|
workflows: {
|
|
10
10
|
"address-allocator/create":
|
|
11
11
|
'schema: urn:xcsh:console:workflow:v1\nid: address-allocator-create\nlabel: Create IP Address Allocators\nresource: address-allocator\noperation: create\npreconditions:\n - user_logged_in\n - namespace_selected\n - "role_minimum: admin"\nparams:\n namespace:\n required: true\n description: Target namespace\n example: demo\n name:\n required: true\n description: IP Address Allocators name (lowercase alphanumeric and hyphens)\n example: example-address-allocator\n address_allocator_mode:\n required: true\n description: Address Allocator Mode\n allocation_unit:\n required: false\n description: Allocation Unit\n default: 0\n address_pool:\n required: false\n description: Address Pool\n default: value\n address_allocation_scheme:\n required: false\n description: "Server-required: Field should be not nil"\n default: value\nsteps:\n - id: navigate-to-list\n action: navigate\n url: /web/workspaces/multi-cloud-network-connect/manage/networking/legacy_network_configuration/address_allocators\n wait_for: text(\'IP Address Allocators\')\n description: Navigate to IP Address Allocators list page\n - id: click-add-tab\n action: click\n selector: text(\'Add IP Address Allocator\')\n wait_for: textbox[name=\'Name\']\n description: Click Add IP Address Allocator to open the create form\n - id: fill-name\n action: fill\n selector: textbox[name=\'Name\']\n value: "{name}"\n description: Enter Name\n - id: select-address_allocator_mode\n action: select\n selector: listbox\n context: Address Allocator Mode section\n value: "{address_allocator_mode}"\n description: Select Address Allocator Mode\n - id: fill-allocation_unit\n action: fill\n selector: spinbutton[name=\'Allocation Unit\']\n value: "{allocation_unit}"\n description: Set Allocation Unit\n - id: fill-address_pool\n action: fill\n selector: ngx-datatable input.form-control\n context: Address Pool table\n value: "{address_pool}"\n description: Enter Address Pool in the existing table row (no Add Item needed — the table ships one empty row)\n - id: select-address_allocation_scheme\n action: select\n selector: listbox\n context: Address Allocation Scheme section\n value: "{address_allocation_scheme}"\n description: Select Address Allocation Scheme\n - id: save\n action: click\n selector: "[class*=\'save-bt\'],[class*=\'submit-button\']"\n context: footer\n wait_for: text(\'{name}\')\n wait_timeout_ms: 30000\n description: Save/submit the form (union selector matches save-bt OR submit-button)\npostconditions:\n - resource_list_page_visible\n - "resource_name_in_list: {name}"\nmetadata:\n confidence: inferred\n discovered_at: 2026-06-24\n console_version: "2025.06"\n notes: Auto-generated by scripts/generate-workflows.ts from api-specs-enriched field metadata.\n',
|