@xrkseek/harness-cli 0.0.4 → 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/core-agent-loop/dist/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/core-agent-loop/dist/index.js +8 -2
- package/node_modules/@xrkseek/core-agent-loop/dist/index.js.map +1 -1
- package/node_modules/@xrkseek/core-system-prompt/README.md +2 -2
- package/node_modules/@xrkseek/core-system-prompt/dist/index.d.ts +1 -1
- package/node_modules/@xrkseek/core-system-prompt/dist/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/core-system-prompt/dist/index.js +1 -1
- package/node_modules/@xrkseek/core-system-prompt/dist/index.js.map +1 -1
- package/node_modules/@xrkseek/core-system-prompt/dist/three-layer.d.ts +22 -4
- package/node_modules/@xrkseek/core-system-prompt/dist/three-layer.d.ts.map +1 -1
- package/node_modules/@xrkseek/core-system-prompt/dist/three-layer.js +21 -8
- package/node_modules/@xrkseek/core-system-prompt/dist/three-layer.js.map +1 -1
- package/node_modules/@xrkseek/preset-harness/dist/tsconfig.tsbuildinfo +1 -1
- package/node_modules/@xrkseek/preset-minimal/dist/tsconfig.tsbuildinfo +1 -1
- 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 +2 -2
- package/product-web/plugins/@xrkseek/client-ui-agent-preset/client.js +36 -36
- package/product-web/plugins/@xrkseek/client-ui-commands/client.js +8 -8
- package/product-web/plugins/@xrkseek/client-ui-conversation/client.js +154 -154
- package/product-web/plugins/@xrkseek/client-ui-deliverables/client.js +5 -5
- package/product-web/plugins/@xrkseek/client-ui-directory-picker-browse/client.js +27 -27
- package/product-web/plugins/@xrkseek/client-ui-goal/client.js +7 -7
- package/product-web/plugins/@xrkseek/client-ui-input-trigger/client.js +6 -6
- package/product-web/plugins/@xrkseek/client-ui-jobs/client.js +9 -9
- package/product-web/plugins/@xrkseek/client-ui-layout/client.js +3 -3
- package/product-web/plugins/@xrkseek/client-ui-message-feedback/client.js +4 -4
- 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 +1 -1
- package/product-web/plugins/@xrkseek/client-ui-settings-general/client.js +15 -15
- package/product-web/plugins/@xrkseek/client-ui-settings-models/client.js +52 -52
- package/product-web/plugins/@xrkseek/client-ui-settings-plugin-inventory/client.js +12 -12
- package/product-web/plugins/@xrkseek/client-ui-settings-plugins/client.js +42 -42
- package/product-web/plugins/@xrkseek/client-ui-sidebar/client.js +15 -15
- package/product-web/plugins/@xrkseek/client-ui-skill/client.js +12 -12
- package/product-web/plugins/@xrkseek/client-ui-subagent/client.js +18 -18
- package/product-web/plugins/@xrkseek/client-ui-theme/client.js +3 -3
- package/product-web/plugins/@xrkseek/client-ui-tool/client.js +37 -37
- package/product-web/plugins/@xrkseek/client-ui-trajectory/client.js +145 -145
- package/product-web/plugins/@xrkseek/client-ui-user-questions/client.js +24 -24
- package/product-web/plugins/@xrkseek/client-ui-workflow-run/client.js +15 -15
- package/product-web/plugins/@xrkseek/client-ui-workspace/client.js +55 -55
package/README.md
CHANGED
|
@@ -9,6 +9,7 @@ bin:`xrk-harness`。产品 UI:包内 `product-web/`(源码仓用 `apps/web
|
|
|
9
9
|
| `run` | 单 turn(默认 minimal + replay) |
|
|
10
10
|
| `serve` / `web` | HTTP host + 产品壳 |
|
|
11
11
|
| `restart` | 释放监听端口后重新 serve |
|
|
12
|
+
| `plugin` | 安装 / 卸载 / 列出用户插件(`~/.xrk/plugins`) |
|
|
12
13
|
| `doctor` | Node · workspace · 产品壳 |
|
|
13
14
|
| `dump-config` | 打印 preset 配置 |
|
|
14
15
|
|
|
@@ -18,9 +19,10 @@ bin:`xrk-harness`。产品 UI:包内 `product-web/`(源码仓用 `apps/web
|
|
|
18
19
|
npx @xrkseek/harness-cli web
|
|
19
20
|
npx @xrkseek/harness-cli web --force --verbose
|
|
20
21
|
npx @xrkseek/harness-cli restart
|
|
22
|
+
npx @xrkseek/harness-cli plugin add @huanlin/dsh-plugin-spur
|
|
21
23
|
# 源码:
|
|
22
24
|
pnpm build && pnpm web:build && pnpm client:bundle && pnpm web:assemble
|
|
23
25
|
node apps/cli/dist/bin.js web --workspace .
|
|
24
26
|
```
|
|
25
27
|
|
|
26
|
-
静态根:`XRK_WEB_DIST` → `product-web/` → `apps/web/dist
|
|
28
|
+
静态根:`XRK_WEB_DIST` → `product-web/` → `apps/web/dist`。插件:[docs/plugin-loader.md](../../docs/plugin-loader.md)。配置见 [docs/configuration.md](../../docs/configuration.md);发布见 [docs/publishing.md](../../docs/publishing.md)。
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/commands/plugin.ts"],"names":[],"mappings":"AAWA,wBAAgB,cAAc,IAAI,MAAM,CAgCvC;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAuExE"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `xrk-harness plugin` — install / remove / list user plugins under
|
|
3
|
+
* `{XRK_HOME}/plugins` (or `XRK_PLUGINS_DIR`).
|
|
4
|
+
*/
|
|
5
|
+
import { addPlugin, listPlugins, removePlugin, resolvePluginsDir, } from "../plugin/index.js";
|
|
6
|
+
export function pluginHelpText() {
|
|
7
|
+
return `xrk-harness plugin — manage user plugins
|
|
8
|
+
|
|
9
|
+
Usage:
|
|
10
|
+
xrk-harness plugin add <spec…>
|
|
11
|
+
xrk-harness plugin remove <name…>
|
|
12
|
+
xrk-harness plugin list
|
|
13
|
+
xrk-harness plugin path
|
|
14
|
+
xrk-harness plugin help
|
|
15
|
+
|
|
16
|
+
Specs (npm pack):
|
|
17
|
+
@scope/name registry package
|
|
18
|
+
github:user/repo git (npm-compatible)
|
|
19
|
+
./path file:./path local checkout (anchored to cwd)
|
|
20
|
+
link:./path same as file: for local dirs
|
|
21
|
+
|
|
22
|
+
Kinds:
|
|
23
|
+
client xrk.client / dsh.client + lib/client.js → web/boot overlay
|
|
24
|
+
process xrk.plugin.json / xrkseek.plugin / dsh.plugin → discover
|
|
25
|
+
both both halves
|
|
26
|
+
|
|
27
|
+
Root:
|
|
28
|
+
default ~/.xrk/plugins (XRK_HOME / XRK_DSH_HOME / DSH_HOME)
|
|
29
|
+
override XRK_PLUGINS_DIR
|
|
30
|
+
|
|
31
|
+
After add/remove, restart \`xrk-harness web\` / \`serve\` to load changes.
|
|
32
|
+
|
|
33
|
+
Examples:
|
|
34
|
+
xrk-harness plugin add @huanlin/dsh-plugin-spur
|
|
35
|
+
xrk-harness plugin list
|
|
36
|
+
xrk-harness plugin remove @huanlin/dsh-plugin-spur
|
|
37
|
+
`;
|
|
38
|
+
}
|
|
39
|
+
export async function runPlugin(argv) {
|
|
40
|
+
const args = [...argv];
|
|
41
|
+
if (args.length === 0 ||
|
|
42
|
+
args[0] === "help" ||
|
|
43
|
+
args[0] === "--help" ||
|
|
44
|
+
args[0] === "-h") {
|
|
45
|
+
process.stdout.write(pluginHelpText());
|
|
46
|
+
return 0;
|
|
47
|
+
}
|
|
48
|
+
const sub = args.shift();
|
|
49
|
+
try {
|
|
50
|
+
switch (sub) {
|
|
51
|
+
case "add": {
|
|
52
|
+
if (args.length === 0) {
|
|
53
|
+
throw new Error("plugin add needs at least one <spec>");
|
|
54
|
+
}
|
|
55
|
+
for (const spec of args) {
|
|
56
|
+
addPlugin(spec);
|
|
57
|
+
}
|
|
58
|
+
process.stdout.write("xrk-harness: restart `web` / `serve` to load new plugins\n");
|
|
59
|
+
return 0;
|
|
60
|
+
}
|
|
61
|
+
case "remove":
|
|
62
|
+
case "rm": {
|
|
63
|
+
if (args.length === 0) {
|
|
64
|
+
throw new Error("plugin remove needs at least one <name>");
|
|
65
|
+
}
|
|
66
|
+
for (const name of args) {
|
|
67
|
+
removePlugin(name);
|
|
68
|
+
}
|
|
69
|
+
process.stdout.write("xrk-harness: restart `web` / `serve` to drop removed plugins\n");
|
|
70
|
+
return 0;
|
|
71
|
+
}
|
|
72
|
+
case "list":
|
|
73
|
+
case "ls": {
|
|
74
|
+
const pluginsDir = resolvePluginsDir();
|
|
75
|
+
const entries = listPlugins({ pluginsDir });
|
|
76
|
+
if (entries.length === 0) {
|
|
77
|
+
process.stdout.write(`(none) root=${pluginsDir}\n`);
|
|
78
|
+
return 0;
|
|
79
|
+
}
|
|
80
|
+
process.stdout.write(`root=${pluginsDir}\n`);
|
|
81
|
+
for (const e of entries) {
|
|
82
|
+
process.stdout.write(`${e.name}\t${e.version}\t${e.kind}\t${e.source}\n`);
|
|
83
|
+
}
|
|
84
|
+
return 0;
|
|
85
|
+
}
|
|
86
|
+
case "path": {
|
|
87
|
+
process.stdout.write(`${resolvePluginsDir()}\n`);
|
|
88
|
+
return 0;
|
|
89
|
+
}
|
|
90
|
+
default:
|
|
91
|
+
throw new Error(`unknown plugin subcommand: ${sub} (try: add | remove | list | path | help)`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
96
|
+
process.stderr.write(`error: ${message}\n`);
|
|
97
|
+
return 1;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/commands/plugin.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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":"AAMA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;AAE/C,wBAAsB,IAAI,CAAC,IAAI,WAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,CAoDxE"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { runDoctor } from "./commands/doctor.js";
|
|
2
2
|
import { runDumpConfig } from "./commands/dump-config.js";
|
|
3
|
+
import { runPlugin } from "./commands/plugin.js";
|
|
3
4
|
import { runCommand } from "./commands/run.js";
|
|
4
5
|
import { runRestart } from "./commands/restart.js";
|
|
5
6
|
import { runServe } from "./commands/serve.js";
|
|
@@ -43,6 +44,8 @@ export async function main(argv = process.argv.slice(2)) {
|
|
|
43
44
|
return await runServe(args);
|
|
44
45
|
case "restart":
|
|
45
46
|
return await runRestart(args);
|
|
47
|
+
case "plugin":
|
|
48
|
+
return await runPlugin(args.pluginArgv);
|
|
46
49
|
default:
|
|
47
50
|
process.stdout.write(helpText());
|
|
48
51
|
return 0;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/parse-args.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
export type CliCommand = "run" | "doctor" | "dump-config" | "serve" | "restart" | "help";
|
|
1
|
+
export type CliCommand = "run" | "doctor" | "dump-config" | "serve" | "restart" | "plugin" | "help";
|
|
2
2
|
export interface ParsedArgs {
|
|
3
3
|
readonly command: CliCommand;
|
|
4
|
+
/** Remaining argv after `plugin` (subcommand + specs). */
|
|
5
|
+
readonly pluginArgv: readonly string[];
|
|
4
6
|
readonly preset: string;
|
|
5
7
|
readonly prompt: string;
|
|
6
8
|
readonly promptExplicit: boolean;
|
package/dist/parse-args.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-args.d.ts","sourceRoot":"","sources":["../src/parse-args.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAClB,KAAK,GACL,QAAQ,GACR,aAAa,GACb,OAAO,GACP,SAAS,GACT,MAAM,CAAC;AAEX,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,QAAQ,CAAC,YAAY,EAAE,OAAO,GAAG,MAAM,CAAC;IACxC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,wDAAwD;IACxD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAeD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAOjD;
|
|
1
|
+
{"version":3,"file":"parse-args.d.ts","sourceRoot":"","sources":["../src/parse-args.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAClB,KAAK,GACL,QAAQ,GACR,aAAa,GACb,OAAO,GACP,SAAS,GACT,QAAQ,GACR,MAAM,CAAC;AAEX,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,0DAA0D;IAC1D,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,QAAQ,CAAC,YAAY,EAAE,OAAO,GAAG,MAAM,CAAC;IACxC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,wDAAwD;IACxD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAeD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAOjD;AAgCD,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,CAuL7D;AAED,wBAAgB,QAAQ,IAAI,MAAM,CA8CjC"}
|
package/dist/parse-args.js
CHANGED
|
@@ -29,6 +29,7 @@ function parsePort(raw) {
|
|
|
29
29
|
}
|
|
30
30
|
function emptyArgs(partial) {
|
|
31
31
|
return {
|
|
32
|
+
pluginArgv: [],
|
|
32
33
|
preset: "minimal",
|
|
33
34
|
prompt: "ping",
|
|
34
35
|
promptExplicit: false,
|
|
@@ -60,6 +61,7 @@ export function parseArgs(argv) {
|
|
|
60
61
|
first === "dump-config" ||
|
|
61
62
|
first === "serve" ||
|
|
62
63
|
first === "restart" ||
|
|
64
|
+
first === "plugin" ||
|
|
63
65
|
first === "help") {
|
|
64
66
|
command = first;
|
|
65
67
|
}
|
|
@@ -69,6 +71,10 @@ export function parseArgs(argv) {
|
|
|
69
71
|
else {
|
|
70
72
|
throw new Error(`unknown command: ${first}`);
|
|
71
73
|
}
|
|
74
|
+
// `plugin` owns the rest of argv (add/remove/list/path + specs).
|
|
75
|
+
if (command === "plugin") {
|
|
76
|
+
return emptyArgs({ command: "plugin", pluginArgv: args });
|
|
77
|
+
}
|
|
72
78
|
/** Product Host (`web`/`serve`) defaults to harness tools; `run` stays minimal for smoke. */
|
|
73
79
|
let preset = command === "serve" || command === "restart" ? "harness" : "minimal";
|
|
74
80
|
let promptFromFlag;
|
|
@@ -197,6 +203,7 @@ export function parseArgs(argv) {
|
|
|
197
203
|
: "ping";
|
|
198
204
|
return {
|
|
199
205
|
command: help && command !== "help" ? command : help ? "help" : command,
|
|
206
|
+
pluginArgv: [],
|
|
200
207
|
preset,
|
|
201
208
|
prompt,
|
|
202
209
|
promptExplicit,
|
|
@@ -225,6 +232,7 @@ Commands:
|
|
|
225
232
|
serve HTTP host + product UI (apps/web/dist)
|
|
226
233
|
web Alias for serve
|
|
227
234
|
restart Free the listen port, then serve (same flags as web)
|
|
235
|
+
plugin Install / remove / list user plugins (~/.xrk/plugins)
|
|
228
236
|
doctor Check node / workspace / product shell
|
|
229
237
|
dump-config Print layered config JSON
|
|
230
238
|
help Show this help
|
|
@@ -248,12 +256,15 @@ Options:
|
|
|
248
256
|
Env:
|
|
249
257
|
XRK_LOG / XRK_LOG_LEVEL silent|error|warn|info|debug (default info)
|
|
250
258
|
XRK_MCP_ALLOW=1 Allow mcp.connect for configured / saved servers
|
|
259
|
+
XRK_PLUGINS_DIR Plugin root (default: ~/.xrk/plugins when present)
|
|
251
260
|
|
|
252
261
|
Examples:
|
|
253
262
|
xrk-harness serve --preset harness
|
|
254
263
|
xrk-harness web --port 8080 --open --verbose
|
|
255
264
|
xrk-harness web --force
|
|
256
265
|
xrk-harness restart --workspace .
|
|
266
|
+
xrk-harness plugin add @huanlin/dsh-plugin-spur
|
|
267
|
+
xrk-harness plugin list
|
|
257
268
|
xrk-harness run --preset minimal "ping"
|
|
258
269
|
`;
|
|
259
270
|
}
|
package/dist/parse-args.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-args.js","sourceRoot":"","sources":["../src/parse-args.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"parse-args.js","sourceRoot":"","sources":["../src/parse-args.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type PluginKind = "client" | "process" | "both";
|
|
2
|
+
export interface ClassifiedPackage {
|
|
3
|
+
readonly name: string;
|
|
4
|
+
readonly version: string;
|
|
5
|
+
readonly kind: PluginKind;
|
|
6
|
+
readonly root: string;
|
|
7
|
+
/** Absolute path to browser `client.js` when kind includes client. */
|
|
8
|
+
readonly clientJs?: string;
|
|
9
|
+
/** Raw inject from xrk.client / dsh.client (pre-remap). */
|
|
10
|
+
readonly clientInject: readonly string[];
|
|
11
|
+
readonly clientImmediately: boolean;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Classify an unpacked package directory (with package.json).
|
|
15
|
+
* @throws when the package is not an installable XRK plugin.
|
|
16
|
+
*/
|
|
17
|
+
export declare function classifyPackage(root: string, pkg: Record<string, unknown>): ClassifiedPackage;
|
|
18
|
+
//# sourceMappingURL=classify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.d.ts","sourceRoot":"","sources":["../../src/plugin/classify.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;AAEvD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,2DAA2D;IAC3D,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;CACrC;AAmFD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,iBAAiB,CA+C7F"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Classify an unpacked npm package as XRK client / process / both / reject.
|
|
3
|
+
*/
|
|
4
|
+
import { existsSync } from "node:fs";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
function asRecord(value) {
|
|
7
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
8
|
+
return undefined;
|
|
9
|
+
}
|
|
10
|
+
return value;
|
|
11
|
+
}
|
|
12
|
+
function nestedField(pkg, ns, key) {
|
|
13
|
+
return asRecord(pkg[ns])?.[key];
|
|
14
|
+
}
|
|
15
|
+
function readClientMeta(pkg) {
|
|
16
|
+
const client = nestedField(pkg, "xrk", "client") ?? nestedField(pkg, "dsh", "client");
|
|
17
|
+
const rec = asRecord(client);
|
|
18
|
+
if (!rec)
|
|
19
|
+
return undefined;
|
|
20
|
+
const inject = Array.isArray(rec.inject)
|
|
21
|
+
? rec.inject.filter((x) => typeof x === "string")
|
|
22
|
+
: [];
|
|
23
|
+
return {
|
|
24
|
+
inject,
|
|
25
|
+
immediately: rec.immediately === true,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function hasProcessManifest(root, pkg) {
|
|
29
|
+
if (existsSync(path.join(root, "xrk.plugin.json")))
|
|
30
|
+
return true;
|
|
31
|
+
if (nestedField(pkg, "xrkseek", "plugin") !== undefined)
|
|
32
|
+
return true;
|
|
33
|
+
if (nestedField(pkg, "dsh", "plugin") !== undefined)
|
|
34
|
+
return true;
|
|
35
|
+
if (nestedField(pkg, "deepseek", "plugin") !== undefined)
|
|
36
|
+
return true;
|
|
37
|
+
if (pkg["dsh.plugin"] !== undefined || pkg["deepseek.plugin"] !== undefined) {
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
function hasCordisDep(deps) {
|
|
43
|
+
const rec = asRecord(deps);
|
|
44
|
+
return Boolean(rec &&
|
|
45
|
+
("@xrkseek/cordis" in rec ||
|
|
46
|
+
"@deepseek-ai/cordis" in rec));
|
|
47
|
+
}
|
|
48
|
+
function resolveClientJs(root, pkg) {
|
|
49
|
+
const candidates = [
|
|
50
|
+
path.join(root, "lib", "client.js"),
|
|
51
|
+
path.join(root, "dist", "client.js"),
|
|
52
|
+
path.join(root, "client.js"),
|
|
53
|
+
];
|
|
54
|
+
for (const c of candidates) {
|
|
55
|
+
if (existsSync(c))
|
|
56
|
+
return c;
|
|
57
|
+
}
|
|
58
|
+
const exportsField = asRecord(pkg.exports);
|
|
59
|
+
const clientExport = asRecord(exportsField?.["./client"]);
|
|
60
|
+
const def = (typeof clientExport?.default === "string" && clientExport.default) ||
|
|
61
|
+
(typeof clientExport?.import === "string" && clientExport.import) ||
|
|
62
|
+
(typeof exportsField?.["./client"] === "string"
|
|
63
|
+
? exportsField["./client"]
|
|
64
|
+
: undefined);
|
|
65
|
+
if (def) {
|
|
66
|
+
const abs = path.resolve(root, def);
|
|
67
|
+
if (existsSync(abs))
|
|
68
|
+
return abs;
|
|
69
|
+
}
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Classify an unpacked package directory (with package.json).
|
|
74
|
+
* @throws when the package is not an installable XRK plugin.
|
|
75
|
+
*/
|
|
76
|
+
export function classifyPackage(root, pkg) {
|
|
77
|
+
const name = typeof pkg.name === "string" ? pkg.name.trim() : "";
|
|
78
|
+
if (!name) {
|
|
79
|
+
throw new Error("package.json missing string name");
|
|
80
|
+
}
|
|
81
|
+
const version = typeof pkg.version === "string" && pkg.version.trim()
|
|
82
|
+
? pkg.version.trim()
|
|
83
|
+
: "0.0.0";
|
|
84
|
+
const clientMeta = readClientMeta(pkg);
|
|
85
|
+
const clientJs = clientMeta ? resolveClientJs(root, pkg) : undefined;
|
|
86
|
+
const isClient = Boolean(clientMeta && clientJs);
|
|
87
|
+
const isProcess = hasProcessManifest(root, pkg);
|
|
88
|
+
if (!isClient && !isProcess) {
|
|
89
|
+
if (hasCordisDep(pkg.peerDependencies) ||
|
|
90
|
+
hasCordisDep(pkg.dependencies)) {
|
|
91
|
+
throw new Error(`${name}: Cordis host packages are not applied on XRK Host (inventory stub only). Ship tools/commands as process plugins (xrk.plugin.json / xrkseek.plugin) or a client half (xrk.client / dsh.client + lib/client.js).`);
|
|
92
|
+
}
|
|
93
|
+
throw new Error(`${name}: not an XRK plugin — need xrk.client / dsh.client (+ lib/client.js) and/or a process manifest (xrk.plugin.json / xrkseek.plugin / dsh.plugin).`);
|
|
94
|
+
}
|
|
95
|
+
if (clientMeta && !clientJs) {
|
|
96
|
+
throw new Error(`${name}: declares xrk/dsh.client but no lib/client.js (or exports ./client) was found`);
|
|
97
|
+
}
|
|
98
|
+
const kind = isClient && isProcess ? "both" : isClient ? "client" : "process";
|
|
99
|
+
return {
|
|
100
|
+
name,
|
|
101
|
+
version,
|
|
102
|
+
kind,
|
|
103
|
+
root,
|
|
104
|
+
...(clientJs ? { clientJs } : {}),
|
|
105
|
+
clientInject: clientMeta?.inject ?? [],
|
|
106
|
+
clientImmediately: clientMeta?.immediately === true,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=classify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.js","sourceRoot":"","sources":["../../src/plugin/classify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface UnpackedPackage {
|
|
2
|
+
readonly root: string;
|
|
3
|
+
readonly pkg: Record<string, unknown>;
|
|
4
|
+
readonly cleanup: () => void;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Rewrite relative filesystem specs against the invoking directory.
|
|
8
|
+
* Absolute specs, registry names, and github:/git URLs pass through.
|
|
9
|
+
*/
|
|
10
|
+
export declare function anchorPathSpec(argument: string, cwd: string): string;
|
|
11
|
+
/**
|
|
12
|
+
* Prefer a local directory when the spec already points at an unpacked
|
|
13
|
+
* package (file:/link:/relative path with package.json). Otherwise npm pack.
|
|
14
|
+
*/
|
|
15
|
+
export declare function fetchPackage(spec: string, cwd?: string): UnpackedPackage;
|
|
16
|
+
//# sourceMappingURL=fetch-pack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-pack.d.ts","sourceRoot":"","sources":["../../src/plugin/fetch-pack.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAC9B;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAMpE;AAoBD;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,GAAG,GAAE,MAAsB,GAC1B,eAAe,CAmFjB"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fetch a package with `npm pack` and unpack it to a temp directory.
|
|
3
|
+
* Relative path / file: / link: specs are anchored to `cwd` (DSH posture).
|
|
4
|
+
*/
|
|
5
|
+
import { spawnSync } from "node:child_process";
|
|
6
|
+
import { existsSync, mkdtempSync, mkdirSync, readFileSync, readdirSync, rmSync, } from "node:fs";
|
|
7
|
+
import { tmpdir } from "node:os";
|
|
8
|
+
import path from "node:path";
|
|
9
|
+
/**
|
|
10
|
+
* Rewrite relative filesystem specs against the invoking directory.
|
|
11
|
+
* Absolute specs, registry names, and github:/git URLs pass through.
|
|
12
|
+
*/
|
|
13
|
+
export function anchorPathSpec(argument, cwd) {
|
|
14
|
+
const match = /^(?<prefix>(?:file|link):)?(?<path>\.{1,2}(?:[/\\].*)?)$/.exec(argument);
|
|
15
|
+
if (match?.groups?.path === undefined)
|
|
16
|
+
return argument;
|
|
17
|
+
const prefix = match.groups.prefix ?? "";
|
|
18
|
+
return `${prefix}${path.resolve(cwd, match.groups.path)}`;
|
|
19
|
+
}
|
|
20
|
+
function readPkgJson(dir) {
|
|
21
|
+
const text = readFileSync(path.join(dir, "package.json"), "utf8");
|
|
22
|
+
return JSON.parse(text);
|
|
23
|
+
}
|
|
24
|
+
function extractTarball(tgz, extractDir) {
|
|
25
|
+
mkdirSync(extractDir, { recursive: true });
|
|
26
|
+
const tarBin = process.platform === "win32" ? "tar.exe" : "tar";
|
|
27
|
+
const result = spawnSync(tarBin, ["-xzf", tgz, "-C", extractDir], {
|
|
28
|
+
encoding: "utf8",
|
|
29
|
+
});
|
|
30
|
+
if ((result.status ?? 1) !== 0) {
|
|
31
|
+
throw new Error(`failed to extract ${path.basename(tgz)}: ${(result.stderr || result.stdout || result.error?.message || "").trim()}`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Prefer a local directory when the spec already points at an unpacked
|
|
36
|
+
* package (file:/link:/relative path with package.json). Otherwise npm pack.
|
|
37
|
+
*/
|
|
38
|
+
export function fetchPackage(spec, cwd = process.cwd()) {
|
|
39
|
+
const anchored = anchorPathSpec(spec.trim(), cwd);
|
|
40
|
+
const bare = anchored.startsWith("file:") || anchored.startsWith("link:")
|
|
41
|
+
? anchored.slice(anchored.indexOf(":") + 1)
|
|
42
|
+
: anchored;
|
|
43
|
+
const looksLikePath = !/^(git\+|github:|https?:|npm:)/i.test(anchored) &&
|
|
44
|
+
(path.isAbsolute(bare) ||
|
|
45
|
+
bare.startsWith(".") ||
|
|
46
|
+
/[/\\]/.test(bare));
|
|
47
|
+
if (looksLikePath) {
|
|
48
|
+
const abs = path.resolve(cwd, bare);
|
|
49
|
+
if (existsSync(path.join(abs, "package.json"))) {
|
|
50
|
+
return {
|
|
51
|
+
root: abs,
|
|
52
|
+
pkg: readPkgJson(abs),
|
|
53
|
+
cleanup: () => { },
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const stage = mkdtempSync(path.join(tmpdir(), "xrk-plugin-pack-"));
|
|
58
|
+
const cleanup = () => {
|
|
59
|
+
try {
|
|
60
|
+
rmSync(stage, { recursive: true, force: true });
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
/* ignore */
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
try {
|
|
67
|
+
const result = spawnSync("npm", ["pack", anchored, "--pack-destination", stage], {
|
|
68
|
+
cwd,
|
|
69
|
+
encoding: "utf8",
|
|
70
|
+
shell: process.platform === "win32",
|
|
71
|
+
});
|
|
72
|
+
if (result.error) {
|
|
73
|
+
const code = result.error.code;
|
|
74
|
+
if (code === "ENOENT") {
|
|
75
|
+
throw new Error("npm not found on PATH — install Node.js (includes npm) to manage plugins");
|
|
76
|
+
}
|
|
77
|
+
throw result.error;
|
|
78
|
+
}
|
|
79
|
+
if ((result.status ?? 1) !== 0) {
|
|
80
|
+
const err = (result.stderr || result.stdout || "").trim();
|
|
81
|
+
throw new Error(`npm pack failed for ${JSON.stringify(anchored)}${err ? `: ${err}` : ""}`);
|
|
82
|
+
}
|
|
83
|
+
const tgz = readdirSync(stage).find((n) => n.endsWith(".tgz"));
|
|
84
|
+
if (!tgz) {
|
|
85
|
+
throw new Error(`npm pack produced no tarball for ${JSON.stringify(anchored)}`);
|
|
86
|
+
}
|
|
87
|
+
const extractDir = path.join(stage, "extract");
|
|
88
|
+
extractTarball(path.join(stage, tgz), extractDir);
|
|
89
|
+
const packageRoot = path.join(extractDir, "package");
|
|
90
|
+
if (!existsSync(path.join(packageRoot, "package.json"))) {
|
|
91
|
+
throw new Error(`unexpected pack layout for ${anchored}: missing package/`);
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
root: packageRoot,
|
|
95
|
+
pkg: readPkgJson(packageRoot),
|
|
96
|
+
cleanup,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
cleanup();
|
|
101
|
+
throw err;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=fetch-pack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-pack.js","sourceRoot":"","sources":["../../src/plugin/fetch-pack.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type InventoryEntry } from "./inventory.js";
|
|
2
|
+
export { anchorPathSpec, fetchPackage } from "./fetch-pack.js";
|
|
3
|
+
export { classifyPackage } from "./classify.js";
|
|
4
|
+
export { remapInjectId, remapInjectList } from "./remap-inject.js";
|
|
5
|
+
export { readInventory, reconcileBoot, type InventoryEntry, type PluginInventory, } from "./inventory.js";
|
|
6
|
+
export interface PluginIo {
|
|
7
|
+
readonly log: (line: string) => void;
|
|
8
|
+
readonly warn: (line: string) => void;
|
|
9
|
+
}
|
|
10
|
+
/** Resolve plugins root: `XRK_PLUGINS_DIR` or `{XRK_HOME}/plugins`. */
|
|
11
|
+
export declare function resolvePluginsDir(env?: NodeJS.ProcessEnv): string;
|
|
12
|
+
export declare function addPlugin(spec: string, options?: {
|
|
13
|
+
readonly pluginsDir?: string;
|
|
14
|
+
readonly cwd?: string;
|
|
15
|
+
readonly env?: NodeJS.ProcessEnv;
|
|
16
|
+
readonly io?: PluginIo;
|
|
17
|
+
}): InventoryEntry;
|
|
18
|
+
export declare function removePlugin(name: string, options?: {
|
|
19
|
+
readonly pluginsDir?: string;
|
|
20
|
+
readonly env?: NodeJS.ProcessEnv;
|
|
21
|
+
readonly io?: PluginIo;
|
|
22
|
+
}): void;
|
|
23
|
+
export declare function listPlugins(options?: {
|
|
24
|
+
readonly pluginsDir?: string;
|
|
25
|
+
readonly env?: NodeJS.ProcessEnv;
|
|
26
|
+
}): readonly InventoryEntry[];
|
|
27
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugin/index.ts"],"names":[],"mappings":"AAiBA,OAAO,EAKL,KAAK,cAAc,EACpB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EACL,aAAa,EACb,aAAa,EACb,KAAK,cAAc,EACnB,KAAK,eAAe,GACrB,MAAM,gBAAgB,CAAC;AAExB,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AAmBD,uEAAuE;AACvE,wBAAgB,iBAAiB,CAC/B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAIR;AAED,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IACP,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACjC,QAAQ,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC;CACnB,GACL,cAAc,CAgDhB;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IACP,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACjC,QAAQ,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC;CACnB,GACL,IAAI,CAkBN;AAED,wBAAgB,WAAW,CACzB,OAAO,GAAE;IACP,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CAC7B,GACL,SAAS,cAAc,EAAE,CAO3B"}
|