openvibe 0.63.1 → 0.63.3

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 (158) hide show
  1. package/CHANGELOG.md +92 -2
  2. package/README.md +39 -0
  3. package/README_CN.md +1 -1
  4. package/dist/cli/args.d.ts +3 -1
  5. package/dist/cli/args.d.ts.map +1 -1
  6. package/dist/cli/args.js +22 -2
  7. package/dist/cli/args.js.map +1 -1
  8. package/dist/core/agent-session.d.ts.map +1 -1
  9. package/dist/core/agent-session.js +5 -3
  10. package/dist/core/agent-session.js.map +1 -1
  11. package/dist/core/companion/executor/bash-executor.d.ts +30 -0
  12. package/dist/core/companion/executor/bash-executor.d.ts.map +1 -0
  13. package/dist/core/companion/executor/bash-executor.js +105 -0
  14. package/dist/core/companion/executor/bash-executor.js.map +1 -0
  15. package/dist/core/companion/executor/code-executor.d.ts +33 -0
  16. package/dist/core/companion/executor/code-executor.d.ts.map +1 -0
  17. package/dist/core/companion/executor/code-executor.js +144 -0
  18. package/dist/core/companion/executor/code-executor.js.map +1 -0
  19. package/dist/core/companion/executor/resource-monitor.d.ts +55 -0
  20. package/dist/core/companion/executor/resource-monitor.d.ts.map +1 -0
  21. package/dist/core/companion/executor/resource-monitor.js +141 -0
  22. package/dist/core/companion/executor/resource-monitor.js.map +1 -0
  23. package/dist/core/companion/http-server.d.ts +92 -0
  24. package/dist/core/companion/http-server.d.ts.map +1 -0
  25. package/dist/core/companion/http-server.js +229 -0
  26. package/dist/core/companion/http-server.js.map +1 -0
  27. package/dist/core/companion/index.d.ts +29 -0
  28. package/dist/core/companion/index.d.ts.map +1 -0
  29. package/dist/core/companion/index.js +48 -0
  30. package/dist/core/companion/index.js.map +1 -0
  31. package/dist/core/companion/scheduler/resource-scheduler.d.ts +82 -0
  32. package/dist/core/companion/scheduler/resource-scheduler.d.ts.map +1 -0
  33. package/dist/core/companion/scheduler/resource-scheduler.js +333 -0
  34. package/dist/core/companion/scheduler/resource-scheduler.js.map +1 -0
  35. package/dist/core/companion/scheduler/workers/base-worker.d.ts +87 -0
  36. package/dist/core/companion/scheduler/workers/base-worker.d.ts.map +1 -0
  37. package/dist/core/companion/scheduler/workers/base-worker.js +70 -0
  38. package/dist/core/companion/scheduler/workers/base-worker.js.map +1 -0
  39. package/dist/core/companion/scheduler/workers/cpu-worker.d.ts +12 -0
  40. package/dist/core/companion/scheduler/workers/cpu-worker.d.ts.map +1 -0
  41. package/dist/core/companion/scheduler/workers/cpu-worker.js +134 -0
  42. package/dist/core/companion/scheduler/workers/cpu-worker.js.map +1 -0
  43. package/dist/core/companion/scheduler/workers/gpu-worker.d.ts +16 -0
  44. package/dist/core/companion/scheduler/workers/gpu-worker.d.ts.map +1 -0
  45. package/dist/core/companion/scheduler/workers/gpu-worker.js +167 -0
  46. package/dist/core/companion/scheduler/workers/gpu-worker.js.map +1 -0
  47. package/dist/core/companion/scheduler/workers/index.d.ts +6 -0
  48. package/dist/core/companion/scheduler/workers/index.d.ts.map +1 -0
  49. package/dist/core/companion/scheduler/workers/index.js +6 -0
  50. package/dist/core/companion/scheduler/workers/index.js.map +1 -0
  51. package/dist/core/companion/scheduler/workers/io-worker.d.ts +17 -0
  52. package/dist/core/companion/scheduler/workers/io-worker.d.ts.map +1 -0
  53. package/dist/core/companion/scheduler/workers/io-worker.js +197 -0
  54. package/dist/core/companion/scheduler/workers/io-worker.js.map +1 -0
  55. package/dist/core/companion/scheduler/workers/network-worker.d.ts +13 -0
  56. package/dist/core/companion/scheduler/workers/network-worker.d.ts.map +1 -0
  57. package/dist/core/companion/scheduler/workers/network-worker.js +167 -0
  58. package/dist/core/companion/scheduler/workers/network-worker.js.map +1 -0
  59. package/dist/core/companion/security/security-manager.d.ts +50 -0
  60. package/dist/core/companion/security/security-manager.d.ts.map +1 -0
  61. package/dist/core/companion/security/security-manager.js +102 -0
  62. package/dist/core/companion/security/security-manager.js.map +1 -0
  63. package/dist/core/hybrid-cloud/extension.d.ts +8 -0
  64. package/dist/core/hybrid-cloud/extension.d.ts.map +1 -0
  65. package/dist/core/hybrid-cloud/extension.js +64 -0
  66. package/dist/core/hybrid-cloud/extension.js.map +1 -0
  67. package/dist/core/hybrid-cloud/index.d.ts +98 -0
  68. package/dist/core/hybrid-cloud/index.d.ts.map +1 -0
  69. package/dist/core/hybrid-cloud/index.js +211 -0
  70. package/dist/core/hybrid-cloud/index.js.map +1 -0
  71. package/dist/core/keybindings.d.ts +1 -1
  72. package/dist/core/keybindings.d.ts.map +1 -1
  73. package/dist/core/keybindings.js +3 -1
  74. package/dist/core/keybindings.js.map +1 -1
  75. package/dist/core/package-manager.d.ts.map +1 -1
  76. package/dist/core/package-manager.js +6 -1
  77. package/dist/core/package-manager.js.map +1 -1
  78. package/dist/core/settings-manager.d.ts +13 -0
  79. package/dist/core/settings-manager.d.ts.map +1 -1
  80. package/dist/core/settings-manager.js +35 -0
  81. package/dist/core/settings-manager.js.map +1 -1
  82. package/dist/core/slash-commands.d.ts.map +1 -1
  83. package/dist/core/slash-commands.js +7 -0
  84. package/dist/core/slash-commands.js.map +1 -1
  85. package/dist/core/system-prompt.d.ts.map +1 -1
  86. package/dist/core/system-prompt.js +46 -0
  87. package/dist/core/system-prompt.js.map +1 -1
  88. package/dist/core/todo-manager.d.ts +32 -0
  89. package/dist/core/todo-manager.d.ts.map +1 -0
  90. package/dist/core/todo-manager.js +117 -0
  91. package/dist/core/todo-manager.js.map +1 -0
  92. package/dist/core/tools/batch-write.d.ts +42 -0
  93. package/dist/core/tools/batch-write.d.ts.map +1 -0
  94. package/dist/core/tools/batch-write.js +267 -0
  95. package/dist/core/tools/batch-write.js.map +1 -0
  96. package/dist/core/tools/edit.d.ts.map +1 -1
  97. package/dist/core/tools/edit.js +10 -2
  98. package/dist/core/tools/edit.js.map +1 -1
  99. package/dist/core/tools/fast-executor.d.ts +6 -1
  100. package/dist/core/tools/fast-executor.d.ts.map +1 -1
  101. package/dist/core/tools/fast-executor.js +83 -4
  102. package/dist/core/tools/fast-executor.js.map +1 -1
  103. package/dist/core/tools/index.d.ts +141 -0
  104. package/dist/core/tools/index.d.ts.map +1 -1
  105. package/dist/core/tools/index.js +30 -0
  106. package/dist/core/tools/index.js.map +1 -1
  107. package/dist/core/tools/todo.d.ts +47 -0
  108. package/dist/core/tools/todo.d.ts.map +1 -0
  109. package/dist/core/tools/todo.js +212 -0
  110. package/dist/core/tools/todo.js.map +1 -0
  111. package/dist/core/tools/unified.d.ts +121 -0
  112. package/dist/core/tools/unified.d.ts.map +1 -0
  113. package/dist/core/tools/unified.js +481 -0
  114. package/dist/core/tools/unified.js.map +1 -0
  115. package/dist/core/tools/write.d.ts +1 -1
  116. package/dist/core/tools/write.d.ts.map +1 -1
  117. package/dist/core/tools/write.js +20 -5
  118. package/dist/core/tools/write.js.map +1 -1
  119. package/dist/main.d.ts.map +1 -1
  120. package/dist/main.js +63 -1
  121. package/dist/main.js.map +1 -1
  122. package/dist/modes/index.d.ts +2 -0
  123. package/dist/modes/index.d.ts.map +1 -1
  124. package/dist/modes/index.js +2 -0
  125. package/dist/modes/index.js.map +1 -1
  126. package/dist/modes/interactive/components/index.d.ts +1 -0
  127. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  128. package/dist/modes/interactive/components/index.js +1 -0
  129. package/dist/modes/interactive/components/index.js.map +1 -1
  130. package/dist/modes/interactive/components/todo-display.d.ts +9 -0
  131. package/dist/modes/interactive/components/todo-display.d.ts.map +1 -0
  132. package/dist/modes/interactive/components/todo-display.js +60 -0
  133. package/dist/modes/interactive/components/todo-display.js.map +1 -0
  134. package/dist/modes/interactive/interactive-mode.d.ts +8 -0
  135. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  136. package/dist/modes/interactive/interactive-mode.js +151 -0
  137. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  138. package/dist/modes/plan-mode.d.ts +14 -0
  139. package/dist/modes/plan-mode.d.ts.map +1 -0
  140. package/dist/modes/plan-mode.js +107 -0
  141. package/dist/modes/plan-mode.js.map +1 -0
  142. package/dist/modes/spec-mode.d.ts +16 -0
  143. package/dist/modes/spec-mode.d.ts.map +1 -0
  144. package/dist/modes/spec-mode.js +186 -0
  145. package/dist/modes/spec-mode.js.map +1 -0
  146. package/dist/utils/version-check.d.ts.map +1 -1
  147. package/dist/utils/version-check.js +7 -17
  148. package/dist/utils/version-check.js.map +1 -1
  149. package/docs/HYBRID_CLOUD_README.md +188 -0
  150. package/docs/hybrid-architecture-design.md +317 -0
  151. package/docs/todo.md +71 -0
  152. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  153. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  154. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  155. package/examples/extensions/custom-provider-qwen-cli/package.json +1 -1
  156. package/examples/extensions/with-deps/package-lock.json +2 -2
  157. package/examples/extensions/with-deps/package.json +1 -1
  158. package/package.json +4 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"io-worker.js","sourceRoot":"","sources":["../../../../../src/core/companion/scheduler/workers/io-worker.ts"],"names":[],"mappings":"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","sourcesContent":["import { mkdir, readdir, readFile, rm, stat, writeFile } from \"fs/promises\";\nimport { cpus, totalmem } from \"os\";\nimport { dirname, join } from \"path\";\nimport { BaseWorker, type ScheduledTask, type TaskResult, type WorkerCapabilities } from \"./base-worker.js\";\n\nexport class IOWorker extends BaseWorker {\n\treadonly id: string;\n\treadonly type = \"io\";\n\treadonly capabilities: WorkerCapabilities;\n\n\tconstructor(id?: string) {\n\t\tsuper();\n\t\tthis.id = id || `io_${Date.now()}_${Math.random().toString(36).substr(2, 6)}`;\n\t\tthis.capabilities = {\n\t\t\tcpuCores: cpus().length,\n\t\t\tmemoryMb: Math.floor(totalmem() / (1024 * 1024)),\n\t\t\thasGpu: false,\n\t\t\tsupportsTypes: [\"io_heavy\", \"script\"],\n\t\t};\n\t}\n\n\tasync execute(task: ScheduledTask, signal?: AbortSignal): Promise<TaskResult> {\n\t\tthis.markBusy(task.id);\n\t\tconst startTime = Date.now();\n\n\t\ttry {\n\t\t\tconst result = await this.executeIOTask(task, signal);\n\t\t\tconst executionTime = Date.now() - startTime;\n\t\t\tthis.updateStats(executionTime, result.success);\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tconst executionTime = Date.now() - startTime;\n\t\t\tthis.updateStats(executionTime, false);\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\terrorCode: \"IO_ERROR\",\n\t\t\t};\n\t\t} finally {\n\t\t\tthis.markIdle();\n\t\t}\n\t}\n\n\tprivate async executeIOTask(task: ScheduledTask, signal?: AbortSignal): Promise<TaskResult> {\n\t\tconst payload = task.payload as Record<string, unknown>;\n\t\tconst operation = (payload.data as { operation?: string })?.operation;\n\n\t\tif (signal?.aborted) {\n\t\t\treturn { success: false, error: \"Task cancelled\", errorCode: \"CANCELLED\" };\n\t\t}\n\n\t\tswitch (operation) {\n\t\t\tcase \"read\":\n\t\t\t\treturn this.handleRead(payload);\n\t\t\tcase \"write\":\n\t\t\t\treturn this.handleWrite(payload);\n\t\t\tcase \"list\":\n\t\t\t\treturn this.handleList(payload);\n\t\t\tcase \"mkdir\":\n\t\t\t\treturn this.handleMkdir(payload);\n\t\t\tcase \"delete\":\n\t\t\t\treturn this.handleDelete(payload);\n\t\t\tcase \"copy\":\n\t\t\t\treturn this.handleCopy(payload);\n\t\t\tdefault:\n\t\t\t\treturn { success: false, error: `Unknown IO operation: ${operation}`, errorCode: \"UNKNOWN_OPERATION\" };\n\t\t}\n\t}\n\n\tprivate async handleRead(payload: Record<string, unknown>): Promise<TaskResult> {\n\t\tconst path = payload.path as string;\n\t\tif (!path) {\n\t\t\treturn { success: false, error: \"Path is required\", errorCode: \"MISSING_PATH\" };\n\t\t}\n\n\t\ttry {\n\t\t\tconst content = await readFile(path, \"utf-8\");\n\t\t\treturn { success: true, output: content };\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\terrorCode: \"READ_ERROR\",\n\t\t\t};\n\t\t}\n\t}\n\n\tprivate async handleWrite(payload: Record<string, unknown>): Promise<TaskResult> {\n\t\tconst path = payload.path as string;\n\t\tconst content = payload.content as string;\n\n\t\tif (!path || content === undefined) {\n\t\t\treturn { success: false, error: \"Path and content are required\", errorCode: \"MISSING_PARAMS\" };\n\t\t}\n\n\t\ttry {\n\t\t\tawait mkdir(dirname(path), { recursive: true });\n\t\t\tawait writeFile(path, content, \"utf-8\");\n\t\t\treturn { success: true, output: `Written to ${path}` };\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\terrorCode: \"WRITE_ERROR\",\n\t\t\t};\n\t\t}\n\t}\n\n\tprivate async handleList(payload: Record<string, unknown>): Promise<TaskResult> {\n\t\tconst path = (payload.path as string) || \".\";\n\t\tconst recursive = payload.recursive as boolean;\n\n\t\ttry {\n\t\t\tconst entries = await this.listDirectory(path, recursive);\n\t\t\treturn { success: true, output: JSON.stringify(entries, null, 2) };\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\terrorCode: \"LIST_ERROR\",\n\t\t\t};\n\t\t}\n\t}\n\n\tprivate async listDirectory(dir: string, recursive: boolean): Promise<unknown[]> {\n\t\tconst entries = await readdir(dir, { withFileTypes: true });\n\t\tconst result: unknown[] = [];\n\n\t\tfor (const entry of entries) {\n\t\t\tconst fullPath = join(dir, entry.name);\n\t\t\tconst info: Record<string, unknown> = {\n\t\t\t\tname: entry.name,\n\t\t\t\tpath: fullPath,\n\t\t\t\ttype: entry.isDirectory() ? \"directory\" : \"file\",\n\t\t\t};\n\n\t\t\tif (entry.isFile()) {\n\t\t\t\ttry {\n\t\t\t\t\tconst stats = await stat(fullPath);\n\t\t\t\t\tinfo.size = stats.size;\n\t\t\t\t\tinfo.modified = stats.mtime;\n\t\t\t\t} catch {}\n\t\t\t}\n\n\t\t\tresult.push(info);\n\n\t\t\tif (recursive && entry.isDirectory()) {\n\t\t\t\tconst children = await this.listDirectory(fullPath, true);\n\t\t\t\t(info as Record<string, unknown>).children = children;\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tprivate async handleMkdir(payload: Record<string, unknown>): Promise<TaskResult> {\n\t\tconst path = payload.path as string;\n\t\tif (!path) {\n\t\t\treturn { success: false, error: \"Path is required\", errorCode: \"MISSING_PATH\" };\n\t\t}\n\n\t\ttry {\n\t\t\tawait mkdir(path, { recursive: true });\n\t\t\treturn { success: true, output: `Created directory ${path}` };\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\terrorCode: \"MKDIR_ERROR\",\n\t\t\t};\n\t\t}\n\t}\n\n\tprivate async handleDelete(payload: Record<string, unknown>): Promise<TaskResult> {\n\t\tconst path = payload.path as string;\n\t\tconst recursive = payload.recursive as boolean;\n\n\t\tif (!path) {\n\t\t\treturn { success: false, error: \"Path is required\", errorCode: \"MISSING_PATH\" };\n\t\t}\n\n\t\ttry {\n\t\t\tawait rm(path, { recursive, force: true });\n\t\t\treturn { success: true, output: `Deleted ${path}` };\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\terrorCode: \"DELETE_ERROR\",\n\t\t\t};\n\t\t}\n\t}\n\n\tprivate async handleCopy(payload: Record<string, unknown>): Promise<TaskResult> {\n\t\tconst src = payload.source as string;\n\t\tconst dest = payload.destination as string;\n\n\t\tif (!src || !dest) {\n\t\t\treturn { success: false, error: \"Source and destination are required\", errorCode: \"MISSING_PARAMS\" };\n\t\t}\n\n\t\ttry {\n\t\t\tconst content = await readFile(src);\n\t\t\tawait mkdir(dirname(dest), { recursive: true });\n\t\t\tawait writeFile(dest, content);\n\t\t\treturn { success: true, output: `Copied ${src} to ${dest}` };\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\terrorCode: \"COPY_ERROR\",\n\t\t\t};\n\t\t}\n\t}\n}\n"]}
@@ -0,0 +1,13 @@
1
+ import { BaseWorker, type ScheduledTask, type TaskResult, type WorkerCapabilities } from "./base-worker.js";
2
+ export declare class NetworkWorker extends BaseWorker {
3
+ readonly id: string;
4
+ readonly type = "network";
5
+ readonly capabilities: WorkerCapabilities;
6
+ constructor(id?: string);
7
+ execute(task: ScheduledTask, signal?: AbortSignal): Promise<TaskResult>;
8
+ private executeNetworkTask;
9
+ private handleFetch;
10
+ private handleRequest;
11
+ private handleDownload;
12
+ }
13
+ //# sourceMappingURL=network-worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network-worker.d.ts","sourceRoot":"","sources":["../../../../../src/core/companion/scheduler/workers/network-worker.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,EAAE,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE5G,qBAAa,aAAc,SAAQ,UAAU;IAC5C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,aAAa;IAC1B,QAAQ,CAAC,YAAY,EAAE,kBAAkB,CAAC;IAE1C,YAAY,EAAE,CAAC,EAAE,MAAM,EAStB;IAEK,OAAO,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAoB5E;YAEa,kBAAkB;YAqBlB,WAAW;YA4CX,aAAa;YAsDb,cAAc;CAqC5B","sourcesContent":["import { spawn } from \"child_process\";\nimport { cpus, totalmem } from \"os\";\nimport { BaseWorker, type ScheduledTask, type TaskResult, type WorkerCapabilities } from \"./base-worker.js\";\n\nexport class NetworkWorker extends BaseWorker {\n\treadonly id: string;\n\treadonly type = \"network\";\n\treadonly capabilities: WorkerCapabilities;\n\n\tconstructor(id?: string) {\n\t\tsuper();\n\t\tthis.id = id || `net_${Date.now()}_${Math.random().toString(36).substr(2, 6)}`;\n\t\tthis.capabilities = {\n\t\t\tcpuCores: cpus().length,\n\t\t\tmemoryMb: Math.floor(totalmem() / (1024 * 1024)),\n\t\t\thasGpu: false,\n\t\t\tsupportsTypes: [\"network\", \"script\"],\n\t\t};\n\t}\n\n\tasync execute(task: ScheduledTask, signal?: AbortSignal): Promise<TaskResult> {\n\t\tthis.markBusy(task.id);\n\t\tconst startTime = Date.now();\n\n\t\ttry {\n\t\t\tconst result = await this.executeNetworkTask(task, signal);\n\t\t\tconst executionTime = Date.now() - startTime;\n\t\t\tthis.updateStats(executionTime, result.success);\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tconst executionTime = Date.now() - startTime;\n\t\t\tthis.updateStats(executionTime, false);\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\terrorCode: \"NETWORK_ERROR\",\n\t\t\t};\n\t\t} finally {\n\t\t\tthis.markIdle();\n\t\t}\n\t}\n\n\tprivate async executeNetworkTask(task: ScheduledTask, signal?: AbortSignal): Promise<TaskResult> {\n\t\tconst payload = task.payload;\n\t\tconst data = payload.data as Record<string, unknown> | undefined;\n\t\tconst operation = data?.operation as string | undefined;\n\n\t\tswitch (operation) {\n\t\t\tcase \"fetch\":\n\t\t\t\treturn this.handleFetch(data, signal);\n\t\t\tcase \"request\":\n\t\t\t\treturn this.handleRequest(data, signal);\n\t\t\tcase \"download\":\n\t\t\t\treturn this.handleDownload(data, signal);\n\t\t\tdefault:\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: `Unknown network operation: ${operation}`,\n\t\t\t\t\terrorCode: \"UNKNOWN_OPERATION\",\n\t\t\t\t};\n\t\t}\n\t}\n\n\tprivate async handleFetch(data: Record<string, unknown> | undefined, signal?: AbortSignal): Promise<TaskResult> {\n\t\tconst url = data?.url as string;\n\t\tif (!url) {\n\t\t\treturn { success: false, error: \"URL is required\", errorCode: \"MISSING_URL\" };\n\t\t}\n\n\t\treturn new Promise((resolve) => {\n\t\t\tconst stdout: Buffer[] = [];\n\t\t\tconst stderr: Buffer[] = [];\n\n\t\t\tconst args = [\"-s\", \"-L\", url];\n\t\t\tif (data?.headers) {\n\t\t\t\tconst headers = data.headers as Record<string, string>;\n\t\t\t\tfor (const [key, value] of Object.entries(headers)) {\n\t\t\t\t\targs.push(\"-H\", `${key}: ${value}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst child = spawn(\"curl\", args, { timeout: 30000 });\n\n\t\t\tsignal?.addEventListener(\"abort\", () => child.kill(\"SIGTERM\"));\n\n\t\t\tchild.stdout?.on(\"data\", (d: Buffer) => stdout.push(d));\n\t\t\tchild.stderr?.on(\"data\", (d: Buffer) => stderr.push(d));\n\n\t\t\tchild.on(\"close\", (code) => {\n\t\t\t\tresolve({\n\t\t\t\t\tsuccess: code === 0,\n\t\t\t\t\texitCode: code || 0,\n\t\t\t\t\toutput: Buffer.concat(stdout).toString(),\n\t\t\t\t\tstderr: Buffer.concat(stderr).toString(),\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tchild.on(\"error\", (error) => {\n\t\t\t\tresolve({\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: error.message,\n\t\t\t\t\terrorCode: \"FETCH_ERROR\",\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate async handleRequest(data: Record<string, unknown> | undefined, signal?: AbortSignal): Promise<TaskResult> {\n\t\tconst url = data?.url as string;\n\t\tconst method = (data?.method as string) || \"GET\";\n\t\tconst body = data?.body as string | undefined;\n\n\t\tif (!url) {\n\t\t\treturn { success: false, error: \"URL is required\", errorCode: \"MISSING_URL\" };\n\t\t}\n\n\t\treturn new Promise((resolve) => {\n\t\t\tconst stdout: Buffer[] = [];\n\t\t\tconst stderr: Buffer[] = [];\n\n\t\t\tconst args = [\"-s\", \"-X\", method.toUpperCase()];\n\n\t\t\tif (data?.headers) {\n\t\t\t\tconst headers = data.headers as Record<string, string>;\n\t\t\t\tfor (const [key, value] of Object.entries(headers)) {\n\t\t\t\t\targs.push(\"-H\", `${key}: ${value}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (body) {\n\t\t\t\targs.push(\"-d\", body);\n\t\t\t}\n\n\t\t\targs.push(url);\n\n\t\t\tconst child = spawn(\"curl\", args, { timeout: 60000 });\n\n\t\t\tsignal?.addEventListener(\"abort\", () => child.kill(\"SIGTERM\"));\n\n\t\t\tchild.stdout?.on(\"data\", (d: Buffer) => stdout.push(d));\n\t\t\tchild.stderr?.on(\"data\", (d: Buffer) => stderr.push(d));\n\n\t\t\tchild.on(\"close\", (code) => {\n\t\t\t\tresolve({\n\t\t\t\t\tsuccess: code === 0,\n\t\t\t\t\texitCode: code || 0,\n\t\t\t\t\toutput: Buffer.concat(stdout).toString(),\n\t\t\t\t\tstderr: Buffer.concat(stderr).toString(),\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tchild.on(\"error\", (error) => {\n\t\t\t\tresolve({\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: error.message,\n\t\t\t\t\terrorCode: \"REQUEST_ERROR\",\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate async handleDownload(data: Record<string, unknown> | undefined, signal?: AbortSignal): Promise<TaskResult> {\n\t\tconst url = data?.url as string;\n\t\tconst output = data?.output as string;\n\n\t\tif (!url || !output) {\n\t\t\treturn { success: false, error: \"URL and output path are required\", errorCode: \"MISSING_PARAMS\" };\n\t\t}\n\n\t\treturn new Promise((resolve) => {\n\t\t\tconst stderr: Buffer[] = [];\n\n\t\t\tconst args = [\"-s\", \"-L\", \"-o\", output, url];\n\n\t\t\tconst child = spawn(\"curl\", args, { timeout: 300000 });\n\n\t\t\tsignal?.addEventListener(\"abort\", () => child.kill(\"SIGTERM\"));\n\n\t\t\tchild.stderr?.on(\"data\", (d: Buffer) => stderr.push(d));\n\n\t\t\tchild.on(\"close\", (code) => {\n\t\t\t\tresolve({\n\t\t\t\t\tsuccess: code === 0,\n\t\t\t\t\texitCode: code || 0,\n\t\t\t\t\toutput: code === 0 ? `Downloaded to ${output}` : undefined,\n\t\t\t\t\tstderr: Buffer.concat(stderr).toString(),\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tchild.on(\"error\", (error) => {\n\t\t\t\tresolve({\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: error.message,\n\t\t\t\t\terrorCode: \"DOWNLOAD_ERROR\",\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n}\n"]}
@@ -0,0 +1,167 @@
1
+ import { spawn } from "child_process";
2
+ import { cpus, totalmem } from "os";
3
+ import { BaseWorker } from "./base-worker.js";
4
+ export class NetworkWorker extends BaseWorker {
5
+ id;
6
+ type = "network";
7
+ capabilities;
8
+ constructor(id) {
9
+ super();
10
+ this.id = id || `net_${Date.now()}_${Math.random().toString(36).substr(2, 6)}`;
11
+ this.capabilities = {
12
+ cpuCores: cpus().length,
13
+ memoryMb: Math.floor(totalmem() / (1024 * 1024)),
14
+ hasGpu: false,
15
+ supportsTypes: ["network", "script"],
16
+ };
17
+ }
18
+ async execute(task, signal) {
19
+ this.markBusy(task.id);
20
+ const startTime = Date.now();
21
+ try {
22
+ const result = await this.executeNetworkTask(task, signal);
23
+ const executionTime = Date.now() - startTime;
24
+ this.updateStats(executionTime, result.success);
25
+ return result;
26
+ }
27
+ catch (error) {
28
+ const executionTime = Date.now() - startTime;
29
+ this.updateStats(executionTime, false);
30
+ return {
31
+ success: false,
32
+ error: error instanceof Error ? error.message : String(error),
33
+ errorCode: "NETWORK_ERROR",
34
+ };
35
+ }
36
+ finally {
37
+ this.markIdle();
38
+ }
39
+ }
40
+ async executeNetworkTask(task, signal) {
41
+ const payload = task.payload;
42
+ const data = payload.data;
43
+ const operation = data?.operation;
44
+ switch (operation) {
45
+ case "fetch":
46
+ return this.handleFetch(data, signal);
47
+ case "request":
48
+ return this.handleRequest(data, signal);
49
+ case "download":
50
+ return this.handleDownload(data, signal);
51
+ default:
52
+ return {
53
+ success: false,
54
+ error: `Unknown network operation: ${operation}`,
55
+ errorCode: "UNKNOWN_OPERATION",
56
+ };
57
+ }
58
+ }
59
+ async handleFetch(data, signal) {
60
+ const url = data?.url;
61
+ if (!url) {
62
+ return { success: false, error: "URL is required", errorCode: "MISSING_URL" };
63
+ }
64
+ return new Promise((resolve) => {
65
+ const stdout = [];
66
+ const stderr = [];
67
+ const args = ["-s", "-L", url];
68
+ if (data?.headers) {
69
+ const headers = data.headers;
70
+ for (const [key, value] of Object.entries(headers)) {
71
+ args.push("-H", `${key}: ${value}`);
72
+ }
73
+ }
74
+ const child = spawn("curl", args, { timeout: 30000 });
75
+ signal?.addEventListener("abort", () => child.kill("SIGTERM"));
76
+ child.stdout?.on("data", (d) => stdout.push(d));
77
+ child.stderr?.on("data", (d) => stderr.push(d));
78
+ child.on("close", (code) => {
79
+ resolve({
80
+ success: code === 0,
81
+ exitCode: code || 0,
82
+ output: Buffer.concat(stdout).toString(),
83
+ stderr: Buffer.concat(stderr).toString(),
84
+ });
85
+ });
86
+ child.on("error", (error) => {
87
+ resolve({
88
+ success: false,
89
+ error: error.message,
90
+ errorCode: "FETCH_ERROR",
91
+ });
92
+ });
93
+ });
94
+ }
95
+ async handleRequest(data, signal) {
96
+ const url = data?.url;
97
+ const method = data?.method || "GET";
98
+ const body = data?.body;
99
+ if (!url) {
100
+ return { success: false, error: "URL is required", errorCode: "MISSING_URL" };
101
+ }
102
+ return new Promise((resolve) => {
103
+ const stdout = [];
104
+ const stderr = [];
105
+ const args = ["-s", "-X", method.toUpperCase()];
106
+ if (data?.headers) {
107
+ const headers = data.headers;
108
+ for (const [key, value] of Object.entries(headers)) {
109
+ args.push("-H", `${key}: ${value}`);
110
+ }
111
+ }
112
+ if (body) {
113
+ args.push("-d", body);
114
+ }
115
+ args.push(url);
116
+ const child = spawn("curl", args, { timeout: 60000 });
117
+ signal?.addEventListener("abort", () => child.kill("SIGTERM"));
118
+ child.stdout?.on("data", (d) => stdout.push(d));
119
+ child.stderr?.on("data", (d) => stderr.push(d));
120
+ child.on("close", (code) => {
121
+ resolve({
122
+ success: code === 0,
123
+ exitCode: code || 0,
124
+ output: Buffer.concat(stdout).toString(),
125
+ stderr: Buffer.concat(stderr).toString(),
126
+ });
127
+ });
128
+ child.on("error", (error) => {
129
+ resolve({
130
+ success: false,
131
+ error: error.message,
132
+ errorCode: "REQUEST_ERROR",
133
+ });
134
+ });
135
+ });
136
+ }
137
+ async handleDownload(data, signal) {
138
+ const url = data?.url;
139
+ const output = data?.output;
140
+ if (!url || !output) {
141
+ return { success: false, error: "URL and output path are required", errorCode: "MISSING_PARAMS" };
142
+ }
143
+ return new Promise((resolve) => {
144
+ const stderr = [];
145
+ const args = ["-s", "-L", "-o", output, url];
146
+ const child = spawn("curl", args, { timeout: 300000 });
147
+ signal?.addEventListener("abort", () => child.kill("SIGTERM"));
148
+ child.stderr?.on("data", (d) => stderr.push(d));
149
+ child.on("close", (code) => {
150
+ resolve({
151
+ success: code === 0,
152
+ exitCode: code || 0,
153
+ output: code === 0 ? `Downloaded to ${output}` : undefined,
154
+ stderr: Buffer.concat(stderr).toString(),
155
+ });
156
+ });
157
+ child.on("error", (error) => {
158
+ resolve({
159
+ success: false,
160
+ error: error.message,
161
+ errorCode: "DOWNLOAD_ERROR",
162
+ });
163
+ });
164
+ });
165
+ }
166
+ }
167
+ //# sourceMappingURL=network-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network-worker.js","sourceRoot":"","sources":["../../../../../src/core/companion/scheduler/workers/network-worker.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn } from \"child_process\";\nimport { cpus, totalmem } from \"os\";\nimport { BaseWorker, type ScheduledTask, type TaskResult, type WorkerCapabilities } from \"./base-worker.js\";\n\nexport class NetworkWorker extends BaseWorker {\n\treadonly id: string;\n\treadonly type = \"network\";\n\treadonly capabilities: WorkerCapabilities;\n\n\tconstructor(id?: string) {\n\t\tsuper();\n\t\tthis.id = id || `net_${Date.now()}_${Math.random().toString(36).substr(2, 6)}`;\n\t\tthis.capabilities = {\n\t\t\tcpuCores: cpus().length,\n\t\t\tmemoryMb: Math.floor(totalmem() / (1024 * 1024)),\n\t\t\thasGpu: false,\n\t\t\tsupportsTypes: [\"network\", \"script\"],\n\t\t};\n\t}\n\n\tasync execute(task: ScheduledTask, signal?: AbortSignal): Promise<TaskResult> {\n\t\tthis.markBusy(task.id);\n\t\tconst startTime = Date.now();\n\n\t\ttry {\n\t\t\tconst result = await this.executeNetworkTask(task, signal);\n\t\t\tconst executionTime = Date.now() - startTime;\n\t\t\tthis.updateStats(executionTime, result.success);\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tconst executionTime = Date.now() - startTime;\n\t\t\tthis.updateStats(executionTime, false);\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\terrorCode: \"NETWORK_ERROR\",\n\t\t\t};\n\t\t} finally {\n\t\t\tthis.markIdle();\n\t\t}\n\t}\n\n\tprivate async executeNetworkTask(task: ScheduledTask, signal?: AbortSignal): Promise<TaskResult> {\n\t\tconst payload = task.payload;\n\t\tconst data = payload.data as Record<string, unknown> | undefined;\n\t\tconst operation = data?.operation as string | undefined;\n\n\t\tswitch (operation) {\n\t\t\tcase \"fetch\":\n\t\t\t\treturn this.handleFetch(data, signal);\n\t\t\tcase \"request\":\n\t\t\t\treturn this.handleRequest(data, signal);\n\t\t\tcase \"download\":\n\t\t\t\treturn this.handleDownload(data, signal);\n\t\t\tdefault:\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: `Unknown network operation: ${operation}`,\n\t\t\t\t\terrorCode: \"UNKNOWN_OPERATION\",\n\t\t\t\t};\n\t\t}\n\t}\n\n\tprivate async handleFetch(data: Record<string, unknown> | undefined, signal?: AbortSignal): Promise<TaskResult> {\n\t\tconst url = data?.url as string;\n\t\tif (!url) {\n\t\t\treturn { success: false, error: \"URL is required\", errorCode: \"MISSING_URL\" };\n\t\t}\n\n\t\treturn new Promise((resolve) => {\n\t\t\tconst stdout: Buffer[] = [];\n\t\t\tconst stderr: Buffer[] = [];\n\n\t\t\tconst args = [\"-s\", \"-L\", url];\n\t\t\tif (data?.headers) {\n\t\t\t\tconst headers = data.headers as Record<string, string>;\n\t\t\t\tfor (const [key, value] of Object.entries(headers)) {\n\t\t\t\t\targs.push(\"-H\", `${key}: ${value}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst child = spawn(\"curl\", args, { timeout: 30000 });\n\n\t\t\tsignal?.addEventListener(\"abort\", () => child.kill(\"SIGTERM\"));\n\n\t\t\tchild.stdout?.on(\"data\", (d: Buffer) => stdout.push(d));\n\t\t\tchild.stderr?.on(\"data\", (d: Buffer) => stderr.push(d));\n\n\t\t\tchild.on(\"close\", (code) => {\n\t\t\t\tresolve({\n\t\t\t\t\tsuccess: code === 0,\n\t\t\t\t\texitCode: code || 0,\n\t\t\t\t\toutput: Buffer.concat(stdout).toString(),\n\t\t\t\t\tstderr: Buffer.concat(stderr).toString(),\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tchild.on(\"error\", (error) => {\n\t\t\t\tresolve({\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: error.message,\n\t\t\t\t\terrorCode: \"FETCH_ERROR\",\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate async handleRequest(data: Record<string, unknown> | undefined, signal?: AbortSignal): Promise<TaskResult> {\n\t\tconst url = data?.url as string;\n\t\tconst method = (data?.method as string) || \"GET\";\n\t\tconst body = data?.body as string | undefined;\n\n\t\tif (!url) {\n\t\t\treturn { success: false, error: \"URL is required\", errorCode: \"MISSING_URL\" };\n\t\t}\n\n\t\treturn new Promise((resolve) => {\n\t\t\tconst stdout: Buffer[] = [];\n\t\t\tconst stderr: Buffer[] = [];\n\n\t\t\tconst args = [\"-s\", \"-X\", method.toUpperCase()];\n\n\t\t\tif (data?.headers) {\n\t\t\t\tconst headers = data.headers as Record<string, string>;\n\t\t\t\tfor (const [key, value] of Object.entries(headers)) {\n\t\t\t\t\targs.push(\"-H\", `${key}: ${value}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (body) {\n\t\t\t\targs.push(\"-d\", body);\n\t\t\t}\n\n\t\t\targs.push(url);\n\n\t\t\tconst child = spawn(\"curl\", args, { timeout: 60000 });\n\n\t\t\tsignal?.addEventListener(\"abort\", () => child.kill(\"SIGTERM\"));\n\n\t\t\tchild.stdout?.on(\"data\", (d: Buffer) => stdout.push(d));\n\t\t\tchild.stderr?.on(\"data\", (d: Buffer) => stderr.push(d));\n\n\t\t\tchild.on(\"close\", (code) => {\n\t\t\t\tresolve({\n\t\t\t\t\tsuccess: code === 0,\n\t\t\t\t\texitCode: code || 0,\n\t\t\t\t\toutput: Buffer.concat(stdout).toString(),\n\t\t\t\t\tstderr: Buffer.concat(stderr).toString(),\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tchild.on(\"error\", (error) => {\n\t\t\t\tresolve({\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: error.message,\n\t\t\t\t\terrorCode: \"REQUEST_ERROR\",\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate async handleDownload(data: Record<string, unknown> | undefined, signal?: AbortSignal): Promise<TaskResult> {\n\t\tconst url = data?.url as string;\n\t\tconst output = data?.output as string;\n\n\t\tif (!url || !output) {\n\t\t\treturn { success: false, error: \"URL and output path are required\", errorCode: \"MISSING_PARAMS\" };\n\t\t}\n\n\t\treturn new Promise((resolve) => {\n\t\t\tconst stderr: Buffer[] = [];\n\n\t\t\tconst args = [\"-s\", \"-L\", \"-o\", output, url];\n\n\t\t\tconst child = spawn(\"curl\", args, { timeout: 300000 });\n\n\t\t\tsignal?.addEventListener(\"abort\", () => child.kill(\"SIGTERM\"));\n\n\t\t\tchild.stderr?.on(\"data\", (d: Buffer) => stderr.push(d));\n\n\t\t\tchild.on(\"close\", (code) => {\n\t\t\t\tresolve({\n\t\t\t\t\tsuccess: code === 0,\n\t\t\t\t\texitCode: code || 0,\n\t\t\t\t\toutput: code === 0 ? `Downloaded to ${output}` : undefined,\n\t\t\t\t\tstderr: Buffer.concat(stderr).toString(),\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tchild.on(\"error\", (error) => {\n\t\t\t\tresolve({\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: error.message,\n\t\t\t\t\terrorCode: \"DOWNLOAD_ERROR\",\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n}\n"]}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Security Manager for OpenVibe Companion
3
+ *
4
+ * 管理执行安全策略
5
+ */
6
+ export interface SecurityConfig {
7
+ allowedCommands?: string[];
8
+ blockedPaths?: string[];
9
+ maxExecutionTime?: number;
10
+ maxMemoryMb?: number;
11
+ allowNetwork?: boolean;
12
+ allowFileWrite?: boolean;
13
+ }
14
+ export declare class SecurityManager {
15
+ private config;
16
+ constructor(config?: SecurityConfig);
17
+ /**
18
+ * 检查命令是否允许执行
19
+ */
20
+ isCommandAllowed(command: string): boolean;
21
+ /**
22
+ * 检查路径是否允许访问
23
+ */
24
+ isPathAllowed(filePath: string): boolean;
25
+ /**
26
+ * 检查网络访问是否允许
27
+ */
28
+ isNetworkAllowed(): boolean;
29
+ /**
30
+ * 检查文件写入是否允许
31
+ */
32
+ isFileWriteAllowed(): boolean;
33
+ /**
34
+ * 获取最大执行时间
35
+ */
36
+ getMaxExecutionTime(): number;
37
+ /**
38
+ * 获取最大内存限制
39
+ */
40
+ getMaxMemoryMb(): number;
41
+ /**
42
+ * 添加允许的命令
43
+ */
44
+ addAllowedCommand(command: string): void;
45
+ /**
46
+ * 添加阻止的路径
47
+ */
48
+ addBlockedPath(path: string): void;
49
+ }
50
+ //# sourceMappingURL=security-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-manager.d.ts","sourceRoot":"","sources":["../../../../src/core/companion/security/security-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,WAAW,cAAc;IAC9B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,qBAAa,eAAe;IAC3B,OAAO,CAAC,MAAM,CAA2B;IAEzC,YAAY,MAAM,GAAE,cAAmB,EA+BtC;IAED;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAGzC;IAED;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAWvC;IAED;;OAEG;IACH,gBAAgB,IAAI,OAAO,CAE1B;IAED;;OAEG;IACH,kBAAkB,IAAI,OAAO,CAE5B;IAED;;OAEG;IACH,mBAAmB,IAAI,MAAM,CAE5B;IAED;;OAEG;IACH,cAAc,IAAI,MAAM,CAEvB;IAED;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAIvC;IAED;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAIjC;CACD","sourcesContent":["/**\n * Security Manager for OpenVibe Companion\n *\n * 管理执行安全策略\n */\n\nimport { normalize, resolve } from \"path\";\n\nexport interface SecurityConfig {\n\tallowedCommands?: string[];\n\tblockedPaths?: string[];\n\tmaxExecutionTime?: number;\n\tmaxMemoryMb?: number;\n\tallowNetwork?: boolean;\n\tallowFileWrite?: boolean;\n}\n\nexport class SecurityManager {\n\tprivate config: Required<SecurityConfig>;\n\n\tconstructor(config: SecurityConfig = {}) {\n\t\tthis.config = {\n\t\t\tallowedCommands: config.allowedCommands ?? [\n\t\t\t\t\"python\",\n\t\t\t\t\"python3\",\n\t\t\t\t\"node\",\n\t\t\t\t\"npm\",\n\t\t\t\t\"npx\",\n\t\t\t\t\"cargo\",\n\t\t\t\t\"rustc\",\n\t\t\t\t\"git\",\n\t\t\t\t\"cat\",\n\t\t\t\t\"ls\",\n\t\t\t\t\"pwd\",\n\t\t\t\t\"mkdir\",\n\t\t\t\t\"head\",\n\t\t\t\t\"tail\",\n\t\t\t\t\"sort\",\n\t\t\t\t\"uniq\",\n\t\t\t\t\"diff\",\n\t\t\t\t\"wc\",\n\t\t\t\t\"tar\",\n\t\t\t\t\"gzip\",\n\t\t\t\t\"unzip\",\n\t\t\t],\n\t\t\tblockedPaths: config.blockedPaths ?? [],\n\t\t\tmaxExecutionTime: config.maxExecutionTime ?? 300,\n\t\t\tmaxMemoryMb: config.maxMemoryMb ?? 4096,\n\t\t\tallowNetwork: config.allowNetwork ?? false,\n\t\t\tallowFileWrite: config.allowFileWrite ?? true,\n\t\t};\n\t}\n\n\t/**\n\t * 检查命令是否允许执行\n\t */\n\tisCommandAllowed(command: string): boolean {\n\t\tconst baseCommand = command.split(\" \")[0].toLowerCase();\n\t\treturn this.config.allowedCommands.includes(baseCommand);\n\t}\n\n\t/**\n\t * 检查路径是否允许访问\n\t */\n\tisPathAllowed(filePath: string): boolean {\n\t\tconst normalizedPath = normalize(resolve(filePath));\n\n\t\tfor (const blockedPath of this.config.blockedPaths) {\n\t\t\tconst normalizedBlocked = normalize(resolve(blockedPath));\n\t\t\tif (normalizedPath.startsWith(normalizedBlocked)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * 检查网络访问是否允许\n\t */\n\tisNetworkAllowed(): boolean {\n\t\treturn this.config.allowNetwork;\n\t}\n\n\t/**\n\t * 检查文件写入是否允许\n\t */\n\tisFileWriteAllowed(): boolean {\n\t\treturn this.config.allowFileWrite;\n\t}\n\n\t/**\n\t * 获取最大执行时间\n\t */\n\tgetMaxExecutionTime(): number {\n\t\treturn this.config.maxExecutionTime;\n\t}\n\n\t/**\n\t * 获取最大内存限制\n\t */\n\tgetMaxMemoryMb(): number {\n\t\treturn this.config.maxMemoryMb;\n\t}\n\n\t/**\n\t * 添加允许的命令\n\t */\n\taddAllowedCommand(command: string): void {\n\t\tif (!this.config.allowedCommands.includes(command)) {\n\t\t\tthis.config.allowedCommands.push(command);\n\t\t}\n\t}\n\n\t/**\n\t * 添加阻止的路径\n\t */\n\taddBlockedPath(path: string): void {\n\t\tif (!this.config.blockedPaths.includes(path)) {\n\t\t\tthis.config.blockedPaths.push(path);\n\t\t}\n\t}\n}\n"]}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Security Manager for OpenVibe Companion
3
+ *
4
+ * 管理执行安全策略
5
+ */
6
+ import { normalize, resolve } from "path";
7
+ export class SecurityManager {
8
+ config;
9
+ constructor(config = {}) {
10
+ this.config = {
11
+ allowedCommands: config.allowedCommands ?? [
12
+ "python",
13
+ "python3",
14
+ "node",
15
+ "npm",
16
+ "npx",
17
+ "cargo",
18
+ "rustc",
19
+ "git",
20
+ "cat",
21
+ "ls",
22
+ "pwd",
23
+ "mkdir",
24
+ "head",
25
+ "tail",
26
+ "sort",
27
+ "uniq",
28
+ "diff",
29
+ "wc",
30
+ "tar",
31
+ "gzip",
32
+ "unzip",
33
+ ],
34
+ blockedPaths: config.blockedPaths ?? [],
35
+ maxExecutionTime: config.maxExecutionTime ?? 300,
36
+ maxMemoryMb: config.maxMemoryMb ?? 4096,
37
+ allowNetwork: config.allowNetwork ?? false,
38
+ allowFileWrite: config.allowFileWrite ?? true,
39
+ };
40
+ }
41
+ /**
42
+ * 检查命令是否允许执行
43
+ */
44
+ isCommandAllowed(command) {
45
+ const baseCommand = command.split(" ")[0].toLowerCase();
46
+ return this.config.allowedCommands.includes(baseCommand);
47
+ }
48
+ /**
49
+ * 检查路径是否允许访问
50
+ */
51
+ isPathAllowed(filePath) {
52
+ const normalizedPath = normalize(resolve(filePath));
53
+ for (const blockedPath of this.config.blockedPaths) {
54
+ const normalizedBlocked = normalize(resolve(blockedPath));
55
+ if (normalizedPath.startsWith(normalizedBlocked)) {
56
+ return false;
57
+ }
58
+ }
59
+ return true;
60
+ }
61
+ /**
62
+ * 检查网络访问是否允许
63
+ */
64
+ isNetworkAllowed() {
65
+ return this.config.allowNetwork;
66
+ }
67
+ /**
68
+ * 检查文件写入是否允许
69
+ */
70
+ isFileWriteAllowed() {
71
+ return this.config.allowFileWrite;
72
+ }
73
+ /**
74
+ * 获取最大执行时间
75
+ */
76
+ getMaxExecutionTime() {
77
+ return this.config.maxExecutionTime;
78
+ }
79
+ /**
80
+ * 获取最大内存限制
81
+ */
82
+ getMaxMemoryMb() {
83
+ return this.config.maxMemoryMb;
84
+ }
85
+ /**
86
+ * 添加允许的命令
87
+ */
88
+ addAllowedCommand(command) {
89
+ if (!this.config.allowedCommands.includes(command)) {
90
+ this.config.allowedCommands.push(command);
91
+ }
92
+ }
93
+ /**
94
+ * 添加阻止的路径
95
+ */
96
+ addBlockedPath(path) {
97
+ if (!this.config.blockedPaths.includes(path)) {
98
+ this.config.blockedPaths.push(path);
99
+ }
100
+ }
101
+ }
102
+ //# sourceMappingURL=security-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-manager.js","sourceRoot":"","sources":["../../../../src/core/companion/security/security-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAW1C,MAAM,OAAO,eAAe;IACnB,MAAM,CAA2B;IAEzC,YAAY,MAAM,GAAmB,EAAE,EAAE;QACxC,IAAI,CAAC,MAAM,GAAG;YACb,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI;gBAC1C,QAAQ;gBACR,SAAS;gBACT,MAAM;gBACN,KAAK;gBACL,KAAK;gBACL,OAAO;gBACP,OAAO;gBACP,KAAK;gBACL,KAAK;gBACL,IAAI;gBACJ,KAAK;gBACL,OAAO;gBACP,MAAM;gBACN,MAAM;gBACN,MAAM;gBACN,MAAM;gBACN,MAAM;gBACN,IAAI;gBACJ,KAAK;gBACL,MAAM;gBACN,OAAO;aACP;YACD,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,EAAE;YACvC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,IAAI,GAAG;YAChD,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,IAAI;YACvC,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,KAAK;YAC1C,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,IAAI;SAC7C,CAAC;IAAA,CACF;IAED;;OAEG;IACH,gBAAgB,CAAC,OAAe,EAAW;QAC1C,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QACxD,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAAA,CACzD;IAED;;OAEG;IACH,aAAa,CAAC,QAAgB,EAAW;QACxC,MAAM,cAAc,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEpD,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YACpD,MAAM,iBAAiB,GAAG,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;YAC1D,IAAI,cAAc,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBAClD,OAAO,KAAK,CAAC;YACd,CAAC;QACF,CAAC;QAED,OAAO,IAAI,CAAC;IAAA,CACZ;IAED;;OAEG;IACH,gBAAgB,GAAY;QAC3B,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;IAAA,CAChC;IAED;;OAEG;IACH,kBAAkB,GAAY;QAC7B,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;IAAA,CAClC;IAED;;OAEG;IACH,mBAAmB,GAAW;QAC7B,OAAO,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC;IAAA,CACpC;IAED;;OAEG;IACH,cAAc,GAAW;QACxB,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;IAAA,CAC/B;IAED;;OAEG;IACH,iBAAiB,CAAC,OAAe,EAAQ;QACxC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACpD,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3C,CAAC;IAAA,CACD;IAED;;OAEG;IACH,cAAc,CAAC,IAAY,EAAQ;QAClC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9C,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC;IAAA,CACD;CACD","sourcesContent":["/**\n * Security Manager for OpenVibe Companion\n *\n * 管理执行安全策略\n */\n\nimport { normalize, resolve } from \"path\";\n\nexport interface SecurityConfig {\n\tallowedCommands?: string[];\n\tblockedPaths?: string[];\n\tmaxExecutionTime?: number;\n\tmaxMemoryMb?: number;\n\tallowNetwork?: boolean;\n\tallowFileWrite?: boolean;\n}\n\nexport class SecurityManager {\n\tprivate config: Required<SecurityConfig>;\n\n\tconstructor(config: SecurityConfig = {}) {\n\t\tthis.config = {\n\t\t\tallowedCommands: config.allowedCommands ?? [\n\t\t\t\t\"python\",\n\t\t\t\t\"python3\",\n\t\t\t\t\"node\",\n\t\t\t\t\"npm\",\n\t\t\t\t\"npx\",\n\t\t\t\t\"cargo\",\n\t\t\t\t\"rustc\",\n\t\t\t\t\"git\",\n\t\t\t\t\"cat\",\n\t\t\t\t\"ls\",\n\t\t\t\t\"pwd\",\n\t\t\t\t\"mkdir\",\n\t\t\t\t\"head\",\n\t\t\t\t\"tail\",\n\t\t\t\t\"sort\",\n\t\t\t\t\"uniq\",\n\t\t\t\t\"diff\",\n\t\t\t\t\"wc\",\n\t\t\t\t\"tar\",\n\t\t\t\t\"gzip\",\n\t\t\t\t\"unzip\",\n\t\t\t],\n\t\t\tblockedPaths: config.blockedPaths ?? [],\n\t\t\tmaxExecutionTime: config.maxExecutionTime ?? 300,\n\t\t\tmaxMemoryMb: config.maxMemoryMb ?? 4096,\n\t\t\tallowNetwork: config.allowNetwork ?? false,\n\t\t\tallowFileWrite: config.allowFileWrite ?? true,\n\t\t};\n\t}\n\n\t/**\n\t * 检查命令是否允许执行\n\t */\n\tisCommandAllowed(command: string): boolean {\n\t\tconst baseCommand = command.split(\" \")[0].toLowerCase();\n\t\treturn this.config.allowedCommands.includes(baseCommand);\n\t}\n\n\t/**\n\t * 检查路径是否允许访问\n\t */\n\tisPathAllowed(filePath: string): boolean {\n\t\tconst normalizedPath = normalize(resolve(filePath));\n\n\t\tfor (const blockedPath of this.config.blockedPaths) {\n\t\t\tconst normalizedBlocked = normalize(resolve(blockedPath));\n\t\t\tif (normalizedPath.startsWith(normalizedBlocked)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * 检查网络访问是否允许\n\t */\n\tisNetworkAllowed(): boolean {\n\t\treturn this.config.allowNetwork;\n\t}\n\n\t/**\n\t * 检查文件写入是否允许\n\t */\n\tisFileWriteAllowed(): boolean {\n\t\treturn this.config.allowFileWrite;\n\t}\n\n\t/**\n\t * 获取最大执行时间\n\t */\n\tgetMaxExecutionTime(): number {\n\t\treturn this.config.maxExecutionTime;\n\t}\n\n\t/**\n\t * 获取最大内存限制\n\t */\n\tgetMaxMemoryMb(): number {\n\t\treturn this.config.maxMemoryMb;\n\t}\n\n\t/**\n\t * 添加允许的命令\n\t */\n\taddAllowedCommand(command: string): void {\n\t\tif (!this.config.allowedCommands.includes(command)) {\n\t\t\tthis.config.allowedCommands.push(command);\n\t\t}\n\t}\n\n\t/**\n\t * 添加阻止的路径\n\t */\n\taddBlockedPath(path: string): void {\n\t\tif (!this.config.blockedPaths.includes(path)) {\n\t\t\tthis.config.blockedPaths.push(path);\n\t\t}\n\t}\n}\n"]}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Hybrid Cloud Built-in Extension
3
+ *
4
+ * 注册 local-status 和 local-execute 命令
5
+ */
6
+ import type { ExtensionFactory } from "../extensions/types.js";
7
+ export declare function createHybridCloudExtension(): ExtensionFactory;
8
+ //# sourceMappingURL=extension.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../../../src/core/hybrid-cloud/extension.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAA2B,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAExF,wBAAgB,0BAA0B,IAAI,gBAAgB,CA+D7D","sourcesContent":["/**\n * Hybrid Cloud Built-in Extension\n *\n * 注册 local-status 和 local-execute 命令\n */\n\nimport { getCompanion } from \"../companion/index.js\";\nimport type { ExtensionCommandContext, ExtensionFactory } from \"../extensions/types.js\";\n\nexport function createHybridCloudExtension(): ExtensionFactory {\n\treturn (pi) => {\n\t\tpi.registerCommand(\"local-status\", {\n\t\t\tdescription: \"Show local agent status\",\n\t\t\thandler: async (_args: string, ctx: ExtensionCommandContext) => {\n\t\t\t\tconst companion = getCompanion();\n\n\t\t\t\tif (!companion.isActive()) {\n\t\t\t\t\tctx.ui.notify(\"Companion: not running\", \"info\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tconst resources = companion.getResourceStatus();\n\t\t\t\t\tctx.ui.notify(\"Companion: running\", \"info\");\n\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t`CPU cores: ${resources.cpu?.coreCount}, usage: ${resources.cpu?.usagePercent.toFixed(1)}%`,\n\t\t\t\t\t\t\"info\",\n\t\t\t\t\t);\n\t\t\t\t\tctx.ui.notify(`Memory: ${resources.memory?.usagePercent.toFixed(1)}% used`, \"info\");\n\t\t\t\t\tctx.ui.notify(`GPU devices: ${resources.gpu?.deviceCount || 0}`, \"info\");\n\t\t\t\t} catch (error) {\n\t\t\t\t\tctx.ui.notify(`Failed to get resource status: ${error}`, \"error\");\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\n\t\tpi.registerCommand(\"local-execute\", {\n\t\t\tdescription: \"Execute a command on the local machine\",\n\t\t\thandler: async (args: string, ctx: ExtensionCommandContext) => {\n\t\t\t\tconst companion = getCompanion();\n\n\t\t\t\tif (!companion.isActive()) {\n\t\t\t\t\tctx.ui.notify(\"Companion not running\", \"error\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (!args) {\n\t\t\t\t\tctx.ui.notify(\"Usage: /local-execute <command>\", \"error\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await (companion as any).scheduler.scheduleBash({\n\t\t\t\t\t\tcommand: args,\n\t\t\t\t\t\ttimeout: 60,\n\t\t\t\t\t});\n\n\t\t\t\t\tif (result.success) {\n\t\t\t\t\t\tpi.sendMessage({\n\t\t\t\t\t\t\tcustomType: \"local_execution_result\",\n\t\t\t\t\t\t\tcontent: result.stdout || \"Command executed successfully\",\n\t\t\t\t\t\t\tdisplay: true,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tctx.ui.notify(`Execution failed: ${result.error || result.stderr}`, \"error\");\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tctx.ui.notify(`Execution failed: ${error}`, \"error\");\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t};\n}\n"]}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Hybrid Cloud Built-in Extension
3
+ *
4
+ * 注册 local-status 和 local-execute 命令
5
+ */
6
+ import { getCompanion } from "../companion/index.js";
7
+ export function createHybridCloudExtension() {
8
+ return (pi) => {
9
+ pi.registerCommand("local-status", {
10
+ description: "Show local agent status",
11
+ handler: async (_args, ctx) => {
12
+ const companion = getCompanion();
13
+ if (!companion.isActive()) {
14
+ ctx.ui.notify("Companion: not running", "info");
15
+ return;
16
+ }
17
+ try {
18
+ const resources = companion.getResourceStatus();
19
+ ctx.ui.notify("Companion: running", "info");
20
+ ctx.ui.notify(`CPU cores: ${resources.cpu?.coreCount}, usage: ${resources.cpu?.usagePercent.toFixed(1)}%`, "info");
21
+ ctx.ui.notify(`Memory: ${resources.memory?.usagePercent.toFixed(1)}% used`, "info");
22
+ ctx.ui.notify(`GPU devices: ${resources.gpu?.deviceCount || 0}`, "info");
23
+ }
24
+ catch (error) {
25
+ ctx.ui.notify(`Failed to get resource status: ${error}`, "error");
26
+ }
27
+ },
28
+ });
29
+ pi.registerCommand("local-execute", {
30
+ description: "Execute a command on the local machine",
31
+ handler: async (args, ctx) => {
32
+ const companion = getCompanion();
33
+ if (!companion.isActive()) {
34
+ ctx.ui.notify("Companion not running", "error");
35
+ return;
36
+ }
37
+ if (!args) {
38
+ ctx.ui.notify("Usage: /local-execute <command>", "error");
39
+ return;
40
+ }
41
+ try {
42
+ const result = await companion.scheduler.scheduleBash({
43
+ command: args,
44
+ timeout: 60,
45
+ });
46
+ if (result.success) {
47
+ pi.sendMessage({
48
+ customType: "local_execution_result",
49
+ content: result.stdout || "Command executed successfully",
50
+ display: true,
51
+ });
52
+ }
53
+ else {
54
+ ctx.ui.notify(`Execution failed: ${result.error || result.stderr}`, "error");
55
+ }
56
+ }
57
+ catch (error) {
58
+ ctx.ui.notify(`Execution failed: ${error}`, "error");
59
+ }
60
+ },
61
+ });
62
+ };
63
+ }
64
+ //# sourceMappingURL=extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.js","sourceRoot":"","sources":["../../../src/core/hybrid-cloud/extension.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Hybrid Cloud Built-in Extension\n *\n * 注册 local-status 和 local-execute 命令\n */\n\nimport { getCompanion } from \"../companion/index.js\";\nimport type { ExtensionCommandContext, ExtensionFactory } from \"../extensions/types.js\";\n\nexport function createHybridCloudExtension(): ExtensionFactory {\n\treturn (pi) => {\n\t\tpi.registerCommand(\"local-status\", {\n\t\t\tdescription: \"Show local agent status\",\n\t\t\thandler: async (_args: string, ctx: ExtensionCommandContext) => {\n\t\t\t\tconst companion = getCompanion();\n\n\t\t\t\tif (!companion.isActive()) {\n\t\t\t\t\tctx.ui.notify(\"Companion: not running\", \"info\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tconst resources = companion.getResourceStatus();\n\t\t\t\t\tctx.ui.notify(\"Companion: running\", \"info\");\n\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t`CPU cores: ${resources.cpu?.coreCount}, usage: ${resources.cpu?.usagePercent.toFixed(1)}%`,\n\t\t\t\t\t\t\"info\",\n\t\t\t\t\t);\n\t\t\t\t\tctx.ui.notify(`Memory: ${resources.memory?.usagePercent.toFixed(1)}% used`, \"info\");\n\t\t\t\t\tctx.ui.notify(`GPU devices: ${resources.gpu?.deviceCount || 0}`, \"info\");\n\t\t\t\t} catch (error) {\n\t\t\t\t\tctx.ui.notify(`Failed to get resource status: ${error}`, \"error\");\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\n\t\tpi.registerCommand(\"local-execute\", {\n\t\t\tdescription: \"Execute a command on the local machine\",\n\t\t\thandler: async (args: string, ctx: ExtensionCommandContext) => {\n\t\t\t\tconst companion = getCompanion();\n\n\t\t\t\tif (!companion.isActive()) {\n\t\t\t\t\tctx.ui.notify(\"Companion not running\", \"error\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (!args) {\n\t\t\t\t\tctx.ui.notify(\"Usage: /local-execute <command>\", \"error\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await (companion as any).scheduler.scheduleBash({\n\t\t\t\t\t\tcommand: args,\n\t\t\t\t\t\ttimeout: 60,\n\t\t\t\t\t});\n\n\t\t\t\t\tif (result.success) {\n\t\t\t\t\t\tpi.sendMessage({\n\t\t\t\t\t\t\tcustomType: \"local_execution_result\",\n\t\t\t\t\t\t\tcontent: result.stdout || \"Command executed successfully\",\n\t\t\t\t\t\t\tdisplay: true,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tctx.ui.notify(`Execution failed: ${result.error || result.stderr}`, \"error\");\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tctx.ui.notify(`Execution failed: ${error}`, \"error\");\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t};\n}\n"]}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Hybrid Cloud Integration for OpenVibe
3
+ *
4
+ * 直接使用内部 Companion 服务
5
+ */
6
+ import type { AgentSession } from "../agent-session.js";
7
+ import type { BashResult, CodeResult } from "../companion/index.js";
8
+ import type { ToolDefinition } from "../extensions/index.js";
9
+ interface HybridCloudConfig {
10
+ enabled: boolean;
11
+ autoConnect: boolean;
12
+ offloadThreshold: {
13
+ cpuCores?: number;
14
+ memoryMb?: number;
15
+ useGpu?: boolean;
16
+ };
17
+ }
18
+ /**
19
+ * Hybrid Cloud Manager
20
+ * 管理云端与本地代理的协同工作
21
+ */
22
+ export declare class HybridCloudManager {
23
+ private companion;
24
+ private config;
25
+ constructor(_session: AgentSession, config?: Partial<HybridCloudConfig>);
26
+ /**
27
+ * 检查是否应该将任务卸载到本地执行
28
+ */
29
+ shouldOffloadToLocal(requirements: {
30
+ estimatedCpuCores?: number;
31
+ estimatedMemoryMb?: number;
32
+ requiresGpu?: boolean;
33
+ isLongRunning?: boolean;
34
+ }): boolean;
35
+ /**
36
+ * 获取本地资源状态
37
+ */
38
+ getLocalResourceStatus(): {
39
+ status: string;
40
+ host: string;
41
+ port: number;
42
+ cpu: {
43
+ coreCount: number;
44
+ usagePercent: number;
45
+ availableCores: number;
46
+ };
47
+ memory: {
48
+ totalMb: number;
49
+ usedMb: number;
50
+ freeMb: number;
51
+ usagePercent: number;
52
+ };
53
+ gpu: {
54
+ deviceCount: number;
55
+ devices: {
56
+ name: string;
57
+ memoryUsedMb: number;
58
+ memoryTotalMb: number;
59
+ memoryUsagePercent: number;
60
+ }[];
61
+ };
62
+ disk: {
63
+ disks: {
64
+ mountPoint: string;
65
+ usedBytes: number;
66
+ totalBytes: number;
67
+ usagePercent: number;
68
+ }[];
69
+ };
70
+ } | null;
71
+ /**
72
+ * 执行 Bash 命令
73
+ */
74
+ executeBash(command: string, options?: {
75
+ workingDir?: string;
76
+ timeout?: number;
77
+ }): Promise<BashResult>;
78
+ /**
79
+ * 执行代码
80
+ */
81
+ executeCode(code: string, language: string, options?: {
82
+ timeout?: number;
83
+ }): Promise<CodeResult>;
84
+ /**
85
+ * 创建用于 OpenVibe 扩展的工具定义
86
+ */
87
+ createTools(): ToolDefinition[];
88
+ /**
89
+ * 获取状态信息用于展示
90
+ */
91
+ getStatus(): {
92
+ enabled: boolean;
93
+ connected: boolean;
94
+ address: string | undefined;
95
+ };
96
+ }
97
+ export type { HybridCloudConfig };
98
+ //# sourceMappingURL=index.d.ts.map