@okclaw-build/cli 1.0.0-beta.2 → 1.0.0-beta.20
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/check.js +22 -6
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/edit.d.ts +2 -7
- package/dist/commands/edit.js +28 -15
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/feed.d.ts +0 -9
- package/dist/commands/feed.js +80 -103
- package/dist/commands/feed.js.map +1 -1
- package/dist/commands/install.js +34 -9
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/service.js +48 -11
- package/dist/commands/service.js.map +1 -1
- package/dist/commands/show.d.ts +13 -0
- package/dist/commands/show.js +49 -0
- package/dist/commands/show.js.map +1 -0
- package/dist/commands/skill.d.ts +1 -0
- package/dist/commands/skill.js +114 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/uninstall.d.ts +1 -0
- package/dist/commands/uninstall.js +46 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/index.js +93 -7
- package/dist/index.js.map +1 -1
- package/dist/installers/base.d.ts +1 -0
- package/dist/installers/channel.d.ts +10 -1
- package/dist/installers/channel.js +69 -8
- package/dist/installers/channel.js.map +1 -1
- package/dist/installers/openclaw.d.ts +1 -0
- package/dist/installers/openclaw.js +73 -8
- package/dist/installers/openclaw.js.map +1 -1
- package/dist/installers/openviking.js +1 -2
- package/dist/installers/openviking.js.map +1 -1
- package/dist/installers/skill.d.ts +1 -0
- package/dist/installers/skill.js +17 -4
- package/dist/installers/skill.js.map +1 -1
- package/dist/output/mode.d.ts +11 -0
- package/dist/output/mode.js +27 -0
- package/dist/output/mode.js.map +1 -0
- package/dist/output/ndjson.d.ts +57 -0
- package/dist/output/ndjson.js +136 -0
- package/dist/output/ndjson.js.map +1 -0
- package/dist/utils/constants.d.ts +0 -2
- package/dist/utils/constants.js +1 -4
- package/dist/utils/constants.js.map +1 -1
- package/dist/utils/deps.d.ts +0 -5
- package/dist/utils/deps.js +1 -88
- package/dist/utils/deps.js.map +1 -1
- package/dist/utils/logger.d.ts +10 -0
- package/dist/utils/logger.js +31 -4
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/mirror.js +7 -0
- package/dist/utils/mirror.js.map +1 -1
- package/dist/utils/shell.d.ts +12 -2
- package/dist/utils/shell.js +66 -3
- package/dist/utils/shell.js.map +1 -1
- package/package.json +3 -2
package/dist/commands/check.js
CHANGED
|
@@ -1,11 +1,27 @@
|
|
|
1
|
-
import { ensureNodeVersion
|
|
1
|
+
import { ensureNodeVersion } from '../utils/deps.js';
|
|
2
2
|
import { configureMirrors } from '../utils/mirror.js';
|
|
3
|
-
import { info, success } from '../utils/logger.js';
|
|
3
|
+
import { info, success, error } from '../utils/logger.js';
|
|
4
|
+
import { NdjsonEmitter, registerExitHandlers } from '../output/ndjson.js';
|
|
4
5
|
export async function checkCommand() {
|
|
6
|
+
const emitter = new NdjsonEmitter('ensure_runtime');
|
|
7
|
+
registerExitHandlers(emitter);
|
|
8
|
+
emitter.start('checking system dependencies');
|
|
5
9
|
info('Checking system dependencies...');
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
+
try {
|
|
11
|
+
emitter.stepStart('check-node', 'checking Node.js version');
|
|
12
|
+
await ensureNodeVersion();
|
|
13
|
+
emitter.stepDone('check-node', 'node ok');
|
|
14
|
+
emitter.stepStart('mirrors', 'configuring mirrors');
|
|
15
|
+
await configureMirrors();
|
|
16
|
+
emitter.stepDone('mirrors', 'mirrors configured');
|
|
17
|
+
success('All dependencies satisfied.');
|
|
18
|
+
emitter.end(true, 0);
|
|
19
|
+
}
|
|
20
|
+
catch (e) {
|
|
21
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
22
|
+
error(msg);
|
|
23
|
+
emitter.end(false, 1, 'E_CHECK_FAILED', { error: msg });
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
10
26
|
}
|
|
11
27
|
//# sourceMappingURL=check.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE1E,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,gBAAgB,CAAC,CAAC;IACpD,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAE9B,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC9C,IAAI,CAAC,iCAAiC,CAAC,CAAC;IACxC,IAAI,CAAC;QACH,OAAO,CAAC,SAAS,CAAC,YAAY,EAAE,0BAA0B,CAAC,CAAC;QAC5D,MAAM,iBAAiB,EAAE,CAAC;QAC1B,OAAO,CAAC,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QAE1C,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,qBAAqB,CAAC,CAAC;QACpD,MAAM,gBAAgB,EAAE,CAAC;QACzB,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;QAElD,OAAO,CAAC,6BAA6B,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACvB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvD,KAAK,CAAC,GAAG,CAAC,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,gBAAgB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
package/dist/commands/edit.d.ts
CHANGED
|
@@ -1,10 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Copies a file to the openclaw workspace directory.
|
|
5
|
-
* user → ~/.openclaw/workspace/USER.md
|
|
6
|
-
* identity → ~/.openclaw/workspace/IDENTITY.md
|
|
7
|
-
* soul → ~/.openclaw/workspace/SOUL.md
|
|
8
|
-
* agents → ~/.openclaw/workspace/AGENTS.md
|
|
2
|
+
* 7 个受支持的编辑目标:6 个 markdown 位于 workspace,openclaw.json 位于 OPENCLAW_HOME。
|
|
9
3
|
*/
|
|
4
|
+
export declare const TARGETS: Record<string, string>;
|
|
10
5
|
export declare function editCommand(args: string[]): Promise<void>;
|
package/dist/commands/edit.js
CHANGED
|
@@ -1,44 +1,57 @@
|
|
|
1
1
|
import { existsSync, mkdirSync } from 'node:fs';
|
|
2
|
+
import { dirname } from 'node:path';
|
|
2
3
|
import { shell } from '../utils/shell.js';
|
|
3
4
|
import { info, error } from '../utils/logger.js';
|
|
4
|
-
import { OPENCLAW_WORKSPACE } from '../utils/constants.js';
|
|
5
|
+
import { OPENCLAW_HOME, OPENCLAW_WORKSPACE } from '../utils/constants.js';
|
|
6
|
+
import { NdjsonEmitter, registerExitHandlers } from '../output/ndjson.js';
|
|
5
7
|
/**
|
|
6
|
-
*
|
|
8
|
+
* 7 个受支持的编辑目标:6 个 markdown 位于 workspace,openclaw.json 位于 OPENCLAW_HOME。
|
|
7
9
|
*/
|
|
8
|
-
const TARGETS = {
|
|
10
|
+
export const TARGETS = {
|
|
9
11
|
user: `${OPENCLAW_WORKSPACE}/USER.md`,
|
|
10
12
|
identity: `${OPENCLAW_WORKSPACE}/IDENTITY.md`,
|
|
11
13
|
soul: `${OPENCLAW_WORKSPACE}/SOUL.md`,
|
|
12
14
|
agents: `${OPENCLAW_WORKSPACE}/AGENTS.md`,
|
|
15
|
+
memory: `${OPENCLAW_WORKSPACE}/MEMORY.md`,
|
|
16
|
+
tools: `${OPENCLAW_WORKSPACE}/TOOLS.md`,
|
|
17
|
+
'openclaw-json': `${OPENCLAW_HOME}/openclaw.json`,
|
|
13
18
|
};
|
|
14
|
-
/**
|
|
15
|
-
* okclaw edit <target> --file <path>
|
|
16
|
-
*
|
|
17
|
-
* Copies a file to the openclaw workspace directory.
|
|
18
|
-
* user → ~/.openclaw/workspace/USER.md
|
|
19
|
-
* identity → ~/.openclaw/workspace/IDENTITY.md
|
|
20
|
-
* soul → ~/.openclaw/workspace/SOUL.md
|
|
21
|
-
* agents → ~/.openclaw/workspace/AGENTS.md
|
|
22
|
-
*/
|
|
23
19
|
export async function editCommand(args) {
|
|
20
|
+
const emitter = new NdjsonEmitter('file_write');
|
|
21
|
+
registerExitHandlers(emitter);
|
|
24
22
|
const target = args[0];
|
|
25
23
|
if (!target || !TARGETS[target]) {
|
|
26
24
|
error(`Usage: okclaw edit <${Object.keys(TARGETS).join('|')}> --file <path>`);
|
|
25
|
+
emitter.end(false, 1, 'E_USAGE');
|
|
27
26
|
process.exit(1);
|
|
28
27
|
}
|
|
29
28
|
const fileIdx = args.indexOf('--file');
|
|
30
29
|
const filePath = fileIdx >= 0 ? args[fileIdx + 1] : undefined;
|
|
31
30
|
if (!filePath) {
|
|
32
31
|
error('Missing --file argument');
|
|
32
|
+
emitter.end(false, 1, 'E_USAGE');
|
|
33
33
|
process.exit(1);
|
|
34
34
|
}
|
|
35
35
|
if (!existsSync(filePath)) {
|
|
36
36
|
error(`File not found: ${filePath}`);
|
|
37
|
+
emitter.end(false, 1, 'E_SRC_NOT_FOUND');
|
|
37
38
|
process.exit(1);
|
|
38
39
|
}
|
|
39
40
|
const dest = TARGETS[target];
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
41
|
+
emitter.start(`writing ${target}`, { target, dest });
|
|
42
|
+
try {
|
|
43
|
+
emitter.stepStart('write', `copying to ${dest}`);
|
|
44
|
+
mkdirSync(dirname(dest), { recursive: true });
|
|
45
|
+
await shell(`cp -f '${filePath}' '${dest}'`);
|
|
46
|
+
emitter.stepDone('write', 'written');
|
|
47
|
+
info(`Written to ${dest}`);
|
|
48
|
+
emitter.end(true, 0, undefined, { target, dest });
|
|
49
|
+
}
|
|
50
|
+
catch (e) {
|
|
51
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
52
|
+
error(msg);
|
|
53
|
+
emitter.end(false, 1, 'E_WRITE_FAILED', { error: msg });
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
43
56
|
}
|
|
44
57
|
//# sourceMappingURL=edit.js.map
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/commands/edit.ts"],"names":[],"mappings":"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"}
|
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,141 +1,118 @@
|
|
|
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
|
+
import { NdjsonEmitter, registerExitHandlers } from '../output/ndjson.js';
|
|
7
|
+
function run(cmd, args) {
|
|
8
|
+
return new Promise((resolve, reject) => {
|
|
9
|
+
const child = spawn(cmd, args, { stdio: 'inherit' });
|
|
10
|
+
child.on('error', reject);
|
|
11
|
+
child.on('close', (code) => {
|
|
12
|
+
if (code === 0)
|
|
13
|
+
resolve();
|
|
14
|
+
else
|
|
15
|
+
reject(new Error(`${cmd} exited with code ${code}`));
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
const MEMORY_FILE = `${OPENCLAW_WORKSPACE}/MEMORY.md`;
|
|
6
20
|
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
21
|
export async function feedCommand(args) {
|
|
22
|
+
const emitter = new NdjsonEmitter('knowledge_feed');
|
|
23
|
+
// registerExitHandlers 在 ndjson + detached 路径里尤为关键:
|
|
24
|
+
// 进程被 SIGKILL 无法捕获;SIGTERM / 异常 / unhandledRejection 都能兜底发 end。
|
|
25
|
+
registerExitHandlers(emitter);
|
|
17
26
|
const fileIdx = args.indexOf('--file');
|
|
18
27
|
const filePath = fileIdx >= 0 ? args[fileIdx + 1] : undefined;
|
|
19
28
|
if (!filePath) {
|
|
20
29
|
error('Usage: okclaw feed --file <path>');
|
|
30
|
+
emitter.end(false, 1, 'E_USAGE');
|
|
21
31
|
process.exit(1);
|
|
22
32
|
}
|
|
23
33
|
if (!existsSync(filePath)) {
|
|
24
34
|
error(`File not found: ${filePath}`);
|
|
35
|
+
emitter.end(false, 1, 'E_SRC_NOT_FOUND');
|
|
25
36
|
process.exit(1);
|
|
26
37
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
38
|
+
emitter.start(`feeding ${filePath}`, { filePath });
|
|
39
|
+
try {
|
|
40
|
+
mkdirSync(OPENCLAW_WORKSPACE, { recursive: true });
|
|
41
|
+
const ext = extname(filePath).toLowerCase();
|
|
42
|
+
if (ext === '.zip' || ext === '.gz' || ext === '.tgz' || filePath.endsWith('.tar.gz')) {
|
|
43
|
+
await feedArchive(filePath, emitter);
|
|
44
|
+
}
|
|
45
|
+
else if (isTextFile(ext)) {
|
|
46
|
+
emitter.stepStart('read', `reading ${filePath}`);
|
|
47
|
+
const content = readFileSync(filePath, 'utf-8').trim();
|
|
48
|
+
if (!content) {
|
|
49
|
+
warn('Empty file, skipping');
|
|
50
|
+
emitter.stepDone('read', 'empty file, nothing to feed');
|
|
51
|
+
emitter.end(true, 0, undefined, { skipped: true });
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
emitter.stepDone('read', `read ${content.length} chars`);
|
|
55
|
+
emitter.stepStart('write', `writing ${MEMORY_FILE}`);
|
|
56
|
+
writeFileSync(MEMORY_FILE, `# Memory\n\n## ${basename(filePath)}\n\n${content}\n`);
|
|
57
|
+
emitter.stepDone('write', 'MEMORY.md written');
|
|
58
|
+
success(`MEMORY.md written (${content.length} chars)`);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
error(`Unsupported file type: ${ext}`);
|
|
62
|
+
emitter.end(false, 1, 'E_UNSUPPORTED_FILE_TYPE');
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
65
|
+
emitter.end(true, 0, undefined, { filePath });
|
|
33
66
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
67
|
+
catch (e) {
|
|
68
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
69
|
+
error(msg);
|
|
70
|
+
emitter.end(false, 1, 'E_FEED_FAILED', { error: msg });
|
|
71
|
+
process.exit(1);
|
|
38
72
|
}
|
|
39
73
|
}
|
|
40
|
-
async function feedArchive(archivePath) {
|
|
74
|
+
async function feedArchive(archivePath, emitter) {
|
|
41
75
|
const tmpDir = '/tmp/okclaw_feed_extract_' + process.pid;
|
|
42
76
|
mkdirSync(tmpDir, { recursive: true });
|
|
43
77
|
try {
|
|
78
|
+
emitter.stepStart('extract', `extracting ${archivePath}`);
|
|
44
79
|
const ext = extname(archivePath).toLowerCase();
|
|
45
80
|
if (ext === '.zip') {
|
|
46
|
-
await
|
|
81
|
+
await run('unzip', ['-o', archivePath, '-d', tmpDir]);
|
|
47
82
|
}
|
|
48
83
|
else {
|
|
49
|
-
await
|
|
84
|
+
await run('tar', ['xzf', archivePath, '-C', tmpDir]);
|
|
50
85
|
}
|
|
51
86
|
const files = collectFiles(tmpDir);
|
|
87
|
+
emitter.stepDone('extract', `extracted ${files.length} file(s)`);
|
|
52
88
|
info(`Extracted ${files.length} file(s) from archive`);
|
|
53
|
-
|
|
54
|
-
|
|
89
|
+
emitter.stepStart('append', `appending files to ${MEMORY_FILE}`);
|
|
90
|
+
writeFileSync(MEMORY_FILE, '# Memory\n');
|
|
91
|
+
let count = 0;
|
|
92
|
+
for (let idx = 0; idx < files.length; idx++) {
|
|
93
|
+
const file = files[idx];
|
|
55
94
|
const fileExt = extname(file).toLowerCase();
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
95
|
+
if (!isTextFile(fileExt)) {
|
|
96
|
+
warn(`Skipping non-text file: ${basename(file)}`);
|
|
97
|
+
continue;
|
|
59
98
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
99
|
+
const content = readFileSync(file, 'utf-8').trim();
|
|
100
|
+
if (!content)
|
|
101
|
+
continue;
|
|
102
|
+
appendFileSync(MEMORY_FILE, `\n## ${basename(file)}\n\n${content}\n`);
|
|
103
|
+
count++;
|
|
104
|
+
info(`[${count}] Appended: ${basename(file)} (${content.length} chars)`);
|
|
105
|
+
if (files.length > 0) {
|
|
106
|
+
emitter.progress('append', (idx + 1) / files.length, `appended ${count}`);
|
|
63
107
|
}
|
|
64
108
|
}
|
|
65
|
-
|
|
109
|
+
emitter.stepDone('append', `MEMORY.md written with ${count} file(s)`);
|
|
110
|
+
success(`MEMORY.md written with ${count} file(s)`);
|
|
66
111
|
}
|
|
67
112
|
finally {
|
|
68
113
|
rmSync(tmpDir, { recursive: true, force: true });
|
|
69
114
|
}
|
|
70
115
|
}
|
|
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
116
|
function isTextFile(ext) {
|
|
140
117
|
return TEXT_EXTENSIONS.has(ext);
|
|
141
118
|
}
|
|
@@ -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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"}
|
package/dist/commands/install.js
CHANGED
|
@@ -5,6 +5,7 @@ import { ChannelInstaller } from '../installers/channel.js';
|
|
|
5
5
|
import { SkillInstaller } from '../installers/skill.js';
|
|
6
6
|
import { configureMirrors } from '../utils/mirror.js';
|
|
7
7
|
import { info, error, success } from '../utils/logger.js';
|
|
8
|
+
import { NdjsonEmitter, registerExitHandlers } from '../output/ndjson.js';
|
|
8
9
|
function getInstaller(component) {
|
|
9
10
|
switch (component) {
|
|
10
11
|
case 'openclaw': return new OpenclawInstaller();
|
|
@@ -17,9 +18,12 @@ function getInstaller(component) {
|
|
|
17
18
|
}
|
|
18
19
|
}
|
|
19
20
|
export async function installCommand(args) {
|
|
21
|
+
const emitter = new NdjsonEmitter('install');
|
|
22
|
+
registerExitHandlers(emitter);
|
|
20
23
|
const component = args[0];
|
|
21
24
|
if (!component) {
|
|
22
25
|
error('Usage: okclaw install <component> --version <ver> [--config <json>] [--config-file <path>] [--package-url <url>]');
|
|
26
|
+
emitter.end(false, 1, 'E_USAGE');
|
|
23
27
|
process.exit(1);
|
|
24
28
|
}
|
|
25
29
|
let version = '';
|
|
@@ -37,6 +41,7 @@ export async function installCommand(args) {
|
|
|
37
41
|
}
|
|
38
42
|
catch {
|
|
39
43
|
error('Invalid --config JSON');
|
|
44
|
+
emitter.end(false, 1, 'E_CONFIG_JSON');
|
|
40
45
|
process.exit(1);
|
|
41
46
|
}
|
|
42
47
|
continue;
|
|
@@ -48,6 +53,7 @@ export async function installCommand(args) {
|
|
|
48
53
|
}
|
|
49
54
|
catch (e) {
|
|
50
55
|
error(`Failed to read config file: ${e}`);
|
|
56
|
+
emitter.end(false, 1, 'E_CONFIG_FILE');
|
|
51
57
|
process.exit(1);
|
|
52
58
|
}
|
|
53
59
|
continue;
|
|
@@ -59,19 +65,38 @@ export async function installCommand(args) {
|
|
|
59
65
|
}
|
|
60
66
|
if (!version) {
|
|
61
67
|
error('--version is required');
|
|
68
|
+
emitter.end(false, 1, 'E_VERSION_REQUIRED');
|
|
62
69
|
process.exit(1);
|
|
63
70
|
}
|
|
71
|
+
emitter.start(`installing ${component}@${version}`, { component, version });
|
|
64
72
|
info(`Installing ${component}@${version}...`);
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
73
|
+
try {
|
|
74
|
+
emitter.stepStart('check-deps', 'checking system dependencies');
|
|
75
|
+
const installer = getInstaller(component);
|
|
76
|
+
await installer.checkDeps();
|
|
77
|
+
emitter.stepDone('check-deps', 'dependencies ok');
|
|
78
|
+
emitter.stepStart('mirrors', 'configuring npm/pip mirrors');
|
|
79
|
+
await configureMirrors();
|
|
80
|
+
emitter.stepDone('mirrors', 'mirrors configured');
|
|
81
|
+
emitter.stepStart('install', `installing ${component}@${version}`);
|
|
82
|
+
await installer.install(version, packageUrl);
|
|
83
|
+
emitter.stepDone('install', `${component}@${version} installed`);
|
|
84
|
+
if (config) {
|
|
85
|
+
emitter.stepStart('configure', 'applying configuration');
|
|
86
|
+
await installer.configure(config);
|
|
87
|
+
emitter.stepDone('configure', 'configuration applied');
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
info('No config provided, keeping existing configuration.');
|
|
91
|
+
}
|
|
92
|
+
success(`${component}@${version} installed.`);
|
|
93
|
+
emitter.end(true, 0, undefined, { component, version });
|
|
71
94
|
}
|
|
72
|
-
|
|
73
|
-
|
|
95
|
+
catch (e) {
|
|
96
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
97
|
+
error(msg);
|
|
98
|
+
emitter.end(false, 1, 'E_INSTALL_FAILED', { error: msg });
|
|
99
|
+
process.exit(1);
|
|
74
100
|
}
|
|
75
|
-
success(`${component}@${version} installed.`);
|
|
76
101
|
}
|
|
77
102
|
//# sourceMappingURL=install.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE1E,SAAS,YAAY,CAAC,SAAiB;IACrC,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,UAAU,CAAC,CAAC,OAAO,IAAI,iBAAiB,EAAE,CAAC;QAChD,KAAK,YAAY,CAAC,CAAC,OAAO,IAAI,mBAAmB,EAAE,CAAC;QACpD;YACE,IAAI,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACnC,OAAO,IAAI,cAAc,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;YAClE,CAAC;YACD,OAAO,IAAI,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAc;IACjD,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,SAAS,CAAC,CAAC;IAC7C,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAE9B,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1B,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,KAAK,CAAC,kHAAkH,CAAC,CAAC;QAC1H,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,MAA2C,CAAC;IAChD,IAAI,UAA8B,CAAC;IAEnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEpB,IAAI,CAAC,GAAG,KAAK,WAAW,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACtE,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5D,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,UAAU,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC;gBAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC;gBAC7C,KAAK,CAAC,uBAAuB,CAAC,CAAC;gBAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC;gBACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,SAAS;QACX,CAAC;QACD,IAAI,CAAC,GAAG,KAAK,eAAe,IAAI,GAAG,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAC7E,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACnE,IAAI,CAAC;gBAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;YAAC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACtE,KAAK,CAAC,+BAA+B,CAAC,EAAE,CAAC,CAAC;gBAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC;gBACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,SAAS;QACX,CAAC;QACD,IAAI,CAAC,GAAG,KAAK,eAAe,IAAI,GAAG,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACjF,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/D,SAAS;QACX,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,oBAAoB,CAAC,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,cAAc,SAAS,IAAI,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5E,IAAI,CAAC,cAAc,SAAS,IAAI,OAAO,KAAK,CAAC,CAAC;IAE9C,IAAI,CAAC;QACH,OAAO,CAAC,SAAS,CAAC,YAAY,EAAE,8BAA8B,CAAC,CAAC;QAChE,MAAM,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;QAC1C,MAAM,SAAS,CAAC,SAAS,EAAE,CAAC;QAC5B,OAAO,CAAC,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;QAElD,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,6BAA6B,CAAC,CAAC;QAC5D,MAAM,gBAAgB,EAAE,CAAC;QACzB,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;QAElD,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,cAAc,SAAS,IAAI,OAAO,EAAE,CAAC,CAAC;QACnE,MAAM,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC7C,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,GAAG,SAAS,IAAI,OAAO,YAAY,CAAC,CAAC;QAEjE,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE,wBAAwB,CAAC,CAAC;YACzD,MAAM,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAClC,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAAC;QACzD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,qDAAqD,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO,CAAC,GAAG,SAAS,IAAI,OAAO,aAAa,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvD,KAAK,CAAC,GAAG,CAAC,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,kBAAkB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
package/dist/commands/service.js
CHANGED
|
@@ -1,23 +1,60 @@
|
|
|
1
1
|
import { shell, shellCapture } from '../utils/shell.js';
|
|
2
2
|
import { info, success } from '../utils/logger.js';
|
|
3
3
|
import { OPENVIKING_ENV } from '../utils/constants.js';
|
|
4
|
+
import { NdjsonEmitter, registerExitHandlers } from '../output/ndjson.js';
|
|
5
|
+
import { isNdjson } from '../output/mode.js';
|
|
6
|
+
async function runSimpleOp(op, step, humanVerb, action) {
|
|
7
|
+
const emitter = new NdjsonEmitter(op);
|
|
8
|
+
registerExitHandlers(emitter);
|
|
9
|
+
emitter.start(`${humanVerb} gateway`);
|
|
10
|
+
info(`${humanVerb} openclaw gateway...`);
|
|
11
|
+
try {
|
|
12
|
+
emitter.stepStart(step, `${humanVerb} gateway`);
|
|
13
|
+
await action();
|
|
14
|
+
emitter.stepDone(step, 'done');
|
|
15
|
+
success(`Gateway ${step}ed.`);
|
|
16
|
+
emitter.end(true, 0);
|
|
17
|
+
}
|
|
18
|
+
catch (e) {
|
|
19
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
20
|
+
emitter.end(false, 1, `E_${op.toUpperCase()}_FAILED`, { error: msg });
|
|
21
|
+
throw e;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
4
24
|
export async function startCommand() {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
25
|
+
await runSimpleOp('start', 'start', 'Starting', async () => {
|
|
26
|
+
await shell(`source ${OPENVIKING_ENV} 2>/dev/null || true; openclaw gateway start`);
|
|
27
|
+
});
|
|
8
28
|
}
|
|
9
29
|
export async function stopCommand() {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
30
|
+
await runSimpleOp('stop', 'stop', 'Stopping', async () => {
|
|
31
|
+
await shell('openclaw gateway stop 2>/dev/null || true');
|
|
32
|
+
});
|
|
13
33
|
}
|
|
14
34
|
export async function restartCommand() {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
35
|
+
await runSimpleOp('restart', 'restart', 'Restarting', async () => {
|
|
36
|
+
await shell(`source ${OPENVIKING_ENV} 2>/dev/null || true; openclaw gateway restart`);
|
|
37
|
+
});
|
|
18
38
|
}
|
|
19
39
|
export async function statusCommand() {
|
|
20
|
-
const
|
|
21
|
-
|
|
40
|
+
const emitter = new NdjsonEmitter('status');
|
|
41
|
+
registerExitHandlers(emitter);
|
|
42
|
+
emitter.start('querying gateway status');
|
|
43
|
+
emitter.stepStart('status', 'running openclaw gateway status');
|
|
44
|
+
try {
|
|
45
|
+
const result = await shellCapture('openclaw gateway status 2>&1 || true');
|
|
46
|
+
const output = result.stdout || result.stderr || 'No output';
|
|
47
|
+
if (!isNdjson()) {
|
|
48
|
+
console.log(output);
|
|
49
|
+
}
|
|
50
|
+
const running = /running|active/i.test(output);
|
|
51
|
+
emitter.stepDone('status', 'status query done');
|
|
52
|
+
emitter.end(true, 0, undefined, { running, rawOutput: output });
|
|
53
|
+
}
|
|
54
|
+
catch (e) {
|
|
55
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
56
|
+
emitter.end(false, 1, 'E_STATUS_FAILED', { error: msg });
|
|
57
|
+
throw e;
|
|
58
|
+
}
|
|
22
59
|
}
|
|
23
60
|
//# sourceMappingURL=service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/commands/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/commands/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* okclaw show <target>
|
|
3
|
+
*
|
|
4
|
+
* 把 target 对应的文件内容原样输出到 stdout(text 模式);
|
|
5
|
+
* 在 ndjson 模式下,文件内容放到 end 事件的 fields.content(plan 决策 #16)。
|
|
6
|
+
*
|
|
7
|
+
* - 文件存在 → 输出文件内容,exit 0
|
|
8
|
+
* - 文件不存在 → 输出空内容,exit 0(视为尚未创建)
|
|
9
|
+
* - target 非法 → stderr 提示,exit 1
|
|
10
|
+
*
|
|
11
|
+
* `targets` 参数用于测试注入;生产调用不传第二个参数,使用 edit.ts 导出的 TARGETS。
|
|
12
|
+
*/
|
|
13
|
+
export declare function showCommand(args: string[], targets?: Record<string, string>): Promise<void>;
|