@xrkseek/harness-cli 0.0.5 → 0.0.6
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/README.md +3 -1
- package/dist/commands/plugin.d.ts +3 -0
- package/dist/commands/plugin.d.ts.map +1 -0
- package/dist/commands/plugin.js +100 -0
- package/dist/commands/plugin.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/parse-args.d.ts +3 -1
- package/dist/parse-args.d.ts.map +1 -1
- package/dist/parse-args.js +11 -0
- package/dist/parse-args.js.map +1 -1
- package/dist/plugin/classify.d.ts +18 -0
- package/dist/plugin/classify.d.ts.map +1 -0
- package/dist/plugin/classify.js +109 -0
- package/dist/plugin/classify.js.map +1 -0
- package/dist/plugin/fetch-pack.d.ts +16 -0
- package/dist/plugin/fetch-pack.d.ts.map +1 -0
- package/dist/plugin/fetch-pack.js +104 -0
- package/dist/plugin/fetch-pack.js.map +1 -0
- package/dist/plugin/index.d.ts +27 -0
- package/dist/plugin/index.d.ts.map +1 -0
- package/dist/plugin/index.js +109 -0
- package/dist/plugin/index.js.map +1 -0
- package/dist/plugin/install-client.d.ts +4 -0
- package/dist/plugin/install-client.d.ts.map +1 -0
- package/dist/plugin/install-client.js +34 -0
- package/dist/plugin/install-client.js.map +1 -0
- package/dist/plugin/install-process.d.ts +4 -0
- package/dist/plugin/install-process.d.ts.map +1 -0
- package/dist/plugin/install-process.js +46 -0
- package/dist/plugin/install-process.js.map +1 -0
- package/dist/plugin/inventory.d.ts +42 -0
- package/dist/plugin/inventory.d.ts.map +1 -0
- package/dist/plugin/inventory.js +105 -0
- package/dist/plugin/inventory.js.map +1 -0
- package/dist/plugin/remap-inject.d.ts +16 -0
- package/dist/plugin/remap-inject.d.ts.map +1 -0
- package/dist/plugin/remap-inject.js +52 -0
- package/dist/plugin/remap-inject.js.map +1 -0
- package/node_modules/@xrkseek/server-config/dist/home.d.ts +5 -0
- package/node_modules/@xrkseek/server-config/dist/home.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-config/dist/home.js +7 -0
- package/node_modules/@xrkseek/server-config/dist/home.js.map +1 -1
- package/node_modules/@xrkseek/server-config/dist/index.d.ts +4 -2
- package/node_modules/@xrkseek/server-config/dist/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-config/dist/index.js +10 -1
- package/node_modules/@xrkseek/server-config/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/product-web/boot.json +1 -1
- package/product-web/plugins/@xrkseek/client-locale/client.js +4 -4
- package/product-web/plugins/@xrkseek/client-ui-agent-preset/client.js +38 -38
- package/product-web/plugins/@xrkseek/client-ui-commands/client.js +7 -7
- package/product-web/plugins/@xrkseek/client-ui-conversation/client.js +160 -160
- package/product-web/plugins/@xrkseek/client-ui-deliverables/client.js +4 -4
- package/product-web/plugins/@xrkseek/client-ui-directory-picker-browse/client.js +27 -27
- package/product-web/plugins/@xrkseek/client-ui-goal/client.js +5 -5
- package/product-web/plugins/@xrkseek/client-ui-input-trigger/client.js +6 -6
- package/product-web/plugins/@xrkseek/client-ui-jobs/client.js +8 -8
- package/product-web/plugins/@xrkseek/client-ui-layout/client.js +4 -4
- package/product-web/plugins/@xrkseek/client-ui-message-feedback/client.js +5 -5
- package/product-web/plugins/@xrkseek/client-ui-model-selection/client.js +17 -17
- package/product-web/plugins/@xrkseek/client-ui-permission-presets/client.js +3 -3
- package/product-web/plugins/@xrkseek/client-ui-plan/client.js +3 -3
- package/product-web/plugins/@xrkseek/client-ui-settings-general/client.js +11 -11
- package/product-web/plugins/@xrkseek/client-ui-settings-models/client.js +56 -56
- package/product-web/plugins/@xrkseek/client-ui-settings-plugin-inventory/client.js +13 -13
- package/product-web/plugins/@xrkseek/client-ui-settings-plugins/client.js +45 -45
- package/product-web/plugins/@xrkseek/client-ui-sidebar/client.js +16 -16
- package/product-web/plugins/@xrkseek/client-ui-skill/client.js +10 -10
- package/product-web/plugins/@xrkseek/client-ui-subagent/client.js +17 -17
- package/product-web/plugins/@xrkseek/client-ui-theme/client.js +3 -3
- package/product-web/plugins/@xrkseek/client-ui-tool/client.js +35 -35
- package/product-web/plugins/@xrkseek/client-ui-trajectory/client.js +140 -140
- package/product-web/plugins/@xrkseek/client-ui-user-questions/client.js +28 -28
- package/product-web/plugins/@xrkseek/client-ui-workflow-run/client.js +16 -16
- package/product-web/plugins/@xrkseek/client-ui-workspace/client.js +55 -55
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* High-level plugin install / remove / list for `xrk-harness plugin`.
|
|
3
|
+
*/
|
|
4
|
+
import { mkdirSync } from "node:fs";
|
|
5
|
+
import { homedir } from "node:os";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
import { defaultPluginsDir } from "@xrkseek/server-config";
|
|
8
|
+
import { classifyPackage } from "./classify.js";
|
|
9
|
+
import { fetchPackage } from "./fetch-pack.js";
|
|
10
|
+
import { installClientBundle, removeClientBundle, } from "./install-client.js";
|
|
11
|
+
import { installProcessPlugin, removeProcessPlugin, } from "./install-process.js";
|
|
12
|
+
import { readInventory, reconcileBoot, removeInventoryEntry, upsertInventoryEntry, } from "./inventory.js";
|
|
13
|
+
import { remapInjectList } from "./remap-inject.js";
|
|
14
|
+
export { anchorPathSpec, fetchPackage } from "./fetch-pack.js";
|
|
15
|
+
export { classifyPackage } from "./classify.js";
|
|
16
|
+
export { remapInjectId, remapInjectList } from "./remap-inject.js";
|
|
17
|
+
export { readInventory, reconcileBoot, } from "./inventory.js";
|
|
18
|
+
const defaultIo = {
|
|
19
|
+
log: (line) => {
|
|
20
|
+
process.stdout.write(`${line}\n`);
|
|
21
|
+
},
|
|
22
|
+
warn: (line) => {
|
|
23
|
+
process.stderr.write(`${line}\n`);
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
function expandPath(p) {
|
|
27
|
+
if (p === "~")
|
|
28
|
+
return homedir();
|
|
29
|
+
if (p.startsWith("~/") || p.startsWith("~\\")) {
|
|
30
|
+
return path.resolve(homedir(), p.slice(2));
|
|
31
|
+
}
|
|
32
|
+
return path.resolve(p);
|
|
33
|
+
}
|
|
34
|
+
/** Resolve plugins root: `XRK_PLUGINS_DIR` or `{XRK_HOME}/plugins`. */
|
|
35
|
+
export function resolvePluginsDir(env = process.env) {
|
|
36
|
+
const override = env.XRK_PLUGINS_DIR?.trim();
|
|
37
|
+
if (override)
|
|
38
|
+
return expandPath(override);
|
|
39
|
+
return defaultPluginsDir(env);
|
|
40
|
+
}
|
|
41
|
+
export function addPlugin(spec, options = {}) {
|
|
42
|
+
const io = options.io ?? defaultIo;
|
|
43
|
+
const env = options.env ?? process.env;
|
|
44
|
+
const pluginsDir = options.pluginsDir ?? resolvePluginsDir(env);
|
|
45
|
+
const cwd = options.cwd ?? process.cwd();
|
|
46
|
+
mkdirSync(pluginsDir, { recursive: true });
|
|
47
|
+
const unpacked = fetchPackage(spec, cwd);
|
|
48
|
+
try {
|
|
49
|
+
const classified = classifyPackage(unpacked.root, unpacked.pkg);
|
|
50
|
+
const { inject, dropped } = remapInjectList(classified.clientInject);
|
|
51
|
+
for (const d of dropped) {
|
|
52
|
+
io.warn(`xrk-harness: warning: dropped unknown inject ${JSON.stringify(d)}`);
|
|
53
|
+
}
|
|
54
|
+
if (classified.kind === "client" || classified.kind === "both") {
|
|
55
|
+
installClientBundle(pluginsDir, classified);
|
|
56
|
+
}
|
|
57
|
+
if (classified.kind === "process" || classified.kind === "both") {
|
|
58
|
+
installProcessPlugin(pluginsDir, classified);
|
|
59
|
+
}
|
|
60
|
+
const entry = {
|
|
61
|
+
name: classified.name,
|
|
62
|
+
version: classified.version,
|
|
63
|
+
kind: classified.kind,
|
|
64
|
+
source: spec,
|
|
65
|
+
installedAt: new Date().toISOString(),
|
|
66
|
+
...(classified.kind === "client" || classified.kind === "both"
|
|
67
|
+
? {
|
|
68
|
+
clientInject: inject,
|
|
69
|
+
...(classified.clientImmediately
|
|
70
|
+
? { clientImmediately: true }
|
|
71
|
+
: {}),
|
|
72
|
+
}
|
|
73
|
+
: {}),
|
|
74
|
+
};
|
|
75
|
+
upsertInventoryEntry(pluginsDir, entry);
|
|
76
|
+
reconcileBoot(pluginsDir);
|
|
77
|
+
io.log(`xrk-harness: installed ${entry.name}@${entry.version} (${entry.kind}) → ${pluginsDir}`);
|
|
78
|
+
return entry;
|
|
79
|
+
}
|
|
80
|
+
finally {
|
|
81
|
+
unpacked.cleanup();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
export function removePlugin(name, options = {}) {
|
|
85
|
+
const io = options.io ?? defaultIo;
|
|
86
|
+
const env = options.env ?? process.env;
|
|
87
|
+
const pluginsDir = options.pluginsDir ?? resolvePluginsDir(env);
|
|
88
|
+
const inv = readInventory(pluginsDir);
|
|
89
|
+
const entry = inv.packages[name];
|
|
90
|
+
if (!entry) {
|
|
91
|
+
throw new Error(`plugin not installed: ${name}`);
|
|
92
|
+
}
|
|
93
|
+
if (entry.kind === "client" || entry.kind === "both") {
|
|
94
|
+
removeClientBundle(pluginsDir, name);
|
|
95
|
+
}
|
|
96
|
+
if (entry.kind === "process" || entry.kind === "both") {
|
|
97
|
+
removeProcessPlugin(pluginsDir, name);
|
|
98
|
+
}
|
|
99
|
+
removeInventoryEntry(pluginsDir, name);
|
|
100
|
+
reconcileBoot(pluginsDir);
|
|
101
|
+
io.log(`xrk-harness: removed ${name}`);
|
|
102
|
+
}
|
|
103
|
+
export function listPlugins(options = {}) {
|
|
104
|
+
const env = options.env ?? process.env;
|
|
105
|
+
const pluginsDir = options.pluginsDir ?? resolvePluginsDir(env);
|
|
106
|
+
const inv = readInventory(pluginsDir);
|
|
107
|
+
return Object.values(inv.packages).sort((a, b) => a.name.localeCompare(b.name));
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugin/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ClassifiedPackage } from "./classify.js";
|
|
2
|
+
export declare function installClientBundle(pluginsDir: string, classified: ClassifiedPackage): void;
|
|
3
|
+
export declare function removeClientBundle(pluginsDir: string, name: string): void;
|
|
4
|
+
//# sourceMappingURL=install-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-client.d.ts","sourceRoot":"","sources":["../../src/plugin/install-client.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGvD,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,iBAAiB,GAC5B,IAAI,CAYN;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAYzE"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stage a client plugin: copy client.js (+ optional LICENSE) under web/plugins.
|
|
3
|
+
*/
|
|
4
|
+
import { copyFileSync, existsSync, mkdirSync, rmSync } from "node:fs";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import { clientInstallDir } from "./inventory.js";
|
|
7
|
+
export function installClientBundle(pluginsDir, classified) {
|
|
8
|
+
if (!classified.clientJs) {
|
|
9
|
+
throw new Error(`${classified.name}: missing client.js`);
|
|
10
|
+
}
|
|
11
|
+
const destDir = clientInstallDir(pluginsDir, classified.name);
|
|
12
|
+
rmSync(destDir, { recursive: true, force: true });
|
|
13
|
+
mkdirSync(destDir, { recursive: true });
|
|
14
|
+
copyFileSync(classified.clientJs, path.join(destDir, "client.js"));
|
|
15
|
+
const license = path.join(classified.root, "LICENSE");
|
|
16
|
+
if (existsSync(license)) {
|
|
17
|
+
copyFileSync(license, path.join(destDir, "LICENSE"));
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function removeClientBundle(pluginsDir, name) {
|
|
21
|
+
const destDir = clientInstallDir(pluginsDir, name);
|
|
22
|
+
rmSync(destDir, { recursive: true, force: true });
|
|
23
|
+
// Prune empty @scope parent
|
|
24
|
+
if (name.startsWith("@")) {
|
|
25
|
+
const scopeDir = path.dirname(destDir);
|
|
26
|
+
try {
|
|
27
|
+
rmSync(scopeDir, { recursive: false });
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
/* not empty */
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=install-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-client.js","sourceRoot":"","sources":["../../src/plugin/install-client.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACtE,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,UAAU,mBAAmB,CACjC,UAAkB,EAClB,UAA6B;IAE7B,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,GAAG,UAAU,CAAC,IAAI,qBAAqB,CAAC,CAAC;IAC3D,CAAC;IACD,MAAM,OAAO,GAAG,gBAAgB,CAAC,UAAU,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;IAC9D,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,YAAY,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACtD,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;IACvD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,UAAkB,EAAE,IAAY;IACjE,MAAM,OAAO,GAAG,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACnD,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,4BAA4B;IAC5B,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,eAAe;QACjB,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ClassifiedPackage } from "./classify.js";
|
|
2
|
+
export declare function installProcessPlugin(pluginsDir: string, classified: ClassifiedPackage): void;
|
|
3
|
+
export declare function removeProcessPlugin(pluginsDir: string, name: string): void;
|
|
4
|
+
//# sourceMappingURL=install-process.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-process.d.ts","sourceRoot":"","sources":["../../src/plugin/install-process.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAkBvD,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,iBAAiB,GAC5B,IAAI,CAQN;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAW1E"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stage a process plugin into a discoverable directory under pluginsDir.
|
|
3
|
+
* Copies the unpacked package tree (skips nested node_modules).
|
|
4
|
+
*/
|
|
5
|
+
import { cpSync, existsSync, mkdirSync, readdirSync, rmSync, statSync, } from "node:fs";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
import { processInstallDir } from "./inventory.js";
|
|
8
|
+
function copyTree(src, dest) {
|
|
9
|
+
mkdirSync(dest, { recursive: true });
|
|
10
|
+
for (const name of readdirSync(src)) {
|
|
11
|
+
if (name === "node_modules" || name === ".git")
|
|
12
|
+
continue;
|
|
13
|
+
const from = path.join(src, name);
|
|
14
|
+
const to = path.join(dest, name);
|
|
15
|
+
const st = statSync(from);
|
|
16
|
+
if (st.isDirectory()) {
|
|
17
|
+
copyTree(from, to);
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
cpSync(from, to);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export function installProcessPlugin(pluginsDir, classified) {
|
|
25
|
+
const dest = processInstallDir(pluginsDir, classified.name);
|
|
26
|
+
rmSync(dest, { recursive: true, force: true });
|
|
27
|
+
mkdirSync(path.dirname(dest), { recursive: true });
|
|
28
|
+
copyTree(classified.root, dest);
|
|
29
|
+
if (!existsSync(path.join(dest, "package.json"))) {
|
|
30
|
+
throw new Error(`${classified.name}: process install missing package.json`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export function removeProcessPlugin(pluginsDir, name) {
|
|
34
|
+
const dest = processInstallDir(pluginsDir, name);
|
|
35
|
+
rmSync(dest, { recursive: true, force: true });
|
|
36
|
+
if (name.startsWith("@")) {
|
|
37
|
+
const scopeDir = path.dirname(dest);
|
|
38
|
+
try {
|
|
39
|
+
rmSync(scopeDir, { recursive: false });
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
/* not empty */
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=install-process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-process.js","sourceRoot":"","sources":["../../src/plugin/install-process.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EACL,MAAM,EACN,UAAU,EACV,SAAS,EACT,WAAW,EACX,MAAM,EACN,QAAQ,GACT,MAAM,SAAS,CAAC;AACjB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,SAAS,QAAQ,CAAC,GAAW,EAAE,IAAY;IACzC,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QACpC,IAAI,IAAI,KAAK,cAAc,IAAI,IAAI,KAAK,MAAM;YAAE,SAAS;QACzD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAClC,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACjC,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;YACrB,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,UAAkB,EAClB,UAA6B;IAE7B,MAAM,IAAI,GAAG,iBAAiB,CAAC,UAAU,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;IAC5D,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,GAAG,UAAU,CAAC,IAAI,wCAAwC,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,UAAkB,EAAE,IAAY;IAClE,MAAM,IAAI,GAAG,iBAAiB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACjD,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,eAAe;QACjB,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { PluginKind } from "./classify.js";
|
|
2
|
+
export declare const INVENTORY_FILE = ".xrk-plugins.json";
|
|
3
|
+
export interface InventoryEntry {
|
|
4
|
+
readonly name: string;
|
|
5
|
+
readonly version: string;
|
|
6
|
+
readonly kind: PluginKind;
|
|
7
|
+
/** Original add spec (registry / path / github). */
|
|
8
|
+
readonly source: string;
|
|
9
|
+
readonly installedAt: string;
|
|
10
|
+
/** Remapped client inject when kind includes client. */
|
|
11
|
+
readonly clientInject?: readonly string[];
|
|
12
|
+
readonly clientImmediately?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface PluginInventory {
|
|
15
|
+
readonly rev: number;
|
|
16
|
+
readonly packages: Record<string, InventoryEntry>;
|
|
17
|
+
}
|
|
18
|
+
export interface WebBootEntry {
|
|
19
|
+
readonly id: string;
|
|
20
|
+
readonly url: string;
|
|
21
|
+
readonly rev: string;
|
|
22
|
+
readonly inject: readonly string[];
|
|
23
|
+
readonly immediately?: boolean;
|
|
24
|
+
}
|
|
25
|
+
export interface WebBootManifest {
|
|
26
|
+
readonly rev: string;
|
|
27
|
+
readonly entries: readonly WebBootEntry[];
|
|
28
|
+
}
|
|
29
|
+
export declare function inventoryPath(pluginsDir: string): string;
|
|
30
|
+
export declare function readInventory(pluginsDir: string): PluginInventory;
|
|
31
|
+
export declare function writeInventory(pluginsDir: string, inventory: PluginInventory): void;
|
|
32
|
+
export declare function upsertInventoryEntry(pluginsDir: string, entry: InventoryEntry): PluginInventory;
|
|
33
|
+
export declare function removeInventoryEntry(pluginsDir: string, name: string): PluginInventory;
|
|
34
|
+
/** Absolute install dir for a process plugin package name. */
|
|
35
|
+
export declare function processInstallDir(pluginsDir: string, name: string): string;
|
|
36
|
+
/** Absolute dir for staged client.js. */
|
|
37
|
+
export declare function clientInstallDir(pluginsDir: string, name: string): string;
|
|
38
|
+
/**
|
|
39
|
+
* Rewrite `web/boot.json` from inventory client entries only.
|
|
40
|
+
*/
|
|
41
|
+
export declare function reconcileBoot(pluginsDir: string): WebBootManifest;
|
|
42
|
+
//# sourceMappingURL=inventory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inventory.d.ts","sourceRoot":"","sources":["../../src/plugin/inventory.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,eAAO,MAAM,cAAc,sBAAsB,CAAC;AAElD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,oDAAoD;IACpD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,wDAAwD;IACxD,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CACtC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;CAC3C;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,CAoBjE;AAED,wBAAgB,cAAc,CAC5B,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,eAAe,GACzB,IAAI,CAON;AAED,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,cAAc,GACpB,eAAe,CAQjB;AAED,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,GACX,eAAe,CAUjB;AAED,8DAA8D;AAC9D,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAS1E;AAED,yCAAyC;AACzC,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,CA2BjE"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inventory of CLI-installed plugins under `{pluginsDir}/.xrk-plugins.json`.
|
|
3
|
+
* `reconcileBoot` regenerates `{pluginsDir}/web/boot.json` from this list.
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync, } from "node:fs";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
export const INVENTORY_FILE = ".xrk-plugins.json";
|
|
8
|
+
export function inventoryPath(pluginsDir) {
|
|
9
|
+
return path.join(pluginsDir, INVENTORY_FILE);
|
|
10
|
+
}
|
|
11
|
+
export function readInventory(pluginsDir) {
|
|
12
|
+
const file = inventoryPath(pluginsDir);
|
|
13
|
+
if (!existsSync(file)) {
|
|
14
|
+
return { rev: 1, packages: {} };
|
|
15
|
+
}
|
|
16
|
+
try {
|
|
17
|
+
const raw = JSON.parse(readFileSync(file, "utf8"));
|
|
18
|
+
if (!raw || typeof raw !== "object")
|
|
19
|
+
return { rev: 1, packages: {} };
|
|
20
|
+
const o = raw;
|
|
21
|
+
const packages = o.packages && typeof o.packages === "object" && !Array.isArray(o.packages)
|
|
22
|
+
? o.packages
|
|
23
|
+
: {};
|
|
24
|
+
return {
|
|
25
|
+
rev: typeof o.rev === "number" ? o.rev : 1,
|
|
26
|
+
packages,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return { rev: 1, packages: {} };
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export function writeInventory(pluginsDir, inventory) {
|
|
34
|
+
mkdirSync(pluginsDir, { recursive: true });
|
|
35
|
+
writeFileSync(inventoryPath(pluginsDir), `${JSON.stringify(inventory, null, 2)}\n`, "utf8");
|
|
36
|
+
}
|
|
37
|
+
export function upsertInventoryEntry(pluginsDir, entry) {
|
|
38
|
+
const inv = readInventory(pluginsDir);
|
|
39
|
+
const next = {
|
|
40
|
+
rev: inv.rev,
|
|
41
|
+
packages: { ...inv.packages, [entry.name]: entry },
|
|
42
|
+
};
|
|
43
|
+
writeInventory(pluginsDir, next);
|
|
44
|
+
return next;
|
|
45
|
+
}
|
|
46
|
+
export function removeInventoryEntry(pluginsDir, name) {
|
|
47
|
+
const inv = readInventory(pluginsDir);
|
|
48
|
+
if (!(name in inv.packages)) {
|
|
49
|
+
throw new Error(`plugin not installed: ${name}`);
|
|
50
|
+
}
|
|
51
|
+
const packages = { ...inv.packages };
|
|
52
|
+
delete packages[name];
|
|
53
|
+
const next = { rev: inv.rev, packages };
|
|
54
|
+
writeInventory(pluginsDir, next);
|
|
55
|
+
return next;
|
|
56
|
+
}
|
|
57
|
+
/** Absolute install dir for a process plugin package name. */
|
|
58
|
+
export function processInstallDir(pluginsDir, name) {
|
|
59
|
+
if (name.startsWith("@")) {
|
|
60
|
+
const [scope, pkg] = name.split("/");
|
|
61
|
+
if (!scope || !pkg) {
|
|
62
|
+
throw new Error(`invalid scoped package name: ${name}`);
|
|
63
|
+
}
|
|
64
|
+
return path.join(pluginsDir, scope, pkg);
|
|
65
|
+
}
|
|
66
|
+
return path.join(pluginsDir, name);
|
|
67
|
+
}
|
|
68
|
+
/** Absolute dir for staged client.js. */
|
|
69
|
+
export function clientInstallDir(pluginsDir, name) {
|
|
70
|
+
return path.join(pluginsDir, "web", "plugins", ...name.split("/"));
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Rewrite `web/boot.json` from inventory client entries only.
|
|
74
|
+
*/
|
|
75
|
+
export function reconcileBoot(pluginsDir) {
|
|
76
|
+
const inv = readInventory(pluginsDir);
|
|
77
|
+
const entries = [];
|
|
78
|
+
for (const entry of Object.values(inv.packages)) {
|
|
79
|
+
if (entry.kind !== "client" && entry.kind !== "both")
|
|
80
|
+
continue;
|
|
81
|
+
entries.push({
|
|
82
|
+
id: entry.name,
|
|
83
|
+
url: `/plugins/${entry.name}/client.js`,
|
|
84
|
+
rev: entry.version,
|
|
85
|
+
inject: entry.clientInject ?? [],
|
|
86
|
+
...(entry.clientImmediately ? { immediately: true } : {}),
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
entries.sort((a, b) => a.id.localeCompare(b.id));
|
|
90
|
+
const manifest = {
|
|
91
|
+
rev: `xrk-plugins-${Date.now()}`,
|
|
92
|
+
entries,
|
|
93
|
+
};
|
|
94
|
+
const webDir = path.join(pluginsDir, "web");
|
|
95
|
+
mkdirSync(webDir, { recursive: true });
|
|
96
|
+
const bootPath = path.join(webDir, "boot.json");
|
|
97
|
+
if (entries.length === 0) {
|
|
98
|
+
if (existsSync(bootPath))
|
|
99
|
+
rmSync(bootPath, { force: true });
|
|
100
|
+
return manifest;
|
|
101
|
+
}
|
|
102
|
+
writeFileSync(bootPath, `${JSON.stringify(manifest, null, 2)}\n`, "utf8");
|
|
103
|
+
return manifest;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=inventory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inventory.js","sourceRoot":"","sources":["../../src/plugin/inventory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remap DSH client boot inject ids onto XRK product-shell packages.
|
|
3
|
+
* Unknown `@deepseek-ai/*` entries are dropped (with optional warn) so boot
|
|
4
|
+
* does not stall on missing ModuleLoader rows.
|
|
5
|
+
*/
|
|
6
|
+
export interface RemapInjectResult {
|
|
7
|
+
readonly inject: readonly string[];
|
|
8
|
+
readonly dropped: readonly string[];
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Map one inject id. Returns `undefined` when the id should be dropped.
|
|
12
|
+
*/
|
|
13
|
+
export declare function remapInjectId(id: string): string | undefined;
|
|
14
|
+
/** Remap a full inject list; preserve order, dedupe. */
|
|
15
|
+
export declare function remapInjectList(inject: readonly string[] | undefined): RemapInjectResult;
|
|
16
|
+
//# sourceMappingURL=remap-inject.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remap-inject.d.ts","sourceRoot":"","sources":["../../src/plugin/remap-inject.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAaD;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAa5D;AAED,wDAAwD;AACxD,wBAAgB,eAAe,CAC7B,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GACpC,iBAAiB,CAenB"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
const EXACT = {
|
|
2
|
+
"@deepseek-ai/dsh-client-runtime": "@xrkseek/client-runtime",
|
|
3
|
+
"@deepseek-ai/dsh-client-locale": "@xrkseek/client-locale",
|
|
4
|
+
"@deepseek-ai/dsh-client-ui-slots": "@xrkseek/client-ui-slots",
|
|
5
|
+
"@deepseek-ai/dsh-client-ui-primitives": "@xrkseek/client-ui-primitives",
|
|
6
|
+
"@deepseek-ai/dsh-client-ui-conversation": "@xrkseek/client-ui-conversation",
|
|
7
|
+
"@deepseek-ai/dsh-client-ui-attachment": "@xrkseek/client-ui-attachment",
|
|
8
|
+
"@deepseek-ai/dsh-client-web-react": "@xrkseek/client-web-react",
|
|
9
|
+
"@deepseek-ai/dsh-client-schema-form": "@xrkseek/client-schema-form",
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Map one inject id. Returns `undefined` when the id should be dropped.
|
|
13
|
+
*/
|
|
14
|
+
export function remapInjectId(id) {
|
|
15
|
+
const trimmed = id.trim();
|
|
16
|
+
if (!trimmed)
|
|
17
|
+
return undefined;
|
|
18
|
+
if (trimmed.startsWith("@xrkseek/"))
|
|
19
|
+
return trimmed;
|
|
20
|
+
const exact = EXACT[trimmed];
|
|
21
|
+
if (exact)
|
|
22
|
+
return exact;
|
|
23
|
+
// @deepseek-ai/dsh-client-ui-foo → @xrkseek/client-ui-foo
|
|
24
|
+
const ui = /^@deepseek-ai\/dsh-client-(ui-.+)$/.exec(trimmed);
|
|
25
|
+
if (ui?.[1])
|
|
26
|
+
return `@xrkseek/client-${ui[1]}`;
|
|
27
|
+
const client = /^@deepseek-ai\/dsh-client-(.+)$/.exec(trimmed);
|
|
28
|
+
if (client?.[1])
|
|
29
|
+
return `@xrkseek/client-${client[1]}`;
|
|
30
|
+
if (trimmed.startsWith("@deepseek-ai/"))
|
|
31
|
+
return undefined;
|
|
32
|
+
return trimmed;
|
|
33
|
+
}
|
|
34
|
+
/** Remap a full inject list; preserve order, dedupe. */
|
|
35
|
+
export function remapInjectList(inject) {
|
|
36
|
+
const out = [];
|
|
37
|
+
const dropped = [];
|
|
38
|
+
const seen = new Set();
|
|
39
|
+
for (const raw of inject ?? []) {
|
|
40
|
+
const mapped = remapInjectId(raw);
|
|
41
|
+
if (mapped === undefined) {
|
|
42
|
+
dropped.push(raw);
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
if (seen.has(mapped))
|
|
46
|
+
continue;
|
|
47
|
+
seen.add(mapped);
|
|
48
|
+
out.push(mapped);
|
|
49
|
+
}
|
|
50
|
+
return { inject: out, dropped };
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=remap-inject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remap-inject.js","sourceRoot":"","sources":["../../src/plugin/remap-inject.ts"],"names":[],"mappings":"AAUA,MAAM,KAAK,GAAqC;IAC9C,iCAAiC,EAAE,yBAAyB;IAC5D,gCAAgC,EAAE,wBAAwB;IAC1D,kCAAkC,EAAE,0BAA0B;IAC9D,uCAAuC,EAAE,+BAA+B;IACxE,yCAAyC,EAAE,iCAAiC;IAC5E,uCAAuC,EAAE,+BAA+B;IACxE,mCAAmC,EAAE,2BAA2B;IAChE,qCAAqC,EAAE,6BAA6B;CACrE,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,EAAU;IACtC,MAAM,OAAO,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;IAC1B,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,IAAI,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,OAAO,CAAC;IACpD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IACxB,0DAA0D;IAC1D,MAAM,EAAE,GAAG,oCAAoC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9D,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;QAAE,OAAO,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/C,MAAM,MAAM,GAAG,iCAAiC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/D,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC;QAAE,OAAO,mBAAmB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,IAAI,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1D,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,eAAe,CAC7B,MAAqC;IAErC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,GAAG,IAAI,MAAM,IAAI,EAAE,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClB,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,SAAS;QAC/B,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACjB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AAClC,CAAC"}
|
|
@@ -10,4 +10,9 @@ export declare function resolveXrkHome(env?: NodeJS.ProcessEnv): string;
|
|
|
10
10
|
export declare function defaultSessionsDir(env?: NodeJS.ProcessEnv): string;
|
|
11
11
|
/** `{home}/host-settings.json` — Face MCP desired-servers dump. */
|
|
12
12
|
export declare function hostSettingsPath(env?: NodeJS.ProcessEnv): string;
|
|
13
|
+
/**
|
|
14
|
+
* `{home}/plugins` — CLI `plugin add` root + optional Host `pluginsDir`.
|
|
15
|
+
* Process discover + `{plugins}/web/` client overlay live here.
|
|
16
|
+
*/
|
|
17
|
+
export declare function defaultPluginsDir(env?: NodeJS.ProcessEnv): string;
|
|
13
18
|
//# sourceMappingURL=home.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"home.d.ts","sourceRoot":"","sources":["../src/home.ts"],"names":[],"mappings":"AASA,wCAAwC;AACxC,eAAO,MAAM,iBAAiB,SAAS,CAAC;AAExC,sEAAsE;AACtE,eAAO,MAAM,aAAa,mDAAoD,CAAC;AAE/E,wBAAwB;AACxB,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAUD,2EAA2E;AAC3E,wBAAgB,cAAc,CAC5B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAMR;AAED,gFAAgF;AAChF,wBAAgB,kBAAkB,CAChC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAER;AAED,mEAAmE;AACnE,wBAAgB,gBAAgB,CAC9B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAER"}
|
|
1
|
+
{"version":3,"file":"home.d.ts","sourceRoot":"","sources":["../src/home.ts"],"names":[],"mappings":"AASA,wCAAwC;AACxC,eAAO,MAAM,iBAAiB,SAAS,CAAC;AAExC,sEAAsE;AACtE,eAAO,MAAM,aAAa,mDAAoD,CAAC;AAE/E,wBAAwB;AACxB,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAUD,2EAA2E;AAC3E,wBAAgB,cAAc,CAC5B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAMR;AAED,gFAAgF;AAChF,wBAAgB,kBAAkB,CAChC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAER;AAED,mEAAmE;AACnE,wBAAgB,gBAAgB,CAC9B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAER;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAER"}
|
|
@@ -39,4 +39,11 @@ export function defaultSessionsDir(env = process.env) {
|
|
|
39
39
|
export function hostSettingsPath(env = process.env) {
|
|
40
40
|
return path.join(resolveXrkHome(env), "host-settings.json");
|
|
41
41
|
}
|
|
42
|
+
/**
|
|
43
|
+
* `{home}/plugins` — CLI `plugin add` root + optional Host `pluginsDir`.
|
|
44
|
+
* Process discover + `{plugins}/web/` client overlay live here.
|
|
45
|
+
*/
|
|
46
|
+
export function defaultPluginsDir(env = process.env) {
|
|
47
|
+
return path.join(resolveXrkHome(env), "plugins");
|
|
48
|
+
}
|
|
42
49
|
//# sourceMappingURL=home.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"home.js","sourceRoot":"","sources":["../src/home.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,wCAAwC;AACxC,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAExC,sEAAsE;AACtE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,UAAU,EAAE,cAAc,EAAE,UAAU,CAAU,CAAC;AAE/E,wBAAwB;AACxB,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,iBAAiB,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,IAAI,KAAK,KAAK,GAAG;QAAE,OAAO,OAAO,EAAE,CAAC;IACpC,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACtD,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,cAAc,CAC5B,MAAyB,OAAO,CAAC,GAAG;IAEpC,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC;QAC7B,IAAI,GAAG;YAAE,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;AACxC,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,kBAAkB,CAChC,MAAyB,OAAO,CAAC,GAAG;IAEpC,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,CAAC;AACpD,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,gBAAgB,CAC9B,MAAyB,OAAO,CAAC,GAAG;IAEpC,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,oBAAoB,CAAC,CAAC;AAC9D,CAAC"}
|
|
1
|
+
{"version":3,"file":"home.js","sourceRoot":"","sources":["../src/home.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,wCAAwC;AACxC,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAExC,sEAAsE;AACtE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,UAAU,EAAE,cAAc,EAAE,UAAU,CAAU,CAAC;AAE/E,wBAAwB;AACxB,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,iBAAiB,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,IAAI,KAAK,KAAK,GAAG;QAAE,OAAO,OAAO,EAAE,CAAC;IACpC,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACtD,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,cAAc,CAC5B,MAAyB,OAAO,CAAC,GAAG;IAEpC,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC;QAC7B,IAAI,GAAG;YAAE,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;AACxC,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,kBAAkB,CAChC,MAAyB,OAAO,CAAC,GAAG;IAEpC,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,CAAC;AACpD,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,gBAAgB,CAC9B,MAAyB,OAAO,CAAC,GAAG;IAEpC,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,oBAAoB,CAAC,CAAC;AAC9D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAyB,OAAO,CAAC,GAAG;IAEpC,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;AACnD,CAAC"}
|
|
@@ -3,7 +3,7 @@ import type { SessionEvent } from "@xrkseek/protocol";
|
|
|
3
3
|
import { type McpServerRow } from "./mcp-servers.js";
|
|
4
4
|
export type { SessionStore, SessionEvent };
|
|
5
5
|
export type { McpServerRow };
|
|
6
|
-
export { XRK_HOME_DIR_NAME, XRK_HOME_ENVS, defaultSessionsDir, defaultXrkHome, hostSettingsPath, resolveXrkHome, } from "./home.js";
|
|
6
|
+
export { XRK_HOME_DIR_NAME, XRK_HOME_ENVS, defaultPluginsDir, defaultSessionsDir, defaultXrkHome, hostSettingsPath, resolveXrkHome, } from "./home.js";
|
|
7
7
|
export { mcpServersContainEnv, mcpServersObjectMap, parseMcpServersJson, parseMcpServersValue, } from "./mcp-servers.js";
|
|
8
8
|
export interface HostCredentials {
|
|
9
9
|
/** API key for /api/* ; empty disables auth (dev only). */
|
|
@@ -18,7 +18,9 @@ export interface HostRuntimeConfig {
|
|
|
18
18
|
readonly rateLimitPerMinute: number;
|
|
19
19
|
/**
|
|
20
20
|
* Optional plugin root for `loader.loadAll` on host spawn.
|
|
21
|
-
* Env: `XRK_PLUGINS_DIR`.
|
|
21
|
+
* Env: `XRK_PLUGINS_DIR`. When unset, `{XRK_HOME}/plugins` if that
|
|
22
|
+
* directory already exists (created by `xrk-harness plugin add`).
|
|
23
|
+
* Empty / omit = skip discover.
|
|
22
24
|
*/
|
|
23
25
|
readonly pluginsDir?: string;
|
|
24
26
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE1E,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;AAC3C,YAAY,EAAE,YAAY,EAAE,CAAC;AAC7B,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,cAAc,GACf,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,eAAe;IAC9B,2DAA2D;IAC3D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IAClD,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,GAAG,CAAC;IAClC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B;;;OAGG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IAC9C,2FAA2F;IAC3F,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACnC;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAChD;AAQD,qEAAqE;AACrE,wBAAgB,cAAc,CAAC,KAAK,GAAE,eAAoB,GAAG,UAAU,CA6GtE;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,aAAa,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACnC,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,YAAY,EAAE,CAAC;CACvD"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { defaultPluginsDir } from "./home.js";
|
|
1
3
|
import { parseMcpServersJson } from "./mcp-servers.js";
|
|
2
|
-
export { XRK_HOME_DIR_NAME, XRK_HOME_ENVS, defaultSessionsDir, defaultXrkHome, hostSettingsPath, resolveXrkHome, } from "./home.js";
|
|
4
|
+
export { XRK_HOME_DIR_NAME, XRK_HOME_ENVS, defaultPluginsDir, defaultSessionsDir, defaultXrkHome, hostSettingsPath, resolveXrkHome, } from "./home.js";
|
|
3
5
|
export { mcpServersContainEnv, mcpServersObjectMap, parseMcpServersJson, parseMcpServersValue, } from "./mcp-servers.js";
|
|
4
6
|
function num(v, fallback) {
|
|
5
7
|
if (v === undefined || v === "")
|
|
@@ -31,6 +33,13 @@ export function loadHostConfig(input = {}) {
|
|
|
31
33
|
...(defaults.pluginsDir
|
|
32
34
|
? { pluginsDir: defaults.pluginsDir }
|
|
33
35
|
: {}),
|
|
36
|
+
...(!defaults.pluginsDir &&
|
|
37
|
+
!(env.XRK_PLUGINS_DIR && String(env.XRK_PLUGINS_DIR).trim())
|
|
38
|
+
? (() => {
|
|
39
|
+
const homePlugins = defaultPluginsDir(env);
|
|
40
|
+
return existsSync(homePlugins) ? { pluginsDir: homePlugins } : {};
|
|
41
|
+
})()
|
|
42
|
+
: {}),
|
|
34
43
|
...(env.XRK_PLUGINS_DIR && String(env.XRK_PLUGINS_DIR).trim()
|
|
35
44
|
? { pluginsDir: String(env.XRK_PLUGINS_DIR).trim() }
|
|
36
45
|
: {}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xrkseek/harness-cli",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"description": "XRK-Harness CLI (run / serve / web). Product shell ships in product-web/.",
|
|
3
|
+
"version": "0.0.6",
|
|
4
|
+
"description": "XRK-Harness CLI (run / serve / web / plugin). Product shell ships in product-web/.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
7
7
|
".": {
|
package/product-web/boot.json
CHANGED
|
@@ -884,11 +884,11 @@ window.__ModuleLoader__.load({
|
|
|
884
884
|
document.head.appendChild(tag);
|
|
885
885
|
}
|
|
886
886
|
var LanguageRow_module_css_default = {
|
|
887
|
-
"selector": "jLfXEq_selector",
|
|
888
|
-
"rowText": "jLfXEq_rowText",
|
|
889
887
|
"row": "jLfXEq_row",
|
|
890
|
-
"
|
|
891
|
-
"
|
|
888
|
+
"title": "jLfXEq_title",
|
|
889
|
+
"rowText": "jLfXEq_rowText",
|
|
890
|
+
"selector": "jLfXEq_selector",
|
|
891
|
+
"chevron": "jLfXEq_chevron"
|
|
892
892
|
};
|
|
893
893
|
//#endregion
|
|
894
894
|
//#region src/client/LanguageRow.tsx
|