@okclaw-build/cli 1.0.0-beta.4 → 1.0.0-beta.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/dist/commands/edit.js +1 -0
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/feed.d.ts +0 -9
- package/dist/commands/feed.js +42 -97
- package/dist/commands/feed.js.map +1 -1
- package/dist/installers/channel.d.ts +10 -1
- package/dist/installers/channel.js +69 -8
- package/dist/installers/channel.js.map +1 -1
- package/package.json +1 -1
package/dist/commands/edit.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/commands/edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D;;GAEG;AACH,MAAM,OAAO,GAA2B;IACtC,IAAI,EAAM,GAAG,kBAAkB,UAAU;IACzC,QAAQ,EAAE,GAAG,kBAAkB,cAAc;IAC7C,IAAI,EAAM,GAAG,kBAAkB,UAAU;IACzC,MAAM,EAAI,GAAG,kBAAkB,YAAY;CAC5C,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAc;IAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,KAAK,CAAC,uBAAuB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,KAAK,CAAC,yBAAyB,CAAC,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7B,SAAS,CAAC,kBAAkB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,MAAM,KAAK,CAAC,UAAU,QAAQ,MAAM,IAAI,GAAG,CAAC,CAAC;IAC7C,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC;AAC7B,CAAC"}
|
|
1
|
+
{"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/commands/edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D;;GAEG;AACH,MAAM,OAAO,GAA2B;IACtC,IAAI,EAAM,GAAG,kBAAkB,UAAU;IACzC,QAAQ,EAAE,GAAG,kBAAkB,cAAc;IAC7C,IAAI,EAAM,GAAG,kBAAkB,UAAU;IACzC,MAAM,EAAI,GAAG,kBAAkB,YAAY;IAC3C,MAAM,EAAI,GAAG,kBAAkB,YAAY;CAC5C,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAc;IAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,KAAK,CAAC,uBAAuB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,KAAK,CAAC,yBAAyB,CAAC,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7B,SAAS,CAAC,kBAAkB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,MAAM,KAAK,CAAC,UAAU,QAAQ,MAAM,IAAI,GAAG,CAAC,CAAC;IAC7C,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC;AAC7B,CAAC"}
|
package/dist/commands/feed.d.ts
CHANGED
|
@@ -1,10 +1 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* okclaw feed --file <path>
|
|
3
|
-
*
|
|
4
|
-
* Feeds file content into OpenViking's memory system.
|
|
5
|
-
*
|
|
6
|
-
* - If the file is a .zip/.tar.gz, extract first then process each file.
|
|
7
|
-
* - For each text file, submit the entire file content as one session and extract memories.
|
|
8
|
-
* - Non-text files are added as resources (ov add-resource).
|
|
9
|
-
*/
|
|
10
1
|
export declare function feedCommand(args: string[]): Promise<void>;
|
package/dist/commands/feed.js
CHANGED
|
@@ -1,18 +1,22 @@
|
|
|
1
|
-
import { existsSync, readFileSync, writeFileSync, readdirSync, statSync, mkdirSync, rmSync
|
|
2
|
-
import { join, extname } from 'node:path';
|
|
3
|
-
import {
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync, appendFileSync, readdirSync, statSync, mkdirSync, rmSync } from 'node:fs';
|
|
2
|
+
import { join, extname, basename } from 'node:path';
|
|
3
|
+
import { spawn } from 'node:child_process';
|
|
4
4
|
import { info, warn, error, success } from '../utils/logger.js';
|
|
5
|
-
|
|
5
|
+
import { OPENCLAW_WORKSPACE } from '../utils/constants.js';
|
|
6
|
+
function run(cmd, args) {
|
|
7
|
+
return new Promise((resolve, reject) => {
|
|
8
|
+
const child = spawn(cmd, args, { stdio: 'inherit' });
|
|
9
|
+
child.on('error', reject);
|
|
10
|
+
child.on('close', (code) => {
|
|
11
|
+
if (code === 0)
|
|
12
|
+
resolve();
|
|
13
|
+
else
|
|
14
|
+
reject(new Error(`${cmd} exited with code ${code}`));
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
const MEMORY_FILE = `${OPENCLAW_WORKSPACE}/MEMORY.md`;
|
|
6
19
|
const TEXT_EXTENSIONS = new Set(['.md', '.txt', '.text', '.csv', '.json', '.xml', '.yaml', '.yml', '.log']);
|
|
7
|
-
/**
|
|
8
|
-
* okclaw feed --file <path>
|
|
9
|
-
*
|
|
10
|
-
* Feeds file content into OpenViking's memory system.
|
|
11
|
-
*
|
|
12
|
-
* - If the file is a .zip/.tar.gz, extract first then process each file.
|
|
13
|
-
* - For each text file, submit the entire file content as one session and extract memories.
|
|
14
|
-
* - Non-text files are added as resources (ov add-resource).
|
|
15
|
-
*/
|
|
16
20
|
export async function feedCommand(args) {
|
|
17
21
|
const fileIdx = args.indexOf('--file');
|
|
18
22
|
const filePath = fileIdx >= 0 ? args[fileIdx + 1] : undefined;
|
|
@@ -24,17 +28,23 @@ export async function feedCommand(args) {
|
|
|
24
28
|
error(`File not found: ${filePath}`);
|
|
25
29
|
process.exit(1);
|
|
26
30
|
}
|
|
31
|
+
mkdirSync(OPENCLAW_WORKSPACE, { recursive: true });
|
|
27
32
|
const ext = extname(filePath).toLowerCase();
|
|
28
33
|
if (ext === '.zip' || ext === '.gz' || ext === '.tgz' || filePath.endsWith('.tar.gz')) {
|
|
29
34
|
await feedArchive(filePath);
|
|
30
35
|
}
|
|
31
36
|
else if (isTextFile(ext)) {
|
|
32
|
-
|
|
37
|
+
const content = readFileSync(filePath, 'utf-8').trim();
|
|
38
|
+
if (!content) {
|
|
39
|
+
warn('Empty file, skipping');
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
writeFileSync(MEMORY_FILE, `# Memory\n\n## ${basename(filePath)}\n\n${content}\n`);
|
|
43
|
+
success(`MEMORY.md written (${content.length} chars)`);
|
|
33
44
|
}
|
|
34
45
|
else {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
success('Resource added.');
|
|
46
|
+
error(`Unsupported file type: ${ext}`);
|
|
47
|
+
process.exit(1);
|
|
38
48
|
}
|
|
39
49
|
}
|
|
40
50
|
async function feedArchive(archivePath) {
|
|
@@ -43,99 +53,34 @@ async function feedArchive(archivePath) {
|
|
|
43
53
|
try {
|
|
44
54
|
const ext = extname(archivePath).toLowerCase();
|
|
45
55
|
if (ext === '.zip') {
|
|
46
|
-
await
|
|
56
|
+
await run('unzip', ['-o', archivePath, '-d', tmpDir]);
|
|
47
57
|
}
|
|
48
58
|
else {
|
|
49
|
-
await
|
|
59
|
+
await run('tar', ['xzf', archivePath, '-C', tmpDir]);
|
|
50
60
|
}
|
|
51
61
|
const files = collectFiles(tmpDir);
|
|
52
62
|
info(`Extracted ${files.length} file(s) from archive`);
|
|
53
|
-
|
|
54
|
-
|
|
63
|
+
writeFileSync(MEMORY_FILE, '# Memory\n');
|
|
64
|
+
let count = 0;
|
|
65
|
+
for (const file of files) {
|
|
55
66
|
const fileExt = extname(file).toLowerCase();
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
await shell(`ov add-resource '${file}' -o json`);
|
|
62
|
-
info(' Added as resource');
|
|
67
|
+
if (!isTextFile(fileExt)) {
|
|
68
|
+
warn(`Skipping non-text file: ${basename(file)}`);
|
|
69
|
+
continue;
|
|
63
70
|
}
|
|
71
|
+
const content = readFileSync(file, 'utf-8').trim();
|
|
72
|
+
if (!content)
|
|
73
|
+
continue;
|
|
74
|
+
appendFileSync(MEMORY_FILE, `\n## ${basename(file)}\n\n${content}\n`);
|
|
75
|
+
count++;
|
|
76
|
+
info(`[${count}] Appended: ${basename(file)} (${content.length} chars)`);
|
|
64
77
|
}
|
|
65
|
-
success(`
|
|
78
|
+
success(`MEMORY.md written with ${count} file(s)`);
|
|
66
79
|
}
|
|
67
80
|
finally {
|
|
68
81
|
rmSync(tmpDir, { recursive: true, force: true });
|
|
69
82
|
}
|
|
70
83
|
}
|
|
71
|
-
/**
|
|
72
|
-
* Feed an entire text file as one session → extract memories.
|
|
73
|
-
* Whole-file submission gives LLM full context for better memory extraction.
|
|
74
|
-
*/
|
|
75
|
-
async function feedTextFile(filePath) {
|
|
76
|
-
const content = readFileSync(filePath, 'utf-8').trim();
|
|
77
|
-
if (!content) {
|
|
78
|
-
warn(`Skipping empty file: ${filePath}`);
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
info(` Feeding file content (${content.length} chars)...`);
|
|
82
|
-
// 1. Create session
|
|
83
|
-
const createResult = await curlJson('POST', `${OV_API}/api/v1/sessions`, {});
|
|
84
|
-
const sessionId = createResult?.result?.session_id;
|
|
85
|
-
if (!sessionId) {
|
|
86
|
-
throw new Error('Failed to create session');
|
|
87
|
-
}
|
|
88
|
-
try {
|
|
89
|
-
// 2. Add entire file as one user message
|
|
90
|
-
await curlJson('POST', `${OV_API}/api/v1/sessions/${sessionId}/messages`, {
|
|
91
|
-
role: 'user',
|
|
92
|
-
content,
|
|
93
|
-
});
|
|
94
|
-
// 3. Extract memories (sync — waits for LLM to analyze and extract, may take minutes)
|
|
95
|
-
const extractResult = await curlJson('POST', `${OV_API}/api/v1/sessions/${sessionId}/extract`, {});
|
|
96
|
-
const memories = Array.isArray(extractResult?.result) ? extractResult.result : [];
|
|
97
|
-
info(` Extracted ${memories.length} memories`);
|
|
98
|
-
}
|
|
99
|
-
finally {
|
|
100
|
-
// 4. Cleanup session (ignore errors — best effort)
|
|
101
|
-
try {
|
|
102
|
-
await curlJson('DELETE', `${OV_API}/api/v1/sessions/${sessionId}`, null);
|
|
103
|
-
}
|
|
104
|
-
catch {
|
|
105
|
-
// session cleanup is best-effort
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
110
|
-
async function curlJson(method, url, body) {
|
|
111
|
-
let cmd;
|
|
112
|
-
let tmpFile = null;
|
|
113
|
-
if (body === null) {
|
|
114
|
-
cmd = `curl -s -X ${method} '${url}'`;
|
|
115
|
-
}
|
|
116
|
-
else {
|
|
117
|
-
tmpFile = `/tmp/okclaw_curl_${process.pid}_${Date.now()}.json`;
|
|
118
|
-
writeFileSync(tmpFile, JSON.stringify(body), 'utf-8');
|
|
119
|
-
cmd = `curl -s -X ${method} '${url}' -H 'Content-Type: application/json' -d @'${tmpFile}'`;
|
|
120
|
-
}
|
|
121
|
-
try {
|
|
122
|
-
const result = await shellCapture(cmd);
|
|
123
|
-
if (result.code !== 0) {
|
|
124
|
-
throw new Error(`curl failed: ${result.stderr}`);
|
|
125
|
-
}
|
|
126
|
-
try {
|
|
127
|
-
return JSON.parse(result.stdout);
|
|
128
|
-
}
|
|
129
|
-
catch {
|
|
130
|
-
throw new Error(`Invalid JSON response: ${result.stdout}`);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
finally {
|
|
134
|
-
if (tmpFile && existsSync(tmpFile)) {
|
|
135
|
-
unlinkSync(tmpFile);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
84
|
function isTextFile(ext) {
|
|
140
85
|
return TEXT_EXTENSIONS.has(ext);
|
|
141
86
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feed.js","sourceRoot":"","sources":["../../src/commands/feed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"feed.js","sourceRoot":"","sources":["../../src/commands/feed.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,8 +4,17 @@ export declare class ChannelInstaller implements Installer {
|
|
|
4
4
|
constructor(channelName: string);
|
|
5
5
|
checkDeps(): Promise<void>;
|
|
6
6
|
install(version: string, packageUrl?: string): Promise<void>;
|
|
7
|
+
private verifyInstalled;
|
|
7
8
|
configure(config: Record<string, unknown>): Promise<void>;
|
|
8
|
-
|
|
9
|
+
/**
|
|
10
|
+
* Clean up both filesystem state (extensions/<name>) and openclaw.json state
|
|
11
|
+
* (plugins.entries/installs/allow.<name> + channels.<name>) for this channel,
|
|
12
|
+
* atomically. Partial cleanup — e.g., rm-ing the dir but leaving the JSON refs —
|
|
13
|
+
* leaves openclaw's config validation broken and poisons all subsequent
|
|
14
|
+
* `openclaw ...` commands ("unknown channel id: <name>").
|
|
15
|
+
*/
|
|
16
|
+
private cleanupStaleState;
|
|
17
|
+
private hasJsonRef;
|
|
9
18
|
private installFromLocalPackage;
|
|
10
19
|
/**
|
|
11
20
|
* Download tgz from npm (npmmirror) first, then install locally.
|
|
@@ -17,18 +17,29 @@ export class ChannelInstaller {
|
|
|
17
17
|
info(`${this.channelName} is bundled with openclaw, skipping install (config only).`);
|
|
18
18
|
return;
|
|
19
19
|
}
|
|
20
|
-
//
|
|
21
|
-
|
|
20
|
+
// Clean up any stale state (both the extension dir AND config entries) so openclaw's
|
|
21
|
+
// config validation passes when `openclaw plugins install` runs.
|
|
22
|
+
this.cleanupStaleState();
|
|
22
23
|
if (packageUrl) {
|
|
23
24
|
await this.installFromLocalPackage(packageUrl);
|
|
24
25
|
}
|
|
25
26
|
else {
|
|
26
27
|
await this.installViaNpmPack(version);
|
|
27
28
|
}
|
|
29
|
+
// Verify install actually landed — otherwise configure() would write channels.<name>
|
|
30
|
+
// into openclaw.json against a non-existent plugin and brick the runtime.
|
|
31
|
+
this.verifyInstalled();
|
|
28
32
|
// Add to plugins.allow so openclaw trusts this plugin
|
|
29
33
|
await this.addToPluginsAllow();
|
|
30
34
|
info(`${this.channelName}@${version} installed.`);
|
|
31
35
|
}
|
|
36
|
+
verifyInstalled() {
|
|
37
|
+
const pluginDir = `${OPENCLAW_HOME}/extensions/${this.channelName}`;
|
|
38
|
+
if (!existsSync(pluginDir)) {
|
|
39
|
+
throw new Error(`Install verification failed: ${pluginDir} not found after "openclaw plugins install". ` +
|
|
40
|
+
`The install command may have silently skipped due to stale config; aborting before configure() runs.`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
32
43
|
async configure(config) {
|
|
33
44
|
if (!config || Object.keys(config).length === 0)
|
|
34
45
|
return;
|
|
@@ -40,13 +51,63 @@ export class ChannelInstaller {
|
|
|
40
51
|
info(`${this.channelName} configured.`);
|
|
41
52
|
}
|
|
42
53
|
// ---- private ----
|
|
43
|
-
|
|
54
|
+
/**
|
|
55
|
+
* Clean up both filesystem state (extensions/<name>) and openclaw.json state
|
|
56
|
+
* (plugins.entries/installs/allow.<name> + channels.<name>) for this channel,
|
|
57
|
+
* atomically. Partial cleanup — e.g., rm-ing the dir but leaving the JSON refs —
|
|
58
|
+
* leaves openclaw's config validation broken and poisons all subsequent
|
|
59
|
+
* `openclaw ...` commands ("unknown channel id: <name>").
|
|
60
|
+
*/
|
|
61
|
+
cleanupStaleState() {
|
|
44
62
|
const pluginDir = `${OPENCLAW_HOME}/extensions/${this.channelName}`;
|
|
45
|
-
|
|
46
|
-
|
|
63
|
+
const configFile = `${OPENCLAW_HOME}/openclaw.json`;
|
|
64
|
+
const hadDir = existsSync(pluginDir);
|
|
65
|
+
const hadJsonRef = this.hasJsonRef(configFile);
|
|
66
|
+
if (!hadDir && !hadJsonRef)
|
|
67
|
+
return;
|
|
68
|
+
info(`Cleaning stale state for ${this.channelName} (dir=${hadDir}, jsonRefs=${hadJsonRef})`);
|
|
69
|
+
if (hadJsonRef) {
|
|
70
|
+
try {
|
|
71
|
+
const cfg = JSON.parse(readFileSync(configFile, 'utf8'));
|
|
72
|
+
if (cfg.channels)
|
|
73
|
+
delete cfg.channels[this.channelName];
|
|
74
|
+
if (cfg.plugins?.entries)
|
|
75
|
+
delete cfg.plugins.entries[this.channelName];
|
|
76
|
+
if (cfg.plugins?.installs)
|
|
77
|
+
delete cfg.plugins.installs[this.channelName];
|
|
78
|
+
if (Array.isArray(cfg.plugins?.allow)) {
|
|
79
|
+
cfg.plugins.allow = cfg.plugins.allow.filter((p) => p !== this.channelName);
|
|
80
|
+
}
|
|
81
|
+
writeFileSync(configFile, JSON.stringify(cfg, null, 2) + '\n', 'utf8');
|
|
82
|
+
}
|
|
83
|
+
catch (e) {
|
|
84
|
+
warn(`Failed to clean openclaw.json: ${e}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (hadDir) {
|
|
47
88
|
rmSync(pluginDir, { recursive: true, force: true });
|
|
48
89
|
}
|
|
49
90
|
}
|
|
91
|
+
hasJsonRef(configFile) {
|
|
92
|
+
if (!existsSync(configFile))
|
|
93
|
+
return false;
|
|
94
|
+
try {
|
|
95
|
+
const cfg = JSON.parse(readFileSync(configFile, 'utf8'));
|
|
96
|
+
if (cfg.channels?.[this.channelName])
|
|
97
|
+
return true;
|
|
98
|
+
if (cfg.plugins?.entries?.[this.channelName])
|
|
99
|
+
return true;
|
|
100
|
+
if (cfg.plugins?.installs?.[this.channelName])
|
|
101
|
+
return true;
|
|
102
|
+
if (Array.isArray(cfg.plugins?.allow) && cfg.plugins.allow.includes(this.channelName))
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
// corrupted JSON — let cleanup run anyway
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
50
111
|
async installFromLocalPackage(packageUrl) {
|
|
51
112
|
mkdirSync(OKCLAW_TMP_DIR, { recursive: true });
|
|
52
113
|
const archive = `${OKCLAW_TMP_DIR}/${this.channelName}-plugin.tgz`;
|
|
@@ -119,9 +180,9 @@ export class ChannelInstaller {
|
|
|
119
180
|
}
|
|
120
181
|
else {
|
|
121
182
|
const strVal = String(value).replace(/'/g, "'\\''");
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
});
|
|
183
|
+
// Let errors propagate — silently skipping a config set leaves openclaw.json
|
|
184
|
+
// in a half-written state that breaks config validation at runtime.
|
|
185
|
+
await shell(`openclaw config set '${path}' '${strVal}'`);
|
|
125
186
|
}
|
|
126
187
|
}
|
|
127
188
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/installers/channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAErF,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE3H,MAAM,OAAO,gBAAgB;IACP;IAApB,YAAoB,WAAmB;QAAnB,gBAAW,GAAX,WAAW,CAAQ;IAAG,CAAC;IAE3C,KAAK,CAAC,SAAS;QACb,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;QAC1B,MAAM,aAAa,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAe,EAAE,UAAmB;QAChD,IAAI,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,4DAA4D,CAAC,CAAC;YACtF,OAAO;QACT,CAAC;QAED,
|
|
1
|
+
{"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/installers/channel.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED