aws-runtime-bridge 1.9.135 → 1.9.139

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 (884) hide show
  1. package/dist/adapter/AcodeSdkAdapter.d.ts +10 -0
  2. package/dist/adapter/AcodeSdkAdapter.js +5 -5
  3. package/dist/adapter/ClaudeSdkAdapter.js +3 -3
  4. package/dist/adapter/CodexSdkAdapter.js +3 -3
  5. package/dist/adapter/OpencodeSdkAdapter.js +3 -3
  6. package/dist/browser/browser-pool.js +1 -1
  7. package/dist/browser/built-in-browser-tools.d.ts +1 -2
  8. package/dist/browser/built-in-browser-tools.js +1 -1
  9. package/dist/browser/ws-server.js +1 -1
  10. package/dist/config.d.ts +4 -0
  11. package/dist/config.js +2 -2
  12. package/dist/index.js +1 -1
  13. package/dist/middleware/auth.js +1 -1
  14. package/dist/remote-desktop/computer-control.d.ts +1 -1
  15. package/dist/remote-desktop/index.d.ts +1 -1
  16. package/dist/remote-desktop/index.js +2 -2
  17. package/dist/remote-desktop/session-manager.d.ts +2 -2
  18. package/dist/remote-desktop/session-manager.js +1 -1
  19. package/dist/remote-desktop/system-backend.js +3 -3
  20. package/dist/routes/ai-sources.js +1 -1
  21. package/dist/routes/background-tasks.js +1 -1
  22. package/dist/routes/browser-listeners.js +1 -1
  23. package/dist/routes/capabilities.d.ts +2 -0
  24. package/dist/routes/capabilities.js +2 -0
  25. package/dist/routes/dashboard.js +1 -1
  26. package/dist/routes/file-change-diff.js +3 -3
  27. package/dist/routes/file-diff-rollback.js +1 -1
  28. package/dist/routes/file-snapshot.js +1 -1
  29. package/dist/routes/git.js +1 -1
  30. package/dist/routes/instance.d.ts +0 -1
  31. package/dist/routes/instance.js +1 -1
  32. package/dist/routes/launch.js +1 -1
  33. package/dist/routes/mcp-extra.d.ts +2 -0
  34. package/dist/routes/mcp-extra.js +3 -0
  35. package/dist/routes/mcp.d.ts +1 -0
  36. package/dist/routes/mcp.js +1 -1
  37. package/dist/routes/plugins.d.ts +2 -0
  38. package/dist/routes/plugins.js +2 -0
  39. package/dist/routes/properties.js +1 -1
  40. package/dist/routes/pty.d.ts +1 -1
  41. package/dist/routes/pty.js +1 -1
  42. package/dist/routes/runtime-binding.js +1 -1
  43. package/dist/routes/skills.d.ts +1 -0
  44. package/dist/routes/skills.js +1 -1
  45. package/dist/routes/sub-agents.js +1 -1
  46. package/dist/routes/task-context.js +1 -1
  47. package/dist/routes/terminal.js +25 -25
  48. package/dist/routes/yml.js +1 -1
  49. package/dist/services/access-control.js +1 -1
  50. package/dist/services/acode-bg-manager.js +1 -1
  51. package/dist/services/agent-capability-sync.d.ts +7 -0
  52. package/dist/services/agent-capability-sync.js +2 -0
  53. package/dist/services/agent-process-manager.d.ts +1 -1
  54. package/dist/services/agent-process-manager.js +1 -1
  55. package/{package/cc-switch-sdk/dist → dist}/services/ai-config-service.d.ts +3 -0
  56. package/dist/services/ai-config-service.js +4 -0
  57. package/dist/services/ai-source-apply.d.ts +1 -1
  58. package/dist/services/ai-source-apply.js +1 -1
  59. package/dist/services/auto-register.js +1 -1
  60. package/dist/services/bridge-package-publish-hooks.js +1 -1
  61. package/dist/services/browser-session-manager.d.ts +3 -3
  62. package/dist/services/browser-session-manager.js +1 -1
  63. package/dist/services/capability-config.d.ts +21 -0
  64. package/dist/services/capability-config.js +3 -0
  65. package/dist/services/cli-commands.js +2 -2
  66. package/dist/services/desktop-mcp-manager.js +1 -1
  67. package/dist/services/fileSnapshotStore.js +1 -1
  68. package/dist/services/instance-ai-config-service.d.ts +1 -0
  69. package/dist/services/instance-ai-config-service.js +1 -1
  70. package/dist/services/instance-features.d.ts +21 -0
  71. package/dist/services/instance-features.js +1 -1
  72. package/dist/services/instance-init-service.d.ts +7 -4
  73. package/dist/services/instance-init-service.js +1 -1
  74. package/dist/services/instance-state.js +1 -1
  75. package/dist/services/jdk-scanner.js +1 -1
  76. package/dist/services/launch-manager.js +1 -1
  77. package/dist/services/legacy-path-migration.d.ts +2 -0
  78. package/dist/services/legacy-path-migration.js +1 -1
  79. package/dist/services/lifecycle-state.js +2 -2
  80. package/dist/services/mcp-deploy.d.ts +49 -0
  81. package/dist/services/mcp-deploy.js +4 -0
  82. package/dist/services/orphan-monitor.js +1 -1
  83. package/dist/services/plugin-event-buffer.d.ts +49 -0
  84. package/dist/services/plugin-event-buffer.js +2 -0
  85. package/dist/services/plugin-manager.d.ts +262 -0
  86. package/dist/services/plugin-manager.js +16 -0
  87. package/dist/services/plugin-package.d.ts +8 -0
  88. package/dist/services/plugin-package.js +2 -0
  89. package/dist/services/process-detail.js +2 -2
  90. package/dist/services/process-detector.js +10 -10
  91. package/dist/services/process-registry.js +1 -1
  92. package/dist/services/process-top.js +2 -2
  93. package/dist/services/runtime-binding.js +4 -4
  94. package/dist/services/sdk-tool-file-change-recorder.js +1 -1
  95. package/dist/services/skill-manager.d.ts +41 -0
  96. package/dist/services/skill-manager.js +3 -0
  97. package/dist/services/startup-config-wizard.js +6 -6
  98. package/dist/services/system-metrics.js +1 -1
  99. package/dist/services/tunnel-client.js +1 -1
  100. package/dist/services/update-notifier.js +2 -2
  101. package/dist/services/windows-service-manager.js +1 -1
  102. package/dist/services/workspace-files.js +1 -1
  103. package/dist/services/workspaceTaskChangeWatcher.js +3 -3
  104. package/dist/types.d.ts +11 -61
  105. package/dist/utils/file-utils.d.ts +9 -6
  106. package/dist/utils/file-utils.js +2 -2
  107. package/dist/utils/instance-ai-config-debug-logger.js +1 -1
  108. package/dist/utils/mcp-utils.d.ts +1 -37
  109. package/dist/utils/mcp-utils.js +1 -1
  110. package/dist/utils/yaml-utils.js +1 -1
  111. package/package/acode/dist/built-in-file-tools.js +2 -2
  112. package/package/acode/dist/commands/commandRegistry.d.ts +2 -0
  113. package/package/acode/dist/commands/commandRegistry.js +1 -1
  114. package/package/acode/dist/index.d.ts +2 -0
  115. package/package/acode/dist/index.js +1 -1
  116. package/package/acode/dist/plugin-tools.d.ts +14 -0
  117. package/package/acode/dist/plugin-tools.js +9 -0
  118. package/package/acode/dist/plugin-types.d.ts +119 -0
  119. package/package/acode/dist/runtime.d.ts +4 -0
  120. package/package/acode/dist/runtime.js +19 -19
  121. package/package/acode/dist/sub-agent-manager.js +1 -1
  122. package/package/acode/dist/types.d.ts +5 -0
  123. package/package/aws-client-agent-mcp/dist/agent-client.d.ts +9 -1
  124. package/package/aws-client-agent-mcp/dist/agent-client.js +1 -1
  125. package/package/aws-client-agent-mcp/dist/http-client.js +1 -1
  126. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +10 -0
  127. package/package/aws-client-agent-mcp/dist/mcp-server.js +21 -21
  128. package/package/aws-client-agent-mcp/dist/mcp-tools.js +2 -4
  129. package/package/aws-client-agent-mcp/dist/memory-tools.js +12 -14
  130. package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts +1 -1
  131. package/package/aws-client-agent-mcp/dist/server-memory-store.js +1 -1
  132. package/package/aws-client-agent-mcp/dist/status-reporter.d.ts +2 -0
  133. package/package/aws-client-agent-mcp/dist/status-reporter.js +3 -2
  134. package/package/aws-client-agent-mcp/dist/types.d.ts +22 -0
  135. package/package.json +4 -10
  136. package/dist/adapters/cc-switch/common.d.ts +0 -41
  137. package/dist/adapters/cc-switch/common.js +0 -2
  138. package/dist/adapters/cc-switch/index.d.ts +0 -19
  139. package/dist/adapters/cc-switch/index.js +0 -2
  140. package/dist/adapters/cc-switch/mcp-acode.d.ts +0 -10
  141. package/dist/adapters/cc-switch/mcp-acode.js +0 -2
  142. package/dist/adapters/cc-switch/mcp-claude.d.ts +0 -10
  143. package/dist/adapters/cc-switch/mcp-claude.js +0 -2
  144. package/dist/adapters/cc-switch/mcp-claudecode.d.ts +0 -10
  145. package/dist/adapters/cc-switch/mcp-claudecode.js +0 -2
  146. package/dist/adapters/cc-switch/mcp-codex.d.ts +0 -10
  147. package/dist/adapters/cc-switch/mcp-codex.js +0 -11
  148. package/dist/adapters/cc-switch/mcp-opencode.d.ts +0 -14
  149. package/dist/adapters/cc-switch/mcp-opencode.js +0 -2
  150. package/dist/adapters/cc-switch/mcp-placeholder.d.ts +0 -9
  151. package/dist/adapters/cc-switch/mcp-placeholder.js +0 -2
  152. package/dist/adapters/cc-switch/skill-acode.d.ts +0 -5
  153. package/dist/adapters/cc-switch/skill-acode.js +0 -2
  154. package/dist/adapters/cc-switch/skill-claude.d.ts +0 -5
  155. package/dist/adapters/cc-switch/skill-claude.js +0 -2
  156. package/dist/adapters/cc-switch/skill-claudecode.d.ts +0 -5
  157. package/dist/adapters/cc-switch/skill-claudecode.js +0 -2
  158. package/dist/adapters/cc-switch/skill-codex.d.ts +0 -4
  159. package/dist/adapters/cc-switch/skill-codex.js +0 -2
  160. package/dist/adapters/cc-switch/skill-directory.d.ts +0 -9
  161. package/dist/adapters/cc-switch/skill-directory.js +0 -3
  162. package/dist/adapters/cc-switch/skill-opencode.d.ts +0 -5
  163. package/dist/adapters/cc-switch/skill-opencode.js +0 -2
  164. package/dist/adapters/cc-switch/skill-placeholder.d.ts +0 -9
  165. package/dist/adapters/cc-switch/skill-placeholder.js +0 -2
  166. package/dist/services/cc-switch-sdk.d.ts +0 -17
  167. package/dist/services/cc-switch-sdk.js +0 -2
  168. package/dist/services/instance-service.d.ts +0 -78
  169. package/dist/services/instance-service.js +0 -2
  170. package/node_modules/@cc-switch/sdk/README.md +0 -541
  171. package/node_modules/@cc-switch/sdk/dist/constants.d.ts +0 -8
  172. package/node_modules/@cc-switch/sdk/dist/constants.js +0 -2
  173. package/node_modules/@cc-switch/sdk/dist/errors.d.ts +0 -5
  174. package/node_modules/@cc-switch/sdk/dist/errors.js +0 -2
  175. package/node_modules/@cc-switch/sdk/dist/index.d.ts +0 -5
  176. package/node_modules/@cc-switch/sdk/dist/index.js +0 -2
  177. package/node_modules/@cc-switch/sdk/dist/schemas.d.ts +0 -7
  178. package/node_modules/@cc-switch/sdk/dist/schemas.js +0 -2
  179. package/node_modules/@cc-switch/sdk/dist/sdk.d.ts +0 -59
  180. package/node_modules/@cc-switch/sdk/dist/sdk.js +0 -2
  181. package/node_modules/@cc-switch/sdk/dist/services/ai-config-service.d.ts +0 -81
  182. package/node_modules/@cc-switch/sdk/dist/services/ai-config-service.js +0 -4
  183. package/node_modules/@cc-switch/sdk/dist/services/mcp-model.d.ts +0 -16
  184. package/node_modules/@cc-switch/sdk/dist/services/mcp-model.js +0 -2
  185. package/node_modules/@cc-switch/sdk/dist/services/mcp-service.d.ts +0 -17
  186. package/node_modules/@cc-switch/sdk/dist/services/mcp-service.js +0 -2
  187. package/node_modules/@cc-switch/sdk/dist/services/skill-model.d.ts +0 -16
  188. package/node_modules/@cc-switch/sdk/dist/services/skill-model.js +0 -2
  189. package/node_modules/@cc-switch/sdk/dist/services/skill-service.d.ts +0 -16
  190. package/node_modules/@cc-switch/sdk/dist/services/skill-service.js +0 -2
  191. package/node_modules/@cc-switch/sdk/dist/state.d.ts +0 -3
  192. package/node_modules/@cc-switch/sdk/dist/state.js +0 -2
  193. package/node_modules/@cc-switch/sdk/dist/types.d.ts +0 -78
  194. package/node_modules/@cc-switch/sdk/dist/utils/fs.d.ts +0 -10
  195. package/node_modules/@cc-switch/sdk/dist/utils/fs.js +0 -3
  196. package/node_modules/@cc-switch/sdk/dist/utils/id.d.ts +0 -3
  197. package/node_modules/@cc-switch/sdk/dist/utils/id.js +0 -2
  198. package/node_modules/@cc-switch/sdk/package.json +0 -31
  199. package/node_modules/zod/LICENSE +0 -21
  200. package/node_modules/zod/README.md +0 -208
  201. package/node_modules/zod/index.cjs +0 -33
  202. package/node_modules/zod/index.d.cts +0 -4
  203. package/node_modules/zod/index.d.ts +0 -4
  204. package/node_modules/zod/index.js +0 -4
  205. package/node_modules/zod/locales/index.cjs +0 -17
  206. package/node_modules/zod/locales/index.d.cts +0 -1
  207. package/node_modules/zod/locales/index.d.ts +0 -1
  208. package/node_modules/zod/locales/index.js +0 -1
  209. package/node_modules/zod/locales/package.json +0 -6
  210. package/node_modules/zod/mini/index.cjs +0 -17
  211. package/node_modules/zod/mini/index.d.cts +0 -1
  212. package/node_modules/zod/mini/index.d.ts +0 -1
  213. package/node_modules/zod/mini/index.js +0 -1
  214. package/node_modules/zod/mini/package.json +0 -6
  215. package/node_modules/zod/package.json +0 -135
  216. package/node_modules/zod/src/index.ts +0 -4
  217. package/node_modules/zod/src/locales/index.ts +0 -1
  218. package/node_modules/zod/src/mini/index.ts +0 -1
  219. package/node_modules/zod/src/v3/ZodError.ts +0 -330
  220. package/node_modules/zod/src/v3/benchmarks/datetime.ts +0 -58
  221. package/node_modules/zod/src/v3/benchmarks/discriminatedUnion.ts +0 -80
  222. package/node_modules/zod/src/v3/benchmarks/index.ts +0 -59
  223. package/node_modules/zod/src/v3/benchmarks/ipv4.ts +0 -57
  224. package/node_modules/zod/src/v3/benchmarks/object.ts +0 -69
  225. package/node_modules/zod/src/v3/benchmarks/primitives.ts +0 -162
  226. package/node_modules/zod/src/v3/benchmarks/realworld.ts +0 -63
  227. package/node_modules/zod/src/v3/benchmarks/string.ts +0 -55
  228. package/node_modules/zod/src/v3/benchmarks/union.ts +0 -80
  229. package/node_modules/zod/src/v3/errors.ts +0 -13
  230. package/node_modules/zod/src/v3/external.ts +0 -6
  231. package/node_modules/zod/src/v3/helpers/enumUtil.ts +0 -17
  232. package/node_modules/zod/src/v3/helpers/errorUtil.ts +0 -8
  233. package/node_modules/zod/src/v3/helpers/parseUtil.ts +0 -176
  234. package/node_modules/zod/src/v3/helpers/partialUtil.ts +0 -34
  235. package/node_modules/zod/src/v3/helpers/typeAliases.ts +0 -2
  236. package/node_modules/zod/src/v3/helpers/util.ts +0 -224
  237. package/node_modules/zod/src/v3/index.ts +0 -4
  238. package/node_modules/zod/src/v3/locales/en.ts +0 -124
  239. package/node_modules/zod/src/v3/standard-schema.ts +0 -113
  240. package/node_modules/zod/src/v3/tests/Mocker.ts +0 -54
  241. package/node_modules/zod/src/v3/tests/all-errors.test.ts +0 -157
  242. package/node_modules/zod/src/v3/tests/anyunknown.test.ts +0 -28
  243. package/node_modules/zod/src/v3/tests/array.test.ts +0 -71
  244. package/node_modules/zod/src/v3/tests/async-parsing.test.ts +0 -388
  245. package/node_modules/zod/src/v3/tests/async-refinements.test.ts +0 -46
  246. package/node_modules/zod/src/v3/tests/base.test.ts +0 -29
  247. package/node_modules/zod/src/v3/tests/bigint.test.ts +0 -55
  248. package/node_modules/zod/src/v3/tests/branded.test.ts +0 -53
  249. package/node_modules/zod/src/v3/tests/catch.test.ts +0 -220
  250. package/node_modules/zod/src/v3/tests/coerce.test.ts +0 -133
  251. package/node_modules/zod/src/v3/tests/complex.test.ts +0 -56
  252. package/node_modules/zod/src/v3/tests/custom.test.ts +0 -31
  253. package/node_modules/zod/src/v3/tests/date.test.ts +0 -32
  254. package/node_modules/zod/src/v3/tests/deepmasking.test.ts +0 -186
  255. package/node_modules/zod/src/v3/tests/default.test.ts +0 -112
  256. package/node_modules/zod/src/v3/tests/description.test.ts +0 -33
  257. package/node_modules/zod/src/v3/tests/discriminated-unions.test.ts +0 -315
  258. package/node_modules/zod/src/v3/tests/enum.test.ts +0 -80
  259. package/node_modules/zod/src/v3/tests/error.test.ts +0 -551
  260. package/node_modules/zod/src/v3/tests/firstparty.test.ts +0 -87
  261. package/node_modules/zod/src/v3/tests/firstpartyschematypes.test.ts +0 -21
  262. package/node_modules/zod/src/v3/tests/function.test.ts +0 -257
  263. package/node_modules/zod/src/v3/tests/generics.test.ts +0 -48
  264. package/node_modules/zod/src/v3/tests/instanceof.test.ts +0 -37
  265. package/node_modules/zod/src/v3/tests/intersection.test.ts +0 -110
  266. package/node_modules/zod/src/v3/tests/language-server.source.ts +0 -76
  267. package/node_modules/zod/src/v3/tests/language-server.test.ts +0 -207
  268. package/node_modules/zod/src/v3/tests/literal.test.ts +0 -36
  269. package/node_modules/zod/src/v3/tests/map.test.ts +0 -110
  270. package/node_modules/zod/src/v3/tests/masking.test.ts +0 -4
  271. package/node_modules/zod/src/v3/tests/mocker.test.ts +0 -19
  272. package/node_modules/zod/src/v3/tests/nan.test.ts +0 -21
  273. package/node_modules/zod/src/v3/tests/nativeEnum.test.ts +0 -87
  274. package/node_modules/zod/src/v3/tests/nullable.test.ts +0 -42
  275. package/node_modules/zod/src/v3/tests/number.test.ts +0 -176
  276. package/node_modules/zod/src/v3/tests/object-augmentation.test.ts +0 -29
  277. package/node_modules/zod/src/v3/tests/object-in-es5-env.test.ts +0 -29
  278. package/node_modules/zod/src/v3/tests/object.test.ts +0 -434
  279. package/node_modules/zod/src/v3/tests/optional.test.ts +0 -42
  280. package/node_modules/zod/src/v3/tests/parseUtil.test.ts +0 -23
  281. package/node_modules/zod/src/v3/tests/parser.test.ts +0 -41
  282. package/node_modules/zod/src/v3/tests/partials.test.ts +0 -243
  283. package/node_modules/zod/src/v3/tests/pickomit.test.ts +0 -111
  284. package/node_modules/zod/src/v3/tests/pipeline.test.ts +0 -29
  285. package/node_modules/zod/src/v3/tests/preprocess.test.ts +0 -186
  286. package/node_modules/zod/src/v3/tests/primitive.test.ts +0 -440
  287. package/node_modules/zod/src/v3/tests/promise.test.ts +0 -90
  288. package/node_modules/zod/src/v3/tests/readonly.test.ts +0 -194
  289. package/node_modules/zod/src/v3/tests/record.test.ts +0 -171
  290. package/node_modules/zod/src/v3/tests/recursive.test.ts +0 -197
  291. package/node_modules/zod/src/v3/tests/refine.test.ts +0 -313
  292. package/node_modules/zod/src/v3/tests/safeparse.test.ts +0 -27
  293. package/node_modules/zod/src/v3/tests/set.test.ts +0 -142
  294. package/node_modules/zod/src/v3/tests/standard-schema.test.ts +0 -83
  295. package/node_modules/zod/src/v3/tests/string.test.ts +0 -916
  296. package/node_modules/zod/src/v3/tests/transformer.test.ts +0 -233
  297. package/node_modules/zod/src/v3/tests/tuple.test.ts +0 -90
  298. package/node_modules/zod/src/v3/tests/unions.test.ts +0 -57
  299. package/node_modules/zod/src/v3/tests/validations.test.ts +0 -133
  300. package/node_modules/zod/src/v3/tests/void.test.ts +0 -15
  301. package/node_modules/zod/src/v3/types.ts +0 -5138
  302. package/node_modules/zod/src/v4/classic/checks.ts +0 -31
  303. package/node_modules/zod/src/v4/classic/coerce.ts +0 -27
  304. package/node_modules/zod/src/v4/classic/compat.ts +0 -70
  305. package/node_modules/zod/src/v4/classic/errors.ts +0 -82
  306. package/node_modules/zod/src/v4/classic/external.ts +0 -50
  307. package/node_modules/zod/src/v4/classic/index.ts +0 -5
  308. package/node_modules/zod/src/v4/classic/iso.ts +0 -90
  309. package/node_modules/zod/src/v4/classic/parse.ts +0 -82
  310. package/node_modules/zod/src/v4/classic/schemas.ts +0 -2197
  311. package/node_modules/zod/src/v4/classic/tests/anyunknown.test.ts +0 -26
  312. package/node_modules/zod/src/v4/classic/tests/array.test.ts +0 -264
  313. package/node_modules/zod/src/v4/classic/tests/assignability.test.ts +0 -210
  314. package/node_modules/zod/src/v4/classic/tests/async-parsing.test.ts +0 -381
  315. package/node_modules/zod/src/v4/classic/tests/async-refinements.test.ts +0 -68
  316. package/node_modules/zod/src/v4/classic/tests/base.test.ts +0 -7
  317. package/node_modules/zod/src/v4/classic/tests/bigint.test.ts +0 -54
  318. package/node_modules/zod/src/v4/classic/tests/brand.test.ts +0 -63
  319. package/node_modules/zod/src/v4/classic/tests/catch.test.ts +0 -276
  320. package/node_modules/zod/src/v4/classic/tests/coalesce.test.ts +0 -20
  321. package/node_modules/zod/src/v4/classic/tests/codec-examples.test.ts +0 -573
  322. package/node_modules/zod/src/v4/classic/tests/codec.test.ts +0 -562
  323. package/node_modules/zod/src/v4/classic/tests/coerce.test.ts +0 -160
  324. package/node_modules/zod/src/v4/classic/tests/continuability.test.ts +0 -352
  325. package/node_modules/zod/src/v4/classic/tests/custom.test.ts +0 -40
  326. package/node_modules/zod/src/v4/classic/tests/date.test.ts +0 -31
  327. package/node_modules/zod/src/v4/classic/tests/datetime.test.ts +0 -302
  328. package/node_modules/zod/src/v4/classic/tests/default.test.ts +0 -365
  329. package/node_modules/zod/src/v4/classic/tests/description.test.ts +0 -32
  330. package/node_modules/zod/src/v4/classic/tests/discriminated-unions.test.ts +0 -661
  331. package/node_modules/zod/src/v4/classic/tests/enum.test.ts +0 -285
  332. package/node_modules/zod/src/v4/classic/tests/error-utils.test.ts +0 -595
  333. package/node_modules/zod/src/v4/classic/tests/error.test.ts +0 -711
  334. package/node_modules/zod/src/v4/classic/tests/file.test.ts +0 -96
  335. package/node_modules/zod/src/v4/classic/tests/firstparty.test.ts +0 -179
  336. package/node_modules/zod/src/v4/classic/tests/function.test.ts +0 -308
  337. package/node_modules/zod/src/v4/classic/tests/generics.test.ts +0 -72
  338. package/node_modules/zod/src/v4/classic/tests/hash.test.ts +0 -68
  339. package/node_modules/zod/src/v4/classic/tests/index.test.ts +0 -844
  340. package/node_modules/zod/src/v4/classic/tests/instanceof.test.ts +0 -34
  341. package/node_modules/zod/src/v4/classic/tests/intersection.test.ts +0 -171
  342. package/node_modules/zod/src/v4/classic/tests/json.test.ts +0 -108
  343. package/node_modules/zod/src/v4/classic/tests/lazy.test.ts +0 -227
  344. package/node_modules/zod/src/v4/classic/tests/literal.test.ts +0 -117
  345. package/node_modules/zod/src/v4/classic/tests/map.test.ts +0 -196
  346. package/node_modules/zod/src/v4/classic/tests/nan.test.ts +0 -21
  347. package/node_modules/zod/src/v4/classic/tests/nested-refine.test.ts +0 -168
  348. package/node_modules/zod/src/v4/classic/tests/nonoptional.test.ts +0 -101
  349. package/node_modules/zod/src/v4/classic/tests/nullable.test.ts +0 -22
  350. package/node_modules/zod/src/v4/classic/tests/number.test.ts +0 -270
  351. package/node_modules/zod/src/v4/classic/tests/object.test.ts +0 -609
  352. package/node_modules/zod/src/v4/classic/tests/optional.test.ts +0 -136
  353. package/node_modules/zod/src/v4/classic/tests/partial.test.ts +0 -340
  354. package/node_modules/zod/src/v4/classic/tests/pickomit.test.ts +0 -127
  355. package/node_modules/zod/src/v4/classic/tests/pipe.test.ts +0 -101
  356. package/node_modules/zod/src/v4/classic/tests/prefault.test.ts +0 -74
  357. package/node_modules/zod/src/v4/classic/tests/preprocess.test.ts +0 -282
  358. package/node_modules/zod/src/v4/classic/tests/primitive.test.ts +0 -175
  359. package/node_modules/zod/src/v4/classic/tests/promise.test.ts +0 -81
  360. package/node_modules/zod/src/v4/classic/tests/prototypes.test.ts +0 -23
  361. package/node_modules/zod/src/v4/classic/tests/readonly.test.ts +0 -252
  362. package/node_modules/zod/src/v4/classic/tests/record.test.ts +0 -356
  363. package/node_modules/zod/src/v4/classic/tests/recursive-types.test.ts +0 -582
  364. package/node_modules/zod/src/v4/classic/tests/refine.test.ts +0 -605
  365. package/node_modules/zod/src/v4/classic/tests/registries.test.ts +0 -204
  366. package/node_modules/zod/src/v4/classic/tests/set.test.ts +0 -181
  367. package/node_modules/zod/src/v4/classic/tests/standard-schema.test.ts +0 -57
  368. package/node_modules/zod/src/v4/classic/tests/string-formats.test.ts +0 -125
  369. package/node_modules/zod/src/v4/classic/tests/string.test.ts +0 -1080
  370. package/node_modules/zod/src/v4/classic/tests/stringbool.test.ts +0 -106
  371. package/node_modules/zod/src/v4/classic/tests/template-literal.test.ts +0 -763
  372. package/node_modules/zod/src/v4/classic/tests/to-json-schema.test.ts +0 -2622
  373. package/node_modules/zod/src/v4/classic/tests/transform.test.ts +0 -361
  374. package/node_modules/zod/src/v4/classic/tests/tuple.test.ts +0 -163
  375. package/node_modules/zod/src/v4/classic/tests/union.test.ts +0 -181
  376. package/node_modules/zod/src/v4/classic/tests/validations.test.ts +0 -283
  377. package/node_modules/zod/src/v4/classic/tests/void.test.ts +0 -12
  378. package/node_modules/zod/src/v4/core/api.ts +0 -1621
  379. package/node_modules/zod/src/v4/core/checks.ts +0 -1287
  380. package/node_modules/zod/src/v4/core/config.ts +0 -15
  381. package/node_modules/zod/src/v4/core/core.ts +0 -115
  382. package/node_modules/zod/src/v4/core/doc.ts +0 -44
  383. package/node_modules/zod/src/v4/core/errors.ts +0 -413
  384. package/node_modules/zod/src/v4/core/index.ts +0 -14
  385. package/node_modules/zod/src/v4/core/json-schema.ts +0 -147
  386. package/node_modules/zod/src/v4/core/parse.ts +0 -195
  387. package/node_modules/zod/src/v4/core/regexes.ts +0 -177
  388. package/node_modules/zod/src/v4/core/registries.ts +0 -97
  389. package/node_modules/zod/src/v4/core/schemas.ts +0 -4317
  390. package/node_modules/zod/src/v4/core/standard-schema.ts +0 -64
  391. package/node_modules/zod/src/v4/core/tests/extend.test.ts +0 -18
  392. package/node_modules/zod/src/v4/core/tests/index.test.ts +0 -46
  393. package/node_modules/zod/src/v4/core/tests/locales/be.test.ts +0 -124
  394. package/node_modules/zod/src/v4/core/tests/locales/en.test.ts +0 -22
  395. package/node_modules/zod/src/v4/core/tests/locales/es.test.ts +0 -181
  396. package/node_modules/zod/src/v4/core/tests/locales/ru.test.ts +0 -128
  397. package/node_modules/zod/src/v4/core/tests/locales/tr.test.ts +0 -69
  398. package/node_modules/zod/src/v4/core/to-json-schema.ts +0 -1044
  399. package/node_modules/zod/src/v4/core/util.ts +0 -910
  400. package/node_modules/zod/src/v4/core/versions.ts +0 -5
  401. package/node_modules/zod/src/v4/core/zsf.ts +0 -323
  402. package/node_modules/zod/src/v4/index.ts +0 -4
  403. package/node_modules/zod/src/v4/locales/ar.ts +0 -125
  404. package/node_modules/zod/src/v4/locales/az.ts +0 -121
  405. package/node_modules/zod/src/v4/locales/be.ts +0 -184
  406. package/node_modules/zod/src/v4/locales/bg.ts +0 -136
  407. package/node_modules/zod/src/v4/locales/ca.ts +0 -127
  408. package/node_modules/zod/src/v4/locales/cs.ts +0 -142
  409. package/node_modules/zod/src/v4/locales/da.ts +0 -141
  410. package/node_modules/zod/src/v4/locales/de.ts +0 -124
  411. package/node_modules/zod/src/v4/locales/en.ts +0 -127
  412. package/node_modules/zod/src/v4/locales/eo.ts +0 -125
  413. package/node_modules/zod/src/v4/locales/es.ts +0 -159
  414. package/node_modules/zod/src/v4/locales/fa.ts +0 -134
  415. package/node_modules/zod/src/v4/locales/fi.ts +0 -131
  416. package/node_modules/zod/src/v4/locales/fr-CA.ts +0 -126
  417. package/node_modules/zod/src/v4/locales/fr.ts +0 -124
  418. package/node_modules/zod/src/v4/locales/he.ts +0 -125
  419. package/node_modules/zod/src/v4/locales/hu.ts +0 -126
  420. package/node_modules/zod/src/v4/locales/id.ts +0 -125
  421. package/node_modules/zod/src/v4/locales/index.ts +0 -47
  422. package/node_modules/zod/src/v4/locales/is.ts +0 -127
  423. package/node_modules/zod/src/v4/locales/it.ts +0 -125
  424. package/node_modules/zod/src/v4/locales/ja.ts +0 -122
  425. package/node_modules/zod/src/v4/locales/ka.ts +0 -138
  426. package/node_modules/zod/src/v4/locales/kh.ts +0 -7
  427. package/node_modules/zod/src/v4/locales/km.ts +0 -126
  428. package/node_modules/zod/src/v4/locales/ko.ts +0 -131
  429. package/node_modules/zod/src/v4/locales/lt.ts +0 -265
  430. package/node_modules/zod/src/v4/locales/mk.ts +0 -127
  431. package/node_modules/zod/src/v4/locales/ms.ts +0 -124
  432. package/node_modules/zod/src/v4/locales/nl.ts +0 -126
  433. package/node_modules/zod/src/v4/locales/no.ts +0 -124
  434. package/node_modules/zod/src/v4/locales/ota.ts +0 -125
  435. package/node_modules/zod/src/v4/locales/pl.ts +0 -126
  436. package/node_modules/zod/src/v4/locales/ps.ts +0 -133
  437. package/node_modules/zod/src/v4/locales/pt.ts +0 -123
  438. package/node_modules/zod/src/v4/locales/ru.ts +0 -184
  439. package/node_modules/zod/src/v4/locales/sl.ts +0 -126
  440. package/node_modules/zod/src/v4/locales/sv.ts +0 -127
  441. package/node_modules/zod/src/v4/locales/ta.ts +0 -125
  442. package/node_modules/zod/src/v4/locales/th.ts +0 -126
  443. package/node_modules/zod/src/v4/locales/tr.ts +0 -121
  444. package/node_modules/zod/src/v4/locales/ua.ts +0 -7
  445. package/node_modules/zod/src/v4/locales/uk.ts +0 -126
  446. package/node_modules/zod/src/v4/locales/ur.ts +0 -126
  447. package/node_modules/zod/src/v4/locales/vi.ts +0 -125
  448. package/node_modules/zod/src/v4/locales/yo.ts +0 -131
  449. package/node_modules/zod/src/v4/locales/zh-CN.ts +0 -123
  450. package/node_modules/zod/src/v4/locales/zh-TW.ts +0 -125
  451. package/node_modules/zod/src/v4/mini/checks.ts +0 -32
  452. package/node_modules/zod/src/v4/mini/coerce.ts +0 -22
  453. package/node_modules/zod/src/v4/mini/external.ts +0 -40
  454. package/node_modules/zod/src/v4/mini/index.ts +0 -3
  455. package/node_modules/zod/src/v4/mini/iso.ts +0 -62
  456. package/node_modules/zod/src/v4/mini/parse.ts +0 -14
  457. package/node_modules/zod/src/v4/mini/schemas.ts +0 -1725
  458. package/node_modules/zod/src/v4/mini/tests/assignability.test.ts +0 -129
  459. package/node_modules/zod/src/v4/mini/tests/brand.test.ts +0 -51
  460. package/node_modules/zod/src/v4/mini/tests/checks.test.ts +0 -144
  461. package/node_modules/zod/src/v4/mini/tests/codec.test.ts +0 -529
  462. package/node_modules/zod/src/v4/mini/tests/computed.test.ts +0 -36
  463. package/node_modules/zod/src/v4/mini/tests/error.test.ts +0 -22
  464. package/node_modules/zod/src/v4/mini/tests/functions.test.ts +0 -43
  465. package/node_modules/zod/src/v4/mini/tests/index.test.ts +0 -899
  466. package/node_modules/zod/src/v4/mini/tests/number.test.ts +0 -95
  467. package/node_modules/zod/src/v4/mini/tests/object.test.ts +0 -200
  468. package/node_modules/zod/src/v4/mini/tests/prototypes.test.ts +0 -43
  469. package/node_modules/zod/src/v4/mini/tests/recursive-types.test.ts +0 -275
  470. package/node_modules/zod/src/v4/mini/tests/string.test.ts +0 -315
  471. package/node_modules/zod/src/v4-mini/index.ts +0 -1
  472. package/node_modules/zod/v3/ZodError.cjs +0 -138
  473. package/node_modules/zod/v3/ZodError.d.cts +0 -164
  474. package/node_modules/zod/v3/ZodError.d.ts +0 -164
  475. package/node_modules/zod/v3/ZodError.js +0 -133
  476. package/node_modules/zod/v3/errors.cjs +0 -17
  477. package/node_modules/zod/v3/errors.d.cts +0 -5
  478. package/node_modules/zod/v3/errors.d.ts +0 -5
  479. package/node_modules/zod/v3/errors.js +0 -9
  480. package/node_modules/zod/v3/external.cjs +0 -22
  481. package/node_modules/zod/v3/external.d.cts +0 -6
  482. package/node_modules/zod/v3/external.d.ts +0 -6
  483. package/node_modules/zod/v3/external.js +0 -6
  484. package/node_modules/zod/v3/helpers/enumUtil.cjs +0 -2
  485. package/node_modules/zod/v3/helpers/enumUtil.d.cts +0 -8
  486. package/node_modules/zod/v3/helpers/enumUtil.d.ts +0 -8
  487. package/node_modules/zod/v3/helpers/enumUtil.js +0 -1
  488. package/node_modules/zod/v3/helpers/errorUtil.cjs +0 -9
  489. package/node_modules/zod/v3/helpers/errorUtil.d.cts +0 -9
  490. package/node_modules/zod/v3/helpers/errorUtil.d.ts +0 -9
  491. package/node_modules/zod/v3/helpers/errorUtil.js +0 -6
  492. package/node_modules/zod/v3/helpers/parseUtil.cjs +0 -124
  493. package/node_modules/zod/v3/helpers/parseUtil.d.cts +0 -78
  494. package/node_modules/zod/v3/helpers/parseUtil.d.ts +0 -78
  495. package/node_modules/zod/v3/helpers/parseUtil.js +0 -109
  496. package/node_modules/zod/v3/helpers/partialUtil.cjs +0 -2
  497. package/node_modules/zod/v3/helpers/partialUtil.d.cts +0 -8
  498. package/node_modules/zod/v3/helpers/partialUtil.d.ts +0 -8
  499. package/node_modules/zod/v3/helpers/partialUtil.js +0 -1
  500. package/node_modules/zod/v3/helpers/typeAliases.cjs +0 -2
  501. package/node_modules/zod/v3/helpers/typeAliases.d.cts +0 -2
  502. package/node_modules/zod/v3/helpers/typeAliases.d.ts +0 -2
  503. package/node_modules/zod/v3/helpers/typeAliases.js +0 -1
  504. package/node_modules/zod/v3/helpers/util.cjs +0 -137
  505. package/node_modules/zod/v3/helpers/util.d.cts +0 -85
  506. package/node_modules/zod/v3/helpers/util.d.ts +0 -85
  507. package/node_modules/zod/v3/helpers/util.js +0 -133
  508. package/node_modules/zod/v3/index.cjs +0 -33
  509. package/node_modules/zod/v3/index.d.cts +0 -4
  510. package/node_modules/zod/v3/index.d.ts +0 -4
  511. package/node_modules/zod/v3/index.js +0 -4
  512. package/node_modules/zod/v3/locales/en.cjs +0 -112
  513. package/node_modules/zod/v3/locales/en.d.cts +0 -3
  514. package/node_modules/zod/v3/locales/en.d.ts +0 -3
  515. package/node_modules/zod/v3/locales/en.js +0 -109
  516. package/node_modules/zod/v3/package.json +0 -6
  517. package/node_modules/zod/v3/standard-schema.cjs +0 -2
  518. package/node_modules/zod/v3/standard-schema.d.cts +0 -102
  519. package/node_modules/zod/v3/standard-schema.d.ts +0 -102
  520. package/node_modules/zod/v3/standard-schema.js +0 -1
  521. package/node_modules/zod/v3/types.cjs +0 -3777
  522. package/node_modules/zod/v3/types.d.cts +0 -1034
  523. package/node_modules/zod/v3/types.d.ts +0 -1034
  524. package/node_modules/zod/v3/types.js +0 -3695
  525. package/node_modules/zod/v4/classic/checks.cjs +0 -32
  526. package/node_modules/zod/v4/classic/checks.d.cts +0 -1
  527. package/node_modules/zod/v4/classic/checks.d.ts +0 -1
  528. package/node_modules/zod/v4/classic/checks.js +0 -1
  529. package/node_modules/zod/v4/classic/coerce.cjs +0 -47
  530. package/node_modules/zod/v4/classic/coerce.d.cts +0 -17
  531. package/node_modules/zod/v4/classic/coerce.d.ts +0 -17
  532. package/node_modules/zod/v4/classic/coerce.js +0 -17
  533. package/node_modules/zod/v4/classic/compat.cjs +0 -61
  534. package/node_modules/zod/v4/classic/compat.d.cts +0 -50
  535. package/node_modules/zod/v4/classic/compat.d.ts +0 -50
  536. package/node_modules/zod/v4/classic/compat.js +0 -31
  537. package/node_modules/zod/v4/classic/errors.cjs +0 -74
  538. package/node_modules/zod/v4/classic/errors.d.cts +0 -30
  539. package/node_modules/zod/v4/classic/errors.d.ts +0 -30
  540. package/node_modules/zod/v4/classic/errors.js +0 -48
  541. package/node_modules/zod/v4/classic/external.cjs +0 -70
  542. package/node_modules/zod/v4/classic/external.d.cts +0 -13
  543. package/node_modules/zod/v4/classic/external.d.ts +0 -13
  544. package/node_modules/zod/v4/classic/external.js +0 -18
  545. package/node_modules/zod/v4/classic/index.cjs +0 -33
  546. package/node_modules/zod/v4/classic/index.d.cts +0 -4
  547. package/node_modules/zod/v4/classic/index.d.ts +0 -4
  548. package/node_modules/zod/v4/classic/index.js +0 -4
  549. package/node_modules/zod/v4/classic/iso.cjs +0 -60
  550. package/node_modules/zod/v4/classic/iso.d.cts +0 -22
  551. package/node_modules/zod/v4/classic/iso.d.ts +0 -22
  552. package/node_modules/zod/v4/classic/iso.js +0 -30
  553. package/node_modules/zod/v4/classic/package.json +0 -6
  554. package/node_modules/zod/v4/classic/parse.cjs +0 -41
  555. package/node_modules/zod/v4/classic/parse.d.cts +0 -31
  556. package/node_modules/zod/v4/classic/parse.d.ts +0 -31
  557. package/node_modules/zod/v4/classic/parse.js +0 -15
  558. package/node_modules/zod/v4/classic/schemas.cjs +0 -1151
  559. package/node_modules/zod/v4/classic/schemas.d.cts +0 -673
  560. package/node_modules/zod/v4/classic/schemas.d.ts +0 -673
  561. package/node_modules/zod/v4/classic/schemas.js +0 -1040
  562. package/node_modules/zod/v4/core/api.cjs +0 -1060
  563. package/node_modules/zod/v4/core/api.d.cts +0 -295
  564. package/node_modules/zod/v4/core/api.d.ts +0 -295
  565. package/node_modules/zod/v4/core/api.js +0 -925
  566. package/node_modules/zod/v4/core/checks.cjs +0 -595
  567. package/node_modules/zod/v4/core/checks.d.cts +0 -278
  568. package/node_modules/zod/v4/core/checks.d.ts +0 -278
  569. package/node_modules/zod/v4/core/checks.js +0 -569
  570. package/node_modules/zod/v4/core/core.cjs +0 -74
  571. package/node_modules/zod/v4/core/core.d.cts +0 -52
  572. package/node_modules/zod/v4/core/core.d.ts +0 -52
  573. package/node_modules/zod/v4/core/core.js +0 -67
  574. package/node_modules/zod/v4/core/doc.cjs +0 -39
  575. package/node_modules/zod/v4/core/doc.d.cts +0 -14
  576. package/node_modules/zod/v4/core/doc.d.ts +0 -14
  577. package/node_modules/zod/v4/core/doc.js +0 -35
  578. package/node_modules/zod/v4/core/errors.cjs +0 -213
  579. package/node_modules/zod/v4/core/errors.d.cts +0 -210
  580. package/node_modules/zod/v4/core/errors.d.ts +0 -210
  581. package/node_modules/zod/v4/core/errors.js +0 -182
  582. package/node_modules/zod/v4/core/index.cjs +0 -43
  583. package/node_modules/zod/v4/core/index.d.cts +0 -14
  584. package/node_modules/zod/v4/core/index.d.ts +0 -14
  585. package/node_modules/zod/v4/core/index.js +0 -14
  586. package/node_modules/zod/v4/core/json-schema.cjs +0 -2
  587. package/node_modules/zod/v4/core/json-schema.d.cts +0 -88
  588. package/node_modules/zod/v4/core/json-schema.d.ts +0 -88
  589. package/node_modules/zod/v4/core/json-schema.js +0 -1
  590. package/node_modules/zod/v4/core/package.json +0 -6
  591. package/node_modules/zod/v4/core/parse.cjs +0 -131
  592. package/node_modules/zod/v4/core/parse.d.cts +0 -49
  593. package/node_modules/zod/v4/core/parse.d.ts +0 -49
  594. package/node_modules/zod/v4/core/parse.js +0 -93
  595. package/node_modules/zod/v4/core/regexes.cjs +0 -136
  596. package/node_modules/zod/v4/core/regexes.d.cts +0 -78
  597. package/node_modules/zod/v4/core/regexes.d.ts +0 -78
  598. package/node_modules/zod/v4/core/regexes.js +0 -127
  599. package/node_modules/zod/v4/core/registries.cjs +0 -57
  600. package/node_modules/zod/v4/core/registries.d.cts +0 -35
  601. package/node_modules/zod/v4/core/registries.d.ts +0 -35
  602. package/node_modules/zod/v4/core/registries.js +0 -52
  603. package/node_modules/zod/v4/core/schemas.cjs +0 -1986
  604. package/node_modules/zod/v4/core/schemas.d.cts +0 -1113
  605. package/node_modules/zod/v4/core/schemas.d.ts +0 -1113
  606. package/node_modules/zod/v4/core/schemas.js +0 -1955
  607. package/node_modules/zod/v4/core/standard-schema.cjs +0 -2
  608. package/node_modules/zod/v4/core/standard-schema.d.cts +0 -55
  609. package/node_modules/zod/v4/core/standard-schema.d.ts +0 -55
  610. package/node_modules/zod/v4/core/standard-schema.js +0 -1
  611. package/node_modules/zod/v4/core/to-json-schema.cjs +0 -920
  612. package/node_modules/zod/v4/core/to-json-schema.d.cts +0 -90
  613. package/node_modules/zod/v4/core/to-json-schema.d.ts +0 -90
  614. package/node_modules/zod/v4/core/to-json-schema.js +0 -915
  615. package/node_modules/zod/v4/core/util.cjs +0 -658
  616. package/node_modules/zod/v4/core/util.d.cts +0 -197
  617. package/node_modules/zod/v4/core/util.d.ts +0 -197
  618. package/node_modules/zod/v4/core/util.js +0 -601
  619. package/node_modules/zod/v4/core/versions.cjs +0 -8
  620. package/node_modules/zod/v4/core/versions.d.cts +0 -5
  621. package/node_modules/zod/v4/core/versions.d.ts +0 -5
  622. package/node_modules/zod/v4/core/versions.js +0 -5
  623. package/node_modules/zod/v4/index.cjs +0 -22
  624. package/node_modules/zod/v4/index.d.cts +0 -3
  625. package/node_modules/zod/v4/index.d.ts +0 -3
  626. package/node_modules/zod/v4/index.js +0 -3
  627. package/node_modules/zod/v4/locales/ar.cjs +0 -143
  628. package/node_modules/zod/v4/locales/ar.d.cts +0 -5
  629. package/node_modules/zod/v4/locales/ar.d.ts +0 -4
  630. package/node_modules/zod/v4/locales/ar.js +0 -116
  631. package/node_modules/zod/v4/locales/az.cjs +0 -142
  632. package/node_modules/zod/v4/locales/az.d.cts +0 -5
  633. package/node_modules/zod/v4/locales/az.d.ts +0 -4
  634. package/node_modules/zod/v4/locales/az.js +0 -115
  635. package/node_modules/zod/v4/locales/be.cjs +0 -191
  636. package/node_modules/zod/v4/locales/be.d.cts +0 -5
  637. package/node_modules/zod/v4/locales/be.d.ts +0 -4
  638. package/node_modules/zod/v4/locales/be.js +0 -164
  639. package/node_modules/zod/v4/locales/bg.cjs +0 -156
  640. package/node_modules/zod/v4/locales/bg.d.cts +0 -5
  641. package/node_modules/zod/v4/locales/bg.d.ts +0 -5
  642. package/node_modules/zod/v4/locales/bg.js +0 -128
  643. package/node_modules/zod/v4/locales/ca.cjs +0 -145
  644. package/node_modules/zod/v4/locales/ca.d.cts +0 -5
  645. package/node_modules/zod/v4/locales/ca.d.ts +0 -4
  646. package/node_modules/zod/v4/locales/ca.js +0 -118
  647. package/node_modules/zod/v4/locales/cs.cjs +0 -162
  648. package/node_modules/zod/v4/locales/cs.d.cts +0 -5
  649. package/node_modules/zod/v4/locales/cs.d.ts +0 -4
  650. package/node_modules/zod/v4/locales/cs.js +0 -135
  651. package/node_modules/zod/v4/locales/da.cjs +0 -158
  652. package/node_modules/zod/v4/locales/da.d.cts +0 -5
  653. package/node_modules/zod/v4/locales/da.d.ts +0 -4
  654. package/node_modules/zod/v4/locales/da.js +0 -131
  655. package/node_modules/zod/v4/locales/de.cjs +0 -143
  656. package/node_modules/zod/v4/locales/de.d.cts +0 -5
  657. package/node_modules/zod/v4/locales/de.d.ts +0 -4
  658. package/node_modules/zod/v4/locales/de.js +0 -116
  659. package/node_modules/zod/v4/locales/en.cjs +0 -145
  660. package/node_modules/zod/v4/locales/en.d.cts +0 -5
  661. package/node_modules/zod/v4/locales/en.d.ts +0 -5
  662. package/node_modules/zod/v4/locales/en.js +0 -117
  663. package/node_modules/zod/v4/locales/eo.cjs +0 -144
  664. package/node_modules/zod/v4/locales/eo.d.cts +0 -5
  665. package/node_modules/zod/v4/locales/eo.d.ts +0 -5
  666. package/node_modules/zod/v4/locales/eo.js +0 -116
  667. package/node_modules/zod/v4/locales/es.cjs +0 -176
  668. package/node_modules/zod/v4/locales/es.d.cts +0 -5
  669. package/node_modules/zod/v4/locales/es.d.ts +0 -4
  670. package/node_modules/zod/v4/locales/es.js +0 -149
  671. package/node_modules/zod/v4/locales/fa.cjs +0 -149
  672. package/node_modules/zod/v4/locales/fa.d.cts +0 -5
  673. package/node_modules/zod/v4/locales/fa.d.ts +0 -4
  674. package/node_modules/zod/v4/locales/fa.js +0 -122
  675. package/node_modules/zod/v4/locales/fi.cjs +0 -149
  676. package/node_modules/zod/v4/locales/fi.d.cts +0 -5
  677. package/node_modules/zod/v4/locales/fi.d.ts +0 -4
  678. package/node_modules/zod/v4/locales/fi.js +0 -122
  679. package/node_modules/zod/v4/locales/fr-CA.cjs +0 -144
  680. package/node_modules/zod/v4/locales/fr-CA.d.cts +0 -5
  681. package/node_modules/zod/v4/locales/fr-CA.d.ts +0 -4
  682. package/node_modules/zod/v4/locales/fr-CA.js +0 -117
  683. package/node_modules/zod/v4/locales/fr.cjs +0 -143
  684. package/node_modules/zod/v4/locales/fr.d.cts +0 -5
  685. package/node_modules/zod/v4/locales/fr.d.ts +0 -4
  686. package/node_modules/zod/v4/locales/fr.js +0 -116
  687. package/node_modules/zod/v4/locales/he.cjs +0 -144
  688. package/node_modules/zod/v4/locales/he.d.cts +0 -5
  689. package/node_modules/zod/v4/locales/he.d.ts +0 -4
  690. package/node_modules/zod/v4/locales/he.js +0 -117
  691. package/node_modules/zod/v4/locales/hu.cjs +0 -144
  692. package/node_modules/zod/v4/locales/hu.d.cts +0 -5
  693. package/node_modules/zod/v4/locales/hu.d.ts +0 -4
  694. package/node_modules/zod/v4/locales/hu.js +0 -117
  695. package/node_modules/zod/v4/locales/id.cjs +0 -143
  696. package/node_modules/zod/v4/locales/id.d.cts +0 -5
  697. package/node_modules/zod/v4/locales/id.d.ts +0 -4
  698. package/node_modules/zod/v4/locales/id.js +0 -116
  699. package/node_modules/zod/v4/locales/index.cjs +0 -100
  700. package/node_modules/zod/v4/locales/index.d.cts +0 -47
  701. package/node_modules/zod/v4/locales/index.d.ts +0 -47
  702. package/node_modules/zod/v4/locales/index.js +0 -47
  703. package/node_modules/zod/v4/locales/is.cjs +0 -145
  704. package/node_modules/zod/v4/locales/is.d.cts +0 -5
  705. package/node_modules/zod/v4/locales/is.d.ts +0 -5
  706. package/node_modules/zod/v4/locales/is.js +0 -117
  707. package/node_modules/zod/v4/locales/it.cjs +0 -144
  708. package/node_modules/zod/v4/locales/it.d.cts +0 -5
  709. package/node_modules/zod/v4/locales/it.d.ts +0 -4
  710. package/node_modules/zod/v4/locales/it.js +0 -117
  711. package/node_modules/zod/v4/locales/ja.cjs +0 -142
  712. package/node_modules/zod/v4/locales/ja.d.cts +0 -5
  713. package/node_modules/zod/v4/locales/ja.d.ts +0 -4
  714. package/node_modules/zod/v4/locales/ja.js +0 -115
  715. package/node_modules/zod/v4/locales/ka.cjs +0 -153
  716. package/node_modules/zod/v4/locales/ka.d.cts +0 -5
  717. package/node_modules/zod/v4/locales/ka.d.ts +0 -5
  718. package/node_modules/zod/v4/locales/ka.js +0 -125
  719. package/node_modules/zod/v4/locales/kh.cjs +0 -12
  720. package/node_modules/zod/v4/locales/kh.d.cts +0 -5
  721. package/node_modules/zod/v4/locales/kh.d.ts +0 -5
  722. package/node_modules/zod/v4/locales/kh.js +0 -5
  723. package/node_modules/zod/v4/locales/km.cjs +0 -144
  724. package/node_modules/zod/v4/locales/km.d.cts +0 -5
  725. package/node_modules/zod/v4/locales/km.d.ts +0 -4
  726. package/node_modules/zod/v4/locales/km.js +0 -117
  727. package/node_modules/zod/v4/locales/ko.cjs +0 -148
  728. package/node_modules/zod/v4/locales/ko.d.cts +0 -5
  729. package/node_modules/zod/v4/locales/ko.d.ts +0 -4
  730. package/node_modules/zod/v4/locales/ko.js +0 -121
  731. package/node_modules/zod/v4/locales/lt.cjs +0 -258
  732. package/node_modules/zod/v4/locales/lt.d.cts +0 -5
  733. package/node_modules/zod/v4/locales/lt.d.ts +0 -5
  734. package/node_modules/zod/v4/locales/lt.js +0 -230
  735. package/node_modules/zod/v4/locales/mk.cjs +0 -145
  736. package/node_modules/zod/v4/locales/mk.d.cts +0 -5
  737. package/node_modules/zod/v4/locales/mk.d.ts +0 -4
  738. package/node_modules/zod/v4/locales/mk.js +0 -118
  739. package/node_modules/zod/v4/locales/ms.cjs +0 -143
  740. package/node_modules/zod/v4/locales/ms.d.cts +0 -5
  741. package/node_modules/zod/v4/locales/ms.d.ts +0 -4
  742. package/node_modules/zod/v4/locales/ms.js +0 -116
  743. package/node_modules/zod/v4/locales/nl.cjs +0 -144
  744. package/node_modules/zod/v4/locales/nl.d.cts +0 -5
  745. package/node_modules/zod/v4/locales/nl.d.ts +0 -4
  746. package/node_modules/zod/v4/locales/nl.js +0 -117
  747. package/node_modules/zod/v4/locales/no.cjs +0 -143
  748. package/node_modules/zod/v4/locales/no.d.cts +0 -5
  749. package/node_modules/zod/v4/locales/no.d.ts +0 -4
  750. package/node_modules/zod/v4/locales/no.js +0 -116
  751. package/node_modules/zod/v4/locales/ota.cjs +0 -144
  752. package/node_modules/zod/v4/locales/ota.d.cts +0 -5
  753. package/node_modules/zod/v4/locales/ota.d.ts +0 -4
  754. package/node_modules/zod/v4/locales/ota.js +0 -117
  755. package/node_modules/zod/v4/locales/package.json +0 -6
  756. package/node_modules/zod/v4/locales/pl.cjs +0 -144
  757. package/node_modules/zod/v4/locales/pl.d.cts +0 -5
  758. package/node_modules/zod/v4/locales/pl.d.ts +0 -4
  759. package/node_modules/zod/v4/locales/pl.js +0 -117
  760. package/node_modules/zod/v4/locales/ps.cjs +0 -149
  761. package/node_modules/zod/v4/locales/ps.d.cts +0 -5
  762. package/node_modules/zod/v4/locales/ps.d.ts +0 -4
  763. package/node_modules/zod/v4/locales/ps.js +0 -122
  764. package/node_modules/zod/v4/locales/pt.cjs +0 -143
  765. package/node_modules/zod/v4/locales/pt.d.cts +0 -5
  766. package/node_modules/zod/v4/locales/pt.d.ts +0 -4
  767. package/node_modules/zod/v4/locales/pt.js +0 -116
  768. package/node_modules/zod/v4/locales/ru.cjs +0 -191
  769. package/node_modules/zod/v4/locales/ru.d.cts +0 -5
  770. package/node_modules/zod/v4/locales/ru.d.ts +0 -4
  771. package/node_modules/zod/v4/locales/ru.js +0 -164
  772. package/node_modules/zod/v4/locales/sl.cjs +0 -144
  773. package/node_modules/zod/v4/locales/sl.d.cts +0 -5
  774. package/node_modules/zod/v4/locales/sl.d.ts +0 -4
  775. package/node_modules/zod/v4/locales/sl.js +0 -117
  776. package/node_modules/zod/v4/locales/sv.cjs +0 -145
  777. package/node_modules/zod/v4/locales/sv.d.cts +0 -5
  778. package/node_modules/zod/v4/locales/sv.d.ts +0 -4
  779. package/node_modules/zod/v4/locales/sv.js +0 -118
  780. package/node_modules/zod/v4/locales/ta.cjs +0 -144
  781. package/node_modules/zod/v4/locales/ta.d.cts +0 -5
  782. package/node_modules/zod/v4/locales/ta.d.ts +0 -4
  783. package/node_modules/zod/v4/locales/ta.js +0 -117
  784. package/node_modules/zod/v4/locales/th.cjs +0 -144
  785. package/node_modules/zod/v4/locales/th.d.cts +0 -5
  786. package/node_modules/zod/v4/locales/th.d.ts +0 -4
  787. package/node_modules/zod/v4/locales/th.js +0 -117
  788. package/node_modules/zod/v4/locales/tr.cjs +0 -143
  789. package/node_modules/zod/v4/locales/tr.d.cts +0 -5
  790. package/node_modules/zod/v4/locales/tr.d.ts +0 -5
  791. package/node_modules/zod/v4/locales/tr.js +0 -115
  792. package/node_modules/zod/v4/locales/ua.cjs +0 -12
  793. package/node_modules/zod/v4/locales/ua.d.cts +0 -5
  794. package/node_modules/zod/v4/locales/ua.d.ts +0 -5
  795. package/node_modules/zod/v4/locales/ua.js +0 -5
  796. package/node_modules/zod/v4/locales/uk.cjs +0 -144
  797. package/node_modules/zod/v4/locales/uk.d.cts +0 -5
  798. package/node_modules/zod/v4/locales/uk.d.ts +0 -4
  799. package/node_modules/zod/v4/locales/uk.js +0 -117
  800. package/node_modules/zod/v4/locales/ur.cjs +0 -144
  801. package/node_modules/zod/v4/locales/ur.d.cts +0 -5
  802. package/node_modules/zod/v4/locales/ur.d.ts +0 -4
  803. package/node_modules/zod/v4/locales/ur.js +0 -117
  804. package/node_modules/zod/v4/locales/vi.cjs +0 -143
  805. package/node_modules/zod/v4/locales/vi.d.cts +0 -5
  806. package/node_modules/zod/v4/locales/vi.d.ts +0 -4
  807. package/node_modules/zod/v4/locales/vi.js +0 -116
  808. package/node_modules/zod/v4/locales/yo.cjs +0 -142
  809. package/node_modules/zod/v4/locales/yo.d.cts +0 -5
  810. package/node_modules/zod/v4/locales/yo.d.ts +0 -4
  811. package/node_modules/zod/v4/locales/yo.js +0 -115
  812. package/node_modules/zod/v4/locales/zh-CN.cjs +0 -143
  813. package/node_modules/zod/v4/locales/zh-CN.d.cts +0 -5
  814. package/node_modules/zod/v4/locales/zh-CN.d.ts +0 -4
  815. package/node_modules/zod/v4/locales/zh-CN.js +0 -116
  816. package/node_modules/zod/v4/locales/zh-TW.cjs +0 -144
  817. package/node_modules/zod/v4/locales/zh-TW.d.cts +0 -5
  818. package/node_modules/zod/v4/locales/zh-TW.d.ts +0 -4
  819. package/node_modules/zod/v4/locales/zh-TW.js +0 -117
  820. package/node_modules/zod/v4/mini/checks.cjs +0 -34
  821. package/node_modules/zod/v4/mini/checks.d.cts +0 -1
  822. package/node_modules/zod/v4/mini/checks.d.ts +0 -1
  823. package/node_modules/zod/v4/mini/checks.js +0 -1
  824. package/node_modules/zod/v4/mini/coerce.cjs +0 -47
  825. package/node_modules/zod/v4/mini/coerce.d.cts +0 -7
  826. package/node_modules/zod/v4/mini/coerce.d.ts +0 -7
  827. package/node_modules/zod/v4/mini/coerce.js +0 -17
  828. package/node_modules/zod/v4/mini/external.cjs +0 -62
  829. package/node_modules/zod/v4/mini/external.d.cts +0 -11
  830. package/node_modules/zod/v4/mini/external.d.ts +0 -11
  831. package/node_modules/zod/v4/mini/external.js +0 -13
  832. package/node_modules/zod/v4/mini/index.cjs +0 -32
  833. package/node_modules/zod/v4/mini/index.d.cts +0 -3
  834. package/node_modules/zod/v4/mini/index.d.ts +0 -3
  835. package/node_modules/zod/v4/mini/index.js +0 -3
  836. package/node_modules/zod/v4/mini/iso.cjs +0 -60
  837. package/node_modules/zod/v4/mini/iso.d.cts +0 -22
  838. package/node_modules/zod/v4/mini/iso.d.ts +0 -22
  839. package/node_modules/zod/v4/mini/iso.js +0 -30
  840. package/node_modules/zod/v4/mini/package.json +0 -6
  841. package/node_modules/zod/v4/mini/parse.cjs +0 -16
  842. package/node_modules/zod/v4/mini/parse.d.cts +0 -1
  843. package/node_modules/zod/v4/mini/parse.d.ts +0 -1
  844. package/node_modules/zod/v4/mini/parse.js +0 -1
  845. package/node_modules/zod/v4/mini/schemas.cjs +0 -892
  846. package/node_modules/zod/v4/mini/schemas.d.cts +0 -407
  847. package/node_modules/zod/v4/mini/schemas.d.ts +0 -407
  848. package/node_modules/zod/v4/mini/schemas.js +0 -775
  849. package/node_modules/zod/v4/package.json +0 -6
  850. package/node_modules/zod/v4-mini/index.cjs +0 -17
  851. package/node_modules/zod/v4-mini/index.d.cts +0 -1
  852. package/node_modules/zod/v4-mini/index.d.ts +0 -1
  853. package/node_modules/zod/v4-mini/index.js +0 -1
  854. package/node_modules/zod/v4-mini/package.json +0 -6
  855. package/package/cc-switch-sdk/README.md +0 -541
  856. package/package/cc-switch-sdk/dist/constants.d.ts +0 -8
  857. package/package/cc-switch-sdk/dist/constants.js +0 -2
  858. package/package/cc-switch-sdk/dist/errors.d.ts +0 -5
  859. package/package/cc-switch-sdk/dist/errors.js +0 -2
  860. package/package/cc-switch-sdk/dist/index.d.ts +0 -5
  861. package/package/cc-switch-sdk/dist/index.js +0 -2
  862. package/package/cc-switch-sdk/dist/schemas.d.ts +0 -7
  863. package/package/cc-switch-sdk/dist/schemas.js +0 -2
  864. package/package/cc-switch-sdk/dist/sdk.d.ts +0 -59
  865. package/package/cc-switch-sdk/dist/sdk.js +0 -2
  866. package/package/cc-switch-sdk/dist/services/ai-config-service.js +0 -4
  867. package/package/cc-switch-sdk/dist/services/mcp-model.d.ts +0 -16
  868. package/package/cc-switch-sdk/dist/services/mcp-model.js +0 -2
  869. package/package/cc-switch-sdk/dist/services/mcp-service.d.ts +0 -17
  870. package/package/cc-switch-sdk/dist/services/mcp-service.js +0 -2
  871. package/package/cc-switch-sdk/dist/services/skill-model.d.ts +0 -16
  872. package/package/cc-switch-sdk/dist/services/skill-model.js +0 -2
  873. package/package/cc-switch-sdk/dist/services/skill-service.d.ts +0 -16
  874. package/package/cc-switch-sdk/dist/services/skill-service.js +0 -2
  875. package/package/cc-switch-sdk/dist/state.d.ts +0 -3
  876. package/package/cc-switch-sdk/dist/state.js +0 -2
  877. package/package/cc-switch-sdk/dist/types.d.ts +0 -78
  878. package/package/cc-switch-sdk/dist/types.js +0 -1
  879. package/package/cc-switch-sdk/dist/utils/fs.d.ts +0 -10
  880. package/package/cc-switch-sdk/dist/utils/fs.js +0 -3
  881. package/package/cc-switch-sdk/dist/utils/id.d.ts +0 -3
  882. package/package/cc-switch-sdk/dist/utils/id.js +0 -2
  883. package/package/cc-switch-sdk/package.json +0 -31
  884. /package/{node_modules/@cc-switch/sdk/dist/types.js → package/acode/dist/plugin-types.js} +0 -0
@@ -0,0 +1,16 @@
1
+ import{spawn as _}from"node:child_process";import{cpSync as F,existsSync as w,lstatSync as se,mkdirSync as D,readFileSync as k,readdirSync as j,renameSync as H,rmSync as E,symlinkSync as oe,writeFileSync as U}from"node:fs";import{dirname as J,join as g,resolve as Z}from"node:path";import{fileURLToPath as ae,pathToFileURL as le}from"node:url";import{parseAcodeCommandMarkdown as ue,splitQualifiedToolName as ce}from"@agentswork/acode";import{getAcodePluginDataHome as W,getBridgeVersion as de}from"../config.js";import{sanitizeAgentId as N,withFileLock as X,downloadPluginZip as fe,sanitizeArchiveFileName as ge}from"../utils/file-utils.js";import{createLogger as pe}from"../utils/logger.js";import{setDeployedDefaultsProvider as me,reconcileDefaultsFromDeployed as he}from"./capability-config.js";import{isCapabilityEnabled as ye,getAgentPluginSources as Se}from"./instance-features.js";import{PluginEventBuffer as we}from"./plugin-event-buffer.js";import{extractPluginZip as x}from"./plugin-package.js";const f=pe("plugin-manager"),$="plugin-manager",Q="\u7CFB\u7EDF\u5185\u7F6E\uFF1A\u7BA1\u7406\u63D2\u4EF6\u7684\u751F\u547D\u5468\u671F\uFF08\u5B89\u88C5/\u5378\u8F7D/\u542F\u505C/\u91CD\u8F7D\uFF09\uFF1B\u5F00\u53D1\u63D2\u4EF6\u7528\u5185\u7F6E /create-plugin \u547D\u4EE4",ee=`\u300C\u63D2\u4EF6\u7BA1\u7406\u63D2\u4EF6\u300D\u7684\u751F\u547D\u5468\u671F\u5DE5\u5177\uFF1A\u7BA1\u7406\u63D2\u4EF6\uFF08\u5B89\u88C5/\u5378\u8F7D/\u91CD\u8F7D/\u542F\u505C/\u5217\u8868\uFF09\u3002\u4EC5\u5F53\u7528\u6237\u660E\u786E\u8981\u6C42\u5B89\u88C5\u3001\u79FB\u9664\u6216\u4FEE\u590D\u63D2\u4EF6\u65F6\u4F7F\u7528\u3002
2
+ - action=list\uFF1A\u5217\u51FA\u5DF2\u5B89\u88C5\u63D2\u4EF6\uFF08\u72B6\u6001\u3001\u76D1\u542C\u5668\u5065\u5EB7\u3001\u5DE5\u5177\u6570\uFF09\u3002
3
+ - action=install\uFF1Asource \u4E3A\u63D2\u4EF6\u6765\u6E90\uFF0C\u5F53\u524D\u652F\u6301 "local:<\u4EFB\u610F\u63D2\u4EF6\u76EE\u5F55\u7EDD\u5BF9\u8DEF\u5F84>"\uFF08\u4E0D\u505A\u76EE\u5F55\u4F4D\u7F6E\u9650\u5236\uFF09\uFF1Bconfig \u4F20\u63D2\u4EF6 manifest \u91CC userConfig \u58F0\u660E\u7684\u914D\u7F6E\u503C\u3002\u5B89\u88C5\u65F6\u4F1A\u5148\u628A\u8BE5\u76EE\u5F55\u79FB\u52A8\u5230\u672C agent \u52A0\u8F7D\u63D2\u4EF6\u7684\u4F4D\u7F6E\uFF0C\u518D\u52A0\u8F7D\u79FB\u52A8\u540E\u7684\u526F\u672C\uFF08\u79FB\u52A8\u540E\u6E90\u76EE\u5F55\u4E0D\u518D\u4FDD\u7559\uFF09\uFF0C\u5B89\u88C5\u540E\u7ACB\u5373\u751F\u6548\uFF1A\u4E0B\u4E00\u6B21 poll_message \u7684 pluginCatalog \u5373\u53EF\u89C1\u3002
4
+ - action=reload\uFF1A\u91CD\u8F7D\u6307\u5B9A\u63D2\u4EF6\uFF08\u6539\u8FC7\u63D2\u4EF6\u6587\u4EF6\u540E\u4F7F\u7528\uFF09\uFF0C\u539F\u5B50\u6362\u88C5\uFF0C\u76D1\u542C\u5668\u91CD\u542F\u3002
5
+ - action=enable / disable\uFF1A\u505C\u7528/\u542F\u7528\uFF08disable \u4FDD\u7559\u5B89\u88C5\u4E0E\u914D\u7F6E\uFF0C\u4EC5\u505C\u6B62\u76D1\u542C\u4E0E\u5DE5\u5177\u8C03\u7528\uFF09\u3002
6
+ - action=uninstall\uFF1A\u5378\u8F7D\u5E76\u5220\u9664\u63D2\u4EF6\u76EE\u5F55\uFF08\u4E0D\u53EF\u9006\uFF0C\u9700\u7528\u6237\u660E\u786E\u8981\u6C42\uFF09\u3002`,ve={type:"object",properties:{action:{type:"string",enum:["install","uninstall","reload","enable","disable","list"],description:"\u751F\u547D\u5468\u671F\u52A8\u4F5C"},name:{type:"string",description:"\u63D2\u4EF6\u540D\uFF08uninstall/reload/enable/disable \u5FC5\u586B\uFF09"},source:{type:"string",description:'install \u6765\u6E90\uFF0C\u5F53\u524D\u652F\u6301 "local:<\u4EFB\u610F\u63D2\u4EF6\u76EE\u5F55\u7EDD\u5BF9\u8DEF\u5F84>"\uFF08\u5B89\u88C5\u65F6\u81EA\u52A8\u79FB\u52A8\u5230\u672C agent \u63D2\u4EF6\u4F4D\u7F6E\u540E\u52A0\u8F7D\uFF09'},config:{type:"object",description:"install \u65F6\u63D2\u4EF6 userConfig \u58F0\u660E\u7684\u914D\u7F6E\u503C\uFF08\u952E\u503C\u5BF9\uFF09",additionalProperties:{type:"string"}}},required:["action"],additionalProperties:!1},Pe=new Set(["install","uninstall","reload","enable","disable","list"]);function te(){const l=de();return l&&l!=="unknown"?l:void 0}function $e(){return ae(new URL("./builtin-commands/",import.meta.url))}const Ee=200,R=256*1024,ke=4*1024,ne=6e4,q=6e4,Ae=/^[a-zA-Z0-9_][a-zA-Z0-9_-]*$/,z=/^[a-z0-9][a-z0-9-]*$/,be=["system.","aws-","acode-"],De=new Set(["NODE_OPTIONS","NODE_PATH","NODE_EXTRA_CA_CERTS","NODE_REPL_HISTORY","LD_PRELOAD","LD_LIBRARY_PATH","LD_AUDIT","DYLD_INSERT_LIBRARIES","DYLD_LIBRARY_PATH","DYLD_FRAMEWORK_PATH","PYTHONPATH","PYTHONSTARTUP","PYTHONHOME","PERL5LIB","PERL5OPT","RUBYOPT","RUBYLIB","BASH_ENV","ENV","SHELLOPTS","BASHOPTS","IFS","PS1","PS4","GIT_SSH","GIT_SSH_COMMAND","GIT_CONFIG","GIT_CONFIG_GLOBAL","PATH","HOME","USERPROFILE","SYSTEMROOT","COMSPEC","TEMP","TMP","LANG","TZ"]),Le=/^[A-Za-z_][A-Za-z0-9_]*$/,Oe=process.platform==="win32"?"junction":"dir",Te=/[^\x20-\x7E]/,Ne=6e4,G=20,re=80;function P(l){return typeof l=="object"&&l!==null&&!Array.isArray(l)}function I(l,e){let t=l;for(const n of e.split(".")){if(!P(t))return;t=t[n]}return t}function A(l,e){return l.length<=e?l:`${l.slice(0,e)}\u2026(\u622A\u65AD,\u5171 ${l.length} \u5B57\u7B26)`}async function C(l,e=8,t=200){for(let n=0;;n++)try{E(l,{recursive:!0,force:!0});return}catch(r){if(n>=e-1)throw r;await new Promise(i=>setTimeout(i,t))}}async function ie(l,e){D(J(e),{recursive:!0});try{H(l,e);return}catch(t){const n=t?.code;if(!n||!["EXDEV","EPERM","EACCES","EBUSY","EINVAL"].includes(n))throw t}F(l,e,{recursive:!0,filter:t=>!/[\\/]\.git([\\/]|$)/.test(t)&&!/[\\/]node_modules([\\/]|$)/.test(t)}),await C(l)}function b(l,e){l.logs.push(`${new Date().toISOString()} ${e}`),l.logs.length>Ee&&l.logs.shift()}function V(l,e,t="params"){if(!P(l))return[];const n=[],r=l.type;if(typeof r=="string"&&!Ie(r,e))return[`${t}: \u671F\u671B ${r}\uFF0C\u5B9E\u9645 ${Ce(e)}`];if(Array.isArray(l.enum)&&l.enum.length>0&&(l.enum.some(s=>JSON.stringify(s)===JSON.stringify(e))||n.push(`${t}: \u503C ${JSON.stringify(e)} \u4E0D\u5728\u679A\u4E3E ${JSON.stringify(l.enum)} \u5185`)),r==="object"&&P(e)){const i=P(l.properties)?l.properties:{},s=Array.isArray(l.required)?l.required:[];for(const o of s)(!(o in e)||e[o]===void 0)&&n.push(`${t}.${o}: \u5FC5\u586B\u53C2\u6570\u7F3A\u5931`);for(const[o,a]of Object.entries(i))o in e&&e[o]!==void 0&&n.push(...V(a,e[o],`${t}.${o}`));if(l.additionalProperties===!1)for(const o of Object.keys(e))o in i||n.push(`${t}.${o}: \u4E0D\u5141\u8BB8\u7684\u672A\u77E5\u53C2\u6570\uFF08schema additionalProperties=false\uFF09`)}return r==="array"&&Array.isArray(e)&&P(l.items)&&e.forEach((i,s)=>{n.push(...V(l.items,i,`${t}[${s}]`))}),n}function Ie(l,e){switch(l){case"string":return typeof e=="string";case"number":return typeof e=="number"&&Number.isFinite(e);case"boolean":return typeof e=="boolean";case"object":return P(e);case"array":return Array.isArray(e);case"null":return e===null;default:return!0}}function Ce(l){return l===null?"null":Array.isArray(l)?"array":typeof l}class Re{constructor(e={}){this.agents=new Map,this.moduleNonce=0,this.templatePullInFlight=new Set,this.backgroundTemplatePulls=new Set,this.rootDir=e.rootDir??g(W(),"plugins"),this.runtimeRootDir=e.runtimeRootDir??g(W(),"plugins-runtime")}forAgent(e){return{listPlugins:()=>this.list(e),getCatalog:()=>this.getCatalog(e),getToolSchema:t=>this.getToolSchema(e,t),invokeTool:(t,n,r,i)=>this.invokeTool(e,t,n,r,i),manage:t=>this.manage(e,t),getCommandDirs:()=>this.getCommandDirs(e)}}setOnPluginsChanged(e){this.onPluginsChanged=e}notifyPluginsChanged(e){try{this.onPluginsChanged?.(e)}catch(t){f.warn("[agent:%s] onPluginsChanged \u56DE\u8C03\u5931\u8D25: %s",e,t instanceof Error?t.message:String(t))}}async getCommandDirs(e){return[...(await this.hydrate(e)).plugins.values()].filter(n=>n.enabled&&n.commandDir).map(n=>n.commandDir)}async getPluginCommands(e){const t=await this.hydrate(e),n=[];n.push(...this.parseCommandDir($,$e()));for(const r of t.plugins.values())!r.enabled||!r.commandDir||n.push(...this.parsePluginCommandDir(r));return n}parsePluginCommandDir(e){return this.parseCommandDir(e.name,e.commandDir)}parseCommandDir(e,t){const n=[];if(!t)return n;try{for(const r of j(t)){if(!r.endsWith(".md"))continue;const i=g(t,r);try{const s=ue(i,k(i,"utf8"));s.plugin=e,n.push(s)}catch(s){f.warn("[plugin:%s] \u547D\u4EE4\u89E3\u6790\u5931\u8D25 %s: %s",e,r,s instanceof Error?s.message:String(s))}}}catch{}return n}async list(e){const t=await this.hydrate(e),n=new Map;for(const r of t.plugins.values()){const i=this.toSummary(r);n.set(i.name,i)}n.has($)||n.set($,{name:$,version:te(),description:Q,status:"enabled",enabled:!0,source:"builtin",installedAt:new Date().toISOString(),toolCount:1,tools:[{name:"plugin-manager.manage",description:"\u63D2\u4EF6\u751F\u547D\u5468\u671F\u7BA1\u7406\uFF08install/uninstall/reload/disable/enable/list\uFF09"}],listeners:[],builtin:!0});for(const r of this.readSharedManifest()){const i=r.pluginName;if(!this.deployedPluginHealthy(i))continue;const o=n.get(i);if(o){String(o.source||"").startsWith("shared:")&&(o.enabled=this.effectiveSharedEnabled(e,r));continue}n.set(i,{name:i,version:this.deployedPluginVersion(i),status:"enabled",enabled:this.effectiveSharedEnabled(e,r),source:`shared:${r.fileName??`${i}.zip`}`,installedAt:new Date().toISOString(),toolCount:0,listeners:[]})}return[...n.values()].sort((r,i)=>r.name.localeCompare(i.name))}deployedPluginVersion(e){try{const t=JSON.parse(k(g(this.deployedPluginDir(e),"plugin.json"),"utf8"));return typeof t.version=="string"?t.version:void 0}catch{return}}async getCatalog(e){const t=await this.hydrate(e),n=[];for(const r of t.plugins.values()){if(!r.enabled||r.status==="error")continue;const i=r.tools.slice(0,G).map(s=>({name:s.name,description:A(s.title||s.description,re),requiredParams:this.requiredParamsOf(s)}));r.tools.length>G&&i.push({name:`(\u53E6\u6709 ${r.tools.length-G} \u4E2A\u5DE5\u5177\u672A\u5217\u51FA)`,description:'\u7528 function_call {action:"catalog"} \u67E5\u770B\u5168\u91CF',requiredParams:void 0}),n.push({plugin:r.name,version:r.version,description:r.description,status:r.status,tools:i})}return n.push({plugin:$,version:te(),description:Q,status:"enabled",tools:[{name:"manage",description:A(ee,re),requiredParams:["action"]}]}),{revision:t.catalogRevision,plugins:n}}async getToolSchema(e,t){const n=ce(t);if(!n)return null;if(n.plugin===$&&n.tool==="manage")return{plugin:$,name:"manage",description:ee,inputSchema:ve};const i=(await this.hydrate(e)).plugins.get(n.plugin);if(!i||!i.enabled)return null;const s=i.tools.find(o=>o.name===n.tool);return s?{plugin:i.name,name:s.name,title:s.title,description:s.description,inputSchema:s.inputSchema??{type:"object",properties:{}}}:null}async invokeTool(e,t,n,r,i){if(t===$&&n==="manage"){const u=this.buildManageRequest(r);if(!u)return{ok:!1,error:"plugin-manager.manage \u7F3A\u5C11 action"};const c=await this.manage(e,u);if(!c.ok)return{ok:!1,error:c.error??"\u63D2\u4EF6\u7BA1\u7406\u64CD\u4F5C\u5931\u8D25"};const d={ok:!0};return c.plugins&&(d.plugins=c.plugins),c.summary&&(d.summary=c.summary),{ok:!0,result:d}}const s=await this.hydrate(e),o=s.plugins.get(t);if(!o)return{ok:!1,error:`\u63D2\u4EF6 ${t} \u672A\u5B89\u88C5\uFF08\u53EF\u7528\u63D2\u4EF6: ${[...s.plugins.keys()].join(", ")||"\u65E0"}\uFF09`};if(!o.enabled)return{ok:!1,error:`\u63D2\u4EF6 ${t} \u5DF2\u505C\u7528\uFF0C\u53EF\u8BA9\u7528\u6237\u5728\u9762\u677F\u6216\u7528 plugin-manager.manage enable \u542F\u7528`};const a=o.tools.find(u=>u.name===n);if(!a)return{ok:!1,error:`\u63D2\u4EF6 ${t} \u65E0\u5DE5\u5177 ${n}\uFF08\u53EF\u7528: ${o.tools.map(u=>u.name).join(", ")||"\u65E0"}\uFF09`};if(a.inputSchema){const u=V(a.inputSchema,r);if(u.length>0)return{ok:!1,error:`\u53C2\u6570\u6821\u9A8C\u5931\u8D25: ${u.join("; ")}`,inputSchema:a.inputSchema}}return this.executeHandler(e,o,a,r,i)}buildManageRequest(e){const t=e.action;if(typeof t!="string"||!Pe.has(t))return null;const n={action:t};if(typeof e.name=="string"&&e.name.trim()&&(n.name=e.name.trim()),typeof e.source=="string"&&e.source.trim()&&(n.source=e.source.trim()),e.config&&typeof e.config=="object"&&!Array.isArray(e.config)){const r={};for(const[i,s]of Object.entries(e.config))typeof s=="string"&&(r[i]=s);n.config=r}return n}async executeHandler(e,t,n,r,i){const s=Date.now(),o=n.handler??{type:"process"};try{return o.type==="mcp"?{ok:!1,error:"handler.type=mcp \u5C06\u5728\u540E\u7EED\u7248\u672C\u652F\u6301\uFF0C\u8BF7\u6539\u7528 process/module handler"}:o.type==="module"?{ok:!0,result:await this.invokeModuleHandler(t,o,r,e,i),durationMs:Date.now()-s}:!o.command||!o.command.trim()?{ok:!1,error:`\u5DE5\u5177 ${n.name} \u7684 process handler \u7F3A\u5C11 command`}:{ok:!0,result:await this.invokeProcessHandler(t,o,r,e,i),durationMs:Date.now()-s}}catch(a){return{ok:!1,error:a instanceof Error?a.message:String(a),durationMs:Date.now()-s}}}async invokeProcessHandler(e,t,n,r,i){const s=Y(t.command??"",{params:n});if(s.length===0)throw new Error("process handler command \u4E3A\u7A7A");const o=typeof t.timeoutMs=="number"&&t.timeoutMs>0?t.timeoutMs:ne,a=new AbortController,u=()=>a.abort();i?.signal?.addEventListener("abort",u,{once:!0});const c=setTimeout(()=>a.abort(),o);try{return await new Promise((d,y)=>{f.info("[plugin:%s] spawn: %s",e.name,s.join(" "));const h=_(s[0],s.slice(1),{cwd:e.dir,env:this.buildPluginEnv(e,r),shell:t.shell===!0,windowsHide:!0,signal:a.signal});let p="",m="";h.stdin?.on("error",()=>{}),h.stdout?.on("data",v=>{p.length<R&&(p+=v.toString("utf8"))}),h.stderr?.on("data",v=>{m.length<R&&(m+=v.toString("utf8"))}),h.on("error",v=>{y(new Error(`\u63D2\u4EF6\u8FDB\u7A0B\u542F\u52A8\u5931\u8D25: ${v.message}`))}),h.on("close",v=>{const L=p.trim();if(v!==0){const O=A(m.trim()||L||"(\u65E0\u8F93\u51FA)",600);y(new Error(a.signal.aborted?`\u63D2\u4EF6\u8FDB\u7A0B\u8D85\u65F6(${o}ms)\u6216\u88AB\u4E2D\u6B62`:`\u63D2\u4EF6\u8FDB\u7A0B\u9000\u51FA\u7801 ${v}: ${O}`));return}if(!L){d({ok:!0});return}try{d(JSON.parse(L))}catch{d(L)}});try{t.stdin==="params"?h.stdin?.end(`${JSON.stringify(n)}
7
+ `):h.stdin?.end()}catch{}})}finally{clearTimeout(c),i?.signal?.removeEventListener("abort",u)}}async invokeModuleHandler(e,t,n,r,i){if(!t.module)throw new Error("module handler \u7F3A\u5C11 module \u8DEF\u5F84");const s=g(e.dir,t.module);let o=e.moduleCache.get(s);o||(o=await import(`${le(s).href}?acode_nonce=${e.importNonce}`),e.moduleCache.set(s,o));const a=t.export||"default",c=o[a];if(typeof c!="function")throw new Error(`\u6A21\u5757 ${t.module} \u672A\u5BFC\u51FA\u51FD\u6570 ${a}`);const d=typeof t.timeoutMs=="number"&&t.timeoutMs>0?t.timeoutMs:ne;let y;const h=Promise.resolve().then(()=>c(n,{agentId:r,signal:i?.signal,pluginRoot:e.dir}));try{return await Promise.race([h,new Promise((p,m)=>{y=setTimeout(()=>m(new Error(`\u63D2\u4EF6\u6A21\u5757\u6267\u884C\u8D85\u65F6(${d}ms)`)),d)})])}finally{clearTimeout(y)}}buildPluginEnv(e,t){const n={};for(const i of["PATH","HOME","USERPROFILE","SystemRoot","COMSPEC","TEMP","TMP","LANG","TZ"]){const s=process.env[i];s!==void 0&&(n[i]=s)}n.ACODE_PLUGIN_ROOT=e.dir,n.ACODE_AGENT_ID=t,n.ACODE_PLUGIN_NAME=e.name;const r=new Set((e.userConfig??[]).map(i=>i.key));for(const[i,s]of Object.entries(e.configValues))r.has(i)&&(!Le.test(i)||De.has(i.toUpperCase())||(n[i]=s));return n}async manage(e,t){const n=this.agentState(e),r=n.queue.then(async()=>{const i=await this.hydrate(e);return this.doManage(i,t)});return n.queue=r.catch(()=>{}),r}async doManage(e,t){if(t.name===$&&(t.action==="uninstall"||t.action==="disable"||t.action==="enable"||t.action==="reload"))return{ok:!1,error:`\u5185\u7F6E\u7CFB\u7EDF\u63D2\u4EF6 ${$} \u4E0D\u53EF${t.action==="uninstall"?"\u5378\u8F7D":t.action==="reload"?"\u91CD\u8F7D":"\u505C\u7528/\u542F\u7528"}`};switch(t.action){case"list":return{ok:!0,plugins:await this.list(e.agentId)};case"install":return this.installPlugin(e,t);case"uninstall":return this.uninstallPlugin(e,t);case"reload":return this.reloadPlugin(e,t);case"enable":case"disable":return this.setEnabled(e,t,t.action==="enable");default:return{ok:!1,error:`\u672A\u77E5 action: ${String(t.action)}`}}}async installPlugin(e,t){const n=(t.source??"").trim();if(!n)return{ok:!1,error:"install \u9700\u8981 source\uFF08\u5F53\u524D\u652F\u6301 local:<\u63D2\u4EF6\u76EE\u5F55\u7EDD\u5BF9\u8DEF\u5F84>\uFF09"};const r=n.split(":",1)[0];if(r!=="local")return{ok:!1,error:`\u6682\u4E0D\u652F\u6301\u63D2\u4EF6\u6765\u6E90 "${r}:"\uFF08npm:/git: \u5728\u8DEF\u7EBF\u56FE\u4E2D\uFF1Bzip \u5305\u8BF7\u7528\u9762\u677F\u5BFC\u5165\u6216 POST /runtime/plugins/:agentId/upload\uFF09`};const i=n.slice(6).trim();return!i||!w(g(i,"plugin.json"))?{ok:!1,error:`\u63D2\u4EF6\u76EE\u5F55\u4E0D\u5B58\u5728\u6216\u7F3A\u5C11 plugin.json: ${i}`}:this.installFromDirectory(e,i,n,t.config)}async installFromZip(e,t,n,r){if(!t||t.length===0)return{ok:!1,error:"zip \u5305\u5185\u5BB9\u4E3A\u7A7A"};const i=this.agentState(e),s=i.queue.then(async()=>{await this.hydrate(e);const o=g(this.rootDir,"tmp",`upload-${Date.now()}-${Math.random().toString(36).slice(2,8)}`);try{const a=await x(t,o);return w(g(a.pluginDir,"plugin.json"))?(f.info("[agent:%s] zip \u5BFC\u5165: %s\uFF08%d \u4E2A\u6587\u4EF6\uFF09",e,n,a.fileCount),await this.installFromDirectory(i,a.pluginDir,`upload:${n}`,r)):{ok:!1,error:"zip \u5185\u672A\u627E\u5230 plugin.json\uFF08\u8BF7\u6253\u5305\u63D2\u4EF6\u76EE\u5F55\uFF0C\u4E14 zip \u5185\u8DEF\u5F84\u4F7F\u7528\u82F1\u6587\uFF09"}}catch(a){const u=a instanceof Error?a.message:String(a);return f.warn("[agent:%s] zip \u5BFC\u5165\u5931\u8D25: %s",e,u),{ok:!1,error:`zip \u5BFC\u5165\u5931\u8D25: ${u}`}}finally{await C(o,3,100).catch(()=>{})}});return i.queue=s.catch(()=>{}),s}async installFromDirectory(e,t,n,r){const i=this.loadManifestOnly(t);if(!i.ok)return i;const s=i.manifest,o=s.name;if(o===$)return{ok:!1,error:`\u63D2\u4EF6\u540D ${o} \u4E3A\u7CFB\u7EDF\u4FDD\u7559\u540D\u79F0\uFF0C\u4E0D\u5141\u8BB8\u5B89\u88C5\u540C\u540D\u63D2\u4EF6`};const a=this.validateUserConfigValues(s,r??{});if(a)return{ok:!1,error:a};const u=this.loadPluginFromDir(e,t,n,new Date().toISOString(),r??{});if(!u.ok)return f.warn("[agent:%s] \u63D2\u4EF6\u88C5\u8F7D\u6821\u9A8C\u5931\u8D25\uFF08%s\uFF09: %s",e.agentId,n,u.error),u;const c=g(this.rootDir,"cache",N(e.agentId),o),d=t===c,y=e.plugins.get(o);if(y&&this.stopAllListeners(y),!d)try{await C(c),await ie(t,c)}catch(m){const v=m instanceof Error?m.message:String(m);return f.warn("[agent:%s] \u63D2\u4EF6\u79FB\u52A8\u5931\u8D25\uFF08%s\uFF09: %s",e.agentId,n,v),y&&this.startAllListeners(e,y),{ok:!1,error:`\u63D2\u4EF6\u79FB\u52A8\u5931\u8D25: ${v}`}}const h=this.loadPluginFromDir(e,c,n,new Date().toISOString(),r??{});if(!h.ok){if(f.warn("[agent:%s] \u63D2\u4EF6\u88C5\u8F7D\u5931\u8D25\uFF08%s\uFF09: %s",e.agentId,n,h.error),!d)try{await ie(c,t)}catch(m){f.warn("[agent:%s] \u88C5\u8F7D\u5931\u8D25\u540E\u65E0\u6CD5\u79FB\u56DE\u6E90\u76EE\u5F55\uFF08%s\uFF09\uFF0C\u5DF2\u4FDD\u7559\u7F13\u5B58\u526F\u672C",e.agentId,m instanceof Error?m.message:String(m))}if(y)try{this.startAllListeners(e,y)}catch(m){f.warn("[agent:%s] \u6062\u590D\u65E7\u5B9E\u4F8B\u76D1\u542C\u5931\u8D25: %s",e.agentId,m instanceof Error?m.message:String(m))}return h}const p=h.plugin;return e.plugins.set(p.name,p),this.bumpCatalogRevision(e),this.persistInstalled(e),this.startAllListeners(e,p),f.info("[agent:%s] \u63D2\u4EF6\u5DF2\u5B89\u88C5: %s@%s",e.agentId,p.name,p.version??"?"),this.notifyPluginsChanged(e.agentId),{ok:!0,summary:this.toSummary(p)}}async uninstallPlugin(e,t){const n=(t.name??"").trim(),r=e.plugins.get(n);return r?(this.stopAllListeners(r),e.plugins.delete(n),this.bumpCatalogRevision(e),this.readSharedManifest().some(s=>s.pluginName===n)&&this.removeRuntimeLink(e.agentId,n),this.persistInstalled(e),await C(r.dir),f.info("[agent:%s] \u63D2\u4EF6\u5DF2\u5378\u8F7D: %s",e.agentId,n),this.notifyPluginsChanged(e.agentId),{ok:!0}):{ok:!1,error:`\u63D2\u4EF6 ${n} \u672A\u5B89\u88C5`}}async reloadPlugin(e,t){const n=(t.name??"").trim(),r=e.plugins.get(n);if(!r)return{ok:!1,error:`\u63D2\u4EF6 ${n} \u672A\u5B89\u88C5`};const i=this.loadPluginFromDir(e,r.dir,r.source,r.installedAt,r.configValues);if(!i.ok)return{ok:!1,error:`\u91CD\u8F7D\u5931\u8D25\uFF08\u4FDD\u7559\u65E7\u7248\u672C\u8FD0\u884C\uFF09: ${i.error}`};const s=i.plugin;return this.stopAllListeners(r),e.plugins.set(n,s),this.bumpCatalogRevision(e),this.persistInstalled(e),this.startAllListeners(e,s),f.info("[agent:%s] \u63D2\u4EF6\u5DF2\u91CD\u8F7D: %s",e.agentId,n),this.notifyPluginsChanged(e.agentId),{ok:!0,summary:this.toSummary(s)}}async setEnabled(e,t,n){const r=(t.name??"").trim(),i=e.plugins.get(r);return i?(i.enabled=n,this.bumpCatalogRevision(e),n?this.startAllListeners(e,i):this.stopAllListeners(i),this.persistInstalled(e),this.notifyPluginsChanged(e.agentId),{ok:!0,summary:this.toSummary(i)}):{ok:!1,error:`\u63D2\u4EF6 ${r} \u672A\u5B89\u88C5`}}deployedDir(){return g(this.rootDir,"deployed")}deployedManifestFile(){return g(this.deployedDir(),"manifest.json")}deployedPluginDir(e){if(!B(e))throw new Error(`\u975E\u6CD5\u63D2\u4EF6\u540D\uFF08\u4EC5\u5141\u8BB8 ${z}\uFF09: ${JSON.stringify(e)}`);const t=g(this.deployedDir(),e),n=Z(this.deployedDir());if(Z(t)!==g(n,e))throw new Error(`\u63D2\u4EF6\u76EE\u5F55\u8D8A\u51FA\u90E8\u7F72\u533A: ${e}`);return t}legacySharedDir(){return g(this.rootDir,"shared")}readSharedManifest(){try{const e=JSON.parse(k(this.deployedManifestFile(),"utf8"));return Array.isArray(e.plugins)?e.plugins.filter(t=>t&&B(t.pluginName)):[]}catch{return[]}}writeSharedManifest(e){D(this.deployedDir(),{recursive:!0}),U(this.deployedManifestFile(),`${JSON.stringify({version:2,plugins:e},null,2)}
8
+ `,"utf8")}async migrateLegacySharedIfNeeded(){try{if(w(this.deployedManifestFile()))return;const e=g(this.legacySharedDir(),"manifest.json");if(!w(e))return;const t=JSON.parse(k(e,"utf8")),n=Array.isArray(t.plugins)?t.plugins:[];if(n.length===0)return;const r=[];for(const i of n){const s=g(this.legacySharedDir(),i.zipFile);if(!(!i.pluginName||!w(s)))try{const o=await this.deployPluginZipToPersistentDir(k(s),i.pluginName);if(!o)continue;r.push(o),f.info("[shared] \u65E7\u5171\u4EAB\u63D2\u4EF6\u8FC1\u79FB\u5230\u90E8\u7F72\u533A: %s",i.pluginName)}catch(o){f.warn("[shared] \u65E7\u5171\u4EAB\u63D2\u4EF6 %s \u8FC1\u79FB\u5931\u8D25: %s",i.pluginName,o instanceof Error?o.message:String(o))}}r.length>0&&this.writeSharedManifest(r),E(this.legacySharedDir(),{recursive:!0,force:!0})}catch(e){f.warn("[shared] \u65E7\u5171\u4EAB\u63D2\u4EF6\u8FC1\u79FB\u672A\u6267\u884C\uFF08\u4E0B\u6B21\u91CD\u8BD5\uFF09: %s",e instanceof Error?e.message:String(e))}}deployedPluginHealthy(e){return w(g(this.deployedPluginDir(e),"plugin.json"))}runtimeDirFor(e){return g(this.runtimeRootDir,N(e))}runtimeLinkPath(e,t){return g(this.runtimeDirFor(e),t)}ensureRuntimeLink(e,t){const n=this.runtimeLinkPath(e,t),r=this.deployedPluginDir(t);if(!w(g(r,"plugin.json")))return!1;D(this.runtimeDirFor(e),{recursive:!0});try{if(w(n)){let i=!1;try{i=se(n).isSymbolicLink()}catch{i=!1}if(i)try{return j(n),!0}catch{}E(n,{recursive:!0,force:!0})}return oe(r,n,Oe),f.info("[agent:%s] \u63D2\u4EF6\u8FD0\u884C\u65F6\u94FE\u63A5\u5DF2\u5EFA\u7ACB: %s \u2192 %s",e,n,r),!0}catch(i){return f.warn("[agent:%s] \u63D2\u4EF6\u8FD0\u884C\u65F6\u94FE\u63A5\u5931\u8D25\uFF08%s \u2192 %s\uFF09: %s",e,t,r,i instanceof Error?i.message:String(i)),!1}}removeRuntimeLink(e,t){const n=this.runtimeLinkPath(e,t);try{w(n)&&(E(n,{recursive:!0,force:!0}),f.info("[agent:%s] \u63D2\u4EF6\u8FD0\u884C\u65F6\u94FE\u63A5\u5DF2\u79FB\u9664: %s",e,t))}catch(r){f.warn("[agent:%s] \u63D2\u4EF6\u8FD0\u884C\u65F6\u94FE\u63A5\u79FB\u9664\u5931\u8D25\uFF08%s\uFF09: %s",e,t,r instanceof Error?r.message:String(r))}}async saveSharedPlugin(e,t,n=!0,r){if(!e||e.length===0)return{ok:!1,error:"zip \u5305\u5185\u5BB9\u4E3A\u7A7A"};await this.migrateLegacySharedIfNeeded();const i=g(this.rootDir,"tmp",`deploy-${Date.now()}-${Math.random().toString(36).slice(2,8)}`);try{const s=await x(e,i),o=this.loadManifestOnly(s.pluginDir);if(!o.ok)return o;const a=o.manifest.name,u=this.readSharedManifest().find(p=>p.pluginName===a);if(u&&u.sha256===r&&this.deployedPluginHealthy(a))return{ok:!0,pluginName:a};await this.suspendDeployedPluginAcrossAgents(a),D(this.deployedDir(),{recursive:!0});const c=this.deployedPluginDir(a),d=g(this.deployedDir(),`.old-${a}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`);if(w(c))try{H(c,d)}catch{E(c,{recursive:!0,force:!0})}try{F(s.pluginDir,c,{recursive:!0,filter:p=>!/[\\/]\.git([\\/]|$)/.test(p)&&!/[\\/]node_modules([\\/]|$)/.test(p)})}catch(p){throw w(d)&&(E(c,{recursive:!0,force:!0}),H(d,c)),p}w(d)&&E(d,{recursive:!0,force:!0}),await X(this.deployedManifestFile(),async()=>{const p=this.readSharedManifest().filter(m=>m.pluginName!==a);p.push({pluginName:a,zipFile:u?.zipFile??`${a}.zip`,fileName:t,defaultEnabled:n,sha256:r}),this.writeSharedManifest(p)}),f.info("[shared] \u63D2\u4EF6\u5DF2\u90E8\u7F72\u5230 bridge: %s\uFF08\u6765\u6E90 %s%s\uFF09",a,t,r?`, sha256=${r.slice(0,12)}\u2026`:"");const h=(await this.applySharedToKnownAgents()).find(p=>p.installed.includes(a));return h&&f.info("[shared] \u5DF2\u540C\u6B65\u5230\u8FD0\u884C\u4E2D agent: %s",h.agentId),{ok:!0,pluginName:a}}catch(s){const o=s instanceof Error?s.message:String(s);return f.warn("[shared] \u63D2\u4EF6\u90E8\u7F72\u5931\u8D25\uFF08%s\uFF09: %s",t,o),{ok:!1,error:`\u63D2\u4EF6\u90E8\u7F72\u5931\u8D25: ${o}`}}finally{await C(i,3,100).catch(()=>{})}}async deployPluginZipToPersistentDir(e,t){if(!e||e.length===0)return null;const n=g(this.rootDir,"tmp",`migrate-${Date.now()}-${Math.random().toString(36).slice(2,8)}`);try{const r=await x(e,n),i=this.loadManifestOnly(r.pluginDir);if(!i.ok)return null;const s=i.manifest.name;if(t&&s!==t)return null;D(this.deployedDir(),{recursive:!0});const o=this.deployedPluginDir(s);return w(o)&&E(o,{recursive:!0,force:!0}),F(r.pluginDir,o,{recursive:!0,filter:a=>!/[\\/]\.git([\\/]|$)/.test(a)&&!/[\\/]node_modules([\\/]|$)/.test(a)}),{pluginName:s,zipFile:`${s}.zip`,fileName:`${s}.zip`,defaultEnabled:!0}}finally{E(n,{recursive:!0,force:!0})}}async suspendDeployedPluginAcrossAgents(e){for(const t of[...this.agents.values()]){if(!t.hydrated)continue;const n=t.queue.then(async()=>{const r=t.plugins.get(e);r&&(this.stopAllListeners(r),t.plugins.delete(e),this.bumpCatalogRevision(t),f.info("[agent:%s] \u5DF2\u6458\u9664\u63D2\u4EF6\u7B49\u5F85\u90E8\u7F72\u533A\u66F4\u65B0: %s",t.agentId,e))});t.queue=n.catch(()=>{}),await n}}async applySharedToKnownAgents(){const e=[];for(const t of this.agents.values()){if(!t.hydrated)continue;const n=await this.syncSharedIntoStateQueued(t);n.length>0&&e.push({agentId:t.agentId,installed:n})}return e}async syncSharedIntoStateQueued(e){const t=e.queue.then(()=>this.syncSharedIntoState(e));return e.queue=t.catch(()=>[]),t}effectiveSharedEnabled(e,t){return ye(e,"plugins",t.pluginName)&&(t.defaultEnabled??!0)}async pullTemplatePluginsFromCapabilities(e){const t=Se(e.agentId);if(!t)return;const n=this.readSharedManifest();for(const[r,i]of Object.entries(t)){if(!i.url)continue;const s=n.find(a=>a.pluginName===r);if(!s||!s.sha256||s.sha256===i.sha256&&this.deployedPluginHealthy(r)||this.templatePullInFlight.has(r))continue;this.templatePullInFlight.add(r);const o=g(this.rootDir,"tmp",`pull-${N(e.agentId)}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`);try{D(o,{recursive:!0});let a=`${r}.zip`;try{const y=decodeURIComponent(i.url.split("/").pop()||"");y.toLowerCase().endsWith(".zip")&&(a=ge(y,`${r}.zip`))}catch{}const u=await fe({downloadUrl:i.url,fileName:a,sha256:i.sha256},o);if(!u)continue;const c=k(u.outputPath),d=await this.saveSharedPlugin(c,u.fileName,s.defaultEnabled??!0,i.sha256);d.ok?f.info("[agent:%s] \u5DF2\u90E8\u7F72\u63D2\u4EF6\u81EA\u52A8\u5BF9\u8D26\u66F4\u65B0\u6210\u529F: %s",e.agentId,d.pluginName??r):f.warn("[agent:%s] \u5DF2\u90E8\u7F72\u63D2\u4EF6\u66F4\u65B0\u5931\u8D25: %s: %s",e.agentId,r,d.error)}catch(a){f.warn("[agent:%s] \u5DF2\u90E8\u7F72\u63D2\u4EF6 %s \u66F4\u65B0\u5931\u8D25: %s",e.agentId,r,a instanceof Error?a.message:String(a))}finally{this.templatePullInFlight.delete(r),await C(o,3,100).catch(()=>{})}}}queueTemplatePull(e){this.backgroundTemplatePulls.has(e.agentId)||(this.backgroundTemplatePulls.add(e.agentId),this.pullTemplatePluginsFromCapabilities(e).catch(t=>{f.warn("[agent:%s] \u540E\u53F0\u63D2\u4EF6\u5BF9\u8D26\u66F4\u65B0\u5931\u8D25: %s",e.agentId,t instanceof Error?t.message:String(t))}).finally(()=>{this.backgroundTemplatePulls.delete(e.agentId)}))}async syncSharedIntoState(e){this.queueTemplatePull(e);const t=this.readSharedManifest(),n=new Set,r=[];let i=0;for(const s of t)if(n.add(s.pluginName),this.effectiveSharedEnabled(e.agentId,s)){const a=e.plugins.get(s.pluginName);if(!this.ensureRuntimeLink(e.agentId,s.pluginName))continue;const u=this.runtimeLinkPath(e.agentId,s.pluginName);if(!a){const c=this.loadPluginFromDir(e,u,`shared:${s.fileName}`,new Date().toISOString(),{});c.ok?(e.plugins.set(c.plugin.name,c.plugin),r.push(c.plugin.name),f.info("[agent:%s] \u5DF2\u90E8\u7F72\u63D2\u4EF6\u5DF2\u6309\u5F00\u542F\u6001\u52A0\u8F7D: %s",e.agentId,s.pluginName)):f.warn("[agent:%s] \u5DF2\u90E8\u7F72\u63D2\u4EF6\u52A0\u8F7D\u5931\u8D25: %s: %s",e.agentId,s.pluginName,c.error)}}else{const a=e.plugins.get(s.pluginName);a&&(this.stopAllListeners(a),e.plugins.delete(s.pluginName),i++),this.removeRuntimeLink(e.agentId,s.pluginName)}return this.cleanupRuntimeDir(e,n),(r.length>0||i>0)&&this.bumpCatalogRevision(e),this.persistInstalled(e),r}cleanupRuntimeDir(e,t){const n=this.runtimeDirFor(e.agentId);try{if(!w(n))return;const r=new Set(t);for(const i of j(n))!r.has(i)&&!e.plugins.has(i)&&this.removeRuntimeLink(e.agentId,i)}catch{}}async applyCapabilities(e){const t=await this.hydrate(e);await this.pullTemplatePluginsFromCapabilities(t),await this.syncSharedIntoState(t)}async drainEvents(e,t={}){const n=await this.hydrate(e);this.ensureListenersRunning(n);const r=n.buffer.drain(t),i=await this.getCatalog(e);return{revision:r.revision,events:r.events,catalog:i,compactionSeq:n.compactionSeq}}markAgentCompacted(e){const t=this.agentState(e);t.compactionSeq++,f.debug("[agent:%s] \u4E0A\u4E0B\u6587\u538B\u7F29\u6807\u8BB0: compactionSeq=%d",e,t.compactionSeq)}async enqueueExternalEvent(e,t,n){const r=await this.hydrate(e),i=r.plugins.get(t);if(!i||!i.enabled)return{ok:!1,error:`\u63D2\u4EF6 ${t} \u672A\u5B89\u88C5\u6216\u5DF2\u505C\u7528`};const s=typeof n.event=="string"?n.event:"",o=i.listeners.find(a=>a.transport.type==="http-callback"&&(!s||a.event===s));return o?(this.enqueueEvent(r,i,o,n),{ok:!0}):{ok:!1,error:`\u63D2\u4EF6 ${t} \u65E0\u5339\u914D\u7684 http-callback \u76D1\u542C\u5668\uFF08event=${s||"(\u7A7A)"}\uFF09`}}bumpCatalogRevision(e){e.catalogRevision++}agentState(e){let t=this.agents.get(e);return t||(t={agentId:e,plugins:new Map,buffer:new we(e),hydrated:!1,queue:Promise.resolve(),catalogRevision:0,eventSeq:0,compactionSeq:0},this.agents.set(e,t)),t}async hydrate(e){const t=this.agentState(e);return t.hydratePromise||(t.hydratePromise=this.doHydrate(t).catch(n=>{throw t.hydratePromise=void 0,n})),await t.hydratePromise,t}async doHydrate(e){const t=e.agentId;await this.migrateLegacySharedIfNeeded();const n=this.installedFile(t);if(!w(n)){await this.syncSharedIntoState(e).catch(()=>{}),e.hydrated=!0;return}try{const r=JSON.parse(k(n,"utf8")),i=this.readSecrets(t);for(const s of r.plugins??[]){if(String(s.source||"").startsWith("shared:"))continue;const a=g(this.rootDir,"cache",N(t),s.name);if(!w(g(a,"plugin.json"))){f.warn("[agent:%s] \u5DF2\u5B89\u88C5\u63D2\u4EF6\u76EE\u5F55\u7F3A\u5931\uFF0C\u8DF3\u8FC7: %s",t,s.name);continue}const u={...s.config,...i[s.name]??{}},c=this.loadPluginFromDir(e,a,s.source,s.installedAt,u);if(c.ok){const d=c.plugin;d.enabled=s.enabled,e.plugins.set(d.name,d)}else f.warn("[agent:%s] \u63D2\u4EF6\u88C5\u8F7D\u5931\u8D25: %s: %s",t,s.name,c.error)}}catch(r){const i=r instanceof Error?r.message:String(r);f.error("[agent:%s] installed.json \u89E3\u6790\u5931\u8D25: %s",t,i)}await this.syncSharedIntoState(e).catch(r=>{f.warn("[agent:%s] \u5171\u4EAB\u63D2\u4EF6\u540C\u6B65\u5931\u8D25: %s",t,r instanceof Error?r.message:String(r))}),e.hydrated=!0}installedFile(e){return g(this.rootDir,"agents",N(e),"installed.json")}persistInstalled(e){this.persistSecrets(e);const t=this.installedFile(e.agentId);D(J(t),{recursive:!0});const n=[...e.plugins.values()].map(r=>({name:r.name,source:r.source,installedAt:r.installedAt,enabled:r.enabled,config:this.stripSensitiveValues(r)}));U(t,`${JSON.stringify({version:1,plugins:n},null,2)}
9
+ `,"utf8")}sensitiveKeysOf(e){return(e.userConfig??[]).filter(t=>t?.sensitive===!0&&typeof t.key=="string").map(t=>t.key)}stripSensitiveValues(e){const t=new Set(this.sensitiveKeysOf(e)),n={};for(const[r,i]of Object.entries(e.configValues))t.has(r)||(n[r]=i);return n}secretsFile(e){return g(this.rootDir,"agents",N(e),"secrets.json")}readSecrets(e){try{const t=JSON.parse(k(this.secretsFile(e),"utf8"));if(!P(t)||!P(t.secrets))return{};const n={};for(const[r,i]of Object.entries(t.secrets)){if(!P(i))continue;const s={};for(const[o,a]of Object.entries(i))typeof a=="string"&&(s[o]=a);n[r]=s}return n}catch{return{}}}persistSecrets(e){const t={};for(const r of e.plugins.values()){const i={};for(const s of this.sensitiveKeysOf(r)){const o=r.configValues[s];typeof o=="string"&&o.length>0&&(i[s]=o)}Object.keys(i).length>0&&(t[r.name]=i)}const n=this.secretsFile(e.agentId);if(Object.keys(t).length===0){try{E(n,{force:!0})}catch{}return}D(J(n),{recursive:!0}),U(n,`${JSON.stringify({version:1,secrets:t},null,2)}
10
+ `,{encoding:"utf8",mode:384})}readJsonFile(e){if(!w(e))return{ok:!0,data:{}};try{const t=JSON.parse(k(e,"utf8"));return P(t)?{ok:!0,data:t}:{ok:!1,error:`${e}: \u6839\u8282\u70B9\u987B\u4E3A\u5BF9\u8C61`}}catch(t){const n=t instanceof Error?t.message:String(t);return{ok:!1,error:`${e}: JSON \u89E3\u6790\u5931\u8D25: ${n}`}}}loadManifestOnly(e){const t=this.readJsonFile(g(e,"plugin.json"));if(!t.ok)return t;const n=t.data,r=Me(n);return r?{ok:!1,error:r}:{ok:!0,manifest:n}}validateUserConfigValues(e,t){const n=Array.isArray(e.userConfig)?e.userConfig:[],r={...t};for(const i of n){if(!i||typeof i.key!="string"||!/^[A-Za-z_][A-Za-z0-9_]*$/.test(i.key))return"plugin.json: userConfig.key \u975E\u6CD5\uFF08\u987B\u4E3A\u73AF\u5883\u53D8\u91CF\u540D\uFF09";if(!(typeof r[i.key]=="string"&&r[i.key].length>0)&&i.required){const o=i.default!==void 0&&typeof i.default=="string"?i.default:"";if(!o)return`\u7F3A\u5C11\u5FC5\u9700\u914D\u7F6E ${i.key}${i.description?`\uFF08${i.description}\uFF09`:""}\uFF0C\u5B89\u88C5\u65F6\u8BF7\u5728 config \u4E2D\u63D0\u4F9B`;r[i.key]=o}}return null}loadPluginFromDir(e,t,n,r,i){const s=this.loadManifestOnly(t);if(!s.ok)return s;const o=s.manifest,a=g(t,o.tools??"tools/tools.json"),u=this.readJsonFile(a);if(!u.ok)return u;const c=[],d=Array.isArray(u.data.tools)?u.data.tools:[];for(const S of d){const T=_e(S);if(T)return{ok:!1,error:`${o.tools??"tools/tools.json"}: ${T}`};c.push(S)}const y=g(t,o.listeners??"listeners/listeners.json"),h=this.readJsonFile(y);if(!h.ok)return h;const p=[],m=Array.isArray(h.data.listeners)?h.data.listeners:[];for(const S of m){const T=Fe(S);if(T)return{ok:!1,error:`${o.listeners??"listeners/listeners.json"}: ${T}`};p.push(S)}const v=Array.isArray(o.userConfig)?o.userConfig:[],L=this.validateUserConfigValues(o,i);if(L)return{ok:!1,error:L};const O={...i};for(const S of v){if(!S||typeof S.key!="string")continue;!(typeof O[S.key]=="string"&&O[S.key].length>0)&&S.required&&S.default!==void 0&&typeof S.default=="string"&&(O[S.key]=S.default)}const M=o.commands;let K;if(typeof M=="string"&&M.trim()){const S=g(t,M.trim());w(S)&&(K=S)}return{ok:!0,plugin:{name:o.name,version:typeof o.version=="string"?o.version:void 0,description:typeof o.description=="string"?o.description:void 0,source:n,installedAt:r,dir:t,enabled:!0,tools:c,listeners:p,commandDir:K,userConfig:v,configValues:O,status:"enabled",runtimes:p.map(S=>({def:S,stopping:!1,restarts:0,logs:[]})),moduleCache:new Map,importNonce:++this.moduleNonce}}}ensureListenersRunning(e){for(const t of e.plugins.values())if(t.enabled)for(const n of t.runtimes)!n.child&&!n.timer&&!n.backoffTimer&&!n.stopping&&this.startListener(e,t,n)}startAllListeners(e,t){for(const n of t.runtimes)this.stopListener(n),t.enabled&&this.startListener(e,t,n)}stopAllListeners(e){for(const t of e.runtimes)this.stopListener(t)}startListener(e,t,n){const r=n.def.transport??{type:"command-stream"};if(r.type==="http-callback"){n.stopping=!1;return}if(r.type==="poll-command"){const i=Math.max(5e3,r.intervalMs??3e4);n.stopping=!1,n.timer=setInterval(()=>{this.pollListenerOnce(e,t,n)},i),this.pollListenerOnce(e,t,n);return}if(!r.command){n.lastError="command-stream \u7F3A\u5C11 command",b(n,`ERROR ${n.lastError}`);return}n.stopping=!1,this.spawnListenerChild(e,t,n)}spawnListenerChild(e,t,n){const i=n.def.transport?.command??"",s=Y(i,{});try{b(n,`spawn: ${s.join(" ")}`);const o=_(s[0],s.slice(1),{cwd:t.dir,env:this.buildPluginEnv(t,e.agentId),shell:!1,windowsHide:!0,stdio:["ignore","pipe","pipe"]});n.child=o,n.lastError=void 0;let a="";o.stdout?.on("data",u=>{a+=u.toString("utf8");let c=a.indexOf(`
11
+ `);for(;c>=0;){const d=a.slice(0,c).trim();a=a.slice(c+1),d&&this.handleListenerLine(e,t,n,d),c=a.indexOf(`
12
+ `)}a.length>1024*1024&&(a=a.slice(-4096))}),o.stderr?.on("data",u=>{b(n,`stderr: ${A(u.toString("utf8").trimEnd(),400)}`)}),o.on("error",u=>{n.lastError=`\u8FDB\u7A0B\u542F\u52A8\u5931\u8D25: ${u.message}`,b(n,`ERROR ${n.lastError}`)}),o.on("close",u=>{n.child=void 0,!n.stopping&&(n.lastError=`\u76D1\u542C\u8FDB\u7A0B\u9000\u51FA\uFF08code=${u??"signal"}\uFF09`,b(n,`exit code=${u??"signal"}\uFF0C\u51C6\u5907\u91CD\u542F`),this.scheduleListenerRestart(e,t,n))})}catch(o){const a=o instanceof Error?o.message:String(o);n.lastError=a,b(n,`ERROR spawn: ${a}`),this.scheduleListenerRestart(e,t,n)}}scheduleListenerRestart(e,t,n){if(n.stopping)return;const r=Math.max(500,n.def.transport?.restartBackoffMs??2e3),i=Math.min(Ne,r*2**Math.min(n.restarts,6));n.restarts++,b(n,`restart #${n.restarts} in ${i}ms`),n.backoffTimer=setTimeout(()=>{n.backoffTimer=void 0,n.stopping||this.spawnListenerChild(e,t,n)},i)}async pollListenerOnce(e,t,n){if(n.polling)return;const r=n.def.transport?.command??"",i=Y(r,{});if(i.length===0)return;n.polling=!0;const s=new AbortController,o=setTimeout(()=>s.abort(),q);try{const a=await new Promise((u,c)=>{const d=_(i[0],i.slice(1),{cwd:t.dir,env:this.buildPluginEnv(t,e.agentId),shell:!1,windowsHide:!0,stdio:["ignore","pipe","pipe"],signal:s.signal});let y="",h="";d.stdout?.on("data",m=>{y.length<R&&(y+=m.toString("utf8"))}),d.stderr?.on("data",m=>{h.length<R&&(h+=m.toString("utf8"))});const p=()=>s.signal.aborted;d.on("error",m=>{c(p()?new Error(`poll \u8D85\u65F6(${q}ms)`):m)}),d.on("close",m=>{p()?c(new Error(`poll \u8D85\u65F6(${q}ms)`)):m===0?u(y):c(new Error(`exit ${m}: ${A(h||y,300)}`))})});n.lastError=void 0;for(const u of a.split(`
13
+ `)){const c=u.trim();c&&this.handleListenerLine(e,t,n,c)}}catch(a){const u=a instanceof Error?a.message:String(a);n.lastError=u,b(n,`poll \u5931\u8D25: ${u}`)}finally{clearTimeout(o),n.polling=!1}}stopListener(e){if(e.stopping=!0,e.restarts=0,e.child){try{e.child.kill()}catch{}e.child=void 0}e.timer&&(clearInterval(e.timer),e.timer=void 0),e.backoffTimer&&(clearTimeout(e.backoffTimer),e.backoffTimer=void 0)}handleListenerLine(e,t,n,r){b(n,`event: ${A(r,300)}`);let i;try{i=JSON.parse(r)}catch{n.lastError="\u4E8B\u4EF6\u884C\u4E0D\u662F\u5408\u6CD5 JSON\uFF08\u8981\u6C42 JSONL\uFF09";return}if(!P(i))return;const s=typeof i.event=="string"?i.event:n.def.event,o=s===n.def.event?n.def:t.listeners.find(a=>a.event===s);o&&(o.delivery&&o.delivery!=="poll"&&f.debug("[plugin:%s] delivery=%s \u6682\u6309 poll \u4EA4\u4ED8",t.name,o.delivery),this.enqueueEvent(e,t,o,i))}enqueueEvent(e,t,n,r){for(const[y,h]of Object.entries(n.matcher??{})){const p=I(r,y);if(!(Array.isArray(h)?h:[h]).some(v=>JSON.stringify(v)===JSON.stringify(p)))return}let i;if(n.dedupKey){const y=I(r,n.dedupKey);y!=null&&(i=A(String(y),256))}e.eventSeq++;const s=A(He(r.data??r),ke),o=n.promptTemplate?je(n.promptTemplate,r):`\u3010\u63D2\u4EF6\u4E8B\u4EF6\u3011${t.name} \xB7 ${n.event}${n.description?`
14
+ ${n.description}`:""}`,a=(n.toolHints??[]).join(","),u=`${o}
15
+ [plugin-event] plugin=${t.name} event=${n.event}`+(a?` toolHints=${a}`:"")+` payload=${s}`,c={msgId:A(i?`plugin-event-${t.name}-${i}`:`plugin-event-${t.name}-${n.event}-${e.eventSeq}`,512),channel:"plugin-event",senderId:`plugin:${t.name}`,senderName:`\u63D2\u4EF6[${t.name}]`,receiverId:e.agentId||void 0,content:u,requireReply:!1,role:"system",timestamp:new Date().toISOString()},d=n.priority??"normal";e.buffer.push({plugin:t.name,event:n.event,priority:d,dedupKey:i,receivedAt:Date.now(),message:c})}requiredParamsOf(e){const t=e.inputSchema;if(!(!t||!Array.isArray(t.required)))return t.required.filter(n=>typeof n=="string")}toSummary(e){return{name:e.name,version:e.version,description:e.description,status:e.status,enabled:e.enabled,source:e.source,installedAt:e.installedAt,toolCount:e.tools.length,tools:e.tools.map(t=>({name:t.name,title:t.title,description:t.description})),listeners:e.runtimes.map(t=>({event:t.def.event,delivery:t.def.delivery??"poll",running:!!(t.child||t.timer)||t.def.transport?.type==="http-callback",error:t.lastError})),running:e.runtimes.some(t=>!!(t.child||t.timer)||t.def.transport?.type==="http-callback"),error:e.error}}async getLogs(e,t){const n=await this.hydrate(e);if(t===$)return{ok:!0,logs:[`\u2500\u2500 ${$} \u4E3A\u7CFB\u7EDF\u5185\u7F6E\u63D2\u4EF6\uFF08\u65E0\u9700\u5B89\u88C5\uFF09\uFF0C\u65E0\u72EC\u7ACB\u76D1\u542C\u5668\u8FD0\u884C\u65E5\u5FD7\u3002`,"\u5176\u751F\u547D\u5468\u671F\u64CD\u4F5C\uFF08install/reload/disable/enable/list\uFF09\u7531 bridge plugin-manager \u5904\u7406\uFF0C\u53EF\u901A\u8FC7\u300C\u91CD\u8F7D/\u542F\u7528/\u505C\u7528\u300D\u6309\u94AE\u89C2\u5BDF\u72B6\u6001\u53D8\u5316\u3002"]};const r=n.plugins.get(t);if(!r)return{ok:!1,error:`\u63D2\u4EF6 ${t} \u672A\u5B89\u88C5`,logs:[]};const i=[];for(const s of r.runtimes)i.push(`\u2500\u2500 listener ${s.def.event} (${s.def.transport?.type}) ${s.lastError?`[error: ${s.lastError}]`:""}`),i.push(...s.logs);return{ok:!0,logs:i}}async stopAgent(e){const t=this.agents.get(e);if(t){for(const n of t.plugins.values())this.stopAllListeners(n);this.agents.delete(e)}}async stopAll(){for(const e of[...this.agents.keys()])await this.stopAgent(e)}async listDeployed(){await this.migrateLegacySharedIfNeeded();const e=this.readSharedManifest(),t=[];for(const n of e){const r=this.deployedPluginDir(n.pluginName),i=this.deployedPluginHealthy(n.pluginName);let s;if(i)try{const o=JSON.parse(k(g(r,"plugin.json"),"utf8"));typeof o.version=="string"&&(s=o.version)}catch{}t.push({pluginName:n.pluginName,version:s,fileName:n.fileName??`${n.pluginName}.zip`,defaultEnabled:n.defaultEnabled!==!1,sha256:n.sha256,deployed:i})}return t}deployedDefaultEnabled(){const e=this.readSharedManifest(),t={};for(const n of e)t[n.pluginName]=n.defaultEnabled!==!1;return t}async removeDeployedPlugin(e){if(!B(e))return{ok:!1,error:"pluginName \u975E\u6CD5\uFF08\u987B\u4E3A kebab-case\uFF0C1~64 \u5B57\u7B26\uFF09"};await this.migrateLegacySharedIfNeeded();for(const t of[...this.agents.values()]){if(!t.hydrated)continue;const n=t.queue.then(async()=>{const r=t.plugins.get(e);r&&(this.stopAllListeners(r),t.plugins.delete(e)),this.removeRuntimeLink(t.agentId,e),this.persistInstalled(t)});t.queue=n.catch(()=>{}),await n}await X(this.deployedManifestFile(),async()=>{const t=this.readSharedManifest().filter(n=>n.pluginName!==e);this.writeSharedManifest(t)});try{E(this.deployedPluginDir(e),{recursive:!0,force:!0})}catch(t){return{ok:!1,error:`\u90E8\u7F72\u76EE\u5F55\u6E05\u7406\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`}}return f.info("[shared] \u63D2\u4EF6\u5DF2\u4ECE bridge \u79FB\u9664\u90E8\u7F72: %s",e),{ok:!0}}}function B(l){return typeof l=="string"&&l.length>0&&l.length<=64&&z.test(l)}function Me(l){const e=l.name;if(typeof e!="string"||!z.test(e))return`plugin.json: name \u975E\u6CD5\uFF08\u987B\u4E3A kebab-case\uFF09: ${String(e)}`;if(e.length>64)return"plugin.json: name \u8FC7\u957F\uFF08\u226464\uFF09";for(const t of be)if(e===t.replace(/\.$/,"")||e.startsWith(t))return`plugin.json: name \u4F7F\u7528\u4E86\u4FDD\u7559\u524D\u7F00 ${t}`;return Te.test(e)?"plugin.json: name \u542B\u975E ASCII \u5B57\u7B26\uFF08\u540C\u5F62\u5B57\u9632\u62A4\uFF09":l.version!==void 0&&typeof l.version!="string"?"plugin.json: version \u987B\u4E3A\u5B57\u7B26\u4E32":l.userConfig!==void 0&&!Array.isArray(l.userConfig)?"plugin.json: userConfig \u987B\u4E3A\u6570\u7EC4":null}function _e(l){if(!P(l))return"\u5DE5\u5177\u6761\u76EE\u987B\u4E3A\u5BF9\u8C61";const e=l.name;if(typeof e!="string"||!Ae.test(e))return`\u5DE5\u5177 name \u975E\u6CD5: ${String(e)}`;if(typeof l.description!="string"||!l.description.trim())return`\u5DE5\u5177 ${e} \u7F3A\u5C11 description`;const t=l.handler;if(!P(t))return`\u5DE5\u5177 ${e} \u7F3A\u5C11 handler`;const n=t.type;return n!=="process"&&n!=="module"&&n!=="mcp"?`\u5DE5\u5177 ${e} handler.type \u975E\u6CD5: ${String(n)}`:n==="process"&&typeof t.command!="string"?`\u5DE5\u5177 ${e} \u7684 process handler \u7F3A\u5C11 command`:n==="module"&&typeof t.module!="string"?`\u5DE5\u5177 ${e} \u7684 module handler \u7F3A\u5C11 module`:l.inputSchema!==void 0&&!P(l.inputSchema)?`\u5DE5\u5177 ${e} inputSchema \u987B\u4E3A\u5BF9\u8C61`:null}function Fe(l){if(!P(l))return"\u76D1\u542C\u5668\u6761\u76EE\u987B\u4E3A\u5BF9\u8C61";if(typeof l.event!="string"||!l.event.trim())return"\u76D1\u542C\u5668\u7F3A\u5C11 event";const e=l.transport;if(!P(e))return`\u76D1\u542C\u5668 ${String(l.event)} \u7F3A\u5C11 transport`;const t=e.type;if(t!=="command-stream"&&t!=="poll-command"&&t!=="http-callback")return`\u76D1\u542C\u5668 ${String(l.event)} transport.type \u975E\u6CD5: ${String(t)}`;if((t==="command-stream"||t==="poll-command")&&typeof e.command!="string")return`\u76D1\u542C\u5668 ${String(l.event)} \u7684 ${t} transport \u7F3A\u5C11 command`;const n=l.delivery;return n!==void 0&&n!=="poll"&&n!=="force"&&n!=="wake"?`\u76D1\u542C\u5668 ${String(l.event)} delivery \u975E\u6CD5: ${String(n)}`:null}function Y(l,e){return l.trim().split(/\s+/).map(t=>{const n=/^\{\{(.+)\}\}$/.exec(t);if(n){const r=I(e,n[1].trim());return r==null?"":typeof r=="string"?r:JSON.stringify(r)}return t.replace(/\{\{(.+?)\}\}/g,(r,i)=>{const s=I(e,i.trim());return s==null?"":typeof s=="string"?s:JSON.stringify(s)})}).filter(t=>t!=="")}function je(l,e){return l.replace(/\{\{(.+?)\}\}/g,(t,n)=>{let r=I(e,n.trim());return r===void 0&&!n.trim().startsWith("params.")&&(r=I(e,`data.${n.trim()}`)),r==null?"":typeof r=="string"?r:JSON.stringify(r)})}function He(l){try{return JSON.stringify(l)??"null"}catch{return"(\u4E0D\u53EF\u5E8F\u5217\u5316\u7684\u4E8B\u4EF6\u8D1F\u8F7D)"}}const Ue=new Re;me("plugins",()=>Ue.deployedDefaultEnabled());const et=()=>he("plugins");export{Q as BUILTIN_PLUGIN_DESCRIPTION,ee as BUILTIN_PLUGIN_MANAGE_DESC,$ as BUILTIN_PLUGIN_NAME,Re as PluginManager,$e as getBuiltinCommandDir,B as isValidPluginName,Ue as pluginManager,et as reconcilePluginsDefaultsFromDeployed,Y as renderCommandArgv,V as validateAgainstSchema,Me as validateManifest};
16
+
@@ -0,0 +1,8 @@
1
+
2
+ export interface PluginZipExtractResult {
3
+
4
+ pluginDir: string;
5
+ fileCount: number;
6
+ }
7
+
8
+ export declare function extractPluginZip(zipBuffer: Buffer, stagingRoot: string): Promise<PluginZipExtractResult>;
@@ -0,0 +1,2 @@
1
+ import{createWriteStream as w}from"node:fs";import{mkdir as m,readdir as h,rm as p}from"node:fs/promises";import u from"node:path";import{Readable as d,Transform as f}from"node:stream";import{pipeline as y}from"node:stream/promises";import x from"unzipper";const s={maxEntries:2e3,maxFileBytes:100*1024*1024,maxTotalBytes:200*1024*1024,maxPathLength:400,maxPathDepth:24};function z(t,e){let r=0;return new f({transform(i,o,a){if(r+=i.length,r>t){a(new Error(`${e} \u8D85\u51FA\u4E0A\u9650\uFF08${t} \u5B57\u8282\uFF09`));return}a(null,i)}})}function E(t,e){let r=0;return{transform(){return new f({transform(i,o,a){if(r+=i.length,r>t){a(new Error(`${e} \u8D85\u51FA\u603B\u91CF\u4E0A\u9650\uFF08${t} \u5B57\u8282\uFF09`));return}a(null,i)}})}}}function $(t,e){const r=String(e||"").replace(/\\/g,"/");if(!r||r.startsWith("/")||/^[A-Za-z]:/.test(r)||r.split("/").includes(".."))throw new Error(`zip \u6761\u76EE\u8DEF\u5F84\u975E\u6CD5: ${e}`);if(r.length>s.maxPathLength)throw new Error(`zip \u6761\u76EE\u8DEF\u5F84\u8FC7\u957F: ${e}`);if(r.split("/").filter(Boolean).length>s.maxPathDepth)throw new Error(`zip \u6761\u76EE\u8DEF\u5F84\u8FC7\u6DF1: ${e}`);const i=u.resolve(t,r),o=u.resolve(t)+u.sep;if(i!==u.resolve(t)&&!i.startsWith(o))throw new Error(`zip \u6761\u76EE\u8D8A\u754C\uFF08zip-slip\uFF09: ${e}`);return i}async function F(t,e){await p(e,{recursive:!0,force:!0}),await m(e,{recursive:!0});const r=d.from([t]),i=r.pipe(x.Parse({forceStream:!0}));let o=0,a=0;const c=E(s.maxTotalBytes,"zip \u89E3\u538B\u603B\u91CF");try{for await(const n of i){const l=$(e,n.path);if(n.type==="Directory"){await m(l,{recursive:!0}),n.autodrain?.();continue}if(n.type!=="File"){n.autodrain?.();continue}if(o++,o>s.maxEntries)throw new Error(`zip \u6761\u76EE\u6570\u8D85\u51FA\u4E0A\u9650\uFF08${s.maxEntries}\uFF09`);if(a+=Number(n.size??0),a>s.maxTotalBytes)throw new Error(`zip \u603B\u91CF\u8D85\u51FA\u4E0A\u9650\uFF08${s.maxTotalBytes} \u5B57\u8282\uFF09`);await m(u.dirname(l),{recursive:!0}),await y(n,z(s.maxFileBytes,`zip \u6761\u76EE ${n.path}`),c.transform(),w(l))}}catch(n){throw await p(e,{recursive:!0,force:!0}).catch(()=>{}),n}finally{r.destroy(),i.destroy?.()}if(o===0)throw new Error("zip \u5185\u6CA1\u6709\u6587\u4EF6\uFF08\u9700\u8981\u5305\u542B plugin.json\uFF09");return{pluginDir:await v(e),fileCount:o}}async function v(t){const r=(await h(t,{withFileTypes:!0})).filter(i=>!i.name.startsWith("."));return r.length===1&&r[0].isDirectory()?u.join(t,r[0].name):t}export{F as extractPluginZip};
2
+
@@ -1,4 +1,4 @@
1
- import{execFile as g}from"node:child_process";import{readFile as d,readlink as T}from"node:fs/promises";import{promisify as C}from"node:util";import F from"node:os";const l=C(g);import{createLogger as O}from"../utils/logger.js";const k=O("process-detail"),m=9e3,S=100,I=50,f="\u8FDB\u7A0B\u4E0D\u5B58\u5728\u3001\u5DF2\u9000\u51FA\u6216\u5F53\u524D\u7528\u6237\u65E0\u6743\u67E5\u770B";function v(n){const t=new Map;for(const c of n.split(/\r?\n/)){const a=c.indexOf(":");a<=0||t.set(c.slice(0,a).trim(),c.slice(a+1).trim())}const e=B(t.get("VmSize")),s=B(t.get("VmRSS")),r={},i=t.get("Name"),o=t.get("State"),u=Number(t.get("PPid")),p=Number(t.get("Threads"));return i&&(r.name=i),o&&(r.status=o.split(/\s+/)[0]),Number.isFinite(u)&&(r.ppid=u),Number.isFinite(p)&&(r.threads=p),e!==null&&(r.virtualBytes=e*1024),s!==null&&(r.rssBytes=s*1024),r}function B(n){if(!n)return null;const t=n.match(/^(\d+)\s*kB$/);if(!t)return null;const e=Number(t[1]);return Number.isFinite(e)?e:null}function L(n){const t=Number(n.trim().split(/\s+/)[0]);return Number.isFinite(t)?t:null}function D(n){const t=n.lastIndexOf(")");if(t<0)return null;const e=n.slice(t+1).trim().split(/\s+/),s=Number(e[11]),r=Number(e[12]),i=Number(e[19]);return!Number.isFinite(s)||!Number.isFinite(r)||!Number.isFinite(i)?null:{userTicks:s,systemTicks:r,startTicks:i}}function w(n){const t=n.trim();if(!t||!/^\d/.test(t))return null;const[e,s]=t.includes("-")?t.split("-",2):[void 0,t],r=s.split(":").map(Number);if(r.some(o=>!Number.isFinite(o)))return null;let i=0;for(const o of r)i=i*60+o;if(e!==void 0){if(!/^\d+$/.test(e))return null;i+=Number(e)*86400}return i}function E(n){const[t,e]=n.trim().split("."),s=w(t);return s===null?null:s+(e&&+`0.${e}`||0)}function M(n){const t=n.trim().split(/\s+/);if(t.length<8)return null;const e=t.slice(7).join(" ");if(e.includes("(LISTEN)"))return null;const s=e.match(/\(([A-Z ]+)\)$/),r=e.replace(/\s*\([A-Z ]+\)$/,""),i=r.includes("->")?r.split("->")[1]:r;return i?{remote:i,state:s?s[1]:void 0}:null}function R(n,t){const e=[];for(const s of n.split(/\r?\n/).slice(1)){if(!s.trim()||!s.includes(`pid=${t}`))continue;const r=s.trim().split(/\s+/);if(r[0]==="LISTEN")continue;const i=r[4]||"";i&&e.push({remote:i})}return e}function U(n){const t=[];for(const e of n.split(/\r?\n/).slice(1)){const s=M(e);s&&t.push(s)}return t}function _(n){const t=n.trim();return t?JSON.parse(t):null}async function W(n){let t;try{t=await d(`/proc/${n}/status`,"utf8")}catch{return{ok:!0,pid:n,unsupported:f}}const e=v(t),[s,r,i]=await Promise.all([d(`/proc/${n}/stat`,"utf8").catch(()=>""),d(`/proc/${n}/cmdline`,"utf8").catch(()=>""),d("/proc/uptime","utf8").catch(()=>"")]),o=s?D(s):null,u=i?L(i):null,[p,c,a,$]=await Promise.all([T(`/proc/${n}/exe`).catch(()=>""),d(`/proc/${n}/io`,"utf8").catch(()=>""),l("ps",["-o","user=","-p",String(n)],{encoding:"utf8",timeout:m}).then(N=>N.stdout.trim()).catch(()=>""),l("ss",["-tupn"],{encoding:"utf8",timeout:m}).then(N=>N.stdout).catch(()=>"")]),h=c?j(c):null,P=A(r)||e.name,x=o&&u!==null?Math.max(0,Math.round(u-o.startTicks/S)):void 0;return{ok:!0,pid:n,name:e.name,command:P||void 0,exePath:p||void 0,user:a||void 0,ppid:e.ppid,status:e.status,threads:e.threads,elapsedSeconds:x,cpuUserSeconds:o?y(o.userTicks/S):void 0,cpuSystemSeconds:o?y(o.systemTicks/S):void 0,virtualBytes:e.virtualBytes,rssBytes:e.rssBytes,ioReadBytes:h?.readBytes,ioWriteBytes:h?.writeBytes,connections:$?b(R($,n)):void 0}}function A(n){const t=n.replace(/\0+$/,"");return t?t.split("\0").filter(Boolean).join(" "):""}function j(n){let t,e;for(const s of n.split(/\r?\n/)){const[r,i]=s.split(":");if(!r||i===void 0)continue;const o=Number(i.trim());Number.isFinite(o)&&(r.trim()==="read_bytes"?t=o:r.trim()==="write_bytes"&&(e=o))}return{readBytes:t??0,writeBytes:e??0}}function G(n){const t=n.trim().match(/^(\d+)\s+(\d+)\s+(\S+)\s+(\S+)\s+(\d+)\s+(\d+)\s+(\S+)\s+(\S+)\s+([\s\S]+)$/);if(!t)return null;const e=Number(t[2]),s=Number(t[5])*1024,r=Number(t[6])*1024,i=w(t[7]),o=E(t[8]),u={user:t[3],status:t[4],command:t[9].trim()};return Number.isFinite(e)&&(u.ppid=e),Number.isFinite(s)&&(u.rssBytes=s),Number.isFinite(r)&&(u.virtualBytes=r),i!==null&&(u.elapsedSeconds=i),o!==null&&(u.cpuTotalSeconds=y(o)),u}async function K(n){const{stdout:t}=await l("ps",["-ww","-p",String(n),"-o","pid=,ppid=,user=,state=,rss=,vsz=,etime=,cputime=,command="],{encoding:"utf8",timeout:m}),e=t.split(/\r?\n/).find(i=>i.trim()),s=e?G(e):null;if(!s)return{ok:!0,pid:n,unsupported:f};const r=await l("lsof",["-n","-P","-i","TCP","-a","-p",String(n),"+c0"],{encoding:"utf8",timeout:m}).then(i=>i.stdout).catch(()=>"");return{ok:!0,pid:n,user:s.user,ppid:s.ppid,status:s.status,command:s.command||void 0,elapsedSeconds:s.elapsedSeconds,cpuTotalSeconds:s.cpuTotalSeconds,virtualBytes:s.virtualBytes,rssBytes:s.rssBytes,connections:r?b(U(r)):void 0}}function z(n){return`
1
+ import{execFile as g}from"node:child_process";import{readFile as d,readlink as T}from"node:fs/promises";import C from"node:os";import{promisify as F}from"node:util";const l=F(g);import{createLogger as O}from"../utils/logger.js";const k=O("process-detail"),m=9e3,S=100,I=50,f="\u8FDB\u7A0B\u4E0D\u5B58\u5728\u3001\u5DF2\u9000\u51FA\u6216\u5F53\u524D\u7528\u6237\u65E0\u6743\u67E5\u770B";function v(n){const t=new Map;for(const c of n.split(/\r?\n/)){const a=c.indexOf(":");a<=0||t.set(c.slice(0,a).trim(),c.slice(a+1).trim())}const e=B(t.get("VmSize")),s=B(t.get("VmRSS")),r={},i=t.get("Name"),o=t.get("State"),u=Number(t.get("PPid")),p=Number(t.get("Threads"));return i&&(r.name=i),o&&(r.status=o.split(/\s+/)[0]),Number.isFinite(u)&&(r.ppid=u),Number.isFinite(p)&&(r.threads=p),e!==null&&(r.virtualBytes=e*1024),s!==null&&(r.rssBytes=s*1024),r}function B(n){if(!n)return null;const t=n.match(/^(\d+)\s*kB$/);if(!t)return null;const e=Number(t[1]);return Number.isFinite(e)?e:null}function L(n){const t=Number(n.trim().split(/\s+/)[0]);return Number.isFinite(t)?t:null}function D(n){const t=n.lastIndexOf(")");if(t<0)return null;const e=n.slice(t+1).trim().split(/\s+/),s=Number(e[11]),r=Number(e[12]),i=Number(e[19]);return!Number.isFinite(s)||!Number.isFinite(r)||!Number.isFinite(i)?null:{userTicks:s,systemTicks:r,startTicks:i}}function w(n){const t=n.trim();if(!t||!/^\d/.test(t))return null;const[e,s]=t.includes("-")?t.split("-",2):[void 0,t],r=s.split(":").map(Number);if(r.some(o=>!Number.isFinite(o)))return null;let i=0;for(const o of r)i=i*60+o;if(e!==void 0){if(!/^\d+$/.test(e))return null;i+=Number(e)*86400}return i}function E(n){const[t,e]=n.trim().split("."),s=w(t);return s===null?null:s+(e&&+`0.${e}`||0)}function M(n){const t=n.trim().split(/\s+/);if(t.length<8)return null;const e=t.slice(7).join(" ");if(e.includes("(LISTEN)"))return null;const s=e.match(/\(([A-Z ]+)\)$/),r=e.replace(/\s*\([A-Z ]+\)$/,""),i=r.includes("->")?r.split("->")[1]:r;return i?{remote:i,state:s?s[1]:void 0}:null}function R(n,t){const e=[];for(const s of n.split(/\r?\n/).slice(1)){if(!s.trim()||!s.includes(`pid=${t}`))continue;const r=s.trim().split(/\s+/);if(r[0]==="LISTEN")continue;const i=r[4]||"";i&&e.push({remote:i})}return e}function U(n){const t=[];for(const e of n.split(/\r?\n/).slice(1)){const s=M(e);s&&t.push(s)}return t}function _(n){const t=n.trim();return t?JSON.parse(t):null}async function W(n){let t;try{t=await d(`/proc/${n}/status`,"utf8")}catch{return{ok:!0,pid:n,unsupported:f}}const e=v(t),[s,r,i]=await Promise.all([d(`/proc/${n}/stat`,"utf8").catch(()=>""),d(`/proc/${n}/cmdline`,"utf8").catch(()=>""),d("/proc/uptime","utf8").catch(()=>"")]),o=s?D(s):null,u=i?L(i):null,[p,c,a,$]=await Promise.all([T(`/proc/${n}/exe`).catch(()=>""),d(`/proc/${n}/io`,"utf8").catch(()=>""),l("ps",["-o","user=","-p",String(n)],{encoding:"utf8",timeout:m}).then(N=>N.stdout.trim()).catch(()=>""),l("ss",["-tupn"],{encoding:"utf8",timeout:m}).then(N=>N.stdout).catch(()=>"")]),h=c?j(c):null,P=A(r)||e.name,x=o&&u!==null?Math.max(0,Math.round(u-o.startTicks/S)):void 0;return{ok:!0,pid:n,name:e.name,command:P||void 0,exePath:p||void 0,user:a||void 0,ppid:e.ppid,status:e.status,threads:e.threads,elapsedSeconds:x,cpuUserSeconds:o?y(o.userTicks/S):void 0,cpuSystemSeconds:o?y(o.systemTicks/S):void 0,virtualBytes:e.virtualBytes,rssBytes:e.rssBytes,ioReadBytes:h?.readBytes,ioWriteBytes:h?.writeBytes,connections:$?b(R($,n)):void 0}}function A(n){const t=n.replace(/\0+$/,"");return t?t.split("\0").filter(Boolean).join(" "):""}function j(n){let t,e;for(const s of n.split(/\r?\n/)){const[r,i]=s.split(":");if(!r||i===void 0)continue;const o=Number(i.trim());Number.isFinite(o)&&(r.trim()==="read_bytes"?t=o:r.trim()==="write_bytes"&&(e=o))}return{readBytes:t??0,writeBytes:e??0}}function G(n){const t=n.trim().match(/^(\d+)\s+(\d+)\s+(\S+)\s+(\S+)\s+(\d+)\s+(\d+)\s+(\S+)\s+(\S+)\s+([\s\S]+)$/);if(!t)return null;const e=Number(t[2]),s=Number(t[5])*1024,r=Number(t[6])*1024,i=w(t[7]),o=E(t[8]),u={user:t[3],status:t[4],command:t[9].trim()};return Number.isFinite(e)&&(u.ppid=e),Number.isFinite(s)&&(u.rssBytes=s),Number.isFinite(r)&&(u.virtualBytes=r),i!==null&&(u.elapsedSeconds=i),o!==null&&(u.cpuTotalSeconds=y(o)),u}async function K(n){const{stdout:t}=await l("ps",["-ww","-p",String(n),"-o","pid=,ppid=,user=,state=,rss=,vsz=,etime=,cputime=,command="],{encoding:"utf8",timeout:m}),e=t.split(/\r?\n/).find(i=>i.trim()),s=e?G(e):null;if(!s)return{ok:!0,pid:n,unsupported:f};const r=await l("lsof",["-n","-P","-i","TCP","-a","-p",String(n),"+c0"],{encoding:"utf8",timeout:m}).then(i=>i.stdout).catch(()=>"");return{ok:!0,pid:n,user:s.user,ppid:s.ppid,status:s.status,command:s.command||void 0,elapsedSeconds:s.elapsedSeconds,cpuTotalSeconds:s.cpuTotalSeconds,virtualBytes:s.virtualBytes,rssBytes:s.rssBytes,connections:r?b(U(r)):void 0}}function z(n){return`
2
2
  $ErrorActionPreference = 'SilentlyContinue'
3
3
  $proc = Get-CimInstance Win32_Process -Filter 'ProcessId=${n}'
4
4
  if (-not $proc) { Write-Output 'null'; exit }
@@ -28,5 +28,5 @@ $row = [pscustomobject]@{
28
28
  connections = $conns
29
29
  }
30
30
  ConvertTo-Json -InputObject $row -Compress -Depth 3
31
- `.trim()}async function V(n){const{stdout:t}=await l("powershell",["-NoProfile","-NonInteractive","-Command",z(n)],{encoding:"utf8",timeout:m,windowsHide:!0}),e=_(t);return!e||!Number.isFinite(Number(e.pid))?{ok:!0,pid:n,unsupported:f}:{ok:!0,pid:n,name:e.name||void 0,command:e.command||void 0,exePath:e.exePath||void 0,user:e.user||void 0,ppid:Number.isFinite(Number(e.ppid))?Number(e.ppid):void 0,threads:Number.isFinite(Number(e.threads))?Number(e.threads):void 0,elapsedSeconds:Number.isFinite(Number(e.elapsedSeconds))?Number(e.elapsedSeconds):void 0,cpuUserSeconds:Number.isFinite(Number(e.cpuUserSeconds))?Number(e.cpuUserSeconds):void 0,cpuSystemSeconds:Number.isFinite(Number(e.cpuSystemSeconds))?Number(e.cpuSystemSeconds):void 0,virtualBytes:Number.isFinite(Number(e.virtualBytes))?Number(e.virtualBytes):void 0,rssBytes:Number.isFinite(Number(e.rssBytes))?Number(e.rssBytes):void 0,ioReadBytes:Number.isFinite(Number(e.ioReadBytes))?Number(e.ioReadBytes):void 0,ioWriteBytes:Number.isFinite(Number(e.ioWriteBytes))?Number(e.ioWriteBytes):void 0,connections:Array.isArray(e.connections)?b(e.connections.filter(s=>s&&s.remote).map(s=>({remote:String(s.remote),state:s.state?String(s.state):void 0}))):void 0}}function b(n){return n.slice(0,I)}function y(n){return Math.round(n*100)/100}async function Q(n){const t=F.platform();try{return t==="win32"?await V(n):t==="darwin"?await K(n):await W(n)}catch(e){return k.debug("Failed to collect process detail:",e),{ok:!0,pid:n,unsupported:f}}}export{Q as collectProcessDetail,G as parseDarwinPsDetailLine,_ as parseJsonObject,A as parseLinuxCmdline,j as parseLinuxIoBytes,D as parseLinuxStatTimes,M as parseLsofConnectionLine,U as parseLsofConnectionsForPid,v as parseProcStatus,L as parseProcUptime,E as parsePsCpuTimeSeconds,w as parsePsEtimeSeconds,R as parseSsConnectionsForPid};
31
+ `.trim()}async function V(n){const{stdout:t}=await l("powershell",["-NoProfile","-NonInteractive","-Command",z(n)],{encoding:"utf8",timeout:m,windowsHide:!0}),e=_(t);return!e||!Number.isFinite(Number(e.pid))?{ok:!0,pid:n,unsupported:f}:{ok:!0,pid:n,name:e.name||void 0,command:e.command||void 0,exePath:e.exePath||void 0,user:e.user||void 0,ppid:Number.isFinite(Number(e.ppid))?Number(e.ppid):void 0,threads:Number.isFinite(Number(e.threads))?Number(e.threads):void 0,elapsedSeconds:Number.isFinite(Number(e.elapsedSeconds))?Number(e.elapsedSeconds):void 0,cpuUserSeconds:Number.isFinite(Number(e.cpuUserSeconds))?Number(e.cpuUserSeconds):void 0,cpuSystemSeconds:Number.isFinite(Number(e.cpuSystemSeconds))?Number(e.cpuSystemSeconds):void 0,virtualBytes:Number.isFinite(Number(e.virtualBytes))?Number(e.virtualBytes):void 0,rssBytes:Number.isFinite(Number(e.rssBytes))?Number(e.rssBytes):void 0,ioReadBytes:Number.isFinite(Number(e.ioReadBytes))?Number(e.ioReadBytes):void 0,ioWriteBytes:Number.isFinite(Number(e.ioWriteBytes))?Number(e.ioWriteBytes):void 0,connections:Array.isArray(e.connections)?b(e.connections.filter(s=>s&&s.remote).map(s=>({remote:String(s.remote),state:s.state?String(s.state):void 0}))):void 0}}function b(n){return n.slice(0,I)}function y(n){return Math.round(n*100)/100}async function Q(n){const t=C.platform();try{return t==="win32"?await V(n):t==="darwin"?await K(n):await W(n)}catch(e){return k.debug("Failed to collect process detail:",e),{ok:!0,pid:n,unsupported:f}}}export{Q as collectProcessDetail,G as parseDarwinPsDetailLine,_ as parseJsonObject,A as parseLinuxCmdline,j as parseLinuxIoBytes,D as parseLinuxStatTimes,M as parseLsofConnectionLine,U as parseLsofConnectionsForPid,v as parseProcStatus,L as parseProcUptime,E as parsePsCpuTimeSeconds,w as parsePsEtimeSeconds,R as parseSsConnectionsForPid};
32
32
 
@@ -1,12 +1,12 @@
1
- import{execSync as L,exec as O}from"child_process";import{promisify as b}from"util";const h=b(O);import g from"os";import{createLogger as k}from"../utils/logger.js";const a=k("process-detector");function z(n,t=15e3){const r=Buffer.from(n,"utf16le").toString("base64");return L(`powershell -NoProfile -NonInteractive -EncodedCommand ${r}`,{encoding:"utf8",timeout:t,windowsHide:!0}).replace(/#\s*<\s*CLIXML[\s\S]*?(?=#<\s*CLIXML|$)/g,"").trim()}async function f(n,t=15e3){const r=Buffer.from(n,"utf16le").toString("base64"),{stdout:s}=await h(`powershell -NoProfile -NonInteractive -EncodedCommand ${r}`,{encoding:"utf8",timeout:t,windowsHide:!0,maxBuffer:10*1024*1024});return s.replace(/#\s*<\s*CLIXML[\s\S]*?(?=#<\s*CLIXML|$)/g,"").trim()}async function w(n){try{if(g.platform()==="win32"){const{stdout:t}=await h(`tasklist /FI "PID eq ${n}" /NH /FO CSV`,{encoding:"utf8",timeout:5e3,windowsHide:!0});return t.includes(String(n))}else return process.kill(n,0),!0}catch{return!1}}function X(n){try{return g.platform()==="win32"?L(`tasklist /FI "PID eq ${n}" /NH /FO CSV`,{encoding:"utf8",timeout:5e3,windowsHide:!0}).includes(String(n)):(process.kill(n,0),!0)}catch{return!1}}async function P(){const n=g.platform(),t=[];try{n==="win32"?t.push(...await A()):t.push(...await F())}catch(e){a.debug("Failed to list processes:",e)}return t}async function A(){const n=[];try{const e=await f(`Get-CimInstance Win32_Process -Filter "Name LIKE '%node%' OR Name LIKE '%claude%' OR Name LIKE '%opencode%' OR Name LIKE '%python%'" | Select-Object ProcessId, CommandLine | ConvertTo-Json -Compress`,1e4);if(!e||!e.trim())return n;let r;try{const s=JSON.parse(e);r=Array.isArray(s)?s:[s]}catch{return n}for(const s of r){if(!s.ProcessId||!s.CommandLine)continue;const i=s.CommandLine;if($(i)){const d=y(i);n.push({pid:s.ProcessId,command:i,agentId:d})}}}catch(t){a.debug("PowerShell process query failed, trying wmic fallback:",t),n.push(...await N())}return n}async function N(){const n=[];try{const{stdout:t}=await h(`wmic process where "name like '%node%' or name like '%claude%' or name like '%opencode%'" get processid,commandline /format:list`,{encoding:"utf8",timeout:5e3,windowsHide:!0}),e=t.split(`
2
- `);let r=null,s=null;for(const i of e){const d=i.trim();if(d.startsWith("CommandLine=")?s=d.substring(12):d.startsWith("ProcessId=")&&(r=d.substring(10)),r&&s){if($(s)){const c=y(s);n.push({pid:parseInt(r,10),command:s,agentId:c})}r=null,s=null}}}catch(t){a.debug("wmic process query failed:",t)}return n}async function F(){const n=[];try{const{stdout:t}=await h('ps aux | grep -E "claude|claude-code|opencode" | grep -v grep',{encoding:"utf8",timeout:5e3}),e=t.split(`
3
- `).filter(r=>r.trim());for(const r of e){const s=r.trim().split(/\s+/);if(s.length>=2){const i=parseInt(s[1],10),d=s.slice(10).join(" ");if($(d)){const c=y(d);n.push({pid:i,command:d,agentId:c})}}}}catch(t){a.debug("ps process query failed:",t)}return n}function $(n){if(!n)return!1;const t=n.toLowerCase();return!!(t.includes("claude")||t.includes("@anthropic-ai/claude-code")||t.includes("opencode")||t.includes("open-code")||t.includes("opencode.exe")||t.includes("opencode.cmd")||t.includes("aws-client-agent-mcp")||t.includes("aws-client-agent")||t.includes("acode")&&t.includes("sdk")||t.includes("cc-switch-sdk")||t.includes("cc-switch"))}function y(n){if(!n)return;const t=n.match(/AWS_AGENT_ID=(\S+)/);if(t)return C(t[1]);const e=n.match(/--agent-id[=\s]+(\S+)/);if(e)return C(e[1]);const r=n.match(/--id[=\s]+(\S+)/);if(r)return C(r[1])}function C(n){if(!n)return n;const t=n[0],e=n[n.length-1];return(t==='"'||t==="'")&&t===e?n.slice(1,-1):n}async function x(n){const e=(await P()).find(r=>r.agentId===n);if(e)return e;if(g.platform()==="win32"){const r=await T(n);if(r)return r;const s=await R(n);if(s)return s}}async function T(n){try{const t=`$targetId = '${n}'; $procs = Get-CimInstance Win32_Process | Where-Object { $_.CommandLine -and ($_.Name -like '*node*' -or $_.Name -like '*claude*' -or $_.Name -like '*opencode*') }; foreach ($proc in $procs) { if ($proc.CommandLine -like "*$targetId*") { @{ProcessId=$proc.ProcessId; CommandLine=$proc.CommandLine; AgentId=$targetId} | ConvertTo-Json -Compress } }`,e=await f(t,1e4);if(!e||!e.trim())return;const r=e.trim().split(`
4
- `).filter(s=>s.trim());for(const s of r)try{const i=JSON.parse(s.trim());if(i.ProcessId)return{pid:i.ProcessId,command:i.CommandLine||"",agentId:i.AgentId||n}}catch{}}catch(t){a.debug("PowerShell env var query failed:",t)}}async function R(n){try{const e=await f("Get-CimInstance Win32_Process | Select-Object ProcessId, ParentProcessId, Name, CommandLine | ConvertTo-Json -Compress",15e3);return!e||!e.trim()?void 0:await W(e.trim(),n)}catch(t){a.debug("[findOrphanByAncestorEnvSearch] Failed:",t)}}async function W(n,t){let e;try{const o=n.replace(/#\s*<\s*CLIXML[\s\S]*?(?=\{|\[|$)/g,"").trim(),u=B(o),l=JSON.parse(u);e=Array.isArray(l)?l:[l]}catch(o){a.debug(`[searchOrphanInProcessTree] JSON parse failed, raw length=${n.length}`,o);return}if(!e.length)return;const r=new Map;for(const o of e)o.processId&&r.set(o.processId,o);function s(o){const u=o.name.toLowerCase(),l=(o.commandLine||"").toLowerCase();return!!(u.includes("claude")||l.includes("claude")||l.includes("@anthropic-ai/claude-code")||l.includes("cli.js")||u.includes("opencode")||l.includes("opencode")||l.includes("serve")&&l.includes("--port"))}function i(o){const u=o.toLowerCase();return u==="powershell.exe"||u==="cmd.exe"||u==="pwsh.exe"||u==="bash.exe"}function d(o){let u=o;const l=10;for(let I=0;I<l;I++){const p=r.get(u);if(!p)break;if(i(p.name)){const m=r.get(p.parentProcessId);if(m&&m.name.toLowerCase()==="node.exe"){const S=(m.commandLine||"").toLowerCase();if(S.includes("runtime-bridge")||S.includes("agentswork"))return a.debug(`[searchOrphanInProcessTree] Found bridge ancestor chain: agent(${o}) -> shell(${p.processId}) -> node(${m.processId})`),{shellPid:p.processId,shellCmd:p.commandLine||""}}}if(u=p.parentProcessId,u<=0)break}return null}for(const o of e){if(!s(o))continue;const u=d(o.processId);if(u){if(u.shellCmd.toLowerCase().includes(t.toLowerCase()))return a.info(`[searchOrphanInProcessTree] Found orphan by tree search (agentId verified): agentId=${t}, pid=${o.processId}, name=${o.name}`),{pid:o.processId,command:o.commandLine||"",agentId:t};const p=e.filter(m=>s(m)&&d(m.processId));if(p.length===1)return a.info(`[searchOrphanInProcessTree] Found orphan by tree search (single candidate): agentId=${t}, pid=${o.processId}, name=${o.name}`),{pid:o.processId,command:o.commandLine||"",agentId:t};a.debug(`[searchOrphanInProcessTree] Multiple candidates found (${p.length}), cannot determine which belongs to agentId=${t}`)}}const c=e.filter(o=>s(o)&&!d(o.processId));for(const o of c)if(await _(o.processId,t))return a.info(`[searchOrphanInProcessTree] Found orphan by env verification: agentId=${t}, pid=${o.processId}, name=${o.name}`),{pid:o.processId,command:o.commandLine||"",agentId:t}}function B(n){const t=n.indexOf("["),e=n.indexOf("{");let r=-1;return t>=0&&e>=0?r=Math.min(t,e):t>=0?r=t:e>=0&&(r=e),r<0?n:n.substring(r)}async function _(n,t){try{const e=`
1
+ import{execSync as O,exec as k}from"child_process";import h from"os";import{promisify as M}from"util";const g=M(k);import{createLogger as b}from"../utils/logger.js";const a=b("process-detector");async function m(n,t=15e3){const r=Buffer.from(n,"utf16le").toString("base64"),{stdout:s}=await g(`powershell -NoProfile -NonInteractive -EncodedCommand ${r}`,{encoding:"utf8",timeout:t,windowsHide:!0,maxBuffer:10*1024*1024});return s.replace(/#\s*<\s*CLIXML[\s\S]*?(?=#<\s*CLIXML|$)/g,"").trim()}async function w(n){try{if(h.platform()==="win32"){const{stdout:t}=await g(`tasklist /FI "PID eq ${n}" /NH /FO CSV`,{encoding:"utf8",timeout:5e3,windowsHide:!0});return t.includes(String(n))}else return process.kill(n,0),!0}catch{return!1}}function z(n){try{return h.platform()==="win32"?O(`tasklist /FI "PID eq ${n}" /NH /FO CSV`,{encoding:"utf8",timeout:5e3,windowsHide:!0}).includes(String(n)):(process.kill(n,0),!0)}catch{return!1}}async function I(){const n=h.platform(),t=[];try{n==="win32"?t.push(...await A()):t.push(...await N())}catch(e){a.debug("Failed to list processes:",e)}return t}async function A(){const n=[];try{const e=await m(`Get-CimInstance Win32_Process -Filter "Name LIKE '%node%' OR Name LIKE '%claude%' OR Name LIKE '%opencode%' OR Name LIKE '%python%'" | Select-Object ProcessId, CommandLine | ConvertTo-Json -Compress`,1e4);if(!e||!e.trim())return n;let r;try{const s=JSON.parse(e);r=Array.isArray(s)?s:[s]}catch{return n}for(const s of r){if(!s.ProcessId||!s.CommandLine)continue;const i=s.CommandLine;if($(i)){const d=y(i);n.push({pid:s.ProcessId,command:i,agentId:d})}}}catch(t){a.debug("PowerShell process query failed, trying wmic fallback:",t),n.push(...await F())}return n}async function F(){const n=[];try{const{stdout:t}=await g(`wmic process where "name like '%node%' or name like '%claude%' or name like '%opencode%'" get processid,commandline /format:list`,{encoding:"utf8",timeout:5e3,windowsHide:!0}),e=t.split(`
2
+ `);let r=null,s=null;for(const i of e){const d=i.trim();if(d.startsWith("CommandLine=")?s=d.substring(12):d.startsWith("ProcessId=")&&(r=d.substring(10)),r&&s){if($(s)){const c=y(s);n.push({pid:parseInt(r,10),command:s,agentId:c})}r=null,s=null}}}catch(t){a.debug("wmic process query failed:",t)}return n}async function N(){const n=[];try{const{stdout:t}=await g('ps aux | grep -E "claude|claude-code|opencode" | grep -v grep',{encoding:"utf8",timeout:5e3}),e=t.split(`
3
+ `).filter(r=>r.trim());for(const r of e){const s=r.trim().split(/\s+/);if(s.length>=2){const i=parseInt(s[1],10),d=s.slice(10).join(" ");if($(d)){const c=y(d);n.push({pid:i,command:d,agentId:c})}}}}catch(t){a.debug("ps process query failed:",t)}return n}function $(n){if(!n)return!1;const t=n.toLowerCase();return!!(t.includes("claude")||t.includes("@anthropic-ai/claude-code")||t.includes("opencode")||t.includes("open-code")||t.includes("opencode.exe")||t.includes("opencode.cmd")||t.includes("aws-client-agent-mcp")||t.includes("aws-client-agent")||t.includes("acode")&&t.includes("sdk")||t.includes("cc-switch-sdk")||t.includes("cc-switch"))}function y(n){if(!n)return;const t=n.match(/AWS_AGENT_ID=(\S+)/);if(t)return C(t[1]);const e=n.match(/--agent-id[=\s]+(\S+)/);if(e)return C(e[1]);const r=n.match(/--id[=\s]+(\S+)/);if(r)return C(r[1])}function C(n){if(!n)return n;const t=n[0],e=n[n.length-1];return(t==='"'||t==="'")&&t===e?n.slice(1,-1):n}async function x(n){const e=(await I()).find(r=>r.agentId===n);if(e)return e;if(h.platform()==="win32"){const r=await T(n);if(r)return r;const s=await R(n);if(s)return s}}async function T(n){try{const t=`$targetId = '${n}'; $procs = Get-CimInstance Win32_Process | Where-Object { $_.CommandLine -and ($_.Name -like '*node*' -or $_.Name -like '*claude*' -or $_.Name -like '*opencode*') }; foreach ($proc in $procs) { if ($proc.CommandLine -like "*$targetId*") { @{ProcessId=$proc.ProcessId; CommandLine=$proc.CommandLine; AgentId=$targetId} | ConvertTo-Json -Compress } }`,e=await m(t,1e4);if(!e||!e.trim())return;const r=e.trim().split(`
4
+ `).filter(s=>s.trim());for(const s of r)try{const i=JSON.parse(s.trim());if(i.ProcessId)return{pid:i.ProcessId,command:i.CommandLine||"",agentId:i.AgentId||n}}catch{}}catch(t){a.debug("PowerShell env var query failed:",t)}}async function R(n){try{const e=await m("Get-CimInstance Win32_Process | Select-Object ProcessId, ParentProcessId, Name, CommandLine | ConvertTo-Json -Compress",15e3);return!e||!e.trim()?void 0:await W(e.trim(),n)}catch(t){a.debug("[findOrphanByAncestorEnvSearch] Failed:",t)}}async function W(n,t){let e;try{const o=n.replace(/#\s*<\s*CLIXML[\s\S]*?(?=\{|\[|$)/g,"").trim(),u=B(o),l=JSON.parse(u);e=Array.isArray(l)?l:[l]}catch(o){a.debug(`[searchOrphanInProcessTree] JSON parse failed, raw length=${n.length}`,o);return}if(!e.length)return;const r=new Map;for(const o of e)o.processId&&r.set(o.processId,o);function s(o){const u=o.name.toLowerCase(),l=(o.commandLine||"").toLowerCase();return!!(u.includes("claude")||l.includes("claude")||l.includes("@anthropic-ai/claude-code")||l.includes("cli.js")||u.includes("opencode")||l.includes("opencode")||l.includes("serve")&&l.includes("--port"))}function i(o){const u=o.toLowerCase();return u==="powershell.exe"||u==="cmd.exe"||u==="pwsh.exe"||u==="bash.exe"}function d(o){let u=o;const l=10;for(let P=0;P<l;P++){const p=r.get(u);if(!p)break;if(i(p.name)){const f=r.get(p.parentProcessId);if(f&&f.name.toLowerCase()==="node.exe"){const S=(f.commandLine||"").toLowerCase();if(S.includes("runtime-bridge")||S.includes("agentswork"))return a.debug(`[searchOrphanInProcessTree] Found bridge ancestor chain: agent(${o}) -> shell(${p.processId}) -> node(${f.processId})`),{shellPid:p.processId,shellCmd:p.commandLine||""}}}if(u=p.parentProcessId,u<=0)break}return null}for(const o of e){if(!s(o))continue;const u=d(o.processId);if(u){if(u.shellCmd.toLowerCase().includes(t.toLowerCase()))return a.info(`[searchOrphanInProcessTree] Found orphan by tree search (agentId verified): agentId=${t}, pid=${o.processId}, name=${o.name}`),{pid:o.processId,command:o.commandLine||"",agentId:t};const p=e.filter(f=>s(f)&&d(f.processId));if(p.length===1)return a.info(`[searchOrphanInProcessTree] Found orphan by tree search (single candidate): agentId=${t}, pid=${o.processId}, name=${o.name}`),{pid:o.processId,command:o.commandLine||"",agentId:t};a.debug(`[searchOrphanInProcessTree] Multiple candidates found (${p.length}), cannot determine which belongs to agentId=${t}`)}}const c=e.filter(o=>s(o)&&!d(o.processId));for(const o of c)if(await _(o.processId,t))return a.info(`[searchOrphanInProcessTree] Found orphan by env verification: agentId=${t}, pid=${o.processId}, name=${o.name}`),{pid:o.processId,command:o.commandLine||"",agentId:t}}function B(n){const t=n.indexOf("["),e=n.indexOf("{");let r=-1;return t>=0&&e>=0?r=Math.min(t,e):t>=0?r=t:e>=0&&(r=e),r<0?n:n.substring(r)}async function _(n,t){try{const e=`
5
5
  try {
6
6
  $proc = Get-CimInstance Win32_Process -Filter "ProcessId = ${n}" -ErrorAction SilentlyContinue
7
7
  if ($proc -and $proc.CommandLine -like '*${t}*') { 'MATCH' } else { 'NOMATCH' }
8
8
  } catch { 'ERROR' }
9
- `;if((await f(e,5e3)).trim()==="MATCH")return!0;const s=`
9
+ `;if((await m(e,5e3)).trim()==="MATCH")return!0;const s=`
10
10
  try {
11
11
  $proc = Get-CimInstance Win32_Process -Filter "ProcessId = ${n}" -ErrorAction SilentlyContinue
12
12
  if ($proc) {
@@ -15,7 +15,7 @@ import{execSync as L,exec as O}from"child_process";import{promisify as b}from"ut
15
15
  if ($parent -and $parent.CommandLine -like '*${t}*') { 'MATCH' } else { 'NOMATCH' }
16
16
  } else { 'NOPROC' }
17
17
  } catch { 'ERROR' }
18
- `;if((await f(s,5e3)).trim()==="MATCH")return!0;const d=`
18
+ `;if((await m(s,5e3)).trim()==="MATCH")return!0;const d=`
19
19
  try {
20
20
  $proc = Get-CimInstance Win32_Process -Filter "ProcessId = ${n}" -ErrorAction SilentlyContinue
21
21
  if ($proc) {
@@ -28,7 +28,7 @@ import{execSync as L,exec as O}from"child_process";import{promisify as b}from"ut
28
28
  } else { 'NOPARENT' }
29
29
  } else { 'NOPROC' }
30
30
  } catch { 'ERROR' }
31
- `;return(await f(d,5e3)).trim()==="MATCH"}catch(e){return a.debug(`[verifyProcessAgentId] Failed for pid=${n}, agentId=${t}:`,e),!1}}async function K(n){if(n)try{const t=await P(),e=n.replace(/\\/g,"/").toLowerCase();for(const r of t)if(r.command.replace(/\\/g,"/").toLowerCase().includes(e))return a.info(`[findOrphanProcessByWorkspace] Found process by workspace: pid=${r.pid}, workspace=${n}`),r;if(g.platform()==="win32"){const s=`
31
+ `;return(await m(d,5e3)).trim()==="MATCH"}catch(e){return a.debug(`[verifyProcessAgentId] Failed for pid=${n}, agentId=${t}:`,e),!1}}async function K(n){if(n)try{const t=await I(),e=n.replace(/\\/g,"/").toLowerCase();for(const r of t)if(r.command.replace(/\\/g,"/").toLowerCase().includes(e))return a.info(`[findOrphanProcessByWorkspace] Found process by workspace: pid=${r.pid}, workspace=${n}`),r;if(h.platform()==="win32"){const s=`
32
32
  $targetPath = '${n.replace(/'/g,"''")}'.ToLower().Replace('\\', '/')
33
33
  $procs = Get-CimInstance Win32_Process | Where-Object {
34
34
  $_.CommandLine -and ($_.Name -like '*node*' -or $_.Name -like '*claude*' -or $_.Name -like '*opencode*')
@@ -39,7 +39,7 @@ import{execSync as L,exec as O}from"child_process";import{promisify as b}from"ut
39
39
  @{ProcessId=$proc.ProcessId; CommandLine=$proc.CommandLine} | ConvertTo-Json -Compress
40
40
  }
41
41
  }
42
- `,i=await f(s,1e4);if(i&&i.trim()){const d=i.trim().split(`
43
- `).filter(c=>c.trim());for(const c of d)try{const o=JSON.parse(c.trim());if(o.ProcessId)return a.info(`[findOrphanProcessByWorkspace] Found process by PowerShell workspace search: pid=${o.ProcessId}`),{pid:o.ProcessId,command:o.CommandLine||""}}catch{}}}}catch(t){a.debug("[findOrphanProcessByWorkspace] Failed:",t)}}function v(n){try{return process.kill(n,"SIGTERM"),!0}catch(t){return a.warn(`Failed to terminate process ${n}:`,t),!1}}async function E(n){const t={terminated:0,failed:0};if(g.platform()==="win32")try{await h(`taskkill /PID ${n} /T /F`,{encoding:"utf8",timeout:5e3,windowsHide:!0}),t.terminated++,a.info(`Terminated process tree for pid=${n}`)}catch(e){const r=e;a.warn(`Failed to terminate process tree for pid=${n}:`,r.message),t.failed++}else{const e=await M(n);a.debug(`Found ${e.length} child processes for pid=${n}`);for(const r of e){const s=await E(r);t.terminated+=s.terminated,t.failed+=s.failed}v(n)?t.terminated++:t.failed++}return t}async function M(n){try{const{stdout:t}=await h(`pgrep -P ${n}`,{encoding:"utf8",timeout:3e3}),e=t.trim().split(`
44
- `).filter(Boolean).map(Number),r=[];for(const s of e)r.push(s),r.push(...await M(s));return r}catch{return[]}}async function U(n,t=5e3){const e=Date.now();for(;Date.now()-e<t;){if(!await w(n))return!0;const r=Math.min(100,t-(Date.now()-e));r>0&&await new Promise(s=>setTimeout(s,r))}return!1}async function V(n){const t=[];for(const e of n)if(e.pid&&await w(e.pid)){const s=(await P()).find(i=>i.pid===e.pid);s?(t.push({agentId:e.agentId,process:s,sessionInfo:{workspacePath:e.workspacePath,command:e.command}}),a.info(`Found orphan process by PID: agentId=${e.agentId}, pid=${e.pid}`)):(t.push({agentId:e.agentId,process:{pid:e.pid,command:e.command||"(unknown - persisted session)",agentId:e.agentId},sessionInfo:{workspacePath:e.workspacePath,command:e.command}}),a.info(`Found orphan process by PID (no cmd match): agentId=${e.agentId}, pid=${e.pid}`))}for(const e of n)if(!e.pid&&e.agentId){const r=await x(e.agentId);r&&!t.some(s=>s.agentId===e.agentId)&&(t.push({agentId:e.agentId,process:r,sessionInfo:{workspacePath:e.workspacePath,command:e.command}}),a.info(`Found orphan process by agentId: agentId=${e.agentId}, pid=${r.pid}`))}return t}async function H(n,t){const e={pid:n,agentId:t,alive:!1,cpu:0,memoryMB:0,status:"dead",lastUpdate:new Date};try{if(!await w(n))return e.status="dead",a.debug(`Process ${n} is not running`),e;e.alive=!0;const{cpu:r,memoryMB:s}=await D(n);return e.cpu=r,e.memoryMB=s,s>2048?e.status="high_memory":r>100?e.status="high_cpu":e.status="healthy",a.debug(`Process ${n} health: CPU=${r}%, Memory=${s}MB, Status=${e.status}`),e}catch(r){return a.warn(`Failed to check health for process ${n}:`,r),e.status="dead",e}}async function D(n){if(g.platform()==="win32"){const e=`Get-CimInstance Win32_Process -Filter "ProcessId=${n}" | Select-Object @{Name='CPU';Expression={$_.WorkingSetSize/1MB}}, @{Name='Mem';Expression={$_.WorkingSetSize/1MB}} | ConvertTo-Json -Compress`;try{const r=await f(e,5e3);if(!r||!r.trim())return{cpu:0,memoryMB:0};const s=JSON.parse(r);return{cpu:0,memoryMB:Math.round((s.WorkingSetSize||0)/1024/1024)}}catch{return{cpu:0,memoryMB:0}}}else try{const{stdout:e}=await h(`ps -p ${n} -o %cpu=,rss=`,{encoding:"utf8",timeout:5e3}),r=e.trim().split(/\s+/);if(r.length>=2)return{cpu:parseFloat(r[0])||0,memoryMB:Math.round(parseInt(r[1],10)/1024)}}catch{return{cpu:0,memoryMB:0}}return{cpu:0,memoryMB:0}}async function Q(n){const t=new Map,e=n.filter(r=>r.pid).map(async r=>{const s=await H(r.pid,r.agentId);t.set(r.agentId,s)});return await Promise.all(e),t}async function Y(n=new Set,t=new Set){const e=[],r=await P();for(const s of r){const i=n.has(s.pid),d=s.agentId?t.has(s.agentId):!1;e.push({...s,isRunning:!0,managementStatus:i||d?"managed":"orphan",sessionId:void 0,lastSeen:new Date().toISOString()})}return e}async function Z(n){const t=new Set(n.map(c=>c.pid)),e=new Set(n.map(c=>c.agentId)),r=new Map(n.map(c=>[c.pid,c])),s=[],i=new Set,d=await P();for(const c of d){i.add(c.pid);const o=t.has(c.pid),u=c.agentId?e.has(c.agentId):!1,l=r.get(c.pid),I=c.agentId||l?.agentId;s.push({...c,agentId:I,isRunning:!0,managementStatus:o||u?"managed":"orphan",sessionId:void 0,lastSeen:new Date().toISOString()})}for(const c of n)!i.has(c.pid)&&!await w(c.pid)&&s.push({pid:c.pid,command:"(process exited)",agentId:c.agentId,isRunning:!1,managementStatus:"unknown",lastSeen:void 0});return s}export{Q as checkAllSessionsHealth,H as checkProcessHealth,V as detectOrphanProcesses,Y as discoverAllProcesses,Z as discoverAllProcessesFull,P as findClaudeCodeProcesses,x as findOrphanProcessByAgentId,K as findOrphanProcessByWorkspace,X as isProcessRunning,w as isProcessRunningAsync,v as terminateProcess,E as terminateProcessTree,U as waitForProcessExit};
42
+ `,i=await m(s,1e4);if(i&&i.trim()){const d=i.trim().split(`
43
+ `).filter(c=>c.trim());for(const c of d)try{const o=JSON.parse(c.trim());if(o.ProcessId)return a.info(`[findOrphanProcessByWorkspace] Found process by PowerShell workspace search: pid=${o.ProcessId}`),{pid:o.ProcessId,command:o.CommandLine||""}}catch{}}}}catch(t){a.debug("[findOrphanProcessByWorkspace] Failed:",t)}}function v(n){try{return process.kill(n,"SIGTERM"),!0}catch(t){return a.warn(`Failed to terminate process ${n}:`,t),!1}}async function E(n){const t={terminated:0,failed:0};if(h.platform()==="win32")try{await g(`taskkill /PID ${n} /T /F`,{encoding:"utf8",timeout:5e3,windowsHide:!0}),t.terminated++,a.info(`Terminated process tree for pid=${n}`)}catch(e){const r=e;a.warn(`Failed to terminate process tree for pid=${n}:`,r.message),t.failed++}else{const e=await L(n);a.debug(`Found ${e.length} child processes for pid=${n}`);for(const r of e){const s=await E(r);t.terminated+=s.terminated,t.failed+=s.failed}v(n)?t.terminated++:t.failed++}return t}async function L(n){try{const{stdout:t}=await g(`pgrep -P ${n}`,{encoding:"utf8",timeout:3e3}),e=t.trim().split(`
44
+ `).filter(Boolean).map(Number),r=[];for(const s of e)r.push(s),r.push(...await L(s));return r}catch{return[]}}async function U(n,t=5e3){const e=Date.now();for(;Date.now()-e<t;){if(!await w(n))return!0;const r=Math.min(100,t-(Date.now()-e));r>0&&await new Promise(s=>setTimeout(s,r))}return!1}async function V(n){const t=[];for(const e of n)if(e.pid&&await w(e.pid)){const s=(await I()).find(i=>i.pid===e.pid);s?(t.push({agentId:e.agentId,process:s,sessionInfo:{workspacePath:e.workspacePath,command:e.command}}),a.info(`Found orphan process by PID: agentId=${e.agentId}, pid=${e.pid}`)):(t.push({agentId:e.agentId,process:{pid:e.pid,command:e.command||"(unknown - persisted session)",agentId:e.agentId},sessionInfo:{workspacePath:e.workspacePath,command:e.command}}),a.info(`Found orphan process by PID (no cmd match): agentId=${e.agentId}, pid=${e.pid}`))}for(const e of n)if(!e.pid&&e.agentId){const r=await x(e.agentId);r&&!t.some(s=>s.agentId===e.agentId)&&(t.push({agentId:e.agentId,process:r,sessionInfo:{workspacePath:e.workspacePath,command:e.command}}),a.info(`Found orphan process by agentId: agentId=${e.agentId}, pid=${r.pid}`))}return t}async function H(n,t){const e={pid:n,agentId:t,alive:!1,cpu:0,memoryMB:0,status:"dead",lastUpdate:new Date};try{if(!await w(n))return e.status="dead",a.debug(`Process ${n} is not running`),e;e.alive=!0;const{cpu:r,memoryMB:s}=await D(n);return e.cpu=r,e.memoryMB=s,s>2048?e.status="high_memory":r>100?e.status="high_cpu":e.status="healthy",a.debug(`Process ${n} health: CPU=${r}%, Memory=${s}MB, Status=${e.status}`),e}catch(r){return a.warn(`Failed to check health for process ${n}:`,r),e.status="dead",e}}async function D(n){if(h.platform()==="win32"){const e=`Get-CimInstance Win32_Process -Filter "ProcessId=${n}" | Select-Object @{Name='CPU';Expression={$_.WorkingSetSize/1MB}}, @{Name='Mem';Expression={$_.WorkingSetSize/1MB}} | ConvertTo-Json -Compress`;try{const r=await m(e,5e3);if(!r||!r.trim())return{cpu:0,memoryMB:0};const s=JSON.parse(r);return{cpu:0,memoryMB:Math.round((s.WorkingSetSize||0)/1024/1024)}}catch{return{cpu:0,memoryMB:0}}}else try{const{stdout:e}=await g(`ps -p ${n} -o %cpu=,rss=`,{encoding:"utf8",timeout:5e3}),r=e.trim().split(/\s+/);if(r.length>=2)return{cpu:parseFloat(r[0])||0,memoryMB:Math.round(parseInt(r[1],10)/1024)}}catch{return{cpu:0,memoryMB:0}}return{cpu:0,memoryMB:0}}async function X(n){const t=new Map,e=n.filter(r=>r.pid).map(async r=>{const s=await H(r.pid,r.agentId);t.set(r.agentId,s)});return await Promise.all(e),t}async function Q(n=new Set,t=new Set){const e=[],r=await I();for(const s of r){const i=n.has(s.pid),d=s.agentId?t.has(s.agentId):!1;e.push({...s,isRunning:!0,managementStatus:i||d?"managed":"orphan",sessionId:void 0,lastSeen:new Date().toISOString()})}return e}async function Y(n){const t=new Set(n.map(c=>c.pid)),e=new Set(n.map(c=>c.agentId)),r=new Map(n.map(c=>[c.pid,c])),s=[],i=new Set,d=await I();for(const c of d){i.add(c.pid);const o=t.has(c.pid),u=c.agentId?e.has(c.agentId):!1,l=r.get(c.pid),P=c.agentId||l?.agentId;s.push({...c,agentId:P,isRunning:!0,managementStatus:o||u?"managed":"orphan",sessionId:void 0,lastSeen:new Date().toISOString()})}for(const c of n)!i.has(c.pid)&&!await w(c.pid)&&s.push({pid:c.pid,command:"(process exited)",agentId:c.agentId,isRunning:!1,managementStatus:"unknown",lastSeen:void 0});return s}export{X as checkAllSessionsHealth,H as checkProcessHealth,V as detectOrphanProcesses,Q as discoverAllProcesses,Y as discoverAllProcessesFull,I as findClaudeCodeProcesses,x as findOrphanProcessByAgentId,K as findOrphanProcessByWorkspace,z as isProcessRunning,w as isProcessRunningAsync,v as terminateProcess,E as terminateProcessTree,U as waitForProcessExit};
45
45
 
@@ -1,2 +1,2 @@
1
- import c from"node:os";import u from"node:path";import{promises as h}from"node:fs";import{createLogger as g}from"../utils/logger.js";import{atomicWriteJsonFile as d,withFileLock as o}from"../utils/file-utils.js";const r=g("process-registry");function n(){return u.join(c.tmpdir(),"agentswork-runtime-bridge","process-registry.json")}class i{constructor(){this.records=new Map,this.pidToAgentId=new Map}static getInstance(){return i.instance===null&&(i.instance=new i),i.instance}async persist(){const t=n();try{const e=Array.from(this.records.values());await d(t,e),r.debug(`[persist] \u5DF2\u6301\u4E45\u5316 ${e.length} \u6761\u8FDB\u7A0B\u8BB0\u5F55`)}catch(e){r.error("[persist] \u6301\u4E45\u5316\u5931\u8D25:",e)}}async mutate(t){return o(n(),async()=>t())}async register(t){await this.mutate(async()=>{const e={...t,createdAt:new Date().toISOString()},s=this.records.get(t.agentId);s&&this.pidToAgentId.delete(s.pid),this.records.set(t.agentId,e),this.pidToAgentId.set(t.pid,t.agentId),r.info(`[register] \u6CE8\u518C\u8FDB\u7A0B: agentId=${t.agentId}, pid=${t.pid}, mode=${t.mode}, state=${t.state}`),await this.persist()})}async update(t,e){return this.mutate(async()=>{const s=this.records.get(t);return s?(e.pid!==void 0&&e.pid!==s.pid&&(this.pidToAgentId.delete(s.pid),this.pidToAgentId.set(e.pid,t)),Object.assign(s,e),r.debug(`[update] \u66F4\u65B0\u8FDB\u7A0B: agentId=${t}, updates=${JSON.stringify(e)}`),await this.persist(),!0):(r.warn(`[update] \u672A\u627E\u5230\u8FDB\u7A0B: agentId=${t}`),!1)})}get(t){return this.records.get(t)}getByPid(t){const e=this.pidToAgentId.get(t);if(e)return this.records.get(e)}getAll(){return Array.from(this.records.values())}getByState(t){return this.getAll().filter(e=>e.state===t)}isManaged(t){return this.records.has(t)}isManagedByPid(t){return this.pidToAgentId.has(t)}async markOrphaned(t){return this.mutate(async()=>{const e=this.records.get(t);return e?(e.state="orphaned",e.orphanedAt=new Date().toISOString(),r.info(`[markOrphaned] \u6807\u8BB0\u8FDB\u7A0B\u4E3A\u5B64\u513F: agentId=${t}, orphanedAt=${e.orphanedAt}`),await this.persist(),!0):(r.warn(`[markOrphaned] \u672A\u627E\u5230\u8FDB\u7A0B: agentId=${t}`),!1)})}async markTerminated(t){return this.mutate(async()=>{const e=this.records.get(t);return e?(e.state="terminated",r.info(`[markTerminated] \u6807\u8BB0\u8FDB\u7A0B\u4E3A\u7EC8\u6B62: agentId=${t}`),await this.persist(),!0):(r.warn(`[markTerminated] \u672A\u627E\u5230\u8FDB\u7A0B: agentId=${t}`),!1)})}async remove(t){return this.mutate(async()=>{const e=this.records.get(t);return e?(this.records.delete(t),this.pidToAgentId.delete(e.pid),r.info(`[remove] \u79FB\u9664\u8FDB\u7A0B: agentId=${t}, pid=${e.pid}`),await this.persist(),!0):(r.warn(`[remove] \u672A\u627E\u5230\u8FDB\u7A0B: agentId=${t}`),!1)})}async updateHeartbeat(t){return this.mutate(async()=>{const e=this.records.get(t);return e?(e.lastHeartbeat=new Date().toISOString(),r.debug(`[updateHeartbeat] \u66F4\u65B0\u5FC3\u8DF3: agentId=${t}, lastHeartbeat=${e.lastHeartbeat}`),await this.persist(),!0):(r.warn(`[updateHeartbeat] \u672A\u627E\u5230\u8FDB\u7A0B: agentId=${t}`),!1)})}async updateHealth(t,e){return this.mutate(async()=>{const s=this.records.get(t);return s?(s.healthStatus=e,r.debug(`[updateHealth] \u66F4\u65B0\u5065\u5EB7\u72B6\u6001: agentId=${t}, health=${JSON.stringify(e)}`),await this.persist(),!0):(r.warn(`[updateHealth] \u672A\u627E\u5230\u8FDB\u7A0B: agentId=${t}`),!1)})}async rebuildFromPersisted(t){await this.mutate(async()=>{r.info(`[rebuildFromPersisted] \u4ECE ${t.length} \u4E2A\u6301\u4E45\u5316\u4F1A\u8BDD\u91CD\u5EFA\u6CE8\u518C\u8868`),this.records.clear(),this.pidToAgentId.clear();for(const e of t){if(!e.pid){r.warn(`[rebuildFromPersisted] \u8DF3\u8FC7\u65E0 PID \u7684\u4F1A\u8BDD: agentId=${e.agentId}`);continue}const s={agentId:e.agentId,sessionId:e.sessionId,pid:e.pid,mode:"sdk",state:"unknown",workspacePath:e.workspacePath||"",command:e.command||"",createdAt:new Date().toISOString()};this.records.set(s.agentId,s),this.pidToAgentId.set(s.pid,s.agentId),r.debug(`[rebuildFromPersisted] \u91CD\u5EFA\u8FDB\u7A0B\u8BB0\u5F55: agentId=${s.agentId}, pid=${s.pid}`)}r.info(`[rebuildFromPersisted] \u91CD\u5EFA\u5B8C\u6210\uFF0C\u5171 ${this.records.size} \u6761\u8BB0\u5F55`),await this.persist()})}exportState(){return this.getAll()}getStats(){const t={creating:0,running:0,stopping:0,orphaned:0,terminated:0,unknown:0,total:this.records.size};for(const e of this.records.values())t[e.state]++;return t}async clear(){await this.mutate(async()=>{const t=this.records.size;this.records.clear(),this.pidToAgentId.clear(),r.info(`[clear] \u6E05\u7A7A\u6240\u6709\u8FDB\u7A0B\u8BB0\u5F55: ${t} \u6761`),await this.persist()})}}i.instance=null;function w(){return i.getInstance()}async function I(){const a=n();try{const t=await h.readFile(a,"utf-8"),e=JSON.parse(t);return r.debug(`[loadPersistedProcessRegistry] \u52A0\u8F7D\u4E86 ${e.length} \u6761\u8FDB\u7A0B\u8BB0\u5F55`),e}catch{return[]}}async function $(a){const t=n();await o(t,async()=>{await d(t,a),r.debug(`[savePersistedProcessRegistry] \u4FDD\u5B58\u4E86 ${a.length} \u6761\u8FDB\u7A0B\u8BB0\u5F55`)})}export{i as ProcessRegistry,w as getProcessRegistry,n as getProcessRegistryFile,I as loadPersistedProcessRegistry,$ as savePersistedProcessRegistry};
1
+ import{promises as c}from"node:fs";import u from"node:os";import h from"node:path";import{atomicWriteJsonFile as d,withFileLock as o}from"../utils/file-utils.js";import{createLogger as g}from"../utils/logger.js";const r=g("process-registry");function n(){return h.join(u.tmpdir(),"agentswork-runtime-bridge","process-registry.json")}class i{constructor(){this.records=new Map,this.pidToAgentId=new Map}static getInstance(){return i.instance===null&&(i.instance=new i),i.instance}async persist(){const t=n();try{const e=Array.from(this.records.values());await d(t,e),r.debug(`[persist] \u5DF2\u6301\u4E45\u5316 ${e.length} \u6761\u8FDB\u7A0B\u8BB0\u5F55`)}catch(e){r.error("[persist] \u6301\u4E45\u5316\u5931\u8D25:",e)}}async mutate(t){return o(n(),async()=>t())}async register(t){await this.mutate(async()=>{const e={...t,createdAt:new Date().toISOString()},s=this.records.get(t.agentId);s&&this.pidToAgentId.delete(s.pid),this.records.set(t.agentId,e),this.pidToAgentId.set(t.pid,t.agentId),r.info(`[register] \u6CE8\u518C\u8FDB\u7A0B: agentId=${t.agentId}, pid=${t.pid}, mode=${t.mode}, state=${t.state}`),await this.persist()})}async update(t,e){return this.mutate(async()=>{const s=this.records.get(t);return s?(e.pid!==void 0&&e.pid!==s.pid&&(this.pidToAgentId.delete(s.pid),this.pidToAgentId.set(e.pid,t)),Object.assign(s,e),r.debug(`[update] \u66F4\u65B0\u8FDB\u7A0B: agentId=${t}, updates=${JSON.stringify(e)}`),await this.persist(),!0):(r.warn(`[update] \u672A\u627E\u5230\u8FDB\u7A0B: agentId=${t}`),!1)})}get(t){return this.records.get(t)}getByPid(t){const e=this.pidToAgentId.get(t);if(e)return this.records.get(e)}getAll(){return Array.from(this.records.values())}getByState(t){return this.getAll().filter(e=>e.state===t)}isManaged(t){return this.records.has(t)}isManagedByPid(t){return this.pidToAgentId.has(t)}async markOrphaned(t){return this.mutate(async()=>{const e=this.records.get(t);return e?(e.state="orphaned",e.orphanedAt=new Date().toISOString(),r.info(`[markOrphaned] \u6807\u8BB0\u8FDB\u7A0B\u4E3A\u5B64\u513F: agentId=${t}, orphanedAt=${e.orphanedAt}`),await this.persist(),!0):(r.warn(`[markOrphaned] \u672A\u627E\u5230\u8FDB\u7A0B: agentId=${t}`),!1)})}async markTerminated(t){return this.mutate(async()=>{const e=this.records.get(t);return e?(e.state="terminated",r.info(`[markTerminated] \u6807\u8BB0\u8FDB\u7A0B\u4E3A\u7EC8\u6B62: agentId=${t}`),await this.persist(),!0):(r.warn(`[markTerminated] \u672A\u627E\u5230\u8FDB\u7A0B: agentId=${t}`),!1)})}async remove(t){return this.mutate(async()=>{const e=this.records.get(t);return e?(this.records.delete(t),this.pidToAgentId.delete(e.pid),r.info(`[remove] \u79FB\u9664\u8FDB\u7A0B: agentId=${t}, pid=${e.pid}`),await this.persist(),!0):(r.warn(`[remove] \u672A\u627E\u5230\u8FDB\u7A0B: agentId=${t}`),!1)})}async updateHeartbeat(t){return this.mutate(async()=>{const e=this.records.get(t);return e?(e.lastHeartbeat=new Date().toISOString(),r.debug(`[updateHeartbeat] \u66F4\u65B0\u5FC3\u8DF3: agentId=${t}, lastHeartbeat=${e.lastHeartbeat}`),await this.persist(),!0):(r.warn(`[updateHeartbeat] \u672A\u627E\u5230\u8FDB\u7A0B: agentId=${t}`),!1)})}async updateHealth(t,e){return this.mutate(async()=>{const s=this.records.get(t);return s?(s.healthStatus=e,r.debug(`[updateHealth] \u66F4\u65B0\u5065\u5EB7\u72B6\u6001: agentId=${t}, health=${JSON.stringify(e)}`),await this.persist(),!0):(r.warn(`[updateHealth] \u672A\u627E\u5230\u8FDB\u7A0B: agentId=${t}`),!1)})}async rebuildFromPersisted(t){await this.mutate(async()=>{r.info(`[rebuildFromPersisted] \u4ECE ${t.length} \u4E2A\u6301\u4E45\u5316\u4F1A\u8BDD\u91CD\u5EFA\u6CE8\u518C\u8868`),this.records.clear(),this.pidToAgentId.clear();for(const e of t){if(!e.pid){r.warn(`[rebuildFromPersisted] \u8DF3\u8FC7\u65E0 PID \u7684\u4F1A\u8BDD: agentId=${e.agentId}`);continue}const s={agentId:e.agentId,sessionId:e.sessionId,pid:e.pid,mode:"sdk",state:"unknown",workspacePath:e.workspacePath||"",command:e.command||"",createdAt:new Date().toISOString()};this.records.set(s.agentId,s),this.pidToAgentId.set(s.pid,s.agentId),r.debug(`[rebuildFromPersisted] \u91CD\u5EFA\u8FDB\u7A0B\u8BB0\u5F55: agentId=${s.agentId}, pid=${s.pid}`)}r.info(`[rebuildFromPersisted] \u91CD\u5EFA\u5B8C\u6210\uFF0C\u5171 ${this.records.size} \u6761\u8BB0\u5F55`),await this.persist()})}exportState(){return this.getAll()}getStats(){const t={creating:0,running:0,stopping:0,orphaned:0,terminated:0,unknown:0,total:this.records.size};for(const e of this.records.values())t[e.state]++;return t}async clear(){await this.mutate(async()=>{const t=this.records.size;this.records.clear(),this.pidToAgentId.clear(),r.info(`[clear] \u6E05\u7A7A\u6240\u6709\u8FDB\u7A0B\u8BB0\u5F55: ${t} \u6761`),await this.persist()})}}i.instance=null;function w(){return i.getInstance()}async function I(){const a=n();try{const t=await c.readFile(a,"utf-8"),e=JSON.parse(t);return r.debug(`[loadPersistedProcessRegistry] \u52A0\u8F7D\u4E86 ${e.length} \u6761\u8FDB\u7A0B\u8BB0\u5F55`),e}catch{return[]}}async function $(a){const t=n();await o(t,async()=>{await d(t,a),r.debug(`[savePersistedProcessRegistry] \u4FDD\u5B58\u4E86 ${a.length} \u6761\u8FDB\u7A0B\u8BB0\u5F55`)})}export{i as ProcessRegistry,w as getProcessRegistry,n as getProcessRegistryFile,I as loadPersistedProcessRegistry,$ as savePersistedProcessRegistry};
2
2
 
@@ -1,4 +1,4 @@
1
- import{execFile as h}from"node:child_process";import{readdir as T,readFile as w}from"node:fs/promises";import{promisify as M}from"node:util";import I from"node:os";const l=M(h);import{createLogger as g}from"../utils/logger.js";const x=g("process-top"),E=["cpu","memory","storage","network"],a=400,O=100,P=10,_=50,m=9e3,B="\u5F53\u524D\u7CFB\u7EDF\u65E0\u6CD5\u6309\u8FDB\u7A0B\u7EDF\u8BA1\u7F51\u7EDC\u8FDE\u63A5",L="macOS \u6682\u4E0D\u652F\u6301\u6309\u8FDB\u7A0B\u7EDF\u8BA1\u78C1\u76D8 IO";function ce(t){const e=String(t??"").trim();return E.includes(e)?e:null}function ae(t){const e=Math.floor(Number(t??P));return Number.isFinite(e)?Math.min(_,Math.max(1,e)):P}function R(t,e){return[...t].sort((n,s)=>s.value-n.value).slice(0,e)}function A(t){const e=t.replace(/\\/g,"/"),n=e.split("/").filter(Boolean);return n[n.length-1]||e}function b(t){const e=t.indexOf("("),n=t.lastIndexOf(")");if(e<0||n<=e)return null;const s=t.slice(e+1,n),o=t.slice(n+1).trim().split(/\s+/),r=Number(o[11]),i=Number(o[12]);return!Number.isFinite(r)||!Number.isFinite(i)?null:{name:s,ticks:r+i}}function k(t){let e=0,n=0;for(const s of t.split(/\r?\n/)){const[o,r]=s.split(":");if(!o||r===void 0)continue;const i=Number(r.trim());Number.isFinite(i)&&(o.trim()==="read_bytes"?e=i:o.trim()==="write_bytes"&&(n=i))}return{readBytes:e,writeBytes:n}}function W(t){const e=t.trim().match(/^(\d+)\s+([\d.]+)\s+(\d+)\s+(.+)$/);if(!e)return null;const n=Number(e[1]),s=Number(e[2]),o=Number(e[3])*1024;return!Number.isFinite(n)||!Number.isFinite(s)||!Number.isFinite(o)?null:{pid:n,cpuPercent:s,rssBytes:o,name:A(e[4].trim())}}function F(t){const e=[];for(const n of t.split(/\r?\n/)){const s=W(n);s&&e.push(s)}return e}async function $(){const{stdout:t}=await l("ps",["-eo","pid=,pcpu=,rss=,comm="],{encoding:"utf8",timeout:m});return F(t)}function v(t){const e=new Map;for(const n of t.split(/\r?\n/).slice(1)){if(!n.trim()||n.startsWith("State ")||n.trim().split(/\s+/)[0]==="LISTEN")continue;const o=new Set;for(const r of n.matchAll(/\("([^"]+)",pid=(\d+)/g)){const i=Number(r[2]);if(!Number.isFinite(i)||o.has(i))continue;o.add(i);const c=e.get(i)||{name:r[1],connectionCount:0};c.connectionCount+=1,e.set(i,c)}}return e}async function N(){return(await T("/proc")).filter(e=>/^\d+$/.test(e)).map(e=>Number(e))}async function D(){const t=async()=>{const s=await N(),o=await Promise.all(s.map(async r=>{try{const i=await w(`/proc/${r}/stat`,"utf8"),c=b(i);return c?[r,c]:null}catch{return null}}));return new Map(o.filter(Boolean))},e=await t();await new Promise(s=>{setTimeout(s,a)});const n=await t();return{first:e,second:n}}async function G(){const{first:t,second:e}=await D(),n=[];for(const[s,o]of e){const r=t.get(s);if(!r)continue;const i=o.ticks-r.ticks;if(i<=0)continue;const c=a/1e3;n.push({pid:s,name:o.name,value:Math.round(i/O/c*1e3)/10})}return n}async function j(){return(await $()).map(e=>({pid:e.pid,name:e.name,value:e.rssBytes}))}async function U(){const t=async()=>{const r=await N(),i=await Promise.all(r.map(async c=>{try{const[u,p]=await Promise.all([w(`/proc/${c}/stat`,"utf8"),w(`/proc/${c}/io`,"utf8")]),S=b(u);if(!S)return null;const y=k(p);return[c,{name:S.name,readBytes:y.readBytes,writeBytes:y.writeBytes}]}catch{return null}}));return new Map(i.filter(Boolean))},e=await t();await new Promise(r=>{setTimeout(r,a)});const n=await t(),s=a/1e3,o=[];for(const[r,i]of n){const c=e.get(r);if(!c)continue;const u=Math.max(0,Math.round((i.readBytes-c.readBytes)/s)),p=Math.max(0,Math.round((i.writeBytes-c.writeBytes)/s));o.push({pid:r,name:i.name,value:u+p,readBytesPerSecond:u,writeBytesPerSecond:p})}return o}async function J(){const{stdout:t}=await l("ss",["-tupn"],{encoding:"utf8",timeout:m}),e=[];for(const[n,s]of v(t))e.push({pid:n,name:s.name,value:s.connectionCount});return e}async function K(){return(await $()).map(e=>({pid:e.pid,name:e.name,value:e.cpuPercent}))}async function V(){return(await $()).map(e=>({pid:e.pid,name:e.name,value:e.rssBytes}))}function X(t){const e=new Map;for(const n of t.split(/\r?\n/).slice(1)){const s=n.trim().split(/\s+/);if(s.length<8)continue;const o=s[0],r=Number(s[1]);if(!Number.isFinite(r)||r<=0||s.slice(7).join(" ").includes("(LISTEN)"))continue;const c=e.get(r)||{name:o,connectionCount:0};c.connectionCount+=1,e.set(r,c)}return e}async function z(){const{stdout:t}=await l("lsof",["-n","-P","-i","TCP","+c0"],{encoding:"utf8",timeout:m}),e=[];for(const[n,s]of X(t))e.push({pid:n,name:s.name,value:s.connectionCount});return e}const C=`
1
+ import{execFile as h}from"node:child_process";import{readdir as T,readFile as w}from"node:fs/promises";import M from"node:os";import{promisify as I}from"node:util";const l=I(h);import{createLogger as g}from"../utils/logger.js";const x=g("process-top"),E=["cpu","memory","storage","network"],a=400,O=100,P=10,_=50,m=9e3,B="\u5F53\u524D\u7CFB\u7EDF\u65E0\u6CD5\u6309\u8FDB\u7A0B\u7EDF\u8BA1\u7F51\u7EDC\u8FDE\u63A5",L="macOS \u6682\u4E0D\u652F\u6301\u6309\u8FDB\u7A0B\u7EDF\u8BA1\u78C1\u76D8 IO";function ce(t){const e=String(t??"").trim();return E.includes(e)?e:null}function ae(t){const e=Math.floor(Number(t??P));return Number.isFinite(e)?Math.min(_,Math.max(1,e)):P}function R(t,e){return[...t].sort((n,s)=>s.value-n.value).slice(0,e)}function A(t){const e=t.replace(/\\/g,"/"),n=e.split("/").filter(Boolean);return n[n.length-1]||e}function b(t){const e=t.indexOf("("),n=t.lastIndexOf(")");if(e<0||n<=e)return null;const s=t.slice(e+1,n),o=t.slice(n+1).trim().split(/\s+/),r=Number(o[11]),i=Number(o[12]);return!Number.isFinite(r)||!Number.isFinite(i)?null:{name:s,ticks:r+i}}function k(t){let e=0,n=0;for(const s of t.split(/\r?\n/)){const[o,r]=s.split(":");if(!o||r===void 0)continue;const i=Number(r.trim());Number.isFinite(i)&&(o.trim()==="read_bytes"?e=i:o.trim()==="write_bytes"&&(n=i))}return{readBytes:e,writeBytes:n}}function W(t){const e=t.trim().match(/^(\d+)\s+([\d.]+)\s+(\d+)\s+(.+)$/);if(!e)return null;const n=Number(e[1]),s=Number(e[2]),o=Number(e[3])*1024;return!Number.isFinite(n)||!Number.isFinite(s)||!Number.isFinite(o)?null:{pid:n,cpuPercent:s,rssBytes:o,name:A(e[4].trim())}}function F(t){const e=[];for(const n of t.split(/\r?\n/)){const s=W(n);s&&e.push(s)}return e}async function $(){const{stdout:t}=await l("ps",["-eo","pid=,pcpu=,rss=,comm="],{encoding:"utf8",timeout:m});return F(t)}function v(t){const e=new Map;for(const n of t.split(/\r?\n/).slice(1)){if(!n.trim()||n.startsWith("State ")||n.trim().split(/\s+/)[0]==="LISTEN")continue;const o=new Set;for(const r of n.matchAll(/\("([^"]+)",pid=(\d+)/g)){const i=Number(r[2]);if(!Number.isFinite(i)||o.has(i))continue;o.add(i);const c=e.get(i)||{name:r[1],connectionCount:0};c.connectionCount+=1,e.set(i,c)}}return e}async function N(){return(await T("/proc")).filter(e=>/^\d+$/.test(e)).map(e=>Number(e))}async function D(){const t=async()=>{const s=await N(),o=await Promise.all(s.map(async r=>{try{const i=await w(`/proc/${r}/stat`,"utf8"),c=b(i);return c?[r,c]:null}catch{return null}}));return new Map(o.filter(Boolean))},e=await t();await new Promise(s=>{setTimeout(s,a)});const n=await t();return{first:e,second:n}}async function G(){const{first:t,second:e}=await D(),n=[];for(const[s,o]of e){const r=t.get(s);if(!r)continue;const i=o.ticks-r.ticks;if(i<=0)continue;const c=a/1e3;n.push({pid:s,name:o.name,value:Math.round(i/O/c*1e3)/10})}return n}async function j(){return(await $()).map(e=>({pid:e.pid,name:e.name,value:e.rssBytes}))}async function U(){const t=async()=>{const r=await N(),i=await Promise.all(r.map(async c=>{try{const[u,p]=await Promise.all([w(`/proc/${c}/stat`,"utf8"),w(`/proc/${c}/io`,"utf8")]),S=b(u);if(!S)return null;const y=k(p);return[c,{name:S.name,readBytes:y.readBytes,writeBytes:y.writeBytes}]}catch{return null}}));return new Map(i.filter(Boolean))},e=await t();await new Promise(r=>{setTimeout(r,a)});const n=await t(),s=a/1e3,o=[];for(const[r,i]of n){const c=e.get(r);if(!c)continue;const u=Math.max(0,Math.round((i.readBytes-c.readBytes)/s)),p=Math.max(0,Math.round((i.writeBytes-c.writeBytes)/s));o.push({pid:r,name:i.name,value:u+p,readBytesPerSecond:u,writeBytesPerSecond:p})}return o}async function J(){const{stdout:t}=await l("ss",["-tupn"],{encoding:"utf8",timeout:m}),e=[];for(const[n,s]of v(t))e.push({pid:n,name:s.name,value:s.connectionCount});return e}async function K(){return(await $()).map(e=>({pid:e.pid,name:e.name,value:e.cpuPercent}))}async function V(){return(await $()).map(e=>({pid:e.pid,name:e.name,value:e.rssBytes}))}function X(t){const e=new Map;for(const n of t.split(/\r?\n/).slice(1)){const s=n.trim().split(/\s+/);if(s.length<8)continue;const o=s[0],r=Number(s[1]);if(!Number.isFinite(r)||r<=0||s.slice(7).join(" ").includes("(LISTEN)"))continue;const c=e.get(r)||{name:o,connectionCount:0};c.connectionCount+=1,e.set(r,c)}return e}async function z(){const{stdout:t}=await l("lsof",["-n","-P","-i","TCP","+c0"],{encoding:"utf8",timeout:m}),e=[];for(const[n,s]of X(t))e.push({pid:n,name:s.name,value:s.connectionCount});return e}const C=`
2
2
  $ErrorActionPreference = 'SilentlyContinue'
3
3
  $cores = [Environment]::ProcessorCount
4
4
  $sw = [System.Diagnostics.Stopwatch]::StartNew()
@@ -46,5 +46,5 @@ foreach ($key in $groups.Keys) {
46
46
  $rows += [pscustomobject]@{ pid = $pidInt; name = $names[$pidInt]; connectionCount = @($groups[$key]).Count }
47
47
  }
48
48
  ConvertTo-Json -InputObject $rows -Compress -Depth 2
49
- `.trim();function d(t){const e=t.trim();if(!e)return[];const n=JSON.parse(e);return Array.isArray(n)?n:[n]}function f(t){return l("powershell",["-NoProfile","-NonInteractive","-Command",t],{encoding:"utf8",timeout:m,windowsHide:!0}).then(e=>e.stdout)}async function q(){return d(await f(C)).filter(e=>Number.isFinite(Number(e.pid))&&Number(e.cpuPercent)>0).map(e=>({pid:Number(e.pid),name:String(e.name||"unknown"),value:Number(e.cpuPercent)}))}async function Q(){return d(await f(C)).filter(e=>Number.isFinite(Number(e.pid))).map(e=>({pid:Number(e.pid),name:String(e.name||"unknown"),value:Number(e.rssBytes||0)}))}async function Z(){return d(await f(H)).filter(e=>Number.isFinite(Number(e.pid))).map(e=>{const n=Number(e.readBytesPerSecond||0),s=Number(e.writeBytesPerSecond||0);return{pid:Number(e.pid),name:String(e.name||"unknown"),value:n+s,readBytesPerSecond:n,writeBytesPerSecond:s}})}async function ee(){return d(await f(Y)).filter(e=>Number.isFinite(Number(e.pid))).map(e=>({pid:Number(e.pid),name:String(e.name||"unknown"),value:Number(e.connectionCount||0)}))}function te(t){return!!(t&&typeof t=="object"&&t.code==="ENOENT")}async function ue(t,e){const n=I.platform(),s={ok:!0,resource:t,limit:e,collectedAt:new Date().toISOString()};if(n==="darwin"&&t==="storage")return{...s,samples:[],unsupported:L};try{let o;return n==="win32"?o=t==="cpu"?await q():t==="memory"?await Q():t==="storage"?await Z():await ee():n==="darwin"?o=t==="cpu"?await K():t==="memory"?await V():await z():o=t==="cpu"?await G():t==="memory"?await j():t==="storage"?await U():await J(),{...s,samples:R(o,e)}}catch(o){if(t==="network"&&(te(o)||n==="win32"))return x.debug("Failed to collect network process top:",o),{...s,samples:[],unsupported:B};throw o}}export{E as PROCESS_TOP_RESOURCES,ae as clampProcessTopLimit,ue as collectProcessTop,ce as normalizeProcessTopResource,d as parseJsonRows,k as parseLinuxIoFile,b as parseLinuxStatLine,X as parseLsofConnectionCounts,W as parsePsMetricsLine,F as parsePsMetricsRows,v as parseSsConnectionCounts,R as sortAndSliceSamples};
49
+ `.trim();function d(t){const e=t.trim();if(!e)return[];const n=JSON.parse(e);return Array.isArray(n)?n:[n]}function f(t){return l("powershell",["-NoProfile","-NonInteractive","-Command",t],{encoding:"utf8",timeout:m,windowsHide:!0}).then(e=>e.stdout)}async function q(){return d(await f(C)).filter(e=>Number.isFinite(Number(e.pid))&&Number(e.cpuPercent)>0).map(e=>({pid:Number(e.pid),name:String(e.name||"unknown"),value:Number(e.cpuPercent)}))}async function Q(){return d(await f(C)).filter(e=>Number.isFinite(Number(e.pid))).map(e=>({pid:Number(e.pid),name:String(e.name||"unknown"),value:Number(e.rssBytes||0)}))}async function Z(){return d(await f(H)).filter(e=>Number.isFinite(Number(e.pid))).map(e=>{const n=Number(e.readBytesPerSecond||0),s=Number(e.writeBytesPerSecond||0);return{pid:Number(e.pid),name:String(e.name||"unknown"),value:n+s,readBytesPerSecond:n,writeBytesPerSecond:s}})}async function ee(){return d(await f(Y)).filter(e=>Number.isFinite(Number(e.pid))).map(e=>({pid:Number(e.pid),name:String(e.name||"unknown"),value:Number(e.connectionCount||0)}))}function te(t){return!!(t&&typeof t=="object"&&t.code==="ENOENT")}async function ue(t,e){const n=M.platform(),s={ok:!0,resource:t,limit:e,collectedAt:new Date().toISOString()};if(n==="darwin"&&t==="storage")return{...s,samples:[],unsupported:L};try{let o;return n==="win32"?o=t==="cpu"?await q():t==="memory"?await Q():t==="storage"?await Z():await ee():n==="darwin"?o=t==="cpu"?await K():t==="memory"?await V():await z():o=t==="cpu"?await G():t==="memory"?await j():t==="storage"?await U():await J(),{...s,samples:R(o,e)}}catch(o){if(t==="network"&&(te(o)||n==="win32"))return x.debug("Failed to collect network process top:",o),{...s,samples:[],unsupported:B};throw o}}export{E as PROCESS_TOP_RESOURCES,ae as clampProcessTopLimit,ue as collectProcessTop,ce as normalizeProcessTopResource,d as parseJsonRows,k as parseLinuxIoFile,b as parseLinuxStatLine,X as parseLsofConnectionCounts,W as parsePsMetricsLine,F as parsePsMetricsRows,v as parseSsConnectionCounts,R as sortAndSliceSamples};
50
50
 
@@ -1,6 +1,6 @@
1
- import m from"node:crypto";import o from"node:fs";import a from"node:path";import{getRuntimeHomeDir as y}from"../config.js";import{createLogger as B}from"../utils/logger.js";const p=B("runtime-binding"),b="sha256",T=v();function v(){const e=m.randomInt(0,1e6);return String(e).padStart(6,"0").replace(/(\d{3})(\d{3})/,"$1-$2")}function d(){return a.join(y(),".aws-bridge")}function g(){return a.join(d(),"binding.json")}function S(){return a.join(d(),"runtime-tokens.properties")}function x(e){return m.createHash(b).update(e,"utf8").digest("hex")}function $(e,t){const n=Buffer.from(e,"hex"),r=Buffer.from(t,"hex");return n.length!==r.length?!1:m.timingSafeEqual(n,r)}function H(e,t){const n=Buffer.from(e,"utf8"),r=Buffer.from(t,"utf8");return n.length!==r.length?!1:m.timingSafeEqual(n,r)}function f(e){return String(e||"").trim()}function I(e){return e.replace(/^((?:https?|wss?):\/\/(?:\[[^\]]+\]|[^/:?#]+):\d+):\d+(?=\/|$)/i,"$1")}function U(e){const t=e.toLowerCase();return t==="localhost"||t==="::1"||t==="[::1]"?"127.0.0.1":t}function u(e){const t=f(e);if(!t)return;const n=I(t);try{const r=new URL(n);return r.protocol==="ws:"?r.protocol="http:":r.protocol==="wss:"?r.protocol="https:":r.protocol=r.protocol.toLowerCase(),r.hostname=U(r.hostname),r.origin}catch{return n.replace(/\/+$/,"")}}function P(){return T}function q(){return g()}function _(){return S()}function N(e){const t=u(e)||String(e||"").trim();if(!t)return"";try{return new URL(t).hostname.toLowerCase()}catch{return t.replace(/^wss?:\/\//i,"").replace(/^https?:\/\//i,"").split("/")[0].split(":")[0].toLowerCase()}}function F(e){const t=u(e);if(t)return t;const n=String(e||"").trim();return n?n.replace(/\/+$/,"").toLowerCase():""}function w(e){const t=F(e);if(!t)throw new Error("serverBaseUrl is required to build runtime token key");return m.createHash("md5").update(t,"utf8").digest("hex")}function k(){const e=new Map;try{const t=o.readFileSync(S(),"utf8");for(const n of t.split(/\r?\n/)){const r=n.trim();if(!r||r.startsWith("#"))continue;const i=r.indexOf("=");if(i<=0)continue;const s=r.slice(0,i).trim(),c=r.slice(i+1).trim();s&&c&&e.set(s,c)}}catch{}return e}function R(e){o.mkdirSync(d(),{recursive:!0});const t=[...e.entries()].sort(([n],[r])=>n.localeCompare(r)).map(([n,r])=>`${n}=${r}`);o.writeFileSync(S(),`${t.join(`
1
+ import m from"node:crypto";import o from"node:fs";import u from"node:path";import{getRuntimeHomeDir as w}from"../config.js";import{createLogger as R}from"../utils/logger.js";const g=R("runtime-binding"),b="sha256",x=v();function v(){const e=m.randomInt(0,1e6);return String(e).padStart(6,"0").replace(/(\d{3})(\d{3})/,"$1-$2")}function a(){return u.join(w(),".aws-bridge")}function p(){return u.join(a(),"binding.json")}function S(){return u.join(a(),"runtime-tokens.properties")}function T(e){return m.createHash(b).update(e,"utf8").digest("hex")}function $(e,t){const n=Buffer.from(e,"hex"),r=Buffer.from(t,"hex");return n.length!==r.length?!1:m.timingSafeEqual(n,r)}function H(e,t){const n=Buffer.from(e,"utf8"),r=Buffer.from(t,"utf8");return n.length!==r.length?!1:m.timingSafeEqual(n,r)}function d(e){return String(e||"").trim()}function I(e){return e.replace(/^((?:https?|wss?):\/\/(?:\[[^\]]+\]|[^/:?#]+):\d+):\d+(?=\/|$)/i,"$1")}function U(e){const t=e.toLowerCase();return t==="localhost"||t==="::1"||t==="[::1]"?"127.0.0.1":t}function f(e){const t=d(e);if(!t)return;const n=I(t);try{const r=new URL(n);return r.protocol==="ws:"?r.protocol="http:":r.protocol==="wss:"?r.protocol="https:":r.protocol=r.protocol.toLowerCase(),r.hostname=U(r.hostname),r.origin}catch{return n.replace(/\/+$/,"")}}function z(){return x}function L(){return p()}function N(){return S()}function F(e){const t=f(e);if(t)return t;const n=String(e||"").trim();return n?n.replace(/\/+$/,"").toLowerCase():""}function y(e){const t=F(e);if(!t)throw new Error("serverBaseUrl is required to build runtime token key");return m.createHash("md5").update(t,"utf8").digest("hex")}function k(){const e=new Map;try{const t=o.readFileSync(S(),"utf8");for(const n of t.split(/\r?\n/)){const r=n.trim();if(!r||r.startsWith("#"))continue;const i=r.indexOf("=");if(i<=0)continue;const s=r.slice(0,i).trim(),c=r.slice(i+1).trim();s&&c&&e.set(s,c)}}catch{}return e}function B(e){o.mkdirSync(a(),{recursive:!0});const t=[...e.entries()].sort(([n],[r])=>n.localeCompare(r)).map(([n,r])=>`${n}=${r}`);o.writeFileSync(S(),`${t.join(`
2
2
  `)}
3
- `,{encoding:"utf8",mode:384})}function A(e){const t=f(e.accessToken);if(t.length<16)throw new Error("accessToken must be at least 16 characters");const n=w(e.serverBaseUrl),r=k();return r.set(n,t),R(r),n}function C(e){if(e)try{const t=w(e);return k().get(t)}catch{return}}function J(e){if(!e)return!1;try{const t=w(e),n=k(),r=n.delete(t);return r&&R(n),r}catch{return!1}}function O(e){if(!e)return!1;for(const t of k().values())if(H(e,t))return!0;return!1}function l(){try{const e=o.readFileSync(g(),"utf8"),t=JSON.parse(e);if(t?.status==="paired"&&t.tokenHash)return{...t,schedulerBaseUrl:u(t.schedulerBaseUrl)||t.schedulerBaseUrl}}catch{}return{status:"unpaired"}}function K(){const e=l(),{tokenHash:t,accessToken:n,...r}=e;return{...r,paired:e.status==="paired"}}function M(){const e=l();return e.status==="paired"&&!!e.tokenHash}function G(e){const t=f(e);if(!t)return!1;const n=l();return n.status==="paired"&&n.tokenHash&&$(x(t),n.tokenHash)?!0:O(t)}function W(e){const t=C(e);if(t)return t;const n=l();if(n.status==="paired"){if(e){const r=u(e),i=u(n.schedulerBaseUrl);return r&&i&&r===i&&f(n.accessToken)||void 0}return f(n.accessToken)||void 0}}function Q(e){return String(e||"").trim()===T}function V(e){const t=f(e.accessToken);if(t.length<16)throw new Error("accessToken must be at least 16 characters");const n=l(),r=u(e.schedulerBaseUrl)||u(n.schedulerBaseUrl),i=new Date().toISOString(),s={status:"paired",instanceId:e.instanceId?String(e.instanceId):n.instanceId,userId:e.userId?String(e.userId):n.userId,schedulerBaseUrl:r,accessToken:t,tokenHash:x(t),createdAt:n.createdAt||i,updatedAt:i};if(o.mkdirSync(d(),{recursive:!0}),o.writeFileSync(g(),`${JSON.stringify(s,null,2)}
4
- `,{encoding:"utf8",mode:384}),s.schedulerBaseUrl){const c=A({serverBaseUrl:s.schedulerBaseUrl,accessToken:t});p.info(`[runtime-bridge] scoped runtime token saved: key=${c}`)}return p.info(`[runtime-bridge] runtime binding saved: ${g()}`),s}function X(){const t={...l(),status:"unpaired",accessToken:void 0,tokenHash:void 0,revokedAt:new Date().toISOString(),updatedAt:new Date().toISOString()};o.mkdirSync(d(),{recursive:!0}),o.writeFileSync(g(),`${JSON.stringify(t,null,2)}
5
- `,{encoding:"utf8",mode:384}),p.info("[runtime-bridge] runtime binding cleared")}function Y(){const e=y(),t=a.join(e,".agentswork","runtime-bridge"),n=d();if(t===n||!o.existsSync(t))return;const r=["binding.json","runtime-tokens.properties"];let i=0;for(const s of r){const c=a.join(t,s),h=a.join(n,s);if(o.existsSync(c)&&!o.existsSync(h)){o.mkdirSync(n,{recursive:!0}),o.copyFileSync(c,h);try{o.chmodSync(h,384)}catch{}i++,p.info(`[runtime-bridge] \u5DF2\u8FC1\u79FB ${c} \u2192 ${h}`)}}i>0&&p.info(`[runtime-bridge] \u5DF2\u8FC1\u79FB ${i} \u4E2A\u914D\u7F6E\u6587\u4EF6\u4ECE ${t} \u5230 ${n}`)}export{w as buildRuntimeTokenKey,X as clearRuntimeBinding,J as clearScopedRuntimeAccessToken,W as getRuntimeAccessToken,q as getRuntimeBindingFilePath,K as getRuntimeBindingPublicState,P as getRuntimePairingCode,_ as getRuntimeTokenStoreFilePath,C as getScopedRuntimeAccessToken,M as hasRuntimeBinding,l as loadRuntimeBinding,Y as migrateOldBindingDir,u as normalizeSchedulerBaseUrl,V as saveRuntimeBinding,A as saveScopedRuntimeAccessToken,G as validateRuntimeBindingToken,Q as validateRuntimePairingCode};
3
+ `,{encoding:"utf8",mode:384})}function A(e){const t=d(e.accessToken);if(t.length<16)throw new Error("accessToken must be at least 16 characters");const n=y(e.serverBaseUrl),r=k();return r.set(n,t),B(r),n}function O(e){if(e)try{const t=y(e);return k().get(t)}catch{return}}function _(e){if(!e)return!1;try{const t=y(e),n=k(),r=n.delete(t);return r&&B(n),r}catch{return!1}}function j(e){if(!e)return!1;for(const t of k().values())if(H(e,t))return!0;return!1}function l(){try{const e=o.readFileSync(p(),"utf8"),t=JSON.parse(e);if(t?.status==="paired"&&t.tokenHash)return{...t,schedulerBaseUrl:f(t.schedulerBaseUrl)||t.schedulerBaseUrl}}catch{}return{status:"unpaired"}}function J(){const e=l(),t={...e};return delete t.tokenHash,delete t.accessToken,{...t,paired:e.status==="paired"}}function K(){const e=l();return e.status==="paired"&&!!e.tokenHash}function M(e){const t=d(e);if(!t)return!1;const n=l();return n.status==="paired"&&n.tokenHash&&$(T(t),n.tokenHash)?!0:j(t)}function G(e){const t=O(e);if(t)return t;const n=l();if(n.status==="paired"){if(e){const r=f(e),i=f(n.schedulerBaseUrl);return r&&i&&r===i&&d(n.accessToken)||void 0}return d(n.accessToken)||void 0}}function W(e){return String(e||"").trim()===x}function Q(e){const t=d(e.accessToken);if(t.length<16)throw new Error("accessToken must be at least 16 characters");const n=l(),r=f(e.schedulerBaseUrl)||f(n.schedulerBaseUrl),i=new Date().toISOString(),s={status:"paired",instanceId:e.instanceId?String(e.instanceId):n.instanceId,userId:e.userId?String(e.userId):n.userId,schedulerBaseUrl:r,accessToken:t,tokenHash:T(t),createdAt:n.createdAt||i,updatedAt:i};if(o.mkdirSync(a(),{recursive:!0}),o.writeFileSync(p(),`${JSON.stringify(s,null,2)}
4
+ `,{encoding:"utf8",mode:384}),s.schedulerBaseUrl){const c=A({serverBaseUrl:s.schedulerBaseUrl,accessToken:t});g.info(`[runtime-bridge] scoped runtime token saved: key=${c}`)}return g.info(`[runtime-bridge] runtime binding saved: ${p()}`),s}function V(){const t={...l(),status:"unpaired",accessToken:void 0,tokenHash:void 0,revokedAt:new Date().toISOString(),updatedAt:new Date().toISOString()};o.mkdirSync(a(),{recursive:!0}),o.writeFileSync(p(),`${JSON.stringify(t,null,2)}
5
+ `,{encoding:"utf8",mode:384}),g.info("[runtime-bridge] runtime binding cleared")}function X(){const e=w(),t=u.join(e,".agentswork","runtime-bridge"),n=a();if(t===n||!o.existsSync(t))return;const r=["binding.json","runtime-tokens.properties"];let i=0;for(const s of r){const c=u.join(t,s),h=u.join(n,s);if(o.existsSync(c)&&!o.existsSync(h)){o.mkdirSync(n,{recursive:!0}),o.copyFileSync(c,h);try{o.chmodSync(h,384)}catch{}i++,g.info(`[runtime-bridge] \u5DF2\u8FC1\u79FB ${c} \u2192 ${h}`)}}i>0&&g.info(`[runtime-bridge] \u5DF2\u8FC1\u79FB ${i} \u4E2A\u914D\u7F6E\u6587\u4EF6\u4ECE ${t} \u5230 ${n}`)}export{y as buildRuntimeTokenKey,V as clearRuntimeBinding,_ as clearScopedRuntimeAccessToken,G as getRuntimeAccessToken,L as getRuntimeBindingFilePath,J as getRuntimeBindingPublicState,z as getRuntimePairingCode,N as getRuntimeTokenStoreFilePath,O as getScopedRuntimeAccessToken,K as hasRuntimeBinding,l as loadRuntimeBinding,X as migrateOldBindingDir,f as normalizeSchedulerBaseUrl,Q as saveRuntimeBinding,A as saveScopedRuntimeAccessToken,M as validateRuntimeBindingToken,W as validateRuntimePairingCode};
6
6
 
@@ -1,2 +1,2 @@
1
- import{promises as A}from"node:fs";import{existsSync as P,readFileSync as L}from"node:fs";import E from"node:path";import{getToolActionInfo as x}from"../adapter/types.js";import{recordAgentFileChange as F}from"./workspaceTaskChangeWatcher.js";import{logger as u}from"../utils/logger.js";const h=new Map,k=new Set(["write","writefile","fswrite","edit","editfile","strreplace","str_replace","editcode","multiedit","apply_patch","applypatch","file_change","write_file","edit_file","delete_file","notebookedit"]),b=new Set(["delete","deletefile","remove","rm","delete_file"]);function y(e){return String(e??"").toLowerCase().replace(/[_-]/g,"")}function w(e){if(!e||typeof e!="object")return;const r=[e.file_path,e.filePath,e.path,e.target_file,e.targetFile,e.file,e.files];for(const t of r){if(typeof t=="string"&&t.trim())return t.trim().replace(/\\/g,"/");if(Array.isArray(t)){const i=t.filter(n=>typeof n=="string"&&n.trim());i.length>1&&u.warn(`[SdkFileChange] \u591A\u6587\u4EF6\u5DE5\u5177\u4EC5\u8BB0\u5F55\u9996\u4E2A\u6587\u4EF6\u8DEF\u5F84\uFF08\u5171 ${i.length} \u4E2A\uFF09`);const o=i[0];if(o)return o.trim().replace(/\\/g,"/")}}}function T(e,r){const t=y(e);if(!t)return;if(b.has(t))return"DELETE";if(k.has(t))return"UPDATE";const i=x(e,r);if(i.actionType==="write_file"||i.actionType==="edit_file")return"UPDATE"}function C(e,r){const t=E.resolve(e).replace(/\\/g,"/"),i=E.resolve(e,r).replace(/\\/g,"/"),o=t+"/";if(!(process.platform==="win32"?i.toLowerCase().startsWith(o.toLowerCase())||i.toLowerCase()===t.toLowerCase():i.startsWith(o)||i===t))return;const s=i.slice(t.length).replace(/^\/+/,"");return s.length>0?s:void 0}function N(e,r,t,i,o){if(!r||!t||typeof t!="object")return;let n=h.get(e);n||(n=new Map,h.set(e,n)),n.set(r,{toolInput:t,startState:D(i,t,o)})}function D(e,r,t){if(!t||!T(e,r))return null;const i=w(r),o=i?C(t,i):void 0;if(!o)return null;const n=E.join(t,o);if(!P(n))return{beforeContent:null,existedAtStart:!1};try{return{beforeContent:L(n,"utf-8"),existedAtStart:!0}}catch{return{beforeContent:null,existedAtStart:!0}}}function O(e){h.delete(e)}async function j(e,r){if(e.type!=="tool_use_end"||r.providerId==="acode")return;const{toolName:t,isError:i}=e.data,o=e.data.toolUseId||e.data.actionId,n=h.get(r.sessionId),s=o&&n?.get(o)||void 0;o&&n&&(n.delete(o),n.size===0&&h.delete(r.sessionId));const S=s?.toolInput;if(i===!0)return;const m=T(t,S);if(!m)return;let l=w(S);if(!l){const c=String(e.data.toolResult??e.data.actionResult??"").match(/(?:path|file)[=:]\s*["']?([^"'\s,]+)["']?/i);c&&(l=c[1].replace(/\\/g,"/"))}if(!l){u.warn(`[SdkFileChange] \u8DF3\u8FC7\u65E0\u6CD5\u89E3\u6790\u8DEF\u5F84\u7684\u6587\u4EF6\u5DE5\u5177: session=${r.sessionId}, tool=${t}`);return}const f=C(r.workspacePath,l);if(!f){u.warn(`[SdkFileChange] \u6587\u4EF6\u8DEF\u5F84\u5728\u5DE5\u4F5C\u533A\u5916\u6216\u4E3A\u5DE5\u4F5C\u533A\u6839\u76EE\u5F55\uFF0C\u8DF3\u8FC7: ${l} (workspace=${r.workspacePath})`);return}try{const a=E.join(r.workspacePath,f);let c=null,p=!1;try{c=await A.readFile(a,"utf-8"),p=!0}catch{}const g=s?.startState??null,_=g?.beforeContent??null;let d;if(m==="DELETE")d="DELETE";else if(g!=null){if(!g.existedAtStart&&!p){u.warn(`[SdkFileChange] \u6587\u4EF6\u5728\u5DE5\u5177\u6267\u884C\u524D\u540E\u5747\u4E0D\u5B58\u5728\uFF0C\u8DF3\u8FC7\u8BB0\u5F55: ${f}`);return}d=g.existedAtStart?p?"UPDATE":"DELETE":"CREATE"}else d=p?"UPDATE":"CREATE";await F({filePath:f,operation:d,beforeContent:_,afterContent:d==="DELETE"?null:c,agentId:r.agentId,workspacePath:r.workspacePath})}catch(a){u.warn(`[SdkFileChange] \u8BB0\u5F55\u5931\u8D25: session=${r.sessionId}, tool=${t}, file=${f}, error=${a instanceof Error?a.message:String(a)}`)}}export{O as forgetSession,j as onSdkToolUseEnd,N as onSdkToolUseStart};
1
+ import{promises as A,existsSync as P,readFileSync as L}from"node:fs";import E from"node:path";import{getToolActionInfo as x}from"../adapter/types.js";import{logger as u}from"../utils/logger.js";import{recordAgentFileChange as F}from"./workspaceTaskChangeWatcher.js";const h=new Map,k=new Set(["write","writefile","fswrite","edit","editfile","strreplace","str_replace","editcode","multiedit","apply_patch","applypatch","file_change","write_file","edit_file","delete_file","notebookedit"]),b=new Set(["delete","deletefile","remove","rm","delete_file"]);function y(e){return String(e??"").toLowerCase().replace(/[_-]/g,"")}function w(e){if(!e||typeof e!="object")return;const r=[e.file_path,e.filePath,e.path,e.target_file,e.targetFile,e.file,e.files];for(const t of r){if(typeof t=="string"&&t.trim())return t.trim().replace(/\\/g,"/");if(Array.isArray(t)){const i=t.filter(n=>typeof n=="string"&&n.trim());i.length>1&&u.warn(`[SdkFileChange] \u591A\u6587\u4EF6\u5DE5\u5177\u4EC5\u8BB0\u5F55\u9996\u4E2A\u6587\u4EF6\u8DEF\u5F84\uFF08\u5171 ${i.length} \u4E2A\uFF09`);const o=i[0];if(o)return o.trim().replace(/\\/g,"/")}}}function T(e,r){const t=y(e);if(!t)return;if(b.has(t))return"DELETE";if(k.has(t))return"UPDATE";const i=x(e,r);if(i.actionType==="write_file"||i.actionType==="edit_file")return"UPDATE"}function C(e,r){const t=E.resolve(e).replace(/\\/g,"/"),i=E.resolve(e,r).replace(/\\/g,"/"),o=t+"/";if(!(process.platform==="win32"?i.toLowerCase().startsWith(o.toLowerCase())||i.toLowerCase()===t.toLowerCase():i.startsWith(o)||i===t))return;const s=i.slice(t.length).replace(/^\/+/,"");return s.length>0?s:void 0}function I(e,r,t,i,o){if(!r||!t||typeof t!="object")return;let n=h.get(e);n||(n=new Map,h.set(e,n)),n.set(r,{toolInput:t,startState:D(i,t,o)})}function D(e,r,t){if(!t||!T(e,r))return null;const i=w(r),o=i?C(t,i):void 0;if(!o)return null;const n=E.join(t,o);if(!P(n))return{beforeContent:null,existedAtStart:!1};try{return{beforeContent:L(n,"utf-8"),existedAtStart:!0}}catch{return{beforeContent:null,existedAtStart:!0}}}function N(e){h.delete(e)}async function O(e,r){if(e.type!=="tool_use_end"||r.providerId==="acode")return;const{toolName:t,isError:i}=e.data,o=e.data.toolUseId||e.data.actionId,n=h.get(r.sessionId),s=o&&n?.get(o)||void 0;o&&n&&(n.delete(o),n.size===0&&h.delete(r.sessionId));const S=s?.toolInput;if(i===!0)return;const m=T(t,S);if(!m)return;let l=w(S);if(!l){const c=String(e.data.toolResult??e.data.actionResult??"").match(/(?:path|file)[=:]\s*["']?([^"'\s,]+)["']?/i);c&&(l=c[1].replace(/\\/g,"/"))}if(!l){u.warn(`[SdkFileChange] \u8DF3\u8FC7\u65E0\u6CD5\u89E3\u6790\u8DEF\u5F84\u7684\u6587\u4EF6\u5DE5\u5177: session=${r.sessionId}, tool=${t}`);return}const f=C(r.workspacePath,l);if(!f){u.warn(`[SdkFileChange] \u6587\u4EF6\u8DEF\u5F84\u5728\u5DE5\u4F5C\u533A\u5916\u6216\u4E3A\u5DE5\u4F5C\u533A\u6839\u76EE\u5F55\uFF0C\u8DF3\u8FC7: ${l} (workspace=${r.workspacePath})`);return}try{const a=E.join(r.workspacePath,f);let c=null,p=!1;try{c=await A.readFile(a,"utf-8"),p=!0}catch{}const g=s?.startState??null,_=g?.beforeContent??null;let d;if(m==="DELETE")d="DELETE";else if(g!==null){if(!g.existedAtStart&&!p){u.warn(`[SdkFileChange] \u6587\u4EF6\u5728\u5DE5\u5177\u6267\u884C\u524D\u540E\u5747\u4E0D\u5B58\u5728\uFF0C\u8DF3\u8FC7\u8BB0\u5F55: ${f}`);return}d=g.existedAtStart?p?"UPDATE":"DELETE":"CREATE"}else d=p?"UPDATE":"CREATE";await F({filePath:f,operation:d,beforeContent:_,afterContent:d==="DELETE"?null:c,agentId:r.agentId,workspacePath:r.workspacePath})}catch(a){u.warn(`[SdkFileChange] \u8BB0\u5F55\u5931\u8D25: session=${r.sessionId}, tool=${t}, file=${f}, error=${a instanceof Error?a.message:String(a)}`)}}export{N as forgetSession,O as onSdkToolUseEnd,I as onSdkToolUseStart};
2
2
 
@@ -0,0 +1,41 @@
1
+
2
+ export interface DeployedSkillEntry {
3
+ skillName: string;
4
+ zipFile: string;
5
+ fileName: string;
6
+ defaultEnabled: boolean;
7
+ sha256?: string;
8
+ }
9
+ export interface DeployedSkillResult {
10
+ ok: boolean;
11
+ error?: string;
12
+ skillName?: string;
13
+ }
14
+
15
+ export declare function isValidSkillName(name: unknown): name is string;
16
+ export declare class SkillManager {
17
+ private readonly rootDir;
18
+ private static _instance;
19
+ static getInstance(): SkillManager;
20
+ private constructor();
21
+ private manifestFile;
22
+ private skillDir;
23
+ private isHealthy;
24
+ private readManifest;
25
+ private writeManifest;
26
+
27
+ saveSharedSkill(zipBuffer: Buffer, originalName: string, defaultEnabled?: boolean, sha256?: string, requestedSkillName?: string): Promise<DeployedSkillResult>;
28
+
29
+ removeDeployedSkill(skillName: string): Promise<{
30
+ ok: boolean;
31
+ error?: string;
32
+ }>;
33
+
34
+ listDeployed(): DeployedSkillEntry[];
35
+
36
+ deployedDefaultEnabled(): Record<string, boolean>;
37
+
38
+ private applyToKnownAgents;
39
+ }
40
+ export declare const skillManager: SkillManager;
41
+ export declare const reconcileSkillsDefaultsFromDeployed: () => number;
@@ -0,0 +1,3 @@
1
+ import{promises as g,cpSync as S,existsSync as c,mkdirSync as $,readFileSync as j,readdirSync as A,rmSync as d,writeFileSync as E}from"node:fs";import i from"node:path";import{getAcodeSkillDataHome as I}from"../config.js";import{extractSkillZip as b,resolveSkillSourceDirFromExtractRoot as x}from"../utils/file-utils.js";import{createLogger as L}from"../utils/logger.js";import{getSkillFarmRoot as N,syncAgentSkillFarm as _}from"./agent-capability-sync.js";import{setDeployedDefaultsProvider as K,reconcileDefaultsFromDeployed as z}from"./capability-config.js";import{getAgentInitRoot as D}from"./instance-state.js";const h=L("skill-manager");function F(n){return typeof n=="string"&&n.length>0&&n.length<=128&&/^[a-zA-Z0-9_.-]+$/.test(n)}const O=1;class p{static getInstance(){return this._instance||(this._instance=new p(i.join(I(),"skills","deployed"))),this._instance}constructor(r){this.rootDir=r}manifestFile(){return i.join(this.rootDir,"manifest.json")}skillDir(r){const t=i.join(this.rootDir,r),e=i.resolve(this.rootDir);if(i.resolve(t)!==i.join(e,r))throw new Error(`\u6280\u80FD\u76EE\u5F55\u8D8A\u51FA\u90E8\u7F72\u533A: ${r}`);return t}isHealthy(r){return c(i.join(this.skillDir(r),"SKILL.md"))}readManifest(){try{const r=JSON.parse(j(this.manifestFile(),"utf8"));return Array.isArray(r.skills)?r.skills.filter(t=>t&&t.skillName):[]}catch{return[]}}writeManifest(r){$(this.rootDir,{recursive:!0}),E(this.manifestFile(),`${JSON.stringify({version:O,skills:r},null,2)}
2
+ `,"utf8")}async saveSharedSkill(r,t,e=!0,m,w){if(!r||r.length===0)return{ok:!1,error:"zip \u5305\u5185\u5BB9\u4E3A\u7A7A"};const y=i.join(D("_tmp"),`skill-deploy-${Date.now()}-${Math.random().toString(36).slice(2,8)}`);try{await R(r,y);const o=await x(y),l=i.basename(i.resolve(o)),M=String(t||"").replace(/\.zip$/i,"").trim(),s=w&&w.trim()||(l&&!l.startsWith("skill-deploy-")?l:"")||M;if(!F(s))return{ok:!1,error:`\u6280\u80FD\u540D\u975E\u6CD5: ${JSON.stringify(s)}`};if(!c(i.join(o,"SKILL.md")))return{ok:!1,error:`\u6280\u80FD\u5305\u7F3A\u5C11 SKILL.md: ${t}`};const k=this.readManifest().find(u=>u.skillName===s);if(k&&k.sha256===m&&this.isHealthy(s))return{ok:!0,skillName:s};$(this.rootDir,{recursive:!0});const a=this.skillDir(s),f=i.join(this.rootDir,`.old-${s}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`);if(c(a))try{S(a,f,{recursive:!0})}catch{d(a,{recursive:!0,force:!0})}try{S(o,a,{recursive:!0})}catch(u){throw c(f)&&(d(a,{recursive:!0,force:!0}),S(f,a,{recursive:!0})),u}c(f)&&d(f,{recursive:!0,force:!0});const v=this.readManifest().filter(u=>u.skillName!==s);return v.push({skillName:s,zipFile:k?.zipFile??`${s}.zip`,fileName:t,defaultEnabled:e,sha256:m}),this.writeManifest(v),h.info("[shared] \u6280\u80FD\u5DF2\u90E8\u7F72\u5230 bridge: %s\uFF08\u6765\u6E90 %s%s\uFF09",s,t,m?`, sha256=${m.slice(0,12)}\u2026`:""),this.applyToKnownAgents(),{ok:!0,skillName:s}}catch(o){const l=o instanceof Error?o.message:String(o);return h.warn("[shared] \u6280\u80FD\u90E8\u7F72\u5931\u8D25\uFF08%s\uFF09: %s",t,l),{ok:!1,error:`\u6280\u80FD\u90E8\u7F72\u5931\u8D25: ${l}`}}finally{try{d(y,{recursive:!0,force:!0})}catch{}}}async removeDeployedSkill(r){if(!F(r))return{ok:!1,error:"skillName \u975E\u6CD5"};const t=this.readManifest().filter(e=>e.skillName!==r);this.writeManifest(t);try{d(this.skillDir(r),{recursive:!0,force:!0})}catch(e){return{ok:!1,error:`\u90E8\u7F72\u76EE\u5F55\u6E05\u7406\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`}}return this.applyToKnownAgents(),h.info("[shared] \u6280\u80FD\u5DF2\u4ECE bridge \u79FB\u9664\u90E8\u7F72: %s",r),{ok:!0}}listDeployed(){return this.readManifest().filter(r=>!/^skill-deploy-/.test(r.skillName)).map(r=>({...r,deployed:this.isHealthy(r.skillName)}))}deployedDefaultEnabled(){const r={};for(const t of this.readManifest())/^skill-deploy-/.test(t.skillName)||(r[t.skillName]=t.defaultEnabled);return r}applyToKnownAgents(){const r=new Set;for(const t of[N(),i.dirname(i.resolve(D("_")))])try{if(c(t))for(const e of A(t))e.startsWith(".")||r.add(e)}catch{}for(const t of r)try{_(t)}catch(e){h.warn("[shared] \u540C\u6B65\u6280\u80FD\u519C\u573A\u5931\u8D25 agent=%s: %s",t,e instanceof Error?e.message:String(e))}}}p._instance=null;async function R(n,r){const t=i.join(D("_tmp"),`skill-${Date.now()}-${Math.random().toString(36).slice(2,8)}.zip`);await g.mkdir(i.dirname(t),{recursive:!0}),await g.writeFile(t,n);try{await b(t,r)}finally{await g.rm(t,{force:!0}).catch(()=>{})}}const H=p.getInstance();K("skills",()=>H.deployedDefaultEnabled());const Q=()=>z("skills");export{p as SkillManager,F as isValidSkillName,Q as reconcileSkillsDefaultsFromDeployed,H as skillManager};
3
+
@@ -1,14 +1,14 @@
1
- import{randomBytes as P}from"node:crypto";import{existsSync as m,readFileSync as T}from"node:fs";import v from"node:os";import{stdin as E,stdout as i}from"node:process";import{createInterface as x}from"node:readline/promises";import{atomicWriteJsonFile as _}from"../utils/file-utils.js";import{logger as o}from"../utils/logger.js";import{getAutoRegisterConfigFilePath as d}from"./auto-register.js";const w={autoRegisterTargets:[{instanceName:"<\u5B9E\u4F8B\u540D\u79F0\uFF0C\u4F8B\u5982 \u6211\u7684\u4E3B\u673A>",serverUrl:"http://<\u8C03\u5EA6\u4E2D\u5FC3IP>:<\u7AEF\u53E3>",userKey:"<\u4F60\u7684 userKey>",instanceId:"<\u5B9E\u4F8BID\uFF0C\u9996\u6B21\u53EF\u7559\u7A7A\u7531\u670D\u52A1\u7AEF\u751F\u6210>"}],connectionKey:"<\u9762\u677F\u8FDE\u63A5 Bridge \u7684\u5BC6\u94A5>",panelUsername:"<\u9762\u677F\u7528\u6237\u540D>",panelPassword:"<\u9762\u677F\u5BC6\u7801>"};function C(t=w){return`[runtime-bridge] \u6700\u5C0F\u914D\u7F6E\u793A\u4F8B\uFF08\u8BF7\u5C06 <\u5360\u4F4D\u7B26> \u66FF\u6362\u4E3A\u771F\u5B9E\u503C\u540E\u4FDD\u5B58\uFF09:
1
+ import{randomBytes as R}from"node:crypto";import{existsSync as m,readFileSync as T}from"node:fs";import v from"node:os";import{stdin as E,stdout as i}from"node:process";import{createInterface as x}from"node:readline/promises";import{atomicWriteJsonFile as _}from"../utils/file-utils.js";import{logger as o}from"../utils/logger.js";import{getAutoRegisterConfigFilePath as d}from"./auto-register.js";const w={autoRegisterTargets:[{instanceName:"<\u5B9E\u4F8B\u540D\u79F0\uFF0C\u4F8B\u5982 \u6211\u7684\u4E3B\u673A>",serverUrl:"http://<\u8C03\u5EA6\u4E2D\u5FC3IP>:<\u7AEF\u53E3>",userKey:"<\u4F60\u7684 userKey>",instanceId:"<\u5B9E\u4F8BID\uFF0C\u9996\u6B21\u53EF\u7559\u7A7A\u7531\u670D\u52A1\u7AEF\u751F\u6210>"}],connectionKey:"<\u9762\u677F\u8FDE\u63A5 Bridge \u7684\u5BC6\u94A5>",panelUsername:"<\u9762\u677F\u7528\u6237\u540D>",panelPassword:"<\u9762\u677F\u5BC6\u7801>"};function $(t=w){return`[runtime-bridge] \u6700\u5C0F\u914D\u7F6E\u793A\u4F8B\uFF08\u8BF7\u5C06 <\u5360\u4F4D\u7B26> \u66FF\u6362\u4E3A\u771F\u5B9E\u503C\u540E\u4FDD\u5B58\uFF09:
2
2
  ${JSON.stringify(t,null,2)}
3
- [runtime-bridge] \u8BF4\u660E\uFF1AautoRegisterTargets \u53EF\u5305\u542B\u591A\u4E2A\u76EE\u6807\uFF1BinstanceId \u9996\u6B21\u53EF\u7701\u7565\uFF0C\u7531\u670D\u52A1\u7AEF\u751F\u6210\uFF1BpanelUsername / panelPassword \u4E3A\u53EF\u9009\u9762\u677F\u8BA4\u8BC1\u3002`}function l(t){return t.trim().toLowerCase()}function U(t){return["","y","yes","\u662F","\u597D","\u914D\u7F6E"].includes(l(t))}function B(t){return["n","no","\u5426","\u4E0D","\u8DF3\u8FC7","skip","s"].includes(l(t))}function N(t){if(!m(t))return{};try{const e=JSON.parse(T(t,"utf-8"));return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch(e){const r=e;return o.warn(`[runtime-bridge] \u8BFB\u53D6\u73B0\u6709\u914D\u7F6E\u5931\u8D25\uFF0C\u5C06\u4F7F\u7528\u7A7A\u9ED8\u8BA4\u503C: ${r.message}`),{}}}function k(){return`awsb_${P(24).toString("base64url")}`}async function g(t,e){await _(t,e)}async function p(t,e){const r=e();await g(t,{connectionKey:r});const n=`[runtime-bridge] \u5DF2\u521B\u5EFA\u914D\u7F6E\u6587\u4EF6: ${t}
3
+ [runtime-bridge] \u8BF4\u660E\uFF1AautoRegisterTargets \u53EF\u5305\u542B\u591A\u4E2A\u76EE\u6807\uFF1BinstanceId \u9996\u6B21\u53EF\u7701\u7565\uFF0C\u7531\u670D\u52A1\u7AEF\u751F\u6210\uFF1BpanelUsername / panelPassword \u4E3A\u53EF\u9009\u9762\u677F\u8BA4\u8BC1\u3002`}function l(t){return t.trim().toLowerCase()}function U(t){return["","y","yes","\u662F","\u597D","\u914D\u7F6E"].includes(l(t))}function B(t){return["n","no","\u5426","\u4E0D","\u8DF3\u8FC7","skip","s"].includes(l(t))}function N(t){if(!m(t))return{};try{const e=JSON.parse(T(t,"utf-8"));return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch(e){const r=e;return o.warn(`[runtime-bridge] \u8BFB\u53D6\u73B0\u6709\u914D\u7F6E\u5931\u8D25\uFF0C\u5C06\u4F7F\u7528\u7A7A\u9ED8\u8BA4\u503C: ${r.message}`),{}}}function k(){return`awsb_${R(24).toString("base64url")}`}async function g(t,e){await _(t,e)}async function p(t,e){const r=e();await g(t,{connectionKey:r});const n=`[runtime-bridge] \u5DF2\u521B\u5EFA\u914D\u7F6E\u6587\u4EF6: ${t}
4
4
  [runtime-bridge] \u81EA\u52A8\u751F\u6210 connectionKey: ${r}
5
5
  [runtime-bridge] \u8BF7\u4FDD\u5B58\u8BE5 connectionKey\uFF1Bserver/\u9762\u677F\u8FDE\u63A5\u6B64 Bridge \u65F6\u9700\u8981\u4F7F\u7528\u5B83\u3002`;o.info(n),i.write(`${n}
6
- `)}async function y(t,e,r){return(await t.question(`${e}\uFF08\u9ED8\u8BA4\u4F7F\u7528\u5F53\u524D\u503C ${r}\uFF0C\u76F4\u63A5\u56DE\u8F66\u4FDD\u7559\uFF09: `)).trim()||r}const $=10;async function h(t,e,r){let n=0;for(;;){const a=(await t.question(r?`${e}\uFF08\u9ED8\u8BA4\u4F7F\u7528\u5F53\u524D\u503C ${r}\uFF0C\u76F4\u63A5\u56DE\u8F66\u4FDD\u7559\uFF09: `:`${e}: `)).trim();if(a)return a;if(r)return r;if(n++,n>=$)throw new Error(`${e} \u8F93\u5165\u8D85\u8FC7\u6700\u5927\u91CD\u8BD5\u6B21\u6570\uFF08${$}\uFF09\uFF0C\u9000\u51FA\u914D\u7F6E\u5F15\u5BFC`);i.write(`${e} \u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\u3002
6
+ `)}async function y(t,e,r){return(await t.question(`${e}\uFF08\u9ED8\u8BA4\u4F7F\u7528\u5F53\u524D\u503C ${r}\uFF0C\u76F4\u63A5\u56DE\u8F66\u4FDD\u7559\uFF09: `)).trim()||r}const h=10;async function b(t,e,r){let n=0;for(;;){const a=(await t.question(r?`${e}\uFF08\u9ED8\u8BA4\u4F7F\u7528\u5F53\u524D\u503C ${r}\uFF0C\u76F4\u63A5\u56DE\u8F66\u4FDD\u7559\uFF09: `:`${e}: `)).trim();if(a)return a;if(r)return r;if(n++,n>=h)throw new Error(`${e} \u8F93\u5165\u8D85\u8FC7\u6700\u5927\u91CD\u8BD5\u6B21\u6570\uFF08${h}\uFF09\uFF0C\u9000\u51FA\u914D\u7F6E\u5F15\u5BFC`);i.write(`${e} \u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\u3002
7
7
  `)}}async function Y(t){for(;;){const e=await t.question(`\u672A\u68C0\u6D4B\u5230 ${d()}\uFF0C\u662F\u5426\u73B0\u5728\u8FDB\u5165\u81EA\u52A8\u6CE8\u518C\u914D\u7F6E\u5F15\u5BFC\uFF1F(Y/n): `);if(U(e))return!0;if(B(e))return!1;i.write(`\u8BF7\u8F93\u5165 Y \u7EE7\u7EED\u914D\u7F6E\uFF0C\u6216\u8F93\u5165 n \u8DF3\u8FC7\u3002
8
8
  `)}}async function q(t){for(;;){const e=await t.question("\u672A\u68C0\u6D4B\u5230\u914D\u7F6E\u6587\u4EF6\uFF0C\u8BF7\u9009\u62E9\u914D\u7F6E\u65B9\u5F0F\uFF1A[1] \u5B8C\u6574\u9010\u6B65\u5F15\u5BFC [2] \u6700\u5C0F\u914D\u7F6E\u793A\u4F8B\uFF08\u751F\u6210\u5360\u4F4D\u7B26\u6A21\u677F\uFF0C\u7A0D\u540E\u624B\u52A8\u586B\u5199\uFF09 (\u9ED8\u8BA4 1): "),r=l(e);if(r===""||r==="1"||r==="full"||r==="\u5B8C\u6574"||r==="\u5F15\u5BFC")return"full";if(r==="2"||r==="minimal"||r==="\u6700\u5C0F"||r==="\u793A\u4F8B")return"minimal";i.write(`\u8BF7\u8F93\u5165 1\uFF08\u5B8C\u6574\u5F15\u5BFC\uFF09\u6216 2\uFF08\u6700\u5C0F\u914D\u7F6E\u793A\u4F8B\uFF09\u3002
9
- `)}}async function b(t,e={}){const r=e.autoRegisterTargets?.[0]||{},n="http://127.0.0.1:8080",a=v.hostname()||"AgentsWork Runtime Bridge",c=r.registerAddr||r.registerIp||"127.0.0.1",u=await h(t,"connectionKey\uFF08\u9762\u677F\u8FDE\u63A5 Bridge \u7684\u5BC6\u94A5\uFF09",e.connectionKey),f=await y(t,"serverUrl\uFF08\u8C03\u5EA6\u4E2D\u5FC3\u5730\u5740\uFF09",r.serverUrl||n),K=await y(t,"instanceName\uFF08\u5B9E\u4F8B\u540D\u79F0\uFF09",r.instanceName||a),R=await h(t,"userKey\uFF08\u7528\u6237 API Key\uFF09",r.userKey),S=await y(t,"registerAddr\uFF08Bridge \u5BF9\u5916\u8BBF\u95EE\u5730\u5740\uFF0C\u652F\u6301 host:port / \u7EAF host / \u5B8C\u6574 URL\uFF09",c),{registerIp:D,...A}=r;return{...e,connectionKey:u,autoRegisterTargets:[{...A,serverUrl:f,instanceName:K,userKey:R,registerAddr:S}]}}async function I(t){return{prompt:t.prompt||x({input:E,output:i,terminal:!0}),shouldClosePrompt:!t.prompt}}async function z(t={}){const e=t.configPath||d(),r=t.generateConnectionKey||k;if(m(e))return"exists";if((t.env||process.env).AWS_BRIDGE_SKIP_SETUP==="true")return await p(e,r),o.info("[runtime-bridge] AWS_BRIDGE_SKIP_SETUP=true\uFF0C\u8DF3\u8FC7\u9996\u6B21\u914D\u7F6E\u5F15\u5BFC"),"skipped";if(!(t.interactive??!!(process.stdin.isTTY&&process.stdout.isTTY)))return await p(e,r),o.info(`[runtime-bridge] \u672A\u68C0\u6D4B\u5230\u914D\u7F6E\u6587\u4EF6: ${e}\uFF1B\u5F53\u524D\u4E3A\u975E\u4EA4\u4E92\u73AF\u5883\uFF0C\u8DF3\u8FC7\u9996\u6B21\u914D\u7F6E\u5F15\u5BFC`),"non-interactive";const{prompt:s,shouldClosePrompt:c}=await I(t);try{if(!await Y(s))return await p(e,r),o.info("[runtime-bridge] \u5DF2\u8DF3\u8FC7\u9996\u6B21\u914D\u7F6E\u5F15\u5BFC"),"skipped";const f=await b(s);return await g(e,f),o.info(`[runtime-bridge] \u5DF2\u5199\u5165\u914D\u7F6E\u6587\u4EF6: ${e}`),"created"}catch(u){const f=u;return o.warn(`[runtime-bridge] \u9996\u6B21\u914D\u7F6E\u5F15\u5BFC\u5931\u8D25: ${f.message}`),"failed"}finally{c&&s.close()}}async function Q(t={}){const e=t.configPath||d();if(!(t.interactive??!!(process.stdin.isTTY&&process.stdout.isTTY)))return o.warn("[runtime-bridge] awsb config \u9700\u8981\u4EA4\u4E92\u5F0F\u7EC8\u7AEF"),"failed";const{prompt:n,shouldClosePrompt:a}=await I(t);try{const s=N(e);if(!m(e)&&await q(n)==="minimal")return i.write(C()),await g(e,w),i.write(`[runtime-bridge] \u5DF2\u5C06\u6700\u5C0F\u914D\u7F6E\u793A\u4F8B\u6A21\u677F\u5199\u5165: ${e}
9
+ `)}}async function I(t,e={}){const r=e.autoRegisterTargets?.[0]||{},n="http://127.0.0.1:8080",a=v.hostname()||"AgentsWork Runtime Bridge",c=r.registerAddr||r.registerIp||"127.0.0.1",u=await b(t,"connectionKey\uFF08\u9762\u677F\u8FDE\u63A5 Bridge \u7684\u5BC6\u94A5\uFF09",e.connectionKey),f=await y(t,"serverUrl\uFF08\u8C03\u5EA6\u4E2D\u5FC3\u5730\u5740\uFF09",r.serverUrl||n),S=await y(t,"instanceName\uFF08\u5B9E\u4F8B\u540D\u79F0\uFF09",r.instanceName||a),A=await b(t,"userKey\uFF08\u7528\u6237 API Key\uFF09",r.userKey),P=await y(t,"registerAddr\uFF08Bridge \u5BF9\u5916\u8BBF\u95EE\u5730\u5740\uFF0C\u652F\u6301 host:port / \u7EAF host / \u5B8C\u6574 URL\uFF09",c),C={...r};return delete C.registerIp,{...e,connectionKey:u,autoRegisterTargets:[{...C,serverUrl:f,instanceName:S,userKey:A,registerAddr:P}]}}async function K(t){return{prompt:t.prompt||x({input:E,output:i,terminal:!0}),shouldClosePrompt:!t.prompt}}async function J(t={}){const e=t.configPath||d(),r=t.generateConnectionKey||k;if(m(e))return"exists";if((t.env||process.env).AWS_BRIDGE_SKIP_SETUP==="true")return await p(e,r),o.info("[runtime-bridge] AWS_BRIDGE_SKIP_SETUP=true\uFF0C\u8DF3\u8FC7\u9996\u6B21\u914D\u7F6E\u5F15\u5BFC"),"skipped";if(!(t.interactive??!!(process.stdin.isTTY&&process.stdout.isTTY)))return await p(e,r),o.info(`[runtime-bridge] \u672A\u68C0\u6D4B\u5230\u914D\u7F6E\u6587\u4EF6: ${e}\uFF1B\u5F53\u524D\u4E3A\u975E\u4EA4\u4E92\u73AF\u5883\uFF0C\u8DF3\u8FC7\u9996\u6B21\u914D\u7F6E\u5F15\u5BFC`),"non-interactive";const{prompt:s,shouldClosePrompt:c}=await K(t);try{if(!await Y(s))return await p(e,r),o.info("[runtime-bridge] \u5DF2\u8DF3\u8FC7\u9996\u6B21\u914D\u7F6E\u5F15\u5BFC"),"skipped";const f=await I(s);return await g(e,f),o.info(`[runtime-bridge] \u5DF2\u5199\u5165\u914D\u7F6E\u6587\u4EF6: ${e}`),"created"}catch(u){const f=u;return o.warn(`[runtime-bridge] \u9996\u6B21\u914D\u7F6E\u5F15\u5BFC\u5931\u8D25: ${f.message}`),"failed"}finally{c&&s.close()}}async function z(t={}){const e=t.configPath||d();if(!(t.interactive??!!(process.stdin.isTTY&&process.stdout.isTTY)))return o.warn("[runtime-bridge] awsb config \u9700\u8981\u4EA4\u4E92\u5F0F\u7EC8\u7AEF"),"failed";const{prompt:n,shouldClosePrompt:a}=await K(t);try{const s=N(e);if(!m(e)&&await q(n)==="minimal")return i.write($()),await g(e,w),i.write(`[runtime-bridge] \u5DF2\u5C06\u6700\u5C0F\u914D\u7F6E\u793A\u4F8B\u6A21\u677F\u5199\u5165: ${e}
10
10
  `),i.write(`[runtime-bridge] \u8BF7\u5C06 <\u5360\u4F4D\u7B26> \u66FF\u6362\u4E3A\u771F\u5B9E\u503C\u540E\u4FDD\u5B58\u3002
11
- `),"created";const u=await b(n,s);return await g(e,u),o.info(`[runtime-bridge] \u5DF2\u66F4\u65B0\u914D\u7F6E\u6587\u4EF6: ${e}`),"configured"}catch(s){const c=s;return o.warn(`[runtime-bridge] \u914D\u7F6E\u5F15\u5BFC\u5931\u8D25: ${c.message}`),"failed"}finally{a&&n.close()}}async function X(t={}){const e=t.configPath||d();i.write(C());try{return await g(e,w),i.write(`[runtime-bridge] \u5DF2\u5C06\u6700\u5C0F\u914D\u7F6E\u793A\u4F8B\u6A21\u677F\u5199\u5165: ${e}
11
+ `),"created";const u=await I(n,s);return await g(e,u),o.info(`[runtime-bridge] \u5DF2\u66F4\u65B0\u914D\u7F6E\u6587\u4EF6: ${e}`),"configured"}catch(s){const c=s;return o.warn(`[runtime-bridge] \u914D\u7F6E\u5F15\u5BFC\u5931\u8D25: ${c.message}`),"failed"}finally{a&&n.close()}}async function Q(t={}){const e=t.configPath||d();i.write($());try{return await g(e,w),i.write(`[runtime-bridge] \u5DF2\u5C06\u6700\u5C0F\u914D\u7F6E\u793A\u4F8B\u6A21\u677F\u5199\u5165: ${e}
12
12
  `),i.write(`[runtime-bridge] \u8BF7\u5C06 <\u5360\u4F4D\u7B26> \u66FF\u6362\u4E3A\u771F\u5B9E\u503C\u540E\u4FDD\u5B58\u3002
13
- `),"created"}catch(r){const n=r;return o.warn(`[runtime-bridge] \u5199\u5165\u793A\u4F8B\u6A21\u677F\u5931\u8D25: ${n.message}`),"failed"}}export{w as MINIMAL_CONFIG_TEMPLATE,Q as configureStartupConfig,z as ensureStartupConfig,C as formatConfigExample,X as printConfigExampleCommand};
13
+ `),"created"}catch(r){const n=r;return o.warn(`[runtime-bridge] \u5199\u5165\u793A\u4F8B\u6A21\u677F\u5931\u8D25: ${n.message}`),"failed"}}export{w as MINIMAL_CONFIG_TEMPLATE,z as configureStartupConfig,J as ensureStartupConfig,$ as formatConfigExample,Q as printConfigExampleCommand};
14
14
 
@@ -1,2 +1,2 @@
1
- import{execFile as T,exec as S}from"node:child_process";import{promisify as y}from"node:util";import c from"node:os";const i=y(T),N=y(S);import{createLogger as b}from"../utils/logger.js";const u=b("system-metrics"),g=120,h=1024**3;let p=null;function B(t){return Math.round(t*100)/100}function d(t){return Number.isFinite(t)?B(Math.min(100,Math.max(0,t))):0}function w(t){return B(t/h)}function f(){return c.cpus().reduce((t,e)=>{const o=Object.values(e.times).reduce((n,s)=>n+s,0);return{idle:t.idle+e.times.idle,total:t.total+o}},{idle:0,total:0})}function M(t){return new Promise(e=>{setTimeout(e,t)})}async function P(){const t=f();await M(g);const e=f(),o=e.total-t.total,n=e.idle-t.idle,s=o<=0?0:(o-n)/o*100,r=c.cpus();return{usagePercent:d(s),coreCount:r.length,model:r[0]?.model||c.arch()}}function x(){const t=c.totalmem(),e=c.freemem(),o=Math.max(0,t-e);return{usedBytes:o,freeBytes:e,totalBytes:t,usagePercent:t>0?d(o/t*100):0}}function k(){return process.env.AWS_SYSTEM_METRICS_STORAGE_PATH||process.cwd()}async function C(t){const o=`Get-CimInstance Win32_LogicalDisk -Filter "DeviceID='${(c.platform()==="win32"?t.slice(0,2).toUpperCase():t).replace(/'/g,"''")}'" | Select-Object Size,FreeSpace | ConvertTo-Json -Compress`,{stdout:n}=await i("powershell",["-NoProfile","-NonInteractive","-Command",o],{encoding:"utf8",timeout:5e3,windowsHide:!0}),s=JSON.parse(n.trim());return{freeBytes:Number(s.FreeSpace||0),totalBytes:Number(s.Size||0)}}async function F(t){const{stdout:e}=await i("df",["-kP",t],{encoding:"utf8",timeout:5e3}),n=e.trim().split(/\r?\n/).filter(Boolean)[1]?.trim().split(/\s+/)||[],s=Number(n[1]||0),r=Number(n[2]||0);return{freeBytes:Number(n[3]||Math.max(0,s-r))*1024,totalBytes:s*1024}}async function v(){const t=k();try{const e=c.platform()==="win32"?await C(t):await F(t),o=Math.max(0,e.totalBytes),n=Math.max(0,e.freeBytes),s=Math.max(0,o-n);return{path:t,usedBytes:s,freeBytes:n,totalBytes:o,usagePercent:o>0?d(s/o*100):0,freeGiB:w(n),totalGiB:w(o)}}catch(e){return u.debug("Failed to collect storage metrics:",e),{path:t,usedBytes:0,freeBytes:0,totalBytes:0,usagePercent:0,freeGiB:0,totalGiB:0}}}async function A(){try{const{stdout:t}=await N("cat /proc/net/dev",{encoding:"utf8",timeout:5e3});let e=0,o=0;for(const n of t.split(/\r?\n/)){const[s,r]=n.split(":");if(!s||!r)continue;const a=s.trim();if(!a||a==="lo")continue;const l=r.trim().split(/\s+/).map(Number);o+=Number.isFinite(l[0])?l[0]:0,e+=Number.isFinite(l[8])?l[8]:0}return{uploadTotalBytes:e,downloadTotalBytes:o}}catch(t){return u.debug("Failed to collect Linux network metrics:",t),null}}async function D(){try{const{stdout:t}=await i("netstat",["-ibn"],{encoding:"utf8",timeout:5e3}),e=new Set;let o=0,n=0;for(const s of t.split(/\r?\n/).slice(1)){const r=s.trim().split(/\s+/),a=r[0];if(!a||a==="lo0"||e.has(a))continue;const l=Number(r[6]||0),m=Number(r[9]||0);n+=Number.isFinite(l)?l:0,o+=Number.isFinite(m)?m:0,e.add(a)}return{uploadTotalBytes:o,downloadTotalBytes:n}}catch(t){return u.debug("Failed to collect macOS network metrics:",t),null}}async function _(){try{const t="Get-NetAdapterStatistics | Select-Object ReceivedBytes,SentBytes | ConvertTo-Json -Compress",{stdout:e}=await i("powershell",["-NoProfile","-NonInteractive","-Command",t],{encoding:"utf8",timeout:5e3,windowsHide:!0}),o=e.trim();if(!o)return null;const n=JSON.parse(o);return(Array.isArray(n)?n:[n]).reduce((r,a)=>({downloadTotalBytes:r.downloadTotalBytes+Number(a.ReceivedBytes||0),uploadTotalBytes:r.uploadTotalBytes+Number(a.SentBytes||0)}),{uploadTotalBytes:0,downloadTotalBytes:0})}catch(t){return u.debug("Failed to collect Windows network metrics:",t),null}}async function G(){const t=c.platform(),e=t==="win32"?await _():t==="darwin"?await D():await A();return{uploadTotalBytes:e?.uploadTotalBytes||0,downloadTotalBytes:e?.downloadTotalBytes||0,sampledAt:Date.now()}}async function I(){const t=await G(),e=p;if(p=t,!e)return{uploadBytesPerSecond:0,downloadBytesPerSecond:0,uploadTotalBytes:t.uploadTotalBytes,downloadTotalBytes:t.downloadTotalBytes};const o=Math.max(1,(t.sampledAt-e.sampledAt)/1e3);return{uploadBytesPerSecond:Math.max(0,Math.round((t.uploadTotalBytes-e.uploadTotalBytes)/o)),downloadBytesPerSecond:Math.max(0,Math.round((t.downloadTotalBytes-e.downloadTotalBytes)/o)),uploadTotalBytes:t.uploadTotalBytes,downloadTotalBytes:t.downloadTotalBytes}}async function U(){const[t,e,o,n]=await Promise.all([P(),Promise.resolve(x()),v(),I()]);return{ok:!0,collectedAt:new Date().toISOString(),cpu:t,memory:e,storage:o,network:n}}export{U as collectSystemMetrics};
1
+ import{execFile as T,exec as S}from"node:child_process";import c from"node:os";import{promisify as y}from"node:util";const i=y(T),N=y(S);import{createLogger as b}from"../utils/logger.js";const u=b("system-metrics"),g=120,h=1024**3;let p=null;function B(t){return Math.round(t*100)/100}function d(t){return Number.isFinite(t)?B(Math.min(100,Math.max(0,t))):0}function w(t){return B(t/h)}function f(){return c.cpus().reduce((t,e)=>{const o=Object.values(e.times).reduce((n,s)=>n+s,0);return{idle:t.idle+e.times.idle,total:t.total+o}},{idle:0,total:0})}function M(t){return new Promise(e=>{setTimeout(e,t)})}async function P(){const t=f();await M(g);const e=f(),o=e.total-t.total,n=e.idle-t.idle,s=o<=0?0:(o-n)/o*100,r=c.cpus();return{usagePercent:d(s),coreCount:r.length,model:r[0]?.model||c.arch()}}function x(){const t=c.totalmem(),e=c.freemem(),o=Math.max(0,t-e);return{usedBytes:o,freeBytes:e,totalBytes:t,usagePercent:t>0?d(o/t*100):0}}function k(){return process.env.AWS_SYSTEM_METRICS_STORAGE_PATH||process.cwd()}async function C(t){const o=`Get-CimInstance Win32_LogicalDisk -Filter "DeviceID='${(c.platform()==="win32"?t.slice(0,2).toUpperCase():t).replace(/'/g,"''")}'" | Select-Object Size,FreeSpace | ConvertTo-Json -Compress`,{stdout:n}=await i("powershell",["-NoProfile","-NonInteractive","-Command",o],{encoding:"utf8",timeout:5e3,windowsHide:!0}),s=JSON.parse(n.trim());return{freeBytes:Number(s.FreeSpace||0),totalBytes:Number(s.Size||0)}}async function F(t){const{stdout:e}=await i("df",["-kP",t],{encoding:"utf8",timeout:5e3}),n=e.trim().split(/\r?\n/).filter(Boolean)[1]?.trim().split(/\s+/)||[],s=Number(n[1]||0),r=Number(n[2]||0);return{freeBytes:Number(n[3]||Math.max(0,s-r))*1024,totalBytes:s*1024}}async function v(){const t=k();try{const e=c.platform()==="win32"?await C(t):await F(t),o=Math.max(0,e.totalBytes),n=Math.max(0,e.freeBytes),s=Math.max(0,o-n);return{path:t,usedBytes:s,freeBytes:n,totalBytes:o,usagePercent:o>0?d(s/o*100):0,freeGiB:w(n),totalGiB:w(o)}}catch(e){return u.debug("Failed to collect storage metrics:",e),{path:t,usedBytes:0,freeBytes:0,totalBytes:0,usagePercent:0,freeGiB:0,totalGiB:0}}}async function A(){try{const{stdout:t}=await N("cat /proc/net/dev",{encoding:"utf8",timeout:5e3});let e=0,o=0;for(const n of t.split(/\r?\n/)){const[s,r]=n.split(":");if(!s||!r)continue;const a=s.trim();if(!a||a==="lo")continue;const l=r.trim().split(/\s+/).map(Number);o+=Number.isFinite(l[0])?l[0]:0,e+=Number.isFinite(l[8])?l[8]:0}return{uploadTotalBytes:e,downloadTotalBytes:o}}catch(t){return u.debug("Failed to collect Linux network metrics:",t),null}}async function D(){try{const{stdout:t}=await i("netstat",["-ibn"],{encoding:"utf8",timeout:5e3}),e=new Set;let o=0,n=0;for(const s of t.split(/\r?\n/).slice(1)){const r=s.trim().split(/\s+/),a=r[0];if(!a||a==="lo0"||e.has(a))continue;const l=Number(r[6]||0),m=Number(r[9]||0);n+=Number.isFinite(l)?l:0,o+=Number.isFinite(m)?m:0,e.add(a)}return{uploadTotalBytes:o,downloadTotalBytes:n}}catch(t){return u.debug("Failed to collect macOS network metrics:",t),null}}async function _(){try{const t="Get-NetAdapterStatistics | Select-Object ReceivedBytes,SentBytes | ConvertTo-Json -Compress",{stdout:e}=await i("powershell",["-NoProfile","-NonInteractive","-Command",t],{encoding:"utf8",timeout:5e3,windowsHide:!0}),o=e.trim();if(!o)return null;const n=JSON.parse(o);return(Array.isArray(n)?n:[n]).reduce((r,a)=>({downloadTotalBytes:r.downloadTotalBytes+Number(a.ReceivedBytes||0),uploadTotalBytes:r.uploadTotalBytes+Number(a.SentBytes||0)}),{uploadTotalBytes:0,downloadTotalBytes:0})}catch(t){return u.debug("Failed to collect Windows network metrics:",t),null}}async function G(){const t=c.platform(),e=t==="win32"?await _():t==="darwin"?await D():await A();return{uploadTotalBytes:e?.uploadTotalBytes||0,downloadTotalBytes:e?.downloadTotalBytes||0,sampledAt:Date.now()}}async function I(){const t=await G(),e=p;if(p=t,!e)return{uploadBytesPerSecond:0,downloadBytesPerSecond:0,uploadTotalBytes:t.uploadTotalBytes,downloadTotalBytes:t.downloadTotalBytes};const o=Math.max(1,(t.sampledAt-e.sampledAt)/1e3);return{uploadBytesPerSecond:Math.max(0,Math.round((t.uploadTotalBytes-e.uploadTotalBytes)/o)),downloadBytesPerSecond:Math.max(0,Math.round((t.downloadTotalBytes-e.downloadTotalBytes)/o)),uploadTotalBytes:t.uploadTotalBytes,downloadTotalBytes:t.downloadTotalBytes}}async function U(){const[t,e,o,n]=await Promise.all([P(),Promise.resolve(x()),v(),I()]);return{ok:!0,collectedAt:new Date().toISOString(),cpu:t,memory:e,storage:o,network:n}}export{U as collectSystemMetrics};
2
2