@okclaw-build/cli 1.0.0-beta.2 → 1.0.0-beta.21

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.
Files changed (56) hide show
  1. package/dist/commands/check.js +22 -6
  2. package/dist/commands/check.js.map +1 -1
  3. package/dist/commands/edit.d.ts +2 -7
  4. package/dist/commands/edit.js +28 -15
  5. package/dist/commands/edit.js.map +1 -1
  6. package/dist/commands/feed.d.ts +0 -9
  7. package/dist/commands/feed.js +80 -103
  8. package/dist/commands/feed.js.map +1 -1
  9. package/dist/commands/install.js +34 -9
  10. package/dist/commands/install.js.map +1 -1
  11. package/dist/commands/service.js +48 -12
  12. package/dist/commands/service.js.map +1 -1
  13. package/dist/commands/show.d.ts +13 -0
  14. package/dist/commands/show.js +49 -0
  15. package/dist/commands/show.js.map +1 -0
  16. package/dist/commands/skill.d.ts +1 -0
  17. package/dist/commands/skill.js +114 -0
  18. package/dist/commands/skill.js.map +1 -0
  19. package/dist/commands/uninstall.d.ts +1 -0
  20. package/dist/commands/uninstall.js +46 -0
  21. package/dist/commands/uninstall.js.map +1 -0
  22. package/dist/index.js +93 -7
  23. package/dist/index.js.map +1 -1
  24. package/dist/installers/base.d.ts +1 -0
  25. package/dist/installers/channel.d.ts +10 -1
  26. package/dist/installers/channel.js +69 -8
  27. package/dist/installers/channel.js.map +1 -1
  28. package/dist/installers/openclaw.d.ts +1 -0
  29. package/dist/installers/openclaw.js +72 -8
  30. package/dist/installers/openclaw.js.map +1 -1
  31. package/dist/installers/openviking.js +1 -2
  32. package/dist/installers/openviking.js.map +1 -1
  33. package/dist/installers/skill.d.ts +1 -0
  34. package/dist/installers/skill.js +17 -4
  35. package/dist/installers/skill.js.map +1 -1
  36. package/dist/output/mode.d.ts +11 -0
  37. package/dist/output/mode.js +27 -0
  38. package/dist/output/mode.js.map +1 -0
  39. package/dist/output/ndjson.d.ts +57 -0
  40. package/dist/output/ndjson.js +136 -0
  41. package/dist/output/ndjson.js.map +1 -0
  42. package/dist/utils/constants.d.ts +0 -2
  43. package/dist/utils/constants.js +1 -4
  44. package/dist/utils/constants.js.map +1 -1
  45. package/dist/utils/deps.d.ts +0 -5
  46. package/dist/utils/deps.js +1 -88
  47. package/dist/utils/deps.js.map +1 -1
  48. package/dist/utils/logger.d.ts +10 -0
  49. package/dist/utils/logger.js +31 -4
  50. package/dist/utils/logger.js.map +1 -1
  51. package/dist/utils/mirror.js +7 -0
  52. package/dist/utils/mirror.js.map +1 -1
  53. package/dist/utils/shell.d.ts +12 -2
  54. package/dist/utils/shell.js +66 -3
  55. package/dist/utils/shell.js.map +1 -1
  56. package/package.json +3 -2
@@ -1,11 +1,27 @@
1
- import { ensureNodeVersion, ensurePython } from '../utils/deps.js';
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
- await ensureNodeVersion();
7
- await ensurePython();
8
- await configureMirrors();
9
- success('All dependencies satisfied.');
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,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IACxC,MAAM,iBAAiB,EAAE,CAAC;IAC1B,MAAM,YAAY,EAAE,CAAC;IACrB,MAAM,gBAAgB,EAAE,CAAC;IACzB,OAAO,CAAC,6BAA6B,CAAC,CAAC;AACzC,CAAC"}
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"}
@@ -1,10 +1,5 @@
1
1
  /**
2
- * okclaw edit <target> --file <path>
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>;
@@ -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
- * All targets are plain files under ~/.openclaw/workspace/.
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
- mkdirSync(OPENCLAW_WORKSPACE, { recursive: true });
41
- await shell(`cp -f '${filePath}' '${dest}'`);
42
- info(`Written to ${dest}`);
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;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":"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"}
@@ -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>;
@@ -1,141 +1,118 @@
1
- import { existsSync, readFileSync, writeFileSync, readdirSync, statSync, mkdirSync, rmSync, unlinkSync } from 'node:fs';
2
- import { join, extname } from 'node:path';
3
- import { shell, shellCapture } from '../utils/shell.js';
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
- const OV_API = 'http://localhost:1933';
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
- const ext = extname(filePath).toLowerCase();
28
- if (ext === '.zip' || ext === '.gz' || ext === '.tgz' || filePath.endsWith('.tar.gz')) {
29
- await feedArchive(filePath);
30
- }
31
- else if (isTextFile(ext)) {
32
- await feedTextFile(filePath);
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
- else {
35
- info(`Non-text file, adding as resource: ${filePath}`);
36
- await shell(`ov add-resource '${filePath}' -o json`);
37
- success('Resource added.');
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 shell(`unzip -o '${archivePath}' -d '${tmpDir}'`);
81
+ await run('unzip', ['-o', archivePath, '-d', tmpDir]);
47
82
  }
48
83
  else {
49
- await shell(`tar xzf '${archivePath}' -C '${tmpDir}'`);
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
- for (let i = 0; i < files.length; i++) {
54
- const file = files[i];
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
- info(`[${i + 1}/${files.length}] Processing: ${file.replace(tmpDir + '/', '')}`);
57
- if (isTextFile(fileExt)) {
58
- await feedTextFile(file);
95
+ if (!isTextFile(fileExt)) {
96
+ warn(`Skipping non-text file: ${basename(file)}`);
97
+ continue;
59
98
  }
60
- else {
61
- await shell(`ov add-resource '${file}' -o json`);
62
- info(' Added as resource');
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
- success(`All ${files.length} file(s) processed.`);
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":"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"}
1
+ {"version":3,"file":"feed.js","sourceRoot":"","sources":["../../src/commands/feed.ts"],"names":[],"mappings":"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"}
@@ -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
- const installer = getInstaller(component);
66
- await installer.checkDeps();
67
- await configureMirrors();
68
- await installer.install(version, packageUrl);
69
- if (config) {
70
- await installer.configure(config);
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
- else {
73
- info('No config provided, keeping existing configuration.');
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":"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"}
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
@@ -1,23 +1,59 @@
1
1
  import { shell, shellCapture } from '../utils/shell.js';
2
2
  import { info, success } from '../utils/logger.js';
3
- import { OPENVIKING_ENV } from '../utils/constants.js';
3
+ import { NdjsonEmitter, registerExitHandlers } from '../output/ndjson.js';
4
+ import { isNdjson } from '../output/mode.js';
5
+ async function runSimpleOp(op, step, humanVerb, action) {
6
+ const emitter = new NdjsonEmitter(op);
7
+ registerExitHandlers(emitter);
8
+ emitter.start(`${humanVerb} gateway`);
9
+ info(`${humanVerb} openclaw gateway...`);
10
+ try {
11
+ emitter.stepStart(step, `${humanVerb} gateway`);
12
+ await action();
13
+ emitter.stepDone(step, 'done');
14
+ success(`Gateway ${step}ed.`);
15
+ emitter.end(true, 0);
16
+ }
17
+ catch (e) {
18
+ const msg = e instanceof Error ? e.message : String(e);
19
+ emitter.end(false, 1, `E_${op.toUpperCase()}_FAILED`, { error: msg });
20
+ throw e;
21
+ }
22
+ }
4
23
  export async function startCommand() {
5
- info('Starting openclaw gateway...');
6
- await shell(`source ${OPENVIKING_ENV} 2>/dev/null || true; openclaw gateway start`);
7
- success('Gateway started.');
24
+ await runSimpleOp('start', 'start', 'Starting', async () => {
25
+ await shell('openclaw gateway start');
26
+ });
8
27
  }
9
28
  export async function stopCommand() {
10
- info('Stopping openclaw gateway...');
11
- await shell('openclaw gateway stop 2>/dev/null || true');
12
- success('Gateway stopped.');
29
+ await runSimpleOp('stop', 'stop', 'Stopping', async () => {
30
+ await shell('openclaw gateway stop 2>/dev/null || true');
31
+ });
13
32
  }
14
33
  export async function restartCommand() {
15
- info('Restarting openclaw gateway...');
16
- await shell(`source ${OPENVIKING_ENV} 2>/dev/null || true; openclaw gateway restart`);
17
- success('Gateway restarted.');
34
+ await runSimpleOp('restart', 'restart', 'Restarting', async () => {
35
+ await shell('openclaw gateway restart');
36
+ });
18
37
  }
19
38
  export async function statusCommand() {
20
- const result = await shellCapture('openclaw gateway status 2>&1 || true');
21
- console.log(result.stdout || result.stderr || 'No output');
39
+ const emitter = new NdjsonEmitter('status');
40
+ registerExitHandlers(emitter);
41
+ emitter.start('querying gateway status');
42
+ emitter.stepStart('status', 'running openclaw gateway status');
43
+ try {
44
+ const result = await shellCapture('openclaw gateway status 2>&1 || true');
45
+ const output = result.stdout || result.stderr || 'No output';
46
+ if (!isNdjson()) {
47
+ console.log(output);
48
+ }
49
+ const running = /running|active/i.test(output);
50
+ emitter.stepDone('status', 'status query done');
51
+ emitter.end(true, 0, undefined, { running, rawOutput: output });
52
+ }
53
+ catch (e) {
54
+ const msg = e instanceof Error ? e.message : String(e);
55
+ emitter.end(false, 1, 'E_STATUS_FAILED', { error: msg });
56
+ throw e;
57
+ }
22
58
  }
23
59
  //# 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;AAEvD,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IACrC,MAAM,KAAK,CAAC,UAAU,cAAc,8CAA8C,CAAC,CAAC;IACpF,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,CAAC,8BAA8B,CAAC,CAAC;IACrC,MAAM,KAAK,CAAC,2CAA2C,CAAC,CAAC;IACzD,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IACvC,MAAM,KAAK,CAAC,UAAU,cAAc,gDAAgD,CAAC,CAAC;IACtF,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,sCAAsC,CAAC,CAAC;IAC1E,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,WAAW,CAAC,CAAC;AAC7D,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>;