@f5xc-salesdemos/xcsh 19.19.1 → 19.19.3
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": "19.19.
|
|
4
|
+
"version": "19.19.3",
|
|
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": "19.19.
|
|
54
|
-
"@f5xc-salesdemos/pi-agent-core": "19.19.
|
|
55
|
-
"@f5xc-salesdemos/pi-ai": "19.19.
|
|
56
|
-
"@f5xc-salesdemos/pi-natives": "19.19.
|
|
57
|
-
"@f5xc-salesdemos/pi-tui": "19.19.
|
|
58
|
-
"@f5xc-salesdemos/pi-utils": "19.19.
|
|
53
|
+
"@f5xc-salesdemos/xcsh-stats": "19.19.3",
|
|
54
|
+
"@f5xc-salesdemos/pi-agent-core": "19.19.3",
|
|
55
|
+
"@f5xc-salesdemos/pi-ai": "19.19.3",
|
|
56
|
+
"@f5xc-salesdemos/pi-natives": "19.19.3",
|
|
57
|
+
"@f5xc-salesdemos/pi-tui": "19.19.3",
|
|
58
|
+
"@f5xc-salesdemos/pi-utils": "19.19.3",
|
|
59
59
|
"@sinclair/typebox": "^0.34",
|
|
60
60
|
"@xterm/headless": "^6.0",
|
|
61
61
|
"ajv": "^8.20",
|
|
@@ -12,7 +12,7 @@ import type { TSchema } from "@sinclair/typebox";
|
|
|
12
12
|
import * as TypeBox from "@sinclair/typebox";
|
|
13
13
|
import { type ExtensionModule, extensionModuleCapability } from "../../capability/extension-module";
|
|
14
14
|
import { loadCapability } from "../../discovery";
|
|
15
|
-
import { getExtensionNameFromPath } from "../../discovery/helpers";
|
|
15
|
+
import { getExtensionNameFromPath, getPreloadedPluginRoots } from "../../discovery/helpers";
|
|
16
16
|
import type { ExecOptions } from "../../exec/exec";
|
|
17
17
|
import { execCommand } from "../../exec/exec";
|
|
18
18
|
import { PROFILE_COLLECTORS, type ProfileCollector } from "../../internal-urls/profile-collectors";
|
|
@@ -515,9 +515,31 @@ export async function discoverAndLoadExtensions(
|
|
|
515
515
|
addPath(ext.path);
|
|
516
516
|
}
|
|
517
517
|
|
|
518
|
-
// 2. Discover extension entry points from installed plugins
|
|
518
|
+
// 2. Discover extension entry points from installed plugins (node_modules path)
|
|
519
519
|
addPaths(await getAllPluginExtensionPaths(cwd));
|
|
520
520
|
|
|
521
|
+
// 2b. Discover extension entry points from marketplace-cached plugins
|
|
522
|
+
for (const root of getPreloadedPluginRoots()) {
|
|
523
|
+
try {
|
|
524
|
+
const pkgPath = path.join(root.path, "package.json");
|
|
525
|
+
const pkg = await Bun.file(pkgPath).json();
|
|
526
|
+
const manifest = pkg?.xcsh ?? pkg?.pi;
|
|
527
|
+
const extensions = manifest?.extensions;
|
|
528
|
+
if (Array.isArray(extensions)) {
|
|
529
|
+
for (const entry of extensions) {
|
|
530
|
+
if (typeof entry !== "string") continue;
|
|
531
|
+
if (path.isAbsolute(entry) || entry.includes("..")) continue;
|
|
532
|
+
const resolved = path.resolve(root.path, entry);
|
|
533
|
+
if (!resolved.startsWith(root.path + path.sep) && resolved !== root.path) continue;
|
|
534
|
+
if (isDisabledName(getExtensionNameFromPath(resolved))) continue;
|
|
535
|
+
addPath(resolved);
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
} catch {
|
|
539
|
+
// No package.json or invalid — skip
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
|
|
521
543
|
// 3. Explicitly configured paths
|
|
522
544
|
for (const configuredPath of configuredPaths) {
|
|
523
545
|
const resolved = resolvePath(configuredPath, cwd);
|
|
@@ -17,17 +17,17 @@ export interface BuildInfo {
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
export const BUILD_INFO: BuildInfo = {
|
|
20
|
-
"version": "19.19.
|
|
21
|
-
"commit": "
|
|
22
|
-
"shortCommit": "
|
|
20
|
+
"version": "19.19.3",
|
|
21
|
+
"commit": "0d01a928658034ee23d053d44eaed4463ee35b8a",
|
|
22
|
+
"shortCommit": "0d01a92",
|
|
23
23
|
"branch": "main",
|
|
24
|
-
"tag": "v19.19.
|
|
25
|
-
"commitDate": "2026-06-
|
|
26
|
-
"buildDate": "2026-06-
|
|
24
|
+
"tag": "v19.19.3",
|
|
25
|
+
"commitDate": "2026-06-09T02:04:30Z",
|
|
26
|
+
"buildDate": "2026-06-09T02:27:32.159Z",
|
|
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/
|
|
32
|
-
"releaseUrl": "https://github.com/f5xc-salesdemos/xcsh/releases/tag/v19.19.
|
|
31
|
+
"commitUrl": "https://github.com/f5xc-salesdemos/xcsh/commit/0d01a928658034ee23d053d44eaed4463ee35b8a",
|
|
32
|
+
"releaseUrl": "https://github.com/f5xc-salesdemos/xcsh/releases/tag/v19.19.3"
|
|
33
33
|
};
|
|
@@ -387,7 +387,9 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
387
387
|
}
|
|
388
388
|
}
|
|
389
389
|
|
|
390
|
-
const
|
|
390
|
+
const allRecommendedPlugins = !startupQuiet ? await checkRecommendedPlugins().catch(() => []) : [];
|
|
391
|
+
const pluginServiceNames = new Set(services.filter(s => s._isPlugin).map(s => s.name.toLowerCase()));
|
|
392
|
+
const recommendedPlugins = allRecommendedPlugins.filter(p => !pluginServiceNames.has(p.name.toLowerCase()));
|
|
391
393
|
|
|
392
394
|
if (!startupQuiet) {
|
|
393
395
|
this.#welcomeComponent = new WelcomeComponent(
|
|
@@ -113,6 +113,6 @@ Swap exactly one block per oneOf group — e.g. `enable_ha {}` replaces `disable
|
|
|
113
113
|
- `site_mesh_group_on_slo { site_mesh_group { name = "<n>", namespace = "system" } }` ← note the nested `site_mesh_group` wrapper
|
|
114
114
|
- `custom_proxy { proxy_ip_address = "proxy.example.com", proxy_port = 8080 }` ← use `proxy_ip_address`/`proxy_port` (NOT `http_proxy`/`https_proxy`)
|
|
115
115
|
- `custom_proxy_bypass { proxy_bypass = ["10.0.0.0/8"] }` ← use `proxy_bypass` (NOT `bypass_list`)
|
|
116
|
-
- `blocked_services { blocked_service { network_type = "VIRTUAL_NETWORK_SITE_LOCAL" } }` ← use `blocked_service` with `network_type` (NOT `service_list`)
|
|
116
|
+
- `blocked_services { blocked_service { network_type = "VIRTUAL_NETWORK_SITE_LOCAL" } }` ← use `blocked_service` with `network_type` (NOT `service_list`). In Terraform, "blocking HTTP services" = blocking `VIRTUAL_NETWORK_SITE_LOCAL` network type. Always write the file even when the phrase mentions "HTTP service in blocked services list" — map it to `blocked_service { network_type = "VIRTUAL_NETWORK_SITE_LOCAL" }`
|
|
117
117
|
|
|
118
118
|
**CRITICAL — Terraform file write rule**: When asked to "Write Terraform HCL for f5xc_securemesh_site_v2", you **MUST** use the `xcsh_write_file` tool to write the complete `.tf` file to disk. Always name the file after the resource name in the request (e.g., `ar-test-smsv2-1a.tf`). Do NOT just return a coverage table — always write the actual HCL file. The file must include a `terraform { required_providers { f5xc = { source = "f5xc-salesdemos/f5xc" } } }` block and the complete `resource "f5xc_securemesh_site_v2"` block with all 12 oneOf groups.
|