@coclaw/openclaw-coclaw 0.9.0 → 0.9.1

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/index.js CHANGED
@@ -14,6 +14,7 @@ import { ChatHistoryManager } from './src/chat-history-manager/manager.js';
14
14
  import { generateTitle } from './src/topic-manager/title-gen.js';
15
15
  import { AutoUpgradeScheduler } from './src/auto-upgrade/updater.js';
16
16
  import { getPackageInfo } from './src/auto-upgrade/updater-check.js';
17
+ import { createFileHandler } from './src/file-manager/handler.js';
17
18
 
18
19
  // 延迟读取 + 缓存:避免模块加载时 package.json 损坏导致插件整体无法注册
19
20
  let __pluginVersion = null;
@@ -472,6 +473,54 @@ const plugin = {
472
473
  }
473
474
  });
474
475
 
476
+ // --- 文件管理 RPC(WS fallback,RTC 路径由 webrtc-peer 本地拦截) ---
477
+
478
+ const fileHandler = createFileHandler({
479
+ resolveWorkspace: (agentId) => {
480
+ const cfg = api.runtime?.config?.loadConfig();
481
+ const dir = api.runtime?.agent?.resolveAgentWorkspaceDir(cfg, agentId);
482
+ if (!dir) {
483
+ const err = new Error('Cannot resolve workspace: runtime not available');
484
+ err.code = 'AGENT_DENIED';
485
+ throw err;
486
+ }
487
+ return dir;
488
+ },
489
+ logger,
490
+ });
491
+
492
+ api.registerGatewayMethod('coclaw.files.list', async ({ params, respond }) => {
493
+ try {
494
+ respond(true, await fileHandler.listFiles(params ?? {}));
495
+ } catch (err) {
496
+ respondError(respond, err);
497
+ }
498
+ });
499
+
500
+ api.registerGatewayMethod('coclaw.files.delete', async ({ params, respond }) => {
501
+ try {
502
+ respond(true, await fileHandler.deleteFile(params ?? {}));
503
+ } catch (err) {
504
+ respondError(respond, err);
505
+ }
506
+ });
507
+
508
+ api.registerGatewayMethod('coclaw.files.mkdir', async ({ params, respond }) => {
509
+ try {
510
+ respond(true, await fileHandler.mkdirOp(params ?? {}));
511
+ } catch (err) {
512
+ respondError(respond, err);
513
+ }
514
+ });
515
+
516
+ api.registerGatewayMethod('coclaw.files.create', async ({ params, respond }) => {
517
+ try {
518
+ respond(true, await fileHandler.createFile(params ?? {}));
519
+ } catch (err) {
520
+ respondError(respond, err);
521
+ }
522
+ });
523
+
475
524
  const scheduler = new AutoUpgradeScheduler({ pluginId: api.id, logger });
476
525
  api.registerService({
477
526
  id: 'coclaw-auto-upgrade',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coclaw/openclaw-coclaw",
3
- "version": "0.9.0",
3
+ "version": "0.9.1",
4
4
  "type": "module",
5
5
  "license": "Apache-2.0",
6
6
  "description": "OpenClaw CoClaw channel plugin for remote chat",
@@ -54,6 +54,10 @@ export function spawnUpgradeWorker({ pluginDir, fromVersion, toVersion, pluginId
54
54
  env,
55
55
  });
56
56
 
57
+ // spawn 失败时 Node.js 会异步 emit 'error';若无监听器则变为未捕获异常导致 gateway 崩溃
58
+ child.on('error', (err) => {
59
+ logger?.warn?.(`[spawner] Worker spawn error: ${err.message}`);
60
+ });
57
61
  child.unref();
58
62
 
59
63
  logger?.info?.(`[spawner] Worker spawned (pid: ${child.pid})`);
@@ -720,7 +720,11 @@ export function createFileHandler({ resolveWorkspace, logger, deps = {} }) {
720
720
  handleFileChannel,
721
721
  scheduleTmpCleanup,
722
722
  cancelCleanup,
723
- // 暴露内部方法便于测试
723
+ listFiles,
724
+ deleteFile,
725
+ mkdirOp,
726
+ createFile,
727
+ // 向后兼容(测试中已使用 __ 前缀)
724
728
  __listFiles: listFiles,
725
729
  __deleteFile: deleteFile,
726
730
  __mkdirOp: mkdirOp,