@f5-sales-demo/xcsh 19.70.0 → 19.70.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/CHANGELOG.md
CHANGED
|
@@ -23,23 +23,23 @@
|
|
|
23
23
|
|
|
24
24
|
### Changed
|
|
25
25
|
|
|
26
|
-
- Welcome screen fully plugin-driven: removed all hardcoded cloud service stubs (`getFixableServices` empty stub, `checkProfileStatus` dead code). Only F5 XC Context remains as a built-in service. All cloud connector status checks now come exclusively from the Extension API `registerServiceStatus()`. ([#1076](https://github.com/
|
|
26
|
+
- Welcome screen fully plugin-driven: removed all hardcoded cloud service stubs (`getFixableServices` empty stub, `checkProfileStatus` dead code). Only F5 XC Context remains as a built-in service. All cloud connector status checks now come exclusively from the Extension API `registerServiceStatus()`. ([#1076](https://github.com/f5-sales-demo/xcsh/issues/1076))
|
|
27
27
|
|
|
28
28
|
## [18.90.0] - 2026-06-01
|
|
29
29
|
|
|
30
30
|
### Added
|
|
31
31
|
|
|
32
|
-
- Plugin-based welcome screen service status via `registerServiceStatus()` Extension API: plugins can now contribute service status entries and auto-fix prompts to the xcsh welcome screen. ([#1066](https://github.com/
|
|
32
|
+
- Plugin-based welcome screen service status via `registerServiceStatus()` Extension API: plugins can now contribute service status entries and auto-fix prompts to the xcsh welcome screen. ([#1066](https://github.com/f5-sales-demo/xcsh/issues/1066))
|
|
33
33
|
|
|
34
34
|
### Changed
|
|
35
35
|
|
|
36
|
-
- All cloud connector integrations extracted to marketplace plugins: GitHub (9 tools), GitLab (4 tools), Azure, AWS, Google Cloud welcome checks are now installable via `xcsh plugin install`. Only F5 XC Context remains as a built-in service. ([#1069](https://github.com/
|
|
36
|
+
- All cloud connector integrations extracted to marketplace plugins: GitHub (9 tools), GitLab (4 tools), Azure, AWS, Google Cloud welcome checks are now installable via `xcsh plugin install`. Only F5 XC Context remains as a built-in service. ([#1069](https://github.com/f5-sales-demo/xcsh/issues/1069), [#1071](https://github.com/f5-sales-demo/xcsh/issues/1071))
|
|
37
37
|
|
|
38
38
|
## [18.88.0] - 2026-05-31
|
|
39
39
|
|
|
40
40
|
### Changed
|
|
41
41
|
|
|
42
|
-
- Salesforce tools extracted to marketplace plugin: sf_setup, sf_query, sf_org_display, and sf_pipeline_report are now available as an installable plugin (`@
|
|
42
|
+
- Salesforce tools extracted to marketplace plugin: sf_setup, sf_query, sf_org_display, and sf_pipeline_report are now available as an installable plugin (`@f5-sales-demo/xcsh-salesforce`) via the Extension API instead of built-in tools. Install with `xcsh plugin install salesforce`. Context discovery, pipeline reporting, and container-adapted authentication are preserved with full feature parity. ([#1059](https://github.com/f5-sales-demo/xcsh/issues/1059))
|
|
43
43
|
|
|
44
44
|
## [18.75.0] - 2026-05-23
|
|
45
45
|
|
|
@@ -51,40 +51,40 @@
|
|
|
51
51
|
|
|
52
52
|
### Fixed
|
|
53
53
|
|
|
54
|
-
- Welcome banner cloud provider hints: AWS SSO token expiry now correctly suggests `aws sso login` instead of `aws configure`; Google Cloud check replaced `gcloud auth list` (false positives on expired tokens) with `gcloud auth print-access-token`; F5 XC Context surfaces `errorClass` (network/URL) in hints; GitLab `project_inaccessible` gets its own hint; Salesforce differentiates `session_expired` and `not_configured` hints ([#825](https://github.com/
|
|
54
|
+
- Welcome banner cloud provider hints: AWS SSO token expiry now correctly suggests `aws sso login` instead of `aws configure`; Google Cloud check replaced `gcloud auth list` (false positives on expired tokens) with `gcloud auth print-access-token`; F5 XC Context surfaces `errorClass` (network/URL) in hints; GitLab `project_inaccessible` gets its own hint; Salesforce differentiates `session_expired` and `not_configured` hints ([#825](https://github.com/f5-sales-demo/xcsh/issues/825))
|
|
55
55
|
|
|
56
56
|
## [18.64.0] - 2026-05-13
|
|
57
57
|
|
|
58
58
|
### Added
|
|
59
59
|
|
|
60
|
-
- Auto-expand namespace discovery with spec-fetch v3: first namespace-scoped GET per session triggers a concurrent batch of 42 app/security resource type paths with compact 3-field spec summaries, reducing multi-resource discovery queries from ~20 sequential API calls to 1 ([#808](https://github.com/
|
|
61
|
-
- `paths[]` batch parameter on `xcsh_api` tool for explicit multi-path queries ([#808](https://github.com/
|
|
60
|
+
- Auto-expand namespace discovery with spec-fetch v3: first namespace-scoped GET per session triggers a concurrent batch of 42 app/security resource type paths with compact 3-field spec summaries, reducing multi-resource discovery queries from ~20 sequential API calls to 1 ([#808](https://github.com/f5-sales-demo/xcsh/pull/808))
|
|
61
|
+
- `paths[]` batch parameter on `xcsh_api` tool for explicit multi-path queries ([#808](https://github.com/f5-sales-demo/xcsh/pull/808))
|
|
62
62
|
|
|
63
63
|
## [18.58.1] - 2026-05-10
|
|
64
64
|
|
|
65
65
|
### Changed
|
|
66
66
|
|
|
67
|
-
- Regenerated API spec index from catalog v2.1.82: http_loadbalancer CRUD verification corrections (6 new server defaults, corrected minimum configs, cross-field dependencies, default_pool inline pool discovery, 5 composable routing approaches) and tcp_loadbalancer minimum config corrections (listen_port, origin_pools_weights, do_not_advertise format, 9 server defaults, forced hash_policy default) ([#753](https://github.com/
|
|
67
|
+
- Regenerated API spec index from catalog v2.1.82: http_loadbalancer CRUD verification corrections (6 new server defaults, corrected minimum configs, cross-field dependencies, default_pool inline pool discovery, 5 composable routing approaches) and tcp_loadbalancer minimum config corrections (listen_port, origin_pools_weights, do_not_advertise format, 9 server defaults, forced hash_policy default) ([#753](https://github.com/f5-sales-demo/xcsh/issues/753), [#757](https://github.com/f5-sales-demo/xcsh/issues/757))
|
|
68
68
|
|
|
69
69
|
## [18.53.0] - 2026-05-09
|
|
70
70
|
|
|
71
71
|
### Changed
|
|
72
72
|
|
|
73
|
-
- Autoresearch subsystem code quality: -513 lines (18.8% reduction), ~13% faster type checking. Un-exported internal symbols, relocated types, consolidated duplicate patterns, replaced manual deep copies with `structuredClone`, replaced `while(exec)` with `matchAll`, compressed control flow, extracted shared interfaces ([#734](https://github.com/
|
|
73
|
+
- Autoresearch subsystem code quality: -513 lines (18.8% reduction), ~13% faster type checking. Un-exported internal symbols, relocated types, consolidated duplicate patterns, replaced manual deep copies with `structuredClone`, replaced `while(exec)` with `matchAll`, compressed control flow, extracted shared interfaces ([#734](https://github.com/f5-sales-demo/xcsh/pull/734))
|
|
74
74
|
|
|
75
75
|
## [18.53.0] - 2026-05-09
|
|
76
76
|
|
|
77
77
|
### Fixed
|
|
78
78
|
|
|
79
|
-
- Replaced `xcsh --version` recommendation in `renderAboutDoc()` with authoritative intrinsic version guidance — the previous guidance misdirected to the installed binary, not the running session ([#722](https://github.com/
|
|
80
|
-
- System prompt `xcsh://about` entry now routes version questions to the workstation header (zero tool calls) and reserves `xcsh://about` for deeper identity ([#722](https://github.com/
|
|
79
|
+
- Replaced `xcsh --version` recommendation in `renderAboutDoc()` with authoritative intrinsic version guidance — the previous guidance misdirected to the installed binary, not the running session ([#722](https://github.com/f5-sales-demo/xcsh/pull/722))
|
|
80
|
+
- System prompt `xcsh://about` entry now routes version questions to the workstation header (zero tool calls) and reserves `xcsh://about` for deeper identity ([#722](https://github.com/f5-sales-demo/xcsh/pull/722))
|
|
81
81
|
|
|
82
82
|
### Added
|
|
83
83
|
|
|
84
|
-
- SE specialization block in `renderAboutDoc()` capabilities section: F5 XC API, Salesforce pipeline, user/computer profiling, SE-specific subagents ([#722](https://github.com/
|
|
85
|
-
- SE capability skills: account-planning, competitive, meeting-prep, roi-calculator, validation-plan ([#715](https://github.com/
|
|
86
|
-
- MEDDPICC qualification and competitive positioning sections in system prompt ([#715](https://github.com/
|
|
87
|
-
- Version self-awareness and capabilities completeness regression tests ([#722](https://github.com/
|
|
84
|
+
- SE specialization block in `renderAboutDoc()` capabilities section: F5 XC API, Salesforce pipeline, user/computer profiling, SE-specific subagents ([#722](https://github.com/f5-sales-demo/xcsh/pull/722))
|
|
85
|
+
- SE capability skills: account-planning, competitive, meeting-prep, roi-calculator, validation-plan ([#715](https://github.com/f5-sales-demo/xcsh/pull/715))
|
|
86
|
+
- MEDDPICC qualification and competitive positioning sections in system prompt ([#715](https://github.com/f5-sales-demo/xcsh/pull/715))
|
|
87
|
+
- Version self-awareness and capabilities completeness regression tests ([#722](https://github.com/f5-sales-demo/xcsh/pull/722))
|
|
88
88
|
|
|
89
89
|
## [18.40.0] - 2026-05-05
|
|
90
90
|
|
|
@@ -118,22 +118,22 @@
|
|
|
118
118
|
|
|
119
119
|
### Added
|
|
120
120
|
|
|
121
|
-
- `/context <name>` direct switch -- type a context name as a positional argument to switch without the `activate` verb, following `kubectx <name>` convention. ([#380](https://github.com/
|
|
122
|
-
- `/context -` previous context switching -- switch back to the last active context, following the `cd -` / `kubectx -` convention. Session-scoped, in-memory only. Calling `/context -` twice returns to the original context. ([#380](https://github.com/
|
|
123
|
-
- Mixed tab completion for `/context <Tab>` -- shows context names first, then `-` (when a previous context exists), then subcommand names. Context names display tenant URL hints. ([#380](https://github.com/
|
|
124
|
-
- Reserved subcommand name guard -- prevents creating, renaming, or importing contexts with names that collide with `/context` subcommands (19 reserved names including `list`, `create`, `delete`, `help`). Case-insensitive. ([#378](https://github.com/
|
|
125
|
-
- Previous context tracking in `ContextService` -- `previousContextName` getter, `activatePrevious()` method, automatic pointer maintenance on delete (cleared) and rename (updated). ([#379](https://github.com/
|
|
121
|
+
- `/context <name>` direct switch -- type a context name as a positional argument to switch without the `activate` verb, following `kubectx <name>` convention. ([#380](https://github.com/f5-sales-demo/xcsh/issues/380))
|
|
122
|
+
- `/context -` previous context switching -- switch back to the last active context, following the `cd -` / `kubectx -` convention. Session-scoped, in-memory only. Calling `/context -` twice returns to the original context. ([#380](https://github.com/f5-sales-demo/xcsh/issues/380))
|
|
123
|
+
- Mixed tab completion for `/context <Tab>` -- shows context names first, then `-` (when a previous context exists), then subcommand names. Context names display tenant URL hints. ([#380](https://github.com/f5-sales-demo/xcsh/issues/380))
|
|
124
|
+
- Reserved subcommand name guard -- prevents creating, renaming, or importing contexts with names that collide with `/context` subcommands (19 reserved names including `list`, `create`, `delete`, `help`). Case-insensitive. ([#378](https://github.com/f5-sales-demo/xcsh/issues/378))
|
|
125
|
+
- Previous context tracking in `ContextService` -- `previousContextName` getter, `activatePrevious()` method, automatic pointer maintenance on delete (cleared) and rename (updated). ([#379](https://github.com/f5-sales-demo/xcsh/issues/379))
|
|
126
126
|
|
|
127
127
|
## [18.18.4] - 2026-04-26
|
|
128
128
|
|
|
129
129
|
### Fixed
|
|
130
130
|
|
|
131
|
-
- Fixed gutter width propagation in the fallback tool renderer: `#formatToolExecution()` now receives the actual available width at render-time and uses it for line truncation instead of a hardcoded 80-column limit. On narrow terminals (<82 cols) this prevents content wider than the gutter-adjusted viewport; on wide terminals it allows longer output lines. ([#117](https://github.com/
|
|
132
|
-
- Fixed `resolveConfigValue` returning literal env var names (e.g. `"LITELLM_API_KEY"`) as API keys when the env var is unset, causing 401 errors on first launch. The resolver now rejects unresolved `ALL_CAPS_WITH_UNDERSCORES` patterns, matching the existing guard in `resolveYamlApiKeyConfig`. ([#241](https://github.com/
|
|
131
|
+
- Fixed gutter width propagation in the fallback tool renderer: `#formatToolExecution()` now receives the actual available width at render-time and uses it for line truncation instead of a hardcoded 80-column limit. On narrow terminals (<82 cols) this prevents content wider than the gutter-adjusted viewport; on wide terminals it allows longer output lines. ([#117](https://github.com/f5-sales-demo/xcsh/issues/117))
|
|
132
|
+
- Fixed `resolveConfigValue` returning literal env var names (e.g. `"LITELLM_API_KEY"`) as API keys when the env var is unset, causing 401 errors on first launch. The resolver now rejects unresolved `ALL_CAPS_WITH_UNDERSCORES` patterns, matching the existing guard in `resolveYamlApiKeyConfig`. ([#241](https://github.com/f5-sales-demo/xcsh/issues/241))
|
|
133
133
|
|
|
134
134
|
### Changed
|
|
135
135
|
|
|
136
|
-
- Renamed F5 XC credential system from "profile" to "context" to align with kubectl conventions. The `/profile` command is now `/context`, all types/classes use `Context*` naming (`ContextService`, `ContextStatus`, `F5XCContext`, etc.), on-disk paths changed from `profiles/` to `contexts/` and `active_profile` to `active_context`, and the status-line segment ID is now `context_f5xc`. ([#302](https://github.com/
|
|
136
|
+
- Renamed F5 XC credential system from "profile" to "context" to align with kubectl conventions. The `/profile` command is now `/context`, all types/classes use `Context*` naming (`ContextService`, `ContextStatus`, `F5XCContext`, etc.), on-disk paths changed from `profiles/` to `contexts/` and `active_profile` to `active_context`, and the status-line segment ID is now `context_f5xc`. ([#302](https://github.com/f5-sales-demo/xcsh/issues/302))
|
|
137
137
|
|
|
138
138
|
## [18.12.0] - 2026-04-23
|
|
139
139
|
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
3
|
"name": "@f5-sales-demo/xcsh",
|
|
4
|
-
"version": "19.70.
|
|
4
|
+
"version": "19.70.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.70.
|
|
60
|
-
"@f5-sales-demo/pi-agent-core": "19.70.
|
|
61
|
-
"@f5-sales-demo/pi-ai": "19.70.
|
|
62
|
-
"@f5-sales-demo/pi-natives": "19.70.
|
|
63
|
-
"@f5-sales-demo/pi-resource-management": "19.70.
|
|
64
|
-
"@f5-sales-demo/pi-tui": "19.70.
|
|
65
|
-
"@f5-sales-demo/pi-utils": "19.70.
|
|
59
|
+
"@f5-sales-demo/xcsh-stats": "19.70.2",
|
|
60
|
+
"@f5-sales-demo/pi-agent-core": "19.70.2",
|
|
61
|
+
"@f5-sales-demo/pi-ai": "19.70.2",
|
|
62
|
+
"@f5-sales-demo/pi-natives": "19.70.2",
|
|
63
|
+
"@f5-sales-demo/pi-resource-management": "19.70.2",
|
|
64
|
+
"@f5-sales-demo/pi-tui": "19.70.2",
|
|
65
|
+
"@f5-sales-demo/pi-utils": "19.70.2",
|
|
66
66
|
"@sinclair/typebox": "^0.34",
|
|
67
67
|
"@xterm/headless": "^6.0",
|
|
68
68
|
"ajv": "^8.20",
|
|
@@ -1371,12 +1371,11 @@ export const SETTINGS_SCHEMA = {
|
|
|
1371
1371
|
|
|
1372
1372
|
"web_search.enabled": {
|
|
1373
1373
|
type: "boolean",
|
|
1374
|
-
default:
|
|
1374
|
+
default: true,
|
|
1375
1375
|
ui: {
|
|
1376
1376
|
tab: "tools",
|
|
1377
1377
|
label: "Web Search",
|
|
1378
|
-
description:
|
|
1379
|
-
"Enable the web_search tool for web searching (disabled by default to prevent accidental PII exposure via prompt injection)",
|
|
1378
|
+
description: "Enable the web_search tool for web searching.",
|
|
1380
1379
|
},
|
|
1381
1380
|
},
|
|
1382
1381
|
"web_search.verbose": {
|
|
@@ -17,17 +17,17 @@ export interface BuildInfo {
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
export const BUILD_INFO: BuildInfo = {
|
|
20
|
-
"version": "19.70.
|
|
21
|
-
"commit": "
|
|
22
|
-
"shortCommit": "
|
|
20
|
+
"version": "19.70.2",
|
|
21
|
+
"commit": "05387057f93d75a54a49918fd0a62f29047ecf16",
|
|
22
|
+
"shortCommit": "0538705",
|
|
23
23
|
"branch": "main",
|
|
24
|
-
"tag": "v19.70.
|
|
25
|
-
"commitDate": "2026-07-
|
|
26
|
-
"buildDate": "2026-07-
|
|
24
|
+
"tag": "v19.70.2",
|
|
25
|
+
"commitDate": "2026-07-22T00:53:13Z",
|
|
26
|
+
"buildDate": "2026-07-22T01:20:48.788Z",
|
|
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.70.
|
|
31
|
+
"commitUrl": "https://github.com/f5-sales-demo/xcsh/commit/05387057f93d75a54a49918fd0a62f29047ecf16",
|
|
32
|
+
"releaseUrl": "https://github.com/f5-sales-demo/xcsh/releases/tag/v19.70.2"
|
|
33
33
|
};
|
package/src/task/executor.ts
CHANGED
|
@@ -1030,6 +1030,31 @@ export async function runSubprocess(options: ExecutorOptions): Promise<SingleRes
|
|
|
1030
1030
|
await session.setActiveToolsByName(filteredSubagentTools);
|
|
1031
1031
|
}
|
|
1032
1032
|
|
|
1033
|
+
// Surface tools the agent declared but that are unavailable this session,
|
|
1034
|
+
// so the model can report the blocker instead of silently stalling.
|
|
1035
|
+
const declaredTools = agent.tools ?? [];
|
|
1036
|
+
let unavailableToolsNotice = "";
|
|
1037
|
+
if (declaredTools.length > 0) {
|
|
1038
|
+
const activeToolSet = new Set(session.getActiveToolNames());
|
|
1039
|
+
const execSatisfied = activeToolSet.has("python") || activeToolSet.has("bash");
|
|
1040
|
+
const managedToolNames = new Set(["submit_result", "todo_write", "resolve", "task"]);
|
|
1041
|
+
const isSafeToolName = (name: string) => /^[a-zA-Z0-9_-]+$/.test(name);
|
|
1042
|
+
const unavailableTools = declaredTools.filter(name => {
|
|
1043
|
+
if (activeToolSet.has(name)) return false;
|
|
1044
|
+
if (managedToolNames.has(name)) return false;
|
|
1045
|
+
if (!isSafeToolName(name)) return false;
|
|
1046
|
+
if (name === "exec") return !execSatisfied;
|
|
1047
|
+
return true;
|
|
1048
|
+
});
|
|
1049
|
+
if (unavailableTools.length > 0) {
|
|
1050
|
+
unavailableToolsNotice =
|
|
1051
|
+
"<system-reminder>\n" +
|
|
1052
|
+
`These tools you may expect are unavailable in this session: ${unavailableTools.join(", ")}. ` +
|
|
1053
|
+
"Do not attempt to use them. If a capability you need is missing, call submit_result with result.error describing the blocker.\n" +
|
|
1054
|
+
"</system-reminder>\n\n";
|
|
1055
|
+
}
|
|
1056
|
+
}
|
|
1057
|
+
|
|
1033
1058
|
session.sessionManager.appendSessionInit({
|
|
1034
1059
|
systemPrompt: session.agent.state.systemPrompt,
|
|
1035
1060
|
task,
|
|
@@ -1126,7 +1151,7 @@ export async function runSubprocess(options: ExecutorOptions): Promise<SingleRes
|
|
|
1126
1151
|
}
|
|
1127
1152
|
});
|
|
1128
1153
|
|
|
1129
|
-
await session.prompt(task
|
|
1154
|
+
await session.prompt(`${unavailableToolsNotice}${task}`, { attribution: "agent" });
|
|
1130
1155
|
await session.waitForIdle();
|
|
1131
1156
|
|
|
1132
1157
|
const reminderToolChoice = buildNamedToolChoice("submit_result", session.model);
|