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,2 @@
1
+ import{Router as b}from"express";import{raw as I}from"express";import{validateToken as u,validateTokenOrLoopback as f}from"../middleware/auth.js";import{getEffective as k,setDefault as j,setOverride as S}from"../services/capability-config.js";import{isValidPluginName as c,pluginManager as g}from"../services/plugin-manager.js";import{createLogger as w}from"../utils/logger.js";const N=w("plugins"),r=b();function i(a){return(e,n)=>{a(e,n).catch(t=>{N.error("[plugins] %s %s \u5931\u8D25: %s",e.method,e.path,t.message),n.headersSent||n.status(500).json({ok:!1,error:t.message})})}}r.get("/plugins/deployed",u,i(async(a,e)=>{const t=(await g.listDeployed()).map(s=>({...s,enabled:k("","plugins",s.pluginName)}));e.json({ok:!0,deployedPlugins:t})})),r.post("/plugins/deployed/default",u,i(async(a,e)=>{const n=String((a.body??{})?.pluginName??"").trim();if(!c(n)){e.status(400).json({ok:!1,error:"pluginName \u975E\u6CD5\uFF08\u987B\u4E3A kebab-case\uFF0C1~64 \u5B57\u7B26\uFF09"});return}const t=String((a.body??{})?.agentId??"").trim(),s=(a.body??{})?.enabled,o=s==null?null:!!s;t?S(t,"plugins",n,o):j("plugins",n,o),e.json({ok:!0,pluginName:n,agentId:t,enabled:o})})),r.post("/plugins/deployed/remove",u,i(async(a,e)=>{const n=String((a.body??{})?.pluginName??"").trim();if(!c(n)){e.status(400).json({ok:!1,error:"pluginName \u975E\u6CD5\uFF08\u987B\u4E3A kebab-case\uFF0C1~64 \u5B57\u7B26\uFF09"});return}const t=await g.removeDeployedPlugin(n);e.status(t.ok?200:400).json(t)})),r.get("/plugins/:agentId",u,i(async(a,e)=>{const n=String(a.params.agentId??"").trim();if(!n){e.status(400).json({ok:!1,error:"agentId is required"});return}const t=await g.list(n);e.json({ok:!0,agentId:n,plugins:t})})),r.post("/plugins/:agentId/install",u,i(async(a,e)=>{const n=String(a.params.agentId??"").trim(),t=a.body??{},s=typeof t.source=="string"?t.source:"",o=t.config&&typeof t.config=="object"&&!Array.isArray(t.config)?Object.fromEntries(Object.entries(t.config).filter(l=>typeof l[1]=="string")):void 0;if(!n){e.status(400).json({ok:!1,error:"agentId is required"});return}const p={action:"install",source:s,...o?{config:o}:{}},d=await g.manage(n,p);e.status(d.ok?200:400).json(d)}));function m(a){return[u,i(async(e,n)=>{const t=String(e.params.agentId??"").trim(),s=String(e.params.name??"").trim();if(!t||t==="deployed"||!c(s)){n.status(400).json({ok:!1,error:"agentId \u4E14 name \u987B\u4E3A\u5408\u6CD5\u63D2\u4EF6\u540D\uFF08kebab-case\uFF0C1~64 \u5B57\u7B26\uFF09"});return}const o=await g.manage(t,{action:a,name:s});n.status(o.ok?200:400).json(o)})]}r.post("/plugins/:agentId/:name/reload",...m("reload")),r.post("/plugins/:agentId/:name/enable",...m("enable")),r.post("/plugins/:agentId/:name/disable",...m("disable")),r.delete("/plugins/:agentId/:name",...m("uninstall")),r.get("/plugins/:agentId/:name/logs",u,i(async(a,e)=>{const n=String(a.params.agentId??"").trim(),t=String(a.params.name??"").trim();if(!n||!c(t)){e.status(400).json({ok:!1,error:"agentId \u4E14 name \u987B\u4E3A\u5408\u6CD5\u63D2\u4EF6\u540D\uFF08kebab-case\uFF0C1~64 \u5B57\u7B26\uFF09"});return}const s=await g.getLogs(n,t);e.status(s.ok?200:404).json(s)})),r.get("/plugins/:agentId/commands",u,i(async(a,e)=>{const n=String(a.params.agentId??"").trim();if(!n){e.status(400).json({ok:!1,error:"agentId is required"});return}const t=await g.getPluginCommands(n);e.json({ok:!0,agentId:n,commands:t.map(s=>({name:s.name,description:s.description??"",argumentHint:s.argumentHint??"",sourcePath:s.sourcePath,plugin:s.plugin}))})})),r.get("/plugin-events/:agentId/events",f,i(async(a,e)=>{const n=String(a.params.agentId??"").trim();if(!n){e.status(400).json({ok:!1,error:"agentId is required"});return}const t=Number(a.query.maxPerKey),s=Number.isFinite(t)&&t>0?t:void 0,o=await g.drainEvents(n,{maxPerKey:s});e.json({ok:!0,agentId:n,...o})})),r.post("/plugin-events/:agentId/callback/:plugin",f,i(async(a,e)=>{const n=String(a.params.agentId??"").trim(),t=String(a.params.plugin??"").trim(),s=a.body??{};if(!n||!t){e.status(400).json({ok:!1,error:"agentId and plugin are required"});return}const o=await g.enqueueExternalEvent(n,t,s);e.status(o.ok?200:400).json(o)})),r.post("/plugins/:agentId/upload",u,I({type:()=>!0,limit:"100mb"}),i(async(a,e)=>{const n=String(a.params.agentId??"").trim();if(!n){e.status(400).json({ok:!1,error:"agentId is required"});return}const t=a.body;if(!Buffer.isBuffer(t)||t.length===0){e.status(400).json({ok:!1,error:"\u7F3A\u5C11 zip \u5185\u5BB9\uFF08raw body, Content-Type: application/zip\uFF09"});return}const s=String(a.query.filename??"plugin.zip");if(!s.toLowerCase().endsWith(".zip")){e.status(400).json({ok:!1,error:"\u4EC5\u652F\u6301 .zip \u63D2\u4EF6\u5305"});return}let o;const p=String(a.query.config??"").trim();if(p)try{const l=JSON.parse(p);if(l&&typeof l=="object"&&!Array.isArray(l))o=Object.fromEntries(Object.entries(l).filter(y=>typeof y[1]=="string"));else{e.status(400).json({ok:!1,error:"config \u5FC5\u987B\u662F JSON \u5BF9\u8C61"});return}}catch{e.status(400).json({ok:!1,error:"config \u4E0D\u662F\u5408\u6CD5\u7684 JSON \u5BF9\u8C61"});return}const d=await g.installFromZip(n,t,s,o);e.status(d.ok?200:400).json(d)}));export{r as pluginsRouter};
2
+
@@ -1,2 +1,2 @@
1
- import{Router as f}from"express";import{promises as n}from"node:fs";import h from"node:path";import{validateToken as m}from"../middleware/auth.js";import{resolvePropertiesTargetPath as d}from"../utils/path-utils.js";const l=f();l.post("/read-properties",m,async(a,o)=>{const{workspacePath:i,propertiesPath:p}=a.body||{};try{const{normalizedWorkspace:t,resolvedTarget:r}=d(i,p);let e="",s=!0;try{e=await n.readFile(r,"utf-8")}catch(c){if(c?.code==="ENOENT")s=!1;else throw c}o.json({ok:!0,workspacePath:t,filePath:r,exists:s,content:e})}catch(t){const r=t;o.status(400).json({error:r?.message||"read properties failed"})}}),l.post("/write-properties",m,async(a,o)=>{const{workspacePath:i,propertiesPath:p,content:t}=a.body||{};if(!t||!String(t).trim()){o.status(400).json({error:"content is required"});return}try{const{normalizedWorkspace:r,resolvedTarget:e}=d(i,p),s=h.dirname(e);await n.mkdir(s,{recursive:!0}),await n.writeFile(e,String(t),"utf-8"),o.json({ok:!0,workspacePath:r,filePath:e})}catch(r){const e=r;o.status(400).json({error:e?.message||"write properties failed"})}});export{l as propertiesRouter};
1
+ import{promises as n}from"node:fs";import f from"node:path";import{Router as h}from"express";import{validateToken as m}from"../middleware/auth.js";import{resolvePropertiesTargetPath as d}from"../utils/path-utils.js";const l=h();l.post("/read-properties",m,async(a,o)=>{const{workspacePath:i,propertiesPath:p}=a.body||{};try{const{normalizedWorkspace:t,resolvedTarget:r}=d(i,p);let e="",s=!0;try{e=await n.readFile(r,"utf-8")}catch(c){if(c?.code==="ENOENT")s=!1;else throw c}o.json({ok:!0,workspacePath:t,filePath:r,exists:s,content:e})}catch(t){const r=t;o.status(400).json({error:r?.message||"read properties failed"})}}),l.post("/write-properties",m,async(a,o)=>{const{workspacePath:i,propertiesPath:p,content:t}=a.body||{};if(!t||!String(t).trim()){o.status(400).json({error:"content is required"});return}try{const{normalizedWorkspace:r,resolvedTarget:e}=d(i,p),s=f.dirname(e);await n.mkdir(s,{recursive:!0}),await n.writeFile(e,String(t),"utf-8"),o.json({ok:!0,workspacePath:r,filePath:e})}catch(r){const e=r;o.status(400).json({error:e?.message||"write properties failed"})}});export{l as propertiesRouter};
2
2
 
@@ -1,7 +1,7 @@
1
1
  import fs from "node:fs";
2
2
  import type { IncomingMessage } from "node:http";
3
3
  import type { Socket } from "node:net";
4
- import type { Router } from "express";
4
+ import { Router } from "express";
5
5
  import * as pty from "node-pty";
6
6
  import WebSocket from "ws";
7
7
  export type PtySessionStatus = "running" | "exited";
@@ -1,4 +1,4 @@
1
- import O from"node:crypto";import A from"node:fs";import c from"node:path";import{Router as N}from"express";import*as U from"node-pty";import{v4 as D}from"uuid";import M,{WebSocketServer as z}from"ws";import{isRuntimeTokenValid as x,validateToken as h}from"../middleware/auth.js";import{isUpgradeAllowed as R}from"../services/access-control.js";import{createLogger as j}from"../utils/logger.js";const p=j("pty"),W=80,F=24,_=2e5,E=30*60*1e3,b=5*60*1e3,$=60*1e3,v=8,B=new Set(["false","halt","nologin","reboot","shutdown","sync","true"]),H=new Set(["sh","dash","ash"]),u=new Map,w=new Map;function X(e=process.env){const t=String(e.AWS_PTY_IDLE_TTL_MS||"").trim();if(!t)return E;const r=Number(t);return!Number.isFinite(r)||r<1e3?E:r}function Y(e=process.platform,t=process.env,r=A.existsSync){if(e==="win32")return{shell:String(t.ComSpec||t.COMSPEC||"").trim()||"powershell.exe",args:[]};const n=String(t.SHELL||"").trim();return{shell:[...H.has(c.basename(n).toLowerCase())?[]:[n],"/bin/bash","/usr/bin/bash",n,"/bin/sh"].find(a=>J(a,r))||"/bin/sh",args:[]}}function J(e,t){const r=e.trim();if(!r)return!1;const n=c.basename(r).toLowerCase();return B.has(n)?!1:!c.isAbsolute(r)||t(r)}function K(e,t=process.platform,r=process.env){const n=String(e||"auto").trim();if(!n||n==="auto")return Y(t,r);const i=new Set(["bash","sh","zsh","fish","pwsh","pwsh.exe","powershell","powershell.exe","cmd","cmd.exe"]),o=(t==="win32"?c.win32.basename(n):c.basename(n)).toLowerCase();if(!i.has(o))throw new Error(`shell is not allowed: ${n}`);return{shell:/^[A-Za-z]:[\\/]/.test(n)||n.startsWith("\\")||n.startsWith("/")?n:t==="win32"?{cmd:"cmd.exe",powershell:"powershell.exe",pwsh:"pwsh.exe"}[o]??n:n,args:[]}}function V(e,t){const r=c.relative(c.resolve(t),c.resolve(e));return r===""||!r.startsWith("..")&&!c.isAbsolute(r)}function Z(e=process.env){return String(e.AWS_PTY_ALLOWED_ROOTS||"").split(c.delimiter).map(t=>t.trim()).filter(Boolean).map(t=>c.resolve(t))}function q(e,t=process.env){const r=String(e||"").trim();if(!r)throw new Error("workspacePath is required");if(!c.isAbsolute(r))throw new Error("workspacePath must be absolute");const n=c.resolve(r);if(!A.statSync(n).isDirectory())throw new Error("workspacePath must be an existing directory");const o=Z(t);if(o.length>0&&!o.some(a=>V(n,a)))throw new Error("workspacePath is outside allowed roots");return n}function T(e,t){const r=Number(e);return!Number.isInteger(r)||r<=0?t:Math.min(r,500)}function G(e){return{...e,TERM:e.TERM||"xterm-256color",COLORTERM:e.COLORTERM||"truecolor"}}function Q(e,t){e.outputBuffer=`${e.outputBuffer}${t}`,e.outputBuffer.length>_&&(e.outputBuffer=e.outputBuffer.slice(-_))}function g(e){return{id:e.id,title:e.title,workspacePath:e.workspacePath,shell:e.shell,cols:e.cols,rows:e.rows,status:e.status,createdAt:e.createdAt,lastActiveAt:e.lastActiveAt,exitCode:e.exitCode,signal:e.signal,attachedClients:e.sockets.size,ownerUserId:e.ownerUserId,tenantId:e.tenantId,projectId:e.projectId}}function I(e,t){e.readyState===M.OPEN&&e.send(JSON.stringify(t))}function k(e,t){for(const r of e.sockets)I(r,t)}function P(e){e.idleTimer&&clearTimeout(e.idleTimer),e.idleTimer=setTimeout(()=>{e.sockets.size===0&&S(e.id,"idle-timeout")},X())}function C(e){e.idleTimer&&(clearTimeout(e.idleTimer),e.idleTimer=null)}function ee(e){if(u.size>=se())throw new Error("maximum PTY sessions reached");const t=q(e.workspacePath),r=K(e.shell),n=T(e.cols,W),i=T(e.rows,F),o=`pty_${D()}`,a=new Date().toISOString(),d=String(e.title||"").trim()||`Terminal ${u.size+1}`,l=U.spawn(r.shell,r.args,{name:"xterm-256color",cols:n,rows:i,cwd:t,env:G(process.env)}),s={id:o,title:d,workspacePath:t,shell:r.shell,cols:n,rows:i,status:"running",createdAt:a,lastActiveAt:a,attachedClients:0,ptyProcess:l,sockets:new Set,outputBuffer:"",idleTimer:null,persistent:e.persistent===!0,ownerUserId:String(e.ownerUserId||"").trim()||void 0,tenantId:String(e.tenantId||"").trim()||void 0,projectId:String(e.projectId||"").trim()||void 0};return l.onData(f=>{s.lastActiveAt=new Date().toISOString(),Q(s,f),k(s,{type:"output",data:f})}),l.onExit(({exitCode:f,signal:m})=>{s.status="exited",s.exitCode=f,s.signal=m,s.lastActiveAt=new Date().toISOString(),k(s,{type:"exit",exitCode:f,signal:m}),s.sockets.size===0&&!s.persistent?P(s):s.persistent&&(s.idleTimer&&clearTimeout(s.idleTimer),s.idleTimer=setTimeout(()=>{S(s.id,"exited-timeout")},ne()))}),u.set(o,s),s.persistent||P(s),te(s,e.preCommand),p.info(`created pty session id=${o}, cwd=${t}, shell=${r.shell}`),g(s)}function te(e,t){const r=typeof t=="string"?t:"";if(!r.trim())return;const n=`${r.replace(/\n/g,"\r").replace(/\r+$/g,"")}\r`;try{e.ptyProcess.write(n)}catch(i){const o=i;p.warn(`failed to inject pty pre-command sessionId=${e.id}: ${o.message}`)}}function re(e=process.env){const t=String(e.AWS_PTY_CONNECT_TOKEN_TTL_MS||"").trim();if(!t)return $;const r=Number(t);return!Number.isFinite(r)||r<5e3||r>10*60*1e3?$:r}function ne(e=process.env){const t=String(e.AWS_PTY_EXITED_TTL_MS||"").trim();if(!t)return b;const r=Number(t);return!Number.isFinite(r)||r<1e3?b:r}function se(e=process.env){const t=String(e.AWS_PTY_MAX_SESSIONS||"").trim();if(!t)return v;const r=Number(t);return!Number.isInteger(r)||r<1||r>100?v:r}function oe(e){if(!e||typeof e!="object")return{workspacePath:void 0};const t=e;return{workspacePath:t.workspacePath,title:t.title,shell:t.shell,cols:t.cols,rows:t.rows,persistent:t.persistent,preCommand:t.preCommand,ownerUserId:t.ownerUserId,tenantId:t.tenantId,projectId:t.projectId}}function ie(){return Array.from(u.values()).map(g)}function ae(e){const t=u.get(e);return t?g(t):void 0}function ce(e){if(!u.has(e))return;const t=`ptyws_${O.randomBytes(32).toString("base64url")}`,r=Date.now()+re();return w.set(t,{sessionId:e,expiresAt:r}),{token:t,expiresAt:new Date(r).toISOString()}}function ue(e,t){const r=w.get(t);return r?r.expiresAt<Date.now()?(w.delete(t),p.warn(`[pty-ws] consumePtyConnectToken: token \u5DF2\u8FC7\u671F, sessionId=${e}, expiredAt=${new Date(r.expiresAt).toISOString()}`),!1):r.sessionId!==e?(p.warn(`[pty-ws] consumePtyConnectToken: sessionId \u4E0D\u5339\u914D, expected=${r.sessionId}, actual=${e}`),!1):(w.delete(t),p.info(`[pty-ws] consumePtyConnectToken: \u6210\u529F, sessionId=${e}`),!0):(p.warn(`[pty-ws] consumePtyConnectToken: token \u4E0D\u5B58\u5728, sessionId=${e}, ptyConnectTokens.size=${w.size}`),!1)}function le(e){for(const[t,r]of w.entries())r.sessionId===e&&w.delete(t)}function S(e,t="closed"){const r=u.get(e);if(!r)return!1;C(r),le(e),k(r,{type:"status",status:"closing",reason:t});for(const n of r.sockets)n.close(1e3,t);return r.sockets.clear(),r.status==="running"&&r.ptyProcess.kill(),u.delete(e),p.info(`closed pty session id=${e}, reason=${t}`),!0}function Pe(e="shutdown"){for(const t of Array.from(u.keys()))S(t,e)}const y=N();y.get("/sessions",h,(e,t)=>{t.json({ok:!0,sessions:ie()})}),y.post("/sessions",h,(e,t)=>{try{const r=ee(oe(e.body));t.status(201).json({ok:!0,session:r})}catch(r){const n=r;t.status(400).json({error:n.message})}}),y.get("/sessions/:sessionId",h,(e,t)=>{const r=ae(e.params.sessionId);if(!r){t.status(404).json({error:"pty session not found"});return}t.json({ok:!0,session:r})}),y.delete("/sessions/:sessionId",h,(e,t)=>{if(!S(e.params.sessionId,"explicit-close")){t.status(404).json({error:"pty session not found"});return}t.json({ok:!0})}),y.post("/sessions/:sessionId/connect-token",h,(e,t)=>{const r=ce(e.params.sessionId);if(!r){t.status(404).json({error:"pty session not found"});return}t.json({ok:!0,...r})});function pe(e){const t=e.toString();try{return JSON.parse(t)}catch{return{type:"input",data:t}}}function de(e,t){C(e),e.sockets.add(t),e.lastActiveAt=new Date().toISOString(),I(t,{type:"status",status:e.status,session:g(e)}),e.outputBuffer&&I(t,{type:"output",data:e.outputBuffer,replay:!0}),t.on("message",r=>{const n=pe(r);if(!n||typeof n!="object")return;const i=n,o=String(i.type||"");if(e.lastActiveAt=new Date().toISOString(),o==="input"){e.ptyProcess.write(String(i.data||""));return}if(o==="resize"){const a=T(i.cols,e.cols),d=T(i.rows,e.rows);e.cols=a,e.rows=d,e.ptyProcess.resize(a,d);return}if(o==="close"){S(e.id,"client-close");return}o==="ping"&&I(t,{type:"pong"})}),t.on("close",()=>{e.sockets.delete(t),e.lastActiveAt=new Date().toISOString(),e.sockets.size===0&&e.status==="running"&&!e.persistent&&P(e)})}function fe(e,t){const r=t.searchParams.get("token")||"";if(r.trim())return r.trim();const n=e.headers["x-runtime-token"];return Array.isArray(n)?n[0]?.trim()||"":typeof n=="string"?n.trim():String(e.headers.authorization||"").match(/^Bearer\s+(.+)$/i)?.[1]?.trim()||""}function Ae(e){const t=new z({noServer:!0});e.on("upgrade",(r,n,i)=>{if(!R(r,n))return;const o=r.headers.host||"localhost",a=new URL(r.url||"/",`http://${o}`),d=a.pathname.match(/^\/pty\/sessions\/([^/]+)\/stream$/);if(!d)return;const l=fe(r,a),s=decodeURIComponent(d[1]||""),f=l?l.length>12?l.substring(0,12)+"...":l:"empty";if(p.info(`[pty-ws] upgrade \u8BF7\u6C42: sessionId=${s}, token=${f}, pathname=${a.pathname}`),!x(l)&&!ue(s,l)){p.warn(`[pty-ws] token \u6821\u9A8C\u5931\u8D25: sessionId=${s}, token=${f}, runtimeTokenValid=${x(l)}, ptySessions.size=${u.size}`),n.write(`HTTP/1.1 401 Unauthorized\r
1
+ import O from"node:crypto";import A from"node:fs";import c from"node:path";import{Router as N}from"express";import*as U from"node-pty";import{v4 as D}from"uuid";import M,{WebSocketServer as z}from"ws";import{isRuntimeTokenValid as x,validateToken as h}from"../middleware/auth.js";import{isUpgradeAllowed as j}from"../services/access-control.js";import{createLogger as R}from"../utils/logger.js";const p=R("pty"),W=80,F=24,_=2e5,E=30*60*1e3,b=5*60*1e3,$=60*1e3,v=8,B=new Set(["false","halt","nologin","reboot","shutdown","sync","true"]),H=new Set(["sh","dash","ash"]),u=new Map,w=new Map;function X(e=process.env){const t=String(e.AWS_PTY_IDLE_TTL_MS||"").trim();if(!t)return E;const r=Number(t);return!Number.isFinite(r)||r<1e3?E:r}function Y(e=process.platform,t=process.env,r=A.existsSync){if(e==="win32")return{shell:String(t.ComSpec||t.COMSPEC||"").trim()||"powershell.exe",args:[]};const n=String(t.SHELL||"").trim();return{shell:[...H.has(c.basename(n).toLowerCase())?[]:[n],"/bin/bash","/usr/bin/bash",n,"/bin/sh"].find(a=>J(a,r))||"/bin/sh",args:[]}}function J(e,t){const r=e.trim();if(!r)return!1;const n=c.basename(r).toLowerCase();return B.has(n)?!1:!c.isAbsolute(r)||t(r)}function K(e,t=process.platform,r=process.env){const n=String(e||"auto").trim();if(!n||n==="auto")return Y(t,r);const i=new Set(["bash","sh","zsh","fish","pwsh","pwsh.exe","powershell","powershell.exe","cmd","cmd.exe"]),o=(t==="win32"?c.win32.basename(n):c.basename(n)).toLowerCase();if(!i.has(o))throw new Error(`shell is not allowed: ${n}`);return{shell:/^[A-Za-z]:[\\/]/.test(n)||n.startsWith("\\")||n.startsWith("/")?n:t==="win32"?{cmd:"cmd.exe",powershell:"powershell.exe",pwsh:"pwsh.exe"}[o]??n:n,args:[]}}function V(e,t){const r=c.relative(c.resolve(t),c.resolve(e));return r===""||!r.startsWith("..")&&!c.isAbsolute(r)}function Z(e=process.env){return String(e.AWS_PTY_ALLOWED_ROOTS||"").split(c.delimiter).map(t=>t.trim()).filter(Boolean).map(t=>c.resolve(t))}function q(e,t=process.env){const r=String(e||"").trim();if(!r)throw new Error("workspacePath is required");if(!c.isAbsolute(r))throw new Error("workspacePath must be absolute");const n=c.resolve(r);if(!A.statSync(n).isDirectory())throw new Error("workspacePath must be an existing directory");const o=Z(t);if(o.length>0&&!o.some(a=>V(n,a)))throw new Error("workspacePath is outside allowed roots");return n}function T(e,t){const r=Number(e);return!Number.isInteger(r)||r<=0?t:Math.min(r,500)}function G(e){return{...e,TERM:e.TERM||"xterm-256color",COLORTERM:e.COLORTERM||"truecolor"}}function Q(e,t){e.outputBuffer=`${e.outputBuffer}${t}`,e.outputBuffer.length>_&&(e.outputBuffer=e.outputBuffer.slice(-_))}function g(e){return{id:e.id,title:e.title,workspacePath:e.workspacePath,shell:e.shell,cols:e.cols,rows:e.rows,status:e.status,createdAt:e.createdAt,lastActiveAt:e.lastActiveAt,exitCode:e.exitCode,signal:e.signal,attachedClients:e.sockets.size,ownerUserId:e.ownerUserId,tenantId:e.tenantId,projectId:e.projectId}}function I(e,t){e.readyState===M.OPEN&&e.send(JSON.stringify(t))}function k(e,t){for(const r of e.sockets)I(r,t)}function P(e){e.idleTimer&&clearTimeout(e.idleTimer),e.idleTimer=setTimeout(()=>{e.sockets.size===0&&S(e.id,"idle-timeout")},X())}function C(e){e.idleTimer&&(clearTimeout(e.idleTimer),e.idleTimer=null)}function ee(e){if(u.size>=se())throw new Error("maximum PTY sessions reached");const t=q(e.workspacePath),r=K(e.shell),n=T(e.cols,W),i=T(e.rows,F),o=`pty_${D()}`,a=new Date().toISOString(),d=String(e.title||"").trim()||`Terminal ${u.size+1}`,l=U.spawn(r.shell,r.args,{name:"xterm-256color",cols:n,rows:i,cwd:t,env:G(process.env)}),s={id:o,title:d,workspacePath:t,shell:r.shell,cols:n,rows:i,status:"running",createdAt:a,lastActiveAt:a,attachedClients:0,ptyProcess:l,sockets:new Set,outputBuffer:"",idleTimer:null,persistent:e.persistent===!0,ownerUserId:String(e.ownerUserId||"").trim()||void 0,tenantId:String(e.tenantId||"").trim()||void 0,projectId:String(e.projectId||"").trim()||void 0};return l.onData(f=>{s.lastActiveAt=new Date().toISOString(),Q(s,f),k(s,{type:"output",data:f})}),l.onExit(({exitCode:f,signal:m})=>{s.status="exited",s.exitCode=f,s.signal=m,s.lastActiveAt=new Date().toISOString(),k(s,{type:"exit",exitCode:f,signal:m}),s.sockets.size===0&&!s.persistent?P(s):s.persistent&&(s.idleTimer&&clearTimeout(s.idleTimer),s.idleTimer=setTimeout(()=>{S(s.id,"exited-timeout")},ne()))}),u.set(o,s),s.persistent||P(s),te(s,e.preCommand),p.info(`created pty session id=${o}, cwd=${t}, shell=${r.shell}`),g(s)}function te(e,t){const r=typeof t=="string"?t:"";if(!r.trim())return;const n=`${r.replace(/\n/g,"\r").replace(/\r+$/g,"")}\r`;try{e.ptyProcess.write(n)}catch(i){const o=i;p.warn(`failed to inject pty pre-command sessionId=${e.id}: ${o.message}`)}}function re(e=process.env){const t=String(e.AWS_PTY_CONNECT_TOKEN_TTL_MS||"").trim();if(!t)return $;const r=Number(t);return!Number.isFinite(r)||r<5e3||r>10*60*1e3?$:r}function ne(e=process.env){const t=String(e.AWS_PTY_EXITED_TTL_MS||"").trim();if(!t)return b;const r=Number(t);return!Number.isFinite(r)||r<1e3?b:r}function se(e=process.env){const t=String(e.AWS_PTY_MAX_SESSIONS||"").trim();if(!t)return v;const r=Number(t);return!Number.isInteger(r)||r<1||r>100?v:r}function oe(e){if(!e||typeof e!="object")return{workspacePath:void 0};const t=e;return{workspacePath:t.workspacePath,title:t.title,shell:t.shell,cols:t.cols,rows:t.rows,persistent:t.persistent,preCommand:t.preCommand,ownerUserId:t.ownerUserId,tenantId:t.tenantId,projectId:t.projectId}}function ie(){return Array.from(u.values()).map(g)}function ae(e){const t=u.get(e);return t?g(t):void 0}function ce(e){if(!u.has(e))return;const t=`ptyws_${O.randomBytes(32).toString("base64url")}`,r=Date.now()+re();return w.set(t,{sessionId:e,expiresAt:r}),{token:t,expiresAt:new Date(r).toISOString()}}function ue(e,t){const r=w.get(t);return r?r.expiresAt<Date.now()?(w.delete(t),p.warn(`[pty-ws] consumePtyConnectToken: token \u5DF2\u8FC7\u671F, sessionId=${e}, expiredAt=${new Date(r.expiresAt).toISOString()}`),!1):r.sessionId!==e?(p.warn(`[pty-ws] consumePtyConnectToken: sessionId \u4E0D\u5339\u914D, expected=${r.sessionId}, actual=${e}`),!1):(w.delete(t),p.info(`[pty-ws] consumePtyConnectToken: \u6210\u529F, sessionId=${e}`),!0):(p.warn(`[pty-ws] consumePtyConnectToken: token \u4E0D\u5B58\u5728, sessionId=${e}, ptyConnectTokens.size=${w.size}`),!1)}function le(e){for(const[t,r]of w.entries())r.sessionId===e&&w.delete(t)}function S(e,t="closed"){const r=u.get(e);if(!r)return!1;C(r),le(e),k(r,{type:"status",status:"closing",reason:t});for(const n of r.sockets)n.close(1e3,t);return r.sockets.clear(),r.status==="running"&&r.ptyProcess.kill(),u.delete(e),p.info(`closed pty session id=${e}, reason=${t}`),!0}function Pe(e="shutdown"){for(const t of Array.from(u.keys()))S(t,e)}const y=N();y.get("/sessions",h,(e,t)=>{t.json({ok:!0,sessions:ie()})}),y.post("/sessions",h,(e,t)=>{try{const r=ee(oe(e.body));t.status(201).json({ok:!0,session:r})}catch(r){const n=r;t.status(400).json({error:n.message})}}),y.get("/sessions/:sessionId",h,(e,t)=>{const r=ae(e.params.sessionId);if(!r){t.status(404).json({error:"pty session not found"});return}t.json({ok:!0,session:r})}),y.delete("/sessions/:sessionId",h,(e,t)=>{if(!S(e.params.sessionId,"explicit-close")){t.status(404).json({error:"pty session not found"});return}t.json({ok:!0})}),y.post("/sessions/:sessionId/connect-token",h,(e,t)=>{const r=ce(e.params.sessionId);if(!r){t.status(404).json({error:"pty session not found"});return}t.json({ok:!0,...r})});function pe(e){const t=e.toString();try{return JSON.parse(t)}catch{return{type:"input",data:t}}}function de(e,t){C(e),e.sockets.add(t),e.lastActiveAt=new Date().toISOString(),I(t,{type:"status",status:e.status,session:g(e)}),e.outputBuffer&&I(t,{type:"output",data:e.outputBuffer,replay:!0}),t.on("message",r=>{const n=pe(r);if(!n||typeof n!="object")return;const i=n,o=String(i.type||"");if(e.lastActiveAt=new Date().toISOString(),o==="input"){e.ptyProcess.write(String(i.data||""));return}if(o==="resize"){const a=T(i.cols,e.cols),d=T(i.rows,e.rows);e.cols=a,e.rows=d,e.ptyProcess.resize(a,d);return}if(o==="close"){S(e.id,"client-close");return}o==="ping"&&I(t,{type:"pong"})}),t.on("close",()=>{e.sockets.delete(t),e.lastActiveAt=new Date().toISOString(),e.sockets.size===0&&e.status==="running"&&!e.persistent&&P(e)})}function fe(e,t){const r=t.searchParams.get("token")||"";if(r.trim())return r.trim();const n=e.headers["x-runtime-token"];return Array.isArray(n)?n[0]?.trim()||"":typeof n=="string"?n.trim():String(e.headers.authorization||"").match(/^Bearer\s+(.+)$/i)?.[1]?.trim()||""}function Ae(e){const t=new z({noServer:!0});e.on("upgrade",(r,n,i)=>{if(!j(r,n))return;const o=r.headers.host||"localhost",a=new URL(r.url||"/",`http://${o}`),d=a.pathname.match(/^\/pty\/sessions\/([^/]+)\/stream$/);if(!d)return;const l=fe(r,a),s=decodeURIComponent(d[1]||""),f=l?l.length>12?l.substring(0,12)+"...":l:"empty";if(p.info(`[pty-ws] upgrade \u8BF7\u6C42: sessionId=${s}, token=${f}, pathname=${a.pathname}`),!x(l)&&!ue(s,l)){p.warn(`[pty-ws] token \u6821\u9A8C\u5931\u8D25: sessionId=${s}, token=${f}, runtimeTokenValid=${x(l)}, ptySessions.size=${u.size}`),n.write(`HTTP/1.1 401 Unauthorized\r
2
2
  \r
3
3
  `),n.destroy();return}const m=u.get(s);if(!m){p.warn(`[pty-ws] session \u4E0D\u5B58\u5728: sessionId=${s}, ptySessions.size=${u.size}, keys=${Array.from(u.keys()).join(",")}`),n.write(`HTTP/1.1 404 Not Found\r
4
4
  \r
@@ -1,2 +1,2 @@
1
- import T from"axios";import{Router as I}from"express";import{getConfiguredConnectionKeys as j}from"../services/auto-register.js";import{validateToken as f}from"../middleware/auth.js";import{claimMcpLaunchBinding as R,getLatestAgentToken as S,getMcpLaunchQueueSize as k}from"../services/mcp-launch-binding-queue.js";import{clearRuntimeBinding as B,getRuntimeAccessToken as p,getRuntimeBindingPublicState as g,getRuntimePairingCode as y,hasRuntimeBinding as v,saveRuntimeBinding as h,validateRuntimeBindingToken as w,validateRuntimePairingCode as A}from"../services/runtime-binding.js";import{createLogger as $}from"../utils/logger.js";const s=$("runtime-binding-route"),d=I();function q(n){return{success:!1,error:"MCP runtime token must be claimed from launch binding; bridge-scoped token refresh is disabled"}}function U(n){const e=n.header("X-Runtime-Token");return e?e.trim():(n.header("Authorization")||"").match(/^Bearer\s+(.+)$/i)?.[1]?.trim()||""}d.get("/binding/status",(n,e)=>{const t=g();e.json({ok:!0,...t,pairingRequired:!t.paired})}),d.post("/binding/pair",(n,e)=>{const{accessToken:t,instanceId:i,userId:o,schedulerBaseUrl:r,pairingCode:a}=n.body||{},u=v(),c=U(n);if(u){if(!w(c)){e.status(401).json({error:"unauthorized",message:"Bridge is already paired. Provide the current runtime token to rotate binding."});return}}else if(!A(a)){e.status(401).json({error:"invalid_pairing_code",message:"Invalid pairing code. Read the current pairing code from the bridge console and try again."});return}try{h({accessToken:String(t||""),instanceId:i?String(i):void 0,userId:o?String(o):void 0,schedulerBaseUrl:r?String(r):void 0}),s.info(`[runtime-bridge] paired with instanceId=${i||"unknown"}`),e.json({ok:!0,...g()})}catch(l){const b=l;e.status(400).json({error:b.message||"pair runtime bridge failed"})}});function m(n){const e=n.ip||n.socket.remoteAddress||"";return e==="127.0.0.1"||e==="::1"||e==="::ffff:127.0.0.1"}d.post("/binding/request-token",async(n,e)=>{if(!m(n)){e.status(403).json({ok:!1,error:"loopback request required"});return}const t=q(n.body||{});if(!t.success||!t.runtimeAccessToken){e.status(400).json({ok:!1,error:t.error||"request runtime token failed"});return}e.json({ok:!0,runtimeAccessToken:t.runtimeAccessToken,updated:t.updated})}),d.post("/binding/claim-agent",(n,e)=>{if(!m(n)){e.status(403).json({ok:!1,error:"loopback request required"});return}const{agentId:t,workspacePath:i,serverUrl:o}=n.body||{};if(!i||!String(i).trim()){e.status(400).json({ok:!1,error:"workspacePath is required"});return}if(!o||!String(o).trim()){e.status(400).json({ok:!1,error:"serverUrl is required"});return}const r=R({agentId:t,workspacePath:i,serverUrl:o});if(!r){e.status(404).json({ok:!1,error:"launch binding not found for workspacePath and serverUrl",queueSize:k(i)});return}C(r.agentId,r.schedulerBaseUrl).catch(()=>{}),e.json({ok:!0,agentId:r.agentId,workspacePath:r.workspacePath,runtimeAccessToken:r.runtimeAccessToken,userId:r.userId,schedulerBaseUrl:r.schedulerBaseUrl,serverUrl:r.serverUrl,mcpHttpUrl:r.mcpHttpUrl,bindingId:r.id,remainingQueueSize:k(i)})}),d.post("/binding/refresh-token",(n,e)=>{if(!m(n)){e.status(403).json({ok:!1,error:"loopback request required"});return}const{agentId:t,currentToken:i,forceRefresh:o}=n.body||{},r=String(t||"").trim();if(!r){e.status(400).json({ok:!1,error:"agentId is required"});return}const a=S(r);if(!a){e.status(404).json({ok:!1,error:"no cached token for agent"});return}const u=String(i||"").trim();if(!o&&u&&a.runtimeAccessToken===u){e.status(409).json({ok:!1,error:"token_unchanged",message:"Bridge cached token is the same as current; token may be revoked server-side"});return}e.json({ok:!0,runtimeAccessToken:a.runtimeAccessToken})}),d.post("/binding/issue",f,(n,e)=>{const{accessToken:t,instanceId:i,userId:o,schedulerBaseUrl:r}=n.body||{},a=String(t||"").trim();if(!a){e.status(400).json({error:"accessToken is required"});return}try{const c=p()!==a;c?(h({accessToken:a,instanceId:i?String(i):void 0,userId:o?String(o):void 0,schedulerBaseUrl:r?String(r):void 0}),s.info(`[runtime-bridge] runtime token redispatched and updated: instanceId=${i||"unknown"}`)):s.info(`[runtime-bridge] runtime token redispatched but unchanged: instanceId=${i||"unknown"}`),e.json({ok:!0,updated:c,...g()})}catch(u){const c=u;e.status(400).json({error:c.message||"issue runtime token failed"})}}),d.post("/binding/unpair",f,(n,e)=>{B(),e.json({ok:!0,...g()})});function Q(){const n=g();if(n.paired){s.info(`[runtime-bridge] runtime binding loaded: instanceId=${n.instanceId||"unknown"}`);return}s.info("[runtime-bridge] bridge is unpaired; sensitive APIs will reject requests until paired"),s.info(`[runtime-bridge] pairing code: ${y()}`)}async function C(n,e){if(!e){s.debug(`[runtime-binding] notifySchedulerBindingClaimed skipped: no schedulerBaseUrl for agentId=${n}`);return}const t=p(e)||j()[0];if(!t){s.warn(`[runtime-binding] notifySchedulerBindingClaimed skipped: no connection key for agentId=${n}`);return}const i=`${e.replace(/\/+$/,"")}/api/runtime/bridge/binding-claimed`;try{await T.post(i,{agentId:n},{headers:{"X-Runtime-Token":t,"Content-Type":"application/json"},timeout:5e3}),s.debug(`[runtime-binding] Notified scheduler: agentId=${n}, url=${i}`)}catch(o){const r=o instanceof Error?o.message:String(o);s.warn(`[runtime-binding] Failed to notify scheduler binding claimed: agentId=${n}, error=${r}`)}}export{Q as logRuntimeBindingStartupState,q as resolveRuntimeTokenRequest,d as runtimeBindingRouter};
1
+ import T from"axios";import{Router as I}from"express";import{validateToken as f}from"../middleware/auth.js";import{getConfiguredConnectionKeys as j}from"../services/auto-register.js";import{claimMcpLaunchBinding as R,getLatestAgentToken as S,getMcpLaunchQueueSize as k}from"../services/mcp-launch-binding-queue.js";import{clearRuntimeBinding as B,getRuntimeAccessToken as p,getRuntimeBindingPublicState as g,getRuntimePairingCode as y,hasRuntimeBinding as v,saveRuntimeBinding as h,validateRuntimeBindingToken as w,validateRuntimePairingCode as A}from"../services/runtime-binding.js";import{createLogger as $}from"../utils/logger.js";const s=$("runtime-binding-route"),d=I();function q(n){return{success:!1,error:"MCP runtime token must be claimed from launch binding; bridge-scoped token refresh is disabled"}}function U(n){const e=n.header("X-Runtime-Token");return e?e.trim():(n.header("Authorization")||"").match(/^Bearer\s+(.+)$/i)?.[1]?.trim()||""}d.get("/binding/status",(n,e)=>{const t=g();e.json({ok:!0,...t,pairingRequired:!t.paired})}),d.post("/binding/pair",(n,e)=>{const{accessToken:t,instanceId:i,userId:o,schedulerBaseUrl:r,pairingCode:a}=n.body||{},u=v(),c=U(n);if(u){if(!w(c)){e.status(401).json({error:"unauthorized",message:"Bridge is already paired. Provide the current runtime token to rotate binding."});return}}else if(!A(a)){e.status(401).json({error:"invalid_pairing_code",message:"Invalid pairing code. Read the current pairing code from the bridge console and try again."});return}try{h({accessToken:String(t||""),instanceId:i?String(i):void 0,userId:o?String(o):void 0,schedulerBaseUrl:r?String(r):void 0}),s.info(`[runtime-bridge] paired with instanceId=${i||"unknown"}`),e.json({ok:!0,...g()})}catch(l){const b=l;e.status(400).json({error:b.message||"pair runtime bridge failed"})}});function m(n){const e=n.ip||n.socket.remoteAddress||"";return e==="127.0.0.1"||e==="::1"||e==="::ffff:127.0.0.1"}d.post("/binding/request-token",async(n,e)=>{if(!m(n)){e.status(403).json({ok:!1,error:"loopback request required"});return}const t=q(n.body||{});if(!t.success||!t.runtimeAccessToken){e.status(400).json({ok:!1,error:t.error||"request runtime token failed"});return}e.json({ok:!0,runtimeAccessToken:t.runtimeAccessToken,updated:t.updated})}),d.post("/binding/claim-agent",(n,e)=>{if(!m(n)){e.status(403).json({ok:!1,error:"loopback request required"});return}const{agentId:t,workspacePath:i,serverUrl:o}=n.body||{};if(!i||!String(i).trim()){e.status(400).json({ok:!1,error:"workspacePath is required"});return}if(!o||!String(o).trim()){e.status(400).json({ok:!1,error:"serverUrl is required"});return}const r=R({agentId:t,workspacePath:i,serverUrl:o});if(!r){e.status(404).json({ok:!1,error:"launch binding not found for workspacePath and serverUrl",queueSize:k(i)});return}C(r.agentId,r.schedulerBaseUrl).catch(()=>{}),e.json({ok:!0,agentId:r.agentId,workspacePath:r.workspacePath,runtimeAccessToken:r.runtimeAccessToken,userId:r.userId,schedulerBaseUrl:r.schedulerBaseUrl,serverUrl:r.serverUrl,mcpHttpUrl:r.mcpHttpUrl,bindingId:r.id,remainingQueueSize:k(i)})}),d.post("/binding/refresh-token",(n,e)=>{if(!m(n)){e.status(403).json({ok:!1,error:"loopback request required"});return}const{agentId:t,currentToken:i,forceRefresh:o}=n.body||{},r=String(t||"").trim();if(!r){e.status(400).json({ok:!1,error:"agentId is required"});return}const a=S(r);if(!a){e.status(404).json({ok:!1,error:"no cached token for agent"});return}const u=String(i||"").trim();if(!o&&u&&a.runtimeAccessToken===u){e.status(409).json({ok:!1,error:"token_unchanged",message:"Bridge cached token is the same as current; token may be revoked server-side"});return}e.json({ok:!0,runtimeAccessToken:a.runtimeAccessToken})}),d.post("/binding/issue",f,(n,e)=>{const{accessToken:t,instanceId:i,userId:o,schedulerBaseUrl:r}=n.body||{},a=String(t||"").trim();if(!a){e.status(400).json({error:"accessToken is required"});return}try{const c=p()!==a;c?(h({accessToken:a,instanceId:i?String(i):void 0,userId:o?String(o):void 0,schedulerBaseUrl:r?String(r):void 0}),s.info(`[runtime-bridge] runtime token redispatched and updated: instanceId=${i||"unknown"}`)):s.info(`[runtime-bridge] runtime token redispatched but unchanged: instanceId=${i||"unknown"}`),e.json({ok:!0,updated:c,...g()})}catch(u){const c=u;e.status(400).json({error:c.message||"issue runtime token failed"})}}),d.post("/binding/unpair",f,(n,e)=>{B(),e.json({ok:!0,...g()})});function Q(){const n=g();if(n.paired){s.info(`[runtime-bridge] runtime binding loaded: instanceId=${n.instanceId||"unknown"}`);return}s.info("[runtime-bridge] bridge is unpaired; sensitive APIs will reject requests until paired"),s.info(`[runtime-bridge] pairing code: ${y()}`)}async function C(n,e){if(!e){s.debug(`[runtime-binding] notifySchedulerBindingClaimed skipped: no schedulerBaseUrl for agentId=${n}`);return}const t=p(e)||j()[0];if(!t){s.warn(`[runtime-binding] notifySchedulerBindingClaimed skipped: no connection key for agentId=${n}`);return}const i=`${e.replace(/\/+$/,"")}/api/runtime/bridge/binding-claimed`;try{await T.post(i,{agentId:n},{headers:{"X-Runtime-Token":t,"Content-Type":"application/json"},timeout:5e3}),s.debug(`[runtime-binding] Notified scheduler: agentId=${n}, url=${i}`)}catch(o){const r=o instanceof Error?o.message:String(o);s.warn(`[runtime-binding] Failed to notify scheduler binding claimed: agentId=${n}, error=${r}`)}}export{Q as logRuntimeBindingStartupState,q as resolveRuntimeTokenRequest,d as runtimeBindingRouter};
2
2
 
@@ -1 +1,2 @@
1
+
1
2
  export declare const skillsRouter: import("express-serve-static-core").Router;
@@ -1,2 +1,2 @@
1
- import{Router as f}from"express";import{validateToken as d}from"../middleware/auth.js";import{discoverCcSwitchConfiguredItems as y,loadCcSwitchSdk as c,runCcSwitchAdapter as g}from"../services/cc-switch-sdk.js";import{syncLegacyStateFromSdk as k}from"../services/instance-init-service.js";import{resolveSkillSourceDir as S,ensureDirectoryExists as m}from"../utils/file-utils.js";import{normalizeSdkAppFlags as p}from"../utils/mcp-utils.js";const u=f(),j=new Set(["acode","claudecode","opencode"]);u.post("/cc-switch/skills/list",d,async(i,a)=>{const{agentId:t}=i.body||{};if(!t){a.status(400).json({error:"agentId is required"});return}try{const e=await c(t),s=await y(e),r=e.getAllSkills(),n=await k(t,e);a.json({ok:!0,agentId:String(t),imported:s,skills:r,state:n.state})}catch(e){const s=e;a.status(400).json({error:s?.message||"list skills failed"})}}),u.post("/cc-switch/skills/get",d,async(i,a)=>{const{agentId:t,skillId:e}=i.body||{};if(!t||!e){a.status(400).json({error:"agentId and skillId are required"});return}try{const r=(await c(t)).getSkillById(String(e));if(!r){a.status(404).json({error:"skill not found"});return}a.json({ok:!0,agentId:String(t),skill:r})}catch(s){const r=s;a.status(400).json({error:r?.message||"get skill failed"})}}),u.post("/cc-switch/skills/create",d,async(i,a)=>{const{agentId:t,skill:e}=i.body||{};if(!t){a.status(400).json({error:"agentId is required"});return}try{const s=S(e);await m(s);const r=await c(t),n=await r.installSkill({sourceDir:s,name:e?.name?String(e.name).trim():void 0,description:e?.description==null?void 0:String(e.description),apps:p(e?.apps)}),o=await k(t,r),l=await g("create-skill",t,n);a.json({ok:!0,agentId:String(t),skill:n,state:o.state,adapterResult:l})}catch(s){const r=s;a.status(400).json({error:r?.message||"create skill failed"})}}),u.post("/cc-switch/skills/update",d,async(i,a)=>{const{agentId:t,skillId:e,skill:s}=i.body||{};if(!t||!e){a.status(400).json({error:"agentId and skillId are required"});return}try{const r=await c(t),n=await r.updateSkill(String(e),{name:s?.name==null?void 0:String(s.name).trim(),description:s?.description==null?void 0:String(s.description),apps:p(s?.apps)}),o=await k(t,r),l=await g("update-skill",t,n);a.json({ok:!0,agentId:String(t),skill:n,state:o.state,adapterResult:l})}catch(r){const n=r;a.status(400).json({error:n?.message||"update skill failed"})}}),u.post("/cc-switch/skills/toggle-app",d,async(i,a)=>{const{agentId:t,skillId:e,appId:s,enabled:r}=i.body||{};if(!t||!e||!s){a.status(400).json({error:"agentId, skillId and appId are required"});return}try{const n=String(s).trim().toLowerCase();if(!j.has(n)){a.status(400).json({error:"appId must be one of acode, claudecode, opencode"});return}const o=await c(t),l=await o.toggleSkillApp(String(e),n,r===!0),w=await k(t,o),I=await g("toggle-skill-app",t,l,o);a.json({ok:!0,agentId:String(t),skill:l,state:w.state,adapterResult:I})}catch(n){const o=n;a.status(400).json({error:o?.message||"toggle skill app failed"})}}),u.post("/cc-switch/skills/delete",d,async(i,a)=>{const{agentId:t,skillId:e}=i.body||{};if(!t||!e){a.status(400).json({error:"agentId and skillId are required"});return}try{const s=await c(t),r=s.getSkillById(String(e));if(!r){a.status(404).json({error:"skill not found"});return}await s.uninstallSkill(String(e));const n=await k(t,s),o=await g("delete-skill",t,r);a.json({ok:!0,agentId:String(t),removedSkill:r,state:n.state,adapterResult:o})}catch(s){const r=s;a.status(400).json({error:r?.message||"delete skill failed"})}}),u.post("/cc-switch/add-skill",d,async(i,a)=>{const{agentId:t,skill:e}=i.body||{};if(!t){a.status(400).json({error:"agentId is required"});return}try{const s=S(e);await m(s);const r=await c(t),n=await r.installSkill({sourceDir:s,name:e?.name?String(e.name).trim():void 0,description:e?.description==null?void 0:String(e.description),apps:p(e?.apps)}),o=await k(t,r),l=await g("create-skill",t,n);a.json({ok:!0,agentId:String(t),skill:n,state:o.state,adapterResult:l})}catch(s){const r=s;a.status(400).json({error:r?.message||"add skill failed"})}}),u.post("/cc-switch/remove-skill",d,async(i,a)=>{const{agentId:t,skillId:e}=i.body||{};if(!t||!e){a.status(400).json({error:"agentId and skillId are required"});return}try{const s=await c(t),r=s.getSkillById(String(e));if(!r){a.status(404).json({error:"skill not found"});return}await s.uninstallSkill(String(e));const n=await k(t,s),o=await g("delete-skill",t,r);a.json({ok:!0,agentId:String(t),removedSkill:r,state:n.state,adapterResult:o})}catch(s){const r=s;a.status(400).json({error:r?.message||"remove skill failed"})}});export{u as skillsRouter};
1
+ import{Router as c}from"express";import{raw as u}from"express";import{validateToken as i}from"../middleware/auth.js";import{getEffective as p,setDefault as y,setOverride as g}from"../services/capability-config.js";import{skillManager as d,isValidSkillName as f}from"../services/skill-manager.js";import{createLogger as b}from"../utils/logger.js";const S=b("skills"),a=c();function n(t){return(e,s)=>{t(e,s).catch(l=>{S.error("[skills] %s %s \u5931\u8D25: %s",e.method,e.path,l.message),s.headersSent||s.status(500).json({ok:!1,error:l.message})})}}a.post("/skills/deployed/list",i,n(async(t,e)=>{const l=d.listDeployed().map(o=>({...o,enabled:p("","skills",o.skillName)}));e.json({ok:!0,deployedSkills:l})})),a.get("/skills/deployed",i,n(async(t,e)=>{const l=d.listDeployed().map(o=>({...o,enabled:p("","skills",o.skillName)}));e.json({ok:!0,deployedSkills:l})})),a.post("/skills/deployed/default",i,n(async(t,e)=>{const s=String((t.body??{})?.skillName??"").trim();if(!f(s)){e.status(400).json({ok:!1,error:"skillName \u975E\u6CD5"});return}const l=String((t.body??{})?.agentId??"").trim(),o=(t.body??{})?.enabled,r=o==null?null:!!o;l?g(l,"skills",s,r):y("skills",s,r),e.json({ok:!0,skillName:s,agentId:l,enabled:r})})),a.post("/skills/deployed/upload",i,u({type:"application/zip",limit:"200mb"}),n(async(t,e)=>{const s=t.body??{},l=Buffer.isBuffer(s)?s:Buffer.from(s??"");if(!l||l.length===0){e.status(400).json({ok:!1,error:"zip \u5185\u5BB9\u4E3A\u7A7A"});return}const o=String(t.query.filename??t.headers["x-filename"]??"skill.zip"),r=String(t.query.sha256??"").trim()||void 0,m=t.query.defaultEnabled!=="false",k=await d.saveSharedSkill(l,String(o),m,r);e.status(k.ok?200:400).json(k)})),a.post("/skills/deployed/remove",i,n(async(t,e)=>{const s=String((t.body??{})?.skillName??"").trim();if(!f(s)){e.status(400).json({ok:!1,error:"skillName \u975E\u6CD5"});return}const l=await d.removeDeployedSkill(s);e.status(l.ok?200:400).json(l)})),a.post("/skills/cc-switch/list",i,n(async(t,e)=>{e.json({ok:!0,skills:[],state:{skills:[],mcpServers:[]}})}));export{a as skillsRouter};
2
2
 
@@ -1,4 +1,4 @@
1
- import{Router as l}from"express";import{validateToken as c}from"../middleware/auth.js";import{createLogger as m}from"../utils/logger.js";import{subAgentManager as d,subAgentStore as g}from"../services/sub-agent-manager-instance.js";const b=m("sub-agents"),p=l();p.get("/sub-agents/:agentId",c,async(r,t)=>{const s=String(r.params.agentId??"");if(!s.trim()){t.status(400).json({ok:!1,error:"agentId is required"});return}try{const e=await g.list(s),n=d.listActiveByParent(s),o=new Set(n.map(a=>a.subId)),i=n.map(a=>({subId:a.subId,parentAgentId:a.parentAgentId,parentSessionId:a.parentSessionId,subagentType:a.subagentType,description:a.description,prompt:a.prompt,status:a.status,startedAt:a.startedAt,contextSnapshot:a.contextSnapshot,availableTools:a.availableTools})),u=e.filter(a=>!o.has(a.subId)&&a.status!=="running"&&a.status!=="pending"),I=await g.read(s);t.json({ok:!0,agentId:s,updatedAt:I.updatedAt,running:i,history:u})}catch(e){const n=e;b.error("[sub-agents] \u5217\u8868\u5931\u8D25: %s",n.message),t.status(500).json({ok:!1,error:n.message})}}),p.get("/sub-agents/:agentId/events",c,async(r,t)=>{const s=String(r.params.agentId??"");if(!s.trim()){t.status(400).json({ok:!1,error:"agentId is required"});return}t.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","X-Accel-Buffering":"no"}),t.write(`: connected
1
+ import{Router as l}from"express";import{validateToken as c}from"../middleware/auth.js";import{subAgentManager as d,subAgentStore as g}from"../services/sub-agent-manager-instance.js";import{createLogger as m}from"../utils/logger.js";const b=m("sub-agents"),p=l();p.get("/sub-agents/:agentId",c,async(r,t)=>{const s=String(r.params.agentId??"");if(!s.trim()){t.status(400).json({ok:!1,error:"agentId is required"});return}try{const e=await g.list(s),n=d.listActiveByParent(s),o=new Set(n.map(a=>a.subId)),i=n.map(a=>({subId:a.subId,parentAgentId:a.parentAgentId,parentSessionId:a.parentSessionId,subagentType:a.subagentType,description:a.description,prompt:a.prompt,status:a.status,startedAt:a.startedAt,contextSnapshot:a.contextSnapshot,availableTools:a.availableTools})),u=e.filter(a=>!o.has(a.subId)&&a.status!=="running"&&a.status!=="pending"),I=await g.read(s);t.json({ok:!0,agentId:s,updatedAt:I.updatedAt,running:i,history:u})}catch(e){const n=e;b.error("[sub-agents] \u5217\u8868\u5931\u8D25: %s",n.message),t.status(500).json({ok:!1,error:n.message})}}),p.get("/sub-agents/:agentId/events",c,async(r,t)=>{const s=String(r.params.agentId??"");if(!s.trim()){t.status(400).json({ok:!1,error:"agentId is required"});return}t.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","X-Accel-Buffering":"no"}),t.write(`: connected
2
2
 
3
3
  `);const e=d.listActiveByParent(s);e.length>0&&t.write(`data: ${JSON.stringify({type:"snapshot",agentId:s,timestamp:new Date().toISOString(),data:{running:e.map(i=>({subId:i.subId,subagentType:i.subagentType,description:i.description,status:i.status,startedAt:i.startedAt}))}})}
4
4
 
@@ -1,2 +1,2 @@
1
- import{Router as g}from"express";import{createLogger as I}from"../utils/logger.js";import{validateToken as s}from"../middleware/auth.js";import{setTaskContext as m,clearTaskContext as x,getTaskContext as p,startWatching as u,stopWatching as j}from"../services/workspaceTaskChangeWatcher.js";const a=I("task-context"),c=g();c.post("/task-context",s,async(o,r)=>{try{const{agentId:t,taskInstanceId:e,taskNodeId:i,tenantId:k,workspacePath:n,projectId:d}=o.body||{};if(!t||!e||!i||!k||!n){r.status(400).json({error:"agentId, taskInstanceId, taskNodeId, tenantId, workspacePath are required"});return}await u(String(n).trim()),m({agentId:String(t).trim(),taskInstanceId:String(e).trim(),taskNodeId:String(i).trim(),tenantId:String(k).trim(),workspacePath:String(n).trim(),projectId:String(d||"").trim()}),a.info(`Task context set via API: agent=${t}, taskInstance=${e}`),r.json({ok:!0})}catch(t){const e=t;a.error(`Failed to set task context: ${e.message}`),r.status(500).json({error:e.message})}}),c.delete("/task-context",s,async(o,r)=>{try{await j(),x(),a.info("Task context cleared via API"),r.json({ok:!0})}catch(t){const e=t;a.error(`Failed to clear task context: ${e.message}`),r.status(500).json({error:e.message})}}),c.get("/task-context",s,async(o,r)=>{const t=p();r.json({ok:!0,context:t})});export{c as taskContextRouter};
1
+ import{Router as g}from"express";import{validateToken as s}from"../middleware/auth.js";import{setTaskContext as I,clearTaskContext as m,getTaskContext as x,startWatching as p,stopWatching as u}from"../services/workspaceTaskChangeWatcher.js";import{createLogger as j}from"../utils/logger.js";const a=j("task-context"),c=g();c.post("/task-context",s,async(o,r)=>{try{const{agentId:t,taskInstanceId:e,taskNodeId:i,tenantId:k,workspacePath:n,projectId:d}=o.body||{};if(!t||!e||!i||!k||!n){r.status(400).json({error:"agentId, taskInstanceId, taskNodeId, tenantId, workspacePath are required"});return}await p(String(n).trim()),I({agentId:String(t).trim(),taskInstanceId:String(e).trim(),taskNodeId:String(i).trim(),tenantId:String(k).trim(),workspacePath:String(n).trim(),projectId:String(d||"").trim()}),a.info(`Task context set via API: agent=${t}, taskInstance=${e}`),r.json({ok:!0})}catch(t){const e=t;a.error(`Failed to set task context: ${e.message}`),r.status(500).json({error:e.message})}}),c.delete("/task-context",s,async(o,r)=>{try{await u(),m(),a.info("Task context cleared via API"),r.json({ok:!0})}catch(t){const e=t;a.error(`Failed to clear task context: ${e.message}`),r.status(500).json({error:e.message})}}),c.get("/task-context",s,async(o,r)=>{const t=x();r.json({ok:!0,context:t})});export{c as taskContextRouter};
2
2
 
@@ -1,10 +1,10 @@
1
- import{spawn as Xe}from"node:child_process";import{promises as N}from"node:fs";import Qe from"node:os";import j from"node:path";import{TextDecoder as ee}from"node:util";import{Router as Ve}from"express";import{v4 as Ge}from"uuid";import be from"axios";import{adapterRegistry as w,getToolActionInfo as ye,isTransientClipboardPasteFilePath as Ce,redactTransientClipboardPastePaths as q,registerSdkProviders as Je,resolveSdkProviderIdByCommand as Ye}from"../adapter/index.js";import{validateToken as I}from"../middleware/auth.js";import{getActiveBridgeHttpPort as Ze,getAcodeDataHome as _e}from"../config.js";import{getAgentProcessManager as he}from"../services/agent-process-manager.js";import{setAgentFeatures as et,getAgentFeatures as tt,isFeatureEnabled as $e,LAUNCH_ITEM_FEATURE_KEY as nt,HIRE_FEATURE_KEY as ot}from"../services/instance-features.js";import{setPanelEnvVars as rt}from"../services/panel-env.js";import{setChangeCacheRetentionDays as st}from"../services/change-cache-retention.js";import{getAiConfigService as it}from"../services/cc-switch-sdk.js";import{prepareAcodeInstanceConfig as at,redactForLog as te}from"../services/instance-ai-config-service.js";import{enqueueMcpLaunchBinding as ct}from"../services/mcp-launch-binding-queue.js";import{resolveSchedulerBaseUrlFromToken as De}from"../services/auto-register.js";import{findClaudeCodeProcesses as ut,isProcessRunning as dt}from"../services/process-detector.js";import{bridgeEventBuffer as Re,sendOutput as X,sendQuestionRequest as lt,sendToolAuthRequest as mt,sendStatus as _}from"../services/session-output.js";import{getAllPushStats as ft,startHeartbeatScheduler as pt}from"../services/event-delta-pusher.js";import{forgetSession as v,onSdkToolUseEnd as gt,onSdkToolUseStart as yt}from"../services/sdk-tool-file-change-recorder.js";import{findPersistedSessionByAgentId as ht,removePersistedSession as F,savePersistedSessions as It,updatePersistedSessionAutoCommands as St,updatePersistedSessionRuntimeState as At,upsertPersistedSession as Tt}from"../services/terminal-persistence.js";import{getInstanceAiConfigDebugLogger as kt}from"../utils/instance-ai-config-debug-logger.js";import{logger as h}from"../utils/logger.js";const S=Ve();function Pe(e){const n=e.header("X-Runtime-Token");return n&&n.trim()?n.trim():(e.header("Authorization")||"").match(/^Bearer\s+(.+)$/i)?.[1]?.trim()||void 0}const f=new Map,wt=45e3,ne=new Map;function bt(e){if(ne.has(e))return;const n=setInterval(()=>{const t=f.get(e);if(!t){L(e);return}const o=t.currentRuntimeStatus;if(o!=="thinking"&&o!=="tool_using"&&o!=="compacting"){L(e);return}_(t.agentId,e,o,void 0,void 0,{runtimeAccessToken:t.runtimeAccessToken,schedulerBaseUrl:t.schedulerBaseUrl}).catch(()=>{})},wt);ne.set(e,n)}function L(e){const n=ne.get(e);n&&(clearInterval(n),ne.delete(e))}const Ee=4e3,Ct=`
1
+ import{spawn as Xe}from"node:child_process";import{promises as N}from"node:fs";import Qe from"node:os";import j from"node:path";import{TextDecoder as ee}from"node:util";import we from"axios";import{Router as Ve}from"express";import{v4 as Ge}from"uuid";import{adapterRegistry as b,getToolActionInfo as ye,isTransientClipboardPasteFilePath as Ce,redactTransientClipboardPastePaths as q,registerSdkProviders as Je,resolveSdkProviderIdByCommand as Ye}from"../adapter/index.js";import{getActiveBridgeHttpPort as Ze,getAcodeDataHome as _e}from"../config.js";import{validateToken as I}from"../middleware/auth.js";import{getAgentProcessManager as he}from"../services/agent-process-manager.js";import{createAiConfigService as et}from"../services/ai-config-service.js";import{resolveSchedulerBaseUrlFromToken as $e}from"../services/auto-register.js";import{setChangeCacheRetentionDays as tt}from"../services/change-cache-retention.js";import{getAllPushStats as nt,startHeartbeatScheduler as ot}from"../services/event-delta-pusher.js";import{prepareAcodeInstanceConfig as rt,redactForLog as te}from"../services/instance-ai-config-service.js";import{setAgentFeatures as st,setAgentCapabilities as it,getAgentFeatures as at,isFeatureEnabled as De,LAUNCH_ITEM_FEATURE_KEY as ct,HIRE_FEATURE_KEY as ut}from"../services/instance-features.js";import{enqueueMcpLaunchBinding as dt}from"../services/mcp-launch-binding-queue.js";import{setPanelEnvVars as lt}from"../services/panel-env.js";import{findClaudeCodeProcesses as mt,isProcessRunning as ft}from"../services/process-detector.js";import{forgetSession as v,onSdkToolUseEnd as pt,onSdkToolUseStart as gt}from"../services/sdk-tool-file-change-recorder.js";import{bridgeEventBuffer as Re,sendOutput as X,sendQuestionRequest as yt,sendToolAuthRequest as ht,sendStatus as _}from"../services/session-output.js";import{findPersistedSessionByAgentId as It,removePersistedSession as F,savePersistedSessions as St,updatePersistedSessionAutoCommands as At,updatePersistedSessionRuntimeState as Tt,upsertPersistedSession as kt}from"../services/terminal-persistence.js";import{getInstanceAiConfigDebugLogger as bt}from"../utils/instance-ai-config-debug-logger.js";import{logger as h}from"../utils/logger.js";const S=Ve();function Pe(e){const n=e.header("X-Runtime-Token");return n&&n.trim()?n.trim():(e.header("Authorization")||"").match(/^Bearer\s+(.+)$/i)?.[1]?.trim()||void 0}const f=new Map,wt=45e3,ne=new Map;function Ct(e){if(ne.has(e))return;const n=setInterval(()=>{const t=f.get(e);if(!t){L(e);return}const o=t.currentRuntimeStatus;if(o!=="thinking"&&o!=="tool_using"&&o!=="compacting"){L(e);return}_(t.agentId,e,o,void 0,void 0,{runtimeAccessToken:t.runtimeAccessToken,schedulerBaseUrl:t.schedulerBaseUrl}).catch(()=>{})},wt);ne.set(e,n)}function L(e){const n=ne.get(e);n&&(clearInterval(n),ne.delete(e))}const Ee=4e3,_t=`
2
2
 
3
3
  \u8BF7\u6C42\u4F53:
4
- `;function Ie(e){if(e==null||typeof e!="object"||Array.isArray(e))return;const n=e,t={};return typeof n.model=="string"&&n.model.trim()&&(t.model=n.model.trim()),typeof n.baseURL=="string"&&n.baseURL.trim()&&(t.baseURL=n.baseURL.trim()),typeof n.apiKey=="string"&&n.apiKey.trim()&&(t.apiKey=n.apiKey.trim()),typeof n.effort=="string"&&n.effort.trim()&&(t.effort=n.effort.trim()),t}const _t=`
4
+ `;function Ie(e){if(e==null||typeof e!="object"||Array.isArray(e))return;const n=e,t={};return typeof n.model=="string"&&n.model.trim()&&(t.model=n.model.trim()),typeof n.baseURL=="string"&&n.baseURL.trim()&&(t.baseURL=n.baseURL.trim()),typeof n.apiKey=="string"&&n.apiKey.trim()&&(t.apiKey=n.apiKey.trim()),typeof n.effort=="string"&&n.effort.trim()&&(t.effort=n.effort.trim()),t}const $t=`
5
5
 
6
6
  \u8BF7\u6C42\u5934:
7
- `,K=new Set;async function $t(e,n){const t=[],o=[],r=j.join(e,".agentswork","memory");try{const c=(await N.readdir(r)).filter(u=>u.endsWith(".json")),d=await Promise.all(c.map(async u=>{try{const l=await N.readFile(j.join(r,u),"utf-8");return JSON.parse(l)}catch{return h.warn("[loadAgentStartupMemories] Failed to parse memory file: %s",j.join(r,u)),null}}));for(const u of d)if(u?.by_uri)for(const l of Object.values(u.by_uri)){const m=l.memory_type||"memory",p=(l.content||"").trim();p&&(m==="recently_memory"?t.push({title:l.title,content:p,uri:l.uri||""}):m==="agent_memory"&&o.push({title:l.title,content:p,uri:l.uri||""}))}}catch{h.debug("[loadAgentStartupMemories] \u65E0\u6CD5\u8BFB\u53D6\u8BB0\u5FC6\u76EE\u5F55: %s",r)}if(t.length===0&&o.length===0&&n?.schedulerBaseUrl&&n?.runtimeAccessToken&&n?.agentId){const a=`${n.schedulerBaseUrl.replace(/\/+$/,"")}/mcp/call`,c={"Content-Type":"application/json","X-Runtime-Token":n.runtimeAccessToken,Authorization:`Bearer ${n.runtimeAccessToken}`},d=["recently_memory","agent_memory"],u=await Promise.allSettled(d.map(l=>fetch(a,{method:"POST",headers:c,body:JSON.stringify({tool:"list_memories",arguments:{agentId:n.agentId,memory_type:l}})}).then(m=>{if(!m.ok)throw new Error(`Server returned ${m.status}`);return m.json()})));for(let l=0;l<u.length;l++){const m=u[l];if(m.status!=="fulfilled")continue;const p=m.value;if(!Array.isArray(p))continue;const T=d[l]==="recently_memory"?t:o;for(const y of p){const g=(y.content||"").trim();g&&T.push({title:y.title,content:g,uri:y.uri||""})}}(t.length>0||o.length>0)&&h.info(`[loadAgentStartupMemories] Loaded ${t.length} task(s) and ${o.length} memory(s) from server for ${n.agentId}`)}const s=10;t.sort((a,c)=>c.uri.localeCompare(a.uri)),o.sort((a,c)=>c.uri.localeCompare(a.uri));const i=[];if(t.length>0){const c=t.slice(0,s).map((d,u)=>`${d.title?`\u3010${d.title}\u3011`:`\u6761\u76EE ${u+1}`}
7
+ `,K=new Set;async function Dt(e,n){const t=[],o=[],r=j.join(e,".agentswork","memory");try{const c=(await N.readdir(r)).filter(u=>u.endsWith(".json")),d=await Promise.all(c.map(async u=>{try{const l=await N.readFile(j.join(r,u),"utf-8");return JSON.parse(l)}catch{return h.warn("[loadAgentStartupMemories] Failed to parse memory file: %s",j.join(r,u)),null}}));for(const u of d)if(u?.by_uri)for(const l of Object.values(u.by_uri)){const m=l.memory_type||"memory",p=(l.content||"").trim();p&&(m==="recently_memory"?t.push({title:l.title,content:p,uri:l.uri||""}):m==="agent_memory"&&o.push({title:l.title,content:p,uri:l.uri||""}))}}catch{h.debug("[loadAgentStartupMemories] \u65E0\u6CD5\u8BFB\u53D6\u8BB0\u5FC6\u76EE\u5F55: %s",r)}if(t.length===0&&o.length===0&&n?.schedulerBaseUrl&&n?.runtimeAccessToken&&n?.agentId){const a=`${n.schedulerBaseUrl.replace(/\/+$/,"")}/mcp/call`,c={"Content-Type":"application/json","X-Runtime-Token":n.runtimeAccessToken,Authorization:`Bearer ${n.runtimeAccessToken}`},d=["recently_memory","agent_memory"],u=await Promise.allSettled(d.map(l=>fetch(a,{method:"POST",headers:c,body:JSON.stringify({tool:"list_memories",arguments:{agentId:n.agentId,memory_type:l}})}).then(m=>{if(!m.ok)throw new Error(`Server returned ${m.status}`);return m.json()})));for(let l=0;l<u.length;l++){const m=u[l];if(m.status!=="fulfilled")continue;const p=m.value;if(!Array.isArray(p))continue;const T=d[l]==="recently_memory"?t:o;for(const y of p){const g=(y.content||"").trim();g&&T.push({title:y.title,content:g,uri:y.uri||""})}}(t.length>0||o.length>0)&&h.info(`[loadAgentStartupMemories] Loaded ${t.length} task(s) and ${o.length} memory(s) from server for ${n.agentId}`)}const s=10;t.sort((a,c)=>c.uri.localeCompare(a.uri)),o.sort((a,c)=>c.uri.localeCompare(a.uri));const i=[];if(t.length>0){const c=t.slice(0,s).map((d,u)=>`${d.title?`\u3010${d.title}\u3011`:`\u6761\u76EE ${u+1}`}
8
8
  ${d.content}`);i.push(`\u3010\u77ED\u671F\u8BB0\u5FC6\u3011
9
9
  ${c.join(`
10
10
 
@@ -14,41 +14,41 @@ ${c.join(`
14
14
 
15
15
  `)}`),o.length>s&&i.push(`... \u53CA\u53E6\u5916 ${o.length-s} \u6761 agent \u8BA4\u77E5`)}if(i.length!==0)return i.join(`
16
16
 
17
- `)}function Dt(e,n){return e!=="acode"?{supported:!1,statusCode:400,error:"context reset without restart is only supported by ACode"}:n?{supported:!0}:{supported:!1,statusCode:500,error:"ACode adapter does not expose resetContext"}}function Rt(e){return e!=="acode"}function Pt(e){const n=typeof e=="object"&&e!==null&&"suppressStatus"in e&&e.suppressStatus===!0,t=typeof e=="object"&&e!==null&&"reason"in e&&typeof e.reason=="string"&&e.reason.trim()?e.reason.trim():void 0;return{statusNotified:!n,reason:t}}function oe(e){const n=e?.usage;if(!n)return;const t=Number.isFinite(n.inputTokens)?n.inputTokens:0,o=Number.isFinite(n.outputTokens)?n.outputTokens:0;if(t<=0&&o<=0&&!n.contextLimit&&!n.maxOutput&&!n.inputLimit&&!n.compactionThreshold)return;const r={inputTokens:t,outputTokens:o,...n.contextLimit?{contextLimit:n.contextLimit}:{},...n.maxOutput?{maxOutput:n.maxOutput}:{},...n.inputLimit?{inputLimit:n.inputLimit}:{},...n.compactionThreshold?{compactionThreshold:n.compactionThreshold}:{},...n.cacheHitTokens?{cacheHitTokens:n.cacheHitTokens}:{},...n.cacheMissTokens?{cacheMissTokens:n.cacheMissTokens}:{}};return process.env.ACODE_TOKEN_DEBUG==="1"&&(r.inputTokens>0||r.outputTokens>0||r.cacheHitTokens!==void 0||r.cacheMissTokens!==void 0)&&console.log(`[TokenDebug][Terminal] resolveStatusChangeUsage: input=${r.inputTokens} output=${r.outputTokens} cacheHit=${r.cacheHitTokens??"(none)"} cacheMiss=${r.cacheMissTokens??"(none)"} actionType=${e?.actionType??"(none)"}`),r}function Et(e,n){const t=String(e||"").trim().toLowerCase(),o=String(n?.actionType||"").trim().toLowerCase();return t==="tool_using"&&o==="idle"?n?{status:"waiting_input",actionInfo:n}:{status:"waiting_input"}:n?{status:e,actionInfo:n}:{status:e}}const Q=new Map,Mt="utf-8",Me="utf-8",Le=300,xe=6e4;function V(e){return String(e).padStart(2,"0")}function Lt(e,n=new Date){const t=n.getFullYear(),o=V(n.getMonth()+1),r=V(n.getDate()),s=V(n.getHours()),i=V(n.getMinutes()),a=`${t}${o}${r}-${s}${i}${V(n.getSeconds())}-${String(n.getMilliseconds()).padStart(3,"0")}`;return j.join(_e(),"cmd-dist",e,`${t}-${o}-${r}`,s,i,`${a}-cmd.out`)}function xt(e){if(!e)return 0;const n=e.replace(/\r\n/g,`
17
+ `)}function Rt(e,n){return e!=="acode"?{supported:!1,statusCode:400,error:"context reset without restart is only supported by ACode"}:n?{supported:!0}:{supported:!1,statusCode:500,error:"ACode adapter does not expose resetContext"}}function Pt(e){return e!=="acode"}function Et(e){const n=typeof e=="object"&&e!==null&&"suppressStatus"in e&&e.suppressStatus===!0,t=typeof e=="object"&&e!==null&&"reason"in e&&typeof e.reason=="string"&&e.reason.trim()?e.reason.trim():void 0;return{statusNotified:!n,reason:t}}function oe(e){const n=e?.usage;if(!n)return;const t=Number.isFinite(n.inputTokens)?n.inputTokens:0,o=Number.isFinite(n.outputTokens)?n.outputTokens:0;if(t<=0&&o<=0&&!n.contextLimit&&!n.maxOutput&&!n.inputLimit&&!n.compactionThreshold)return;const r={inputTokens:t,outputTokens:o,...n.contextLimit?{contextLimit:n.contextLimit}:{},...n.maxOutput?{maxOutput:n.maxOutput}:{},...n.inputLimit?{inputLimit:n.inputLimit}:{},...n.compactionThreshold?{compactionThreshold:n.compactionThreshold}:{},...n.cacheHitTokens?{cacheHitTokens:n.cacheHitTokens}:{},...n.cacheMissTokens?{cacheMissTokens:n.cacheMissTokens}:{}};return process.env.ACODE_TOKEN_DEBUG==="1"&&(r.inputTokens>0||r.outputTokens>0||r.cacheHitTokens!==void 0||r.cacheMissTokens!==void 0)&&console.log(`[TokenDebug][Terminal] resolveStatusChangeUsage: input=${r.inputTokens} output=${r.outputTokens} cacheHit=${r.cacheHitTokens??"(none)"} cacheMiss=${r.cacheMissTokens??"(none)"} actionType=${e?.actionType??"(none)"}`),r}function Mt(e,n){const t=String(e||"").trim().toLowerCase(),o=String(n?.actionType||"").trim().toLowerCase();return t==="tool_using"&&o==="idle"?n?{status:"waiting_input",actionInfo:n}:{status:"waiting_input"}:n?{status:e,actionInfo:n}:{status:e}}const Q=new Map,Lt="utf-8",Me="utf-8",Le=300,xe=6e4;function V(e){return String(e).padStart(2,"0")}function xt(e,n=new Date){const t=n.getFullYear(),o=V(n.getMonth()+1),r=V(n.getDate()),s=V(n.getHours()),i=V(n.getMinutes()),a=`${t}${o}${r}-${s}${i}${V(n.getSeconds())}-${String(n.getMilliseconds()).padStart(3,"0")}`;return j.join(_e(),"cmd-dist",e,`${t}-${o}-${r}`,s,i,`${a}-cmd.out`)}function Ut(e){if(!e)return 0;const n=e.replace(/\r\n/g,`
18
18
  `).replace(/\r/g,`
19
19
  `),t=n.endsWith(`
20
20
  `)?n.slice(0,-1):n;return t?t.split(`
21
- `).length:1}function Ut(e,n=Le){return`\r
21
+ `).length:1}function jt(e,n=Le){return`\r
22
22
  [ACode] \u547D\u4EE4\u8F93\u51FA\u8D85\u8FC7 ${n} \u884C\uFF0C\u5B8C\u6574\u8F93\u51FA\u5DF2\u5199\u5165: ${e}\r
23
23
  [ACode] Agent \u53EF\u81EA\u884C\u8BFB\u53D6\u8BE5\u6587\u4EF6\uFF0C\u6216\u5728\u8BE5\u6587\u4EF6\u4E2D\u641C\u7D22\u9700\u8981\u7684\u5185\u5BB9\u3002\r
24
- `}function jt(e=xe){return`\r
24
+ `}function Bt(e=xe){return`\r
25
25
  [ACode] \u547D\u4EE4\u8D85\u8FC7 ${Math.round(e/1e3)} \u79D2\u6CA1\u6709\u65B0\u7684\u8F93\u51FA\uFF0C\u5DF2\u505C\u6B62\u6267\u884C\u5E76\u4FDD\u7559\u6B64\u524D\u8F93\u51FA\u3002\r
26
- `}async function Ue(e){const n=e.outputPath||Lt(e.agentId,e.startedAt);return e.outputPath=n,await N.mkdir(j.dirname(n),{recursive:!0}),await N.writeFile(n,e.chunks.join(""),"utf-8"),n}function Bt(e){return String(e??"").replace(/\r/g,`
27
- `).trim()}function Ot(e=process.platform,n=process.env){const t=n.AWS_TERMINAL_OUTPUT_ENCODING?.trim();return t||(e==="win32"?Mt:Me)}function je(e=Ot()){if(e!=="utf-8")try{return new ee(e,{fatal:!1})}catch{return new ee(Me,{fatal:!1})}return Nt()}function Nt(){let e=null,n=null,t=null;const o=[];function r(s){try{return new ee(s,{fatal:!1})}catch{return new ee("utf-8",{fatal:!1})}}return{decode(s,i){if(s!=null&&o.push(s instanceof ArrayBuffer?Buffer.from(s):Buffer.isBuffer(s)?s:Buffer.from(s.buffer,s.byteOffset,s.byteLength)),t==="gb18030")return n||(n=r("gb18030")),n.decode(s,i);e||(e=r("utf-8"));const a=e.decode(s,i);if(t===null&&a.includes("\uFFFD")){t="gb18030",n=r("gb18030");const c=Buffer.concat(o);return n.decode(c)}return t===null&&!i?.stream&&(t="utf-8"),a}}}function re(e,n,t=!1){return t?e.decode():!n||n.length===0?"":e.decode(n,{stream:!0})}function qt(e){const n=e.trim().match(/^cd(?:\s+(.*))?$/i);if(!n)return;const t=n[1]?.trim();if(!t)return null;const o=t.replace(/^\/d\s+/i,"").trim();return o.startsWith('"')&&o.endsWith('"')||o.startsWith("'")&&o.endsWith("'")?o.slice(1,-1):o}function vt(e){const n=Q.get(e.sessionId);if(n)return n;const t={currentDirectory:e.workspacePath,runningProcess:null};return Q.set(e.sessionId,t),t}function Be(e){for(const n of f.values())if(n.agentId===e)return n}async function Ft(e){const n=w.get(e.providerId||"claude-code"),t=se(n.getSessionStatus(e.sessionId),e.currentRuntimeStatus,e.currentRuntimeActionType);return{sessionId:e.sessionId,status:t,runtimeStatus:t,runtimeActionType:e.currentRuntimeActionType,runtimeActionLabel:e.currentRuntimeActionLabel,runtimeActionDetail:e.currentRuntimeActionDetail,agentId:e.agentId,workspacePath:e.workspacePath,command:e.config.command,mode:"sdk",providerSessionId:n.getProviderSessionId(e.sessionId),reused:!0}}function se(e,n,t){const o=String(e||"").trim();if(o){const s=String(n||"").trim(),i=String(t||"").trim().toLowerCase();return o.toLowerCase()==="tool_using"&&s.toLowerCase()==="waiting_input"&&i==="idle"?s:o}return String(n||"").trim()||"running"}function Kt(e,n=dt){return e.pid?n(e.pid)?Ke(e.command)==="acode"?{reusable:!1,reason:"in-process-provider"}:{reusable:!0,reason:"active-pid"}:{reusable:!1,reason:"dead-pid"}:{reusable:!1,reason:"missing-pid"}}function eo(e){const n=Be(e);if(!n)h.info(`[cleanupSdkSessionByAgentId] No active SDK session found for agentId=${e}, cleaning residual state anyway`);else{const t=n.sessionId;return h.info(`[cleanupSdkSessionByAgentId] Cleaning up SDK session for agentId=${e}, sessionId=${t}`),L(t),f.delete(t),v(t),ie(t),F(t).catch(o=>{h.warn(`[cleanupSdkSessionByAgentId] Failed to remove persisted session for agentId=${e}: ${o}`)}),t}K.has(e)&&(K.delete(e),h.info(`[cleanupSdkSessionByAgentId] Released startingAgents lock for agentId=${e}`))}function ie(e){const n=Q.get(e);if(!n?.runningProcess){Q.delete(e);return}try{n.runningProcess.kill()}catch{}finally{n.runningProcess=null,Q.delete(e)}}function b(e,n){n&&(e.seq+=1,X(e.agentId,n,e.sessionId,e.seq,void 0,{runtimeAccessToken:e.runtimeAccessToken,schedulerBaseUrl:e.schedulerBaseUrl}).catch(()=>{}))}function Se(e){return`\x1B[36m${e}>\x1B[0m `}function zt(e,n){return n==="~"?Qe.homedir():j.resolve(e,n)}async function Ht(e,n,t){const o=qt(t);if(o===void 0)return!1;if(o===null)return b(e,`${n.currentDirectory}\r
28
- `),!0;const r=zt(n.currentDirectory,o);try{return(await N.stat(r)).isDirectory()?(n.currentDirectory=r,b(e,`${n.currentDirectory}\r
29
- `),!0):(b(e,`cd: not a directory: ${r}\r
30
- `),!0)}catch(s){const i=s instanceof Error?s.message:String(s);return b(e,`cd: ${i}\r
31
- `),!0}}async function Wt(e,n){const t=f.get(e);if(!t)throw new Error("SDK session not found");const o=Bt(n),r=vt(t);if(!o)return{started:!1,cwd:r.currentDirectory};if(r.runningProcess)throw new Error("A terminal command is already running for this session");const s=q(o);if(b(t,`${Se(r.currentDirectory)}${s}\r
32
- `),Ce(o))return b(t,`[Terminal Warning] \u68C0\u6D4B\u5230\u526A\u8D34\u677F\u4E34\u65F6 paste \u6587\u4EF6\u8DEF\u5F84\uFF0C\u5DF2\u8DF3\u8FC7\u6267\u884C\u3002\u8BF7\u7C98\u8D34\u6587\u4EF6\u5185\u5BB9\u6216\u4F7F\u7528\u663E\u5F0F\u8BFB\u53D6\u547D\u4EE4\u3002\r
33
- `),b(t,Se(r.currentDirectory)),{started:!1,cwd:r.currentDirectory};if(await Ht(t,r,o))return{started:!1,cwd:r.currentDirectory};await _(t.agentId,e,"tool_using",{actionType:"bash",actionLabel:"\u7EC8\u7AEF\u547D\u4EE4",actionDetail:s},void 0,{runtimeAccessToken:t.runtimeAccessToken,schedulerBaseUrl:t.schedulerBaseUrl});const a=Xe(o,{cwd:r.currentDirectory,shell:!0,env:Oe(t.agentId,t.workspacePath,process.env,t.config.envOverrides)});r.runningProcess=a;const c=je(),d=je(),u=t.providerId==="acode",l={agentId:t.agentId,startedAt:new Date,chunks:[],spilled:!1};let m;const p=()=>{m&&(clearTimeout(m),m=void 0)},T=()=>{p(),m=setTimeout(()=>{r.runningProcess===a&&(b(t,jt()),a.kill())},xe)},y=(g,C=!0)=>{if(g&&(u&&l.chunks.push(g),u&&C&&T(),!(u&&l.spilled))){if(u&&xt(l.chunks.join(""))>Le){l.spilled=!0,Ue(l).then($=>{b(t,Ut($))}).catch($=>{const M=$ instanceof Error?$.message:String($);b(t,`\r
26
+ `}async function Ue(e){const n=e.outputPath||xt(e.agentId,e.startedAt);return e.outputPath=n,await N.mkdir(j.dirname(n),{recursive:!0}),await N.writeFile(n,e.chunks.join(""),"utf-8"),n}function Ot(e){return String(e??"").replace(/\r/g,`
27
+ `).trim()}function Nt(e=process.platform,n=process.env){const t=n.AWS_TERMINAL_OUTPUT_ENCODING?.trim();return t||(e==="win32"?Lt:Me)}function je(e=Nt()){if(e!=="utf-8")try{return new ee(e,{fatal:!1})}catch{return new ee(Me,{fatal:!1})}return qt()}function qt(){let e=null,n=null,t=null;const o=[];function r(s){try{return new ee(s,{fatal:!1})}catch{return new ee("utf-8",{fatal:!1})}}return{decode(s,i){if(s!=null&&o.push(s instanceof ArrayBuffer?Buffer.from(s):Buffer.isBuffer(s)?s:Buffer.from(s.buffer,s.byteOffset,s.byteLength)),t==="gb18030")return n||(n=r("gb18030")),n.decode(s,i);e||(e=r("utf-8"));const a=e.decode(s,i);if(t===null&&a.includes("\uFFFD")){t="gb18030",n=r("gb18030");const c=Buffer.concat(o);return n.decode(c)}return t===null&&!i?.stream&&(t="utf-8"),a}}}function re(e,n,t=!1){return t?e.decode():!n||n.length===0?"":e.decode(n,{stream:!0})}function vt(e){const n=e.trim().match(/^cd(?:\s+(.*))?$/i);if(!n)return;const t=n[1]?.trim();if(!t)return null;const o=t.replace(/^\/d\s+/i,"").trim();return o.startsWith('"')&&o.endsWith('"')||o.startsWith("'")&&o.endsWith("'")?o.slice(1,-1):o}function Ft(e){const n=Q.get(e.sessionId);if(n)return n;const t={currentDirectory:e.workspacePath,runningProcess:null};return Q.set(e.sessionId,t),t}function Be(e){for(const n of f.values())if(n.agentId===e)return n}async function Kt(e){const n=b.get(e.providerId||"claude-code"),t=se(n.getSessionStatus(e.sessionId),e.currentRuntimeStatus,e.currentRuntimeActionType);return{sessionId:e.sessionId,status:t,runtimeStatus:t,runtimeActionType:e.currentRuntimeActionType,runtimeActionLabel:e.currentRuntimeActionLabel,runtimeActionDetail:e.currentRuntimeActionDetail,agentId:e.agentId,workspacePath:e.workspacePath,command:e.config.command,mode:"sdk",providerSessionId:n.getProviderSessionId(e.sessionId),reused:!0}}function se(e,n,t){const o=String(e||"").trim();if(o){const s=String(n||"").trim(),i=String(t||"").trim().toLowerCase();return o.toLowerCase()==="tool_using"&&s.toLowerCase()==="waiting_input"&&i==="idle"?s:o}return String(n||"").trim()||"running"}function zt(e,n=ft){return e.pid?n(e.pid)?Ke(e.command)==="acode"?{reusable:!1,reason:"in-process-provider"}:{reusable:!0,reason:"active-pid"}:{reusable:!1,reason:"dead-pid"}:{reusable:!1,reason:"missing-pid"}}function to(e){const n=Be(e);if(!n)h.info(`[cleanupSdkSessionByAgentId] No active SDK session found for agentId=${e}, cleaning residual state anyway`);else{const t=n.sessionId;return h.info(`[cleanupSdkSessionByAgentId] Cleaning up SDK session for agentId=${e}, sessionId=${t}`),L(t),f.delete(t),v(t),ie(t),F(t).catch(o=>{h.warn(`[cleanupSdkSessionByAgentId] Failed to remove persisted session for agentId=${e}: ${o}`)}),t}K.has(e)&&(K.delete(e),h.info(`[cleanupSdkSessionByAgentId] Released startingAgents lock for agentId=${e}`))}function ie(e){const n=Q.get(e);if(!n?.runningProcess){Q.delete(e);return}try{n.runningProcess.kill()}catch{}finally{n.runningProcess=null,Q.delete(e)}}function w(e,n){n&&(e.seq+=1,X(e.agentId,n,e.sessionId,e.seq,void 0,{runtimeAccessToken:e.runtimeAccessToken,schedulerBaseUrl:e.schedulerBaseUrl}).catch(()=>{}))}function Se(e){return`\x1B[36m${e}>\x1B[0m `}function Ht(e,n){return n==="~"?Qe.homedir():j.resolve(e,n)}async function Wt(e,n,t){const o=vt(t);if(o===void 0)return!1;if(o===null)return w(e,`${n.currentDirectory}\r
28
+ `),!0;const r=Ht(n.currentDirectory,o);try{return(await N.stat(r)).isDirectory()?(n.currentDirectory=r,w(e,`${n.currentDirectory}\r
29
+ `),!0):(w(e,`cd: not a directory: ${r}\r
30
+ `),!0)}catch(s){const i=s instanceof Error?s.message:String(s);return w(e,`cd: ${i}\r
31
+ `),!0}}async function Xt(e,n){const t=f.get(e);if(!t)throw new Error("SDK session not found");const o=Ot(n),r=Ft(t);if(!o)return{started:!1,cwd:r.currentDirectory};if(r.runningProcess)throw new Error("A terminal command is already running for this session");const s=q(o);if(w(t,`${Se(r.currentDirectory)}${s}\r
32
+ `),Ce(o))return w(t,`[Terminal Warning] \u68C0\u6D4B\u5230\u526A\u8D34\u677F\u4E34\u65F6 paste \u6587\u4EF6\u8DEF\u5F84\uFF0C\u5DF2\u8DF3\u8FC7\u6267\u884C\u3002\u8BF7\u7C98\u8D34\u6587\u4EF6\u5185\u5BB9\u6216\u4F7F\u7528\u663E\u5F0F\u8BFB\u53D6\u547D\u4EE4\u3002\r
33
+ `),w(t,Se(r.currentDirectory)),{started:!1,cwd:r.currentDirectory};if(await Wt(t,r,o))return{started:!1,cwd:r.currentDirectory};await _(t.agentId,e,"tool_using",{actionType:"bash",actionLabel:"\u7EC8\u7AEF\u547D\u4EE4",actionDetail:s},void 0,{runtimeAccessToken:t.runtimeAccessToken,schedulerBaseUrl:t.schedulerBaseUrl});const a=Xe(o,{cwd:r.currentDirectory,shell:!0,env:Oe(t.agentId,t.workspacePath,process.env,t.config.envOverrides)});r.runningProcess=a;const c=je(),d=je(),u=t.providerId==="acode",l={agentId:t.agentId,startedAt:new Date,chunks:[],spilled:!1};let m;const p=()=>{m&&(clearTimeout(m),m=void 0)},T=()=>{p(),m=setTimeout(()=>{r.runningProcess===a&&(w(t,Bt()),a.kill())},xe)},y=(g,C=!0)=>{if(g&&(u&&l.chunks.push(g),u&&C&&T(),!(u&&l.spilled))){if(u&&Ut(l.chunks.join(""))>Le){l.spilled=!0,Ue(l).then($=>{w(t,jt($))}).catch($=>{const M=$ instanceof Error?$.message:String($);w(t,`\r
34
34
  [ACode] \u547D\u4EE4\u8F93\u51FA\u843D\u76D8\u5931\u8D25: ${M}\r
35
- `)});return}b(t,g)}};return u&&T(),a.stdout.on("data",g=>{y(re(c,g))}),a.stderr.on("data",g=>{y(re(d,g))}),a.on("error",g=>{b(t,`\r
35
+ `)});return}w(t,g)}};return u&&T(),a.stdout.on("data",g=>{y(re(c,g))}),a.stderr.on("data",g=>{y(re(d,g))}),a.on("error",g=>{w(t,`\r
36
36
  [Terminal Error] ${g.message}\r
37
- `)}),a.on("close",(g,C)=>{p(),r.runningProcess=null,y(re(c,void 0,!0),!1),y(re(d,void 0,!0),!1),l.spilled&&Ue(l).catch($=>{const M=$ instanceof Error?$.message:String($);b(t,`\r
37
+ `)}),a.on("close",(g,C)=>{p(),r.runningProcess=null,y(re(c,void 0,!0),!1),y(re(d,void 0,!0),!1),l.spilled&&Ue(l).catch($=>{const M=$ instanceof Error?$.message:String($);w(t,`\r
38
38
  [ACode] \u547D\u4EE4\u8F93\u51FA\u6700\u7EC8\u843D\u76D8\u5931\u8D25: ${M}\r
39
- `)}),g&&g!==0?b(t,`\r
39
+ `)}),g&&g!==0?w(t,`\r
40
40
  [exit ${g}]\r
41
- `):C&&b(t,`\r
41
+ `):C&&w(t,`\r
42
42
  [signal ${C}]\r
43
- `),b(t,Se(r.currentDirectory)),_(t.agentId,e,"waiting_input",void 0,void 0,{runtimeAccessToken:t.runtimeAccessToken,schedulerBaseUrl:t.schedulerBaseUrl})}),{started:!0,cwd:r.currentDirectory}}function Oe(e,n,t,o){const r={};for(const[s,i]of Object.entries(t))i!==void 0&&(r[s]=i);if(n&&(r.AWS_WORKSPACE_PATH=String(n)),o)for(const[s,i]of Object.entries(o)){const a=s.trim();if(!a||i===void 0||i===null)continue;const c=String(i).trim();c&&(r[a]=c)}return r.AWS_AGENT_ID=String(e),r.AWS_MCP_CLAIM_LAUNCH_BINDING="true",r.AWS_RUNTIME_BRIDGE_BASE_URL=`http://127.0.0.1:${Ze()}`,String(r.ACODE_HOME||"").trim()||(r.ACODE_HOME=_e()),$e(e,nt)&&(r.AWS_LAUNCH_CONFIG_TOOLS="1"),$e(e,ot)&&(r.AWS_HIRE_TOOLS="1"),r}function Xt(e){const n=e.trim(),t=n[0],o=n[n.length-1];return(t==='"'||t==="'")&&t===o?n.slice(1,-1):n}async function Qt(e){const n=String(e);if(!Ce(n))return n;const t=Xt(n);return j.isAbsolute(t)?N.readFile(t,"utf-8"):n}function Ne(e,n){const t={};for(const r of[e?.env,n])if(r)for(const[s,i]of Object.entries(r)){const a=s.trim();if(!a||i===void 0||i===null)continue;const c=String(i).trim();c&&(t[a]=c)}const o=t.ANTHROPIC_MODEL?.trim()||t.CODEX_MODEL?.trim()||void 0;return{envOverrides:t,model:o}}async function Vt(){try{return await it().readClaudeCodeConfig()}catch(e){return console.warn(`[Runtime] Failed to read saved ClaudeCode AI config: ${e.message}`),{}}}function Gt(e){if(e==null)return;const t=(typeof e=="string"?e:JSON.stringify(e,null,2)).trim();if(t)return t.length<=Ee?t:`${t.slice(0,Ee)}
44
- ...\uFF08\u7ED3\u679C\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD\uFF09`}function Jt(e){try{const n=JSON.parse(e);if(n&&typeof n=="object"&&!Array.isArray(n))return["directMessages","groupMessages","messages"].some(t=>Array.isArray(n[t])&&n[t].length>0)}catch{}return e.trim().length>0}function Yt(e){if(e.data.actionType==="mcp")return!0;const t=String(e.data.toolName||"").toLowerCase();return t.startsWith("mcp__")||t.includes("-mcp__")||t.includes("mcp_")}function Zt(e){if(e.type!=="tool_use_end")return;const n=Gt(e.data.toolResult??e.data.actionResult);if(!n)return;const t=ye(e.data.toolName,e.data.toolInput),o=e.data.actionType||t.actionType;if(o==="idle"){const r=String(e.data.rawToolName||e.data.toolName||"").toLowerCase();if((r.includes("poll_message")||r.includes("get_message"))&&!Jt(n))return}return o==="mcp"&&Yt(e)?{actionType:"mcp",actionLabel:"MCP\u8FD4\u56DE",actionDetail:e.data.actionDetail||e.data.toolName,actionId:e.data.actionId||e.data.toolUseId,actionResult:n}:{actionType:o,actionLabel:e.data.actionLabel||t.actionLabel,actionDetail:e.data.actionDetail||t.actionDetail||e.data.toolName,actionId:e.data.actionId||e.data.toolUseId,actionResult:n}}function en(e){if(e.type==="ai_request"){const n=e.data.model?` ${e.data.model}`:"",t=e.data.lastUserMessagePreview?`\uFF1A${e.data.lastUserMessagePreview}`:"";return`\r
43
+ `),w(t,Se(r.currentDirectory)),_(t.agentId,e,"waiting_input",void 0,void 0,{runtimeAccessToken:t.runtimeAccessToken,schedulerBaseUrl:t.schedulerBaseUrl})}),{started:!0,cwd:r.currentDirectory}}function Oe(e,n,t,o){const r={};for(const[s,i]of Object.entries(t))i!==void 0&&(r[s]=i);if(n&&(r.AWS_WORKSPACE_PATH=String(n)),o)for(const[s,i]of Object.entries(o)){const a=s.trim();if(!a||i===void 0||i===null)continue;const c=String(i).trim();c&&(r[a]=c)}return r.AWS_AGENT_ID=String(e),r.AWS_MCP_CLAIM_LAUNCH_BINDING="true",r.AWS_RUNTIME_BRIDGE_BASE_URL=`http://127.0.0.1:${Ze()}`,String(r.ACODE_HOME||"").trim()||(r.ACODE_HOME=_e()),De(e,ct)&&(r.AWS_LAUNCH_CONFIG_TOOLS="1"),De(e,ut)&&(r.AWS_HIRE_TOOLS="1"),r}function Qt(e){const n=e.trim(),t=n[0],o=n[n.length-1];return(t==='"'||t==="'")&&t===o?n.slice(1,-1):n}async function Vt(e){const n=String(e);if(!Ce(n))return n;const t=Qt(n);return j.isAbsolute(t)?N.readFile(t,"utf-8"):n}function Ne(e,n){const t={};for(const r of[e?.env,n])if(r)for(const[s,i]of Object.entries(r)){const a=s.trim();if(!a||i===void 0||i===null)continue;const c=String(i).trim();c&&(t[a]=c)}const o=t.ANTHROPIC_MODEL?.trim()||t.CODEX_MODEL?.trim()||void 0;return{envOverrides:t,model:o}}async function Gt(){try{return await et().readClaudeCodeConfig()}catch(e){return console.warn(`[Runtime] Failed to read saved ClaudeCode AI config: ${e.message}`),{}}}function Jt(e){if(e==null)return;const t=(typeof e=="string"?e:JSON.stringify(e,null,2)).trim();if(t)return t.length<=Ee?t:`${t.slice(0,Ee)}
44
+ ...\uFF08\u7ED3\u679C\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD\uFF09`}function Yt(e){try{const n=JSON.parse(e);if(n&&typeof n=="object"&&!Array.isArray(n))return["directMessages","groupMessages","messages"].some(t=>Array.isArray(n[t])&&n[t].length>0)}catch{}return e.trim().length>0}function Zt(e){if(e.data.actionType==="mcp")return!0;const t=String(e.data.toolName||"").toLowerCase();return t.startsWith("mcp__")||t.includes("-mcp__")||t.includes("mcp_")}function en(e){if(e.type!=="tool_use_end")return;const n=Jt(e.data.toolResult??e.data.actionResult);if(!n)return;const t=ye(e.data.toolName,e.data.toolInput),o=e.data.actionType||t.actionType;if(o==="idle"){const r=String(e.data.rawToolName||e.data.toolName||"").toLowerCase();if((r.includes("poll_message")||r.includes("get_message"))&&!Yt(n))return}return o==="mcp"&&Zt(e)?{actionType:"mcp",actionLabel:"MCP\u8FD4\u56DE",actionDetail:e.data.actionDetail||e.data.toolName,actionId:e.data.actionId||e.data.toolUseId,actionResult:n}:{actionType:o,actionLabel:e.data.actionLabel||t.actionLabel,actionDetail:e.data.actionDetail||t.actionDetail||e.data.toolName,actionId:e.data.actionId||e.data.toolUseId,actionResult:n}}function tn(e){if(e.type==="ai_request"){const n=e.data.model?` ${e.data.model}`:"",t=e.data.lastUserMessagePreview?`\uFF1A${e.data.lastUserMessagePreview}`:"";return`\r
45
45
  [ACode] \u6B63\u5728\u8BF7\u6C42\u6A21\u578B${n}${t}\r
46
46
  `}if(e.type==="text_delta"||e.type==="thinking"||e.type==="command_output")return e.data.text||void 0;if(e.type==="error")return e.data.text?`\r
47
47
  [SDK Error] ${e.data.text}\r
48
- `:void 0}function tn(e){const n=rn(e);return{sourceEventType:e.type,logCategory:"acode",...on(e),...n?{logLevel:nn(e),logMessage:n}:{}}}function nn(e){return e.type==="error"?"error":e.type==="command_output"&&e.data.stream==="stderr"?"warn":"info"}function on(e){return e.type!=="command_output"?{}:{...typeof e.data.stream=="string"?{stream:e.data.stream}:{},...typeof e.data.sequence=="number"?{sequence:e.data.sequence}:{},...typeof e.data.cwd=="string"?{cwd:e.data.cwd}:{},...typeof e.data.commandFilePath=="string"?{commandFilePath:e.data.commandFilePath}:{},...typeof e.data.commandLineCount=="number"?{commandLineCount:e.data.commandLineCount}:{}}}function rn(e){if(e.type==="ai_request"){const n=e.data.model||"unknown-model",t=e.data.endpoint?` @ ${e.data.endpoint}`:"",o=typeof e.data.toolCount=="number"?`, tools=${e.data.toolCount}`:"";return`AI request started: ${n}${t}${o}`}if(e.type==="tool_use_start")return qe(e,"\u5F00\u59CB");if(e.type==="tool_use_end")return qe(e,"\u5B8C\u6210");if(e.type==="command_output")return cn(e);if(e.type==="turn_complete")return`Turn completed${e.data.finishReason?`, finish=${e.data.finishReason}`:""}`;if(e.type==="session_complete")return`Session completed: exitCode=${e.data.exitCode??0}`;if(e.type==="error")return e.data.text||"ACode runtime error"}const sn=/\x1b\[[0-9;?]*[a-zA-Z]/g;function an(e){return e.replace(sn,"")}function cn(e){const n=typeof e.data.stream=="string"?e.data.stream:"mixed",t=typeof e.data.sequence=="number"?` #${e.data.sequence}`:"",o=an(String(e.data.text||"")).replace(/\s+/g," ").trim(),r=o.length>240?`${o.slice(0,240)}...`:o;return`\u547D\u4EE4\u8F93\u51FA(${n}${t}): ${r||"(empty)"}`}function qe(e,n){const t=ye(e.data.toolName,e.data.toolInput),o=e.data.actionLabel||t.actionLabel||"\u8C03\u7528\u5DE5\u5177",r=ve(e,t);return r?`${n}${o}: ${r}`:`${n}${o}: ${e.data.actionDetail||e.data.toolName||"tool"}`}function ve(e,n){const t=e.data.toolInput;return n.actionType==="bash"?un(t)||e.data.actionDetail||n.actionDetail:n.actionType==="read_file"||n.actionType==="edit_file"||n.actionType==="write_file"?dn(t)||e.data.actionDetail||n.actionDetail:e.data.actionDetail||n.actionDetail}function un(e){const n=Ae(e?.command,e?.cmd);if(n)return n;if(Array.isArray(e?.argv)){const t=e.argv.map(o=>String(o??"").trim()).filter(Boolean).join(" ");return t?q(t):void 0}return Ae(e?.args)}function dn(e){const n=Fe(e?.paths);return n.length>0?n.length===1?n[0]:`${n.length}\u4E2A\u6587\u4EF6: ${n.join(", ")}`:Ae(e?.file_path,e?.filePath,e?.path,e?.target_file,e?.targetFile)}function Ae(...e){for(const n of e){if(typeof n=="string"&&n.trim())return q(n.trim());if(Array.isArray(n)){const t=Fe(n)[0];if(t)return t}}}function Fe(e){return Array.isArray(e)?e.map(n=>typeof n=="string"?n.trim():"").filter(Boolean).map(n=>q(n)):[]}function ln(e){if(!(!e||Object.keys(e).length===0))try{const n=q(JSON.stringify(e,null,2));return n.length>8e3?`${n.slice(0,8e3)}
49
- ...\uFF08\u8F93\u5165\u53C2\u6570\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD\uFF09`:n}catch{return}}function mn(e){const n=[e.model?`\u6A21\u578B: ${e.model}`:void 0,e.endpoint||e.requestUrl?`\u63A5\u53E3: ${e.endpoint||e.requestUrl}`:void 0,e.requestMethod?`\u65B9\u6CD5: ${e.requestMethod}`:void 0,typeof e.stream=="boolean"?`\u6D41\u5F0F: ${e.stream?"\u662F":"\u5426"}`:void 0,typeof e.messageCount=="number"?`\u4E0A\u4E0B\u6587\u6D88\u606F: ${e.messageCount}`:void 0,typeof e.toolCount=="number"?`\u53EF\u7528\u5DE5\u5177: ${e.toolCount}`:void 0,e.lastUserMessagePreview?`\u6700\u540E\u8BF7\u6C42: ${e.lastUserMessagePreview}`:void 0].filter(i=>!!i),t=fn(e.requestHeaders),o=n.join(`
50
- `)||"ACode \u6B63\u5728\u53D1\u9001 AI \u8BF7\u6C42",r=t.length>0?`${_t}${t.join(`
51
- `)}`:"",s=e.requestBody?`${Ct}${e.requestBody}`:"";return`${o}${r}${s}`}function fn(e){return e?Object.entries(e).map(([n,t])=>`${n}: ${t}`).filter(n=>n.trim().length>0):[]}function pn(e,n){return String(n||"").trim().toLowerCase()!=="waiting_input"?!1:e.type==="thinking"||e.type==="text_delta"}function gn(e){for(const n of["estimatedContextTokens","contextTokens","context_tokens","contextUsedTokens","context_used_tokens"]){const t=e[n],o=Number(t);if(Number.isFinite(o)&&o>0)return o}}function yn(e,n){if(!pn(e,n)){if(e.type==="ai_request"){const t=gn(e.data);return{status:"thinking",actionInfo:{actionType:"ai_request",actionLabel:"AI\u8BF7\u6C42",actionDetail:mn(e.data),...t!==void 0?{usage:{inputTokens:t,outputTokens:0}}:{}}}}if(e.type==="background_command_completed")return{status:"tool_result",actionInfo:{actionType:"background_command",actionLabel:"\u540E\u53F0\u547D\u4EE4",actionDetail:"background_command_completed"}};if(e.type==="thinking"||e.type==="text_delta")return{status:"thinking"};if(e.type==="tool_use_start"){const t=ye(e.data.toolName,e.data.toolInput),o=ve(e,t),r=ln(e.data.toolInput);return e.data.actionType==="idle"||t.actionType==="idle"?{status:"waiting_input",actionInfo:{actionType:e.data.actionType||t.actionType,actionLabel:e.data.actionLabel||t.actionLabel,actionDetail:o||e.data.actionDetail||t.actionDetail||e.data.toolName,actionInput:r,actionId:e.data.actionId||e.data.toolUseId}}:{status:"tool_using",actionInfo:{actionType:e.data.actionType||t.actionType,actionLabel:e.data.actionLabel||t.actionLabel,actionDetail:o||e.data.actionDetail||t.actionDetail||e.data.toolName,actionInput:r,actionId:e.data.actionId||e.data.toolUseId}}}if(e.type==="turn_complete")return{status:"waiting_input",actionInfo:e.data.usage?{usage:e.data.usage}:void 0};if(e.type==="error")return{status:"error"};if(e.type==="context_compaction")return{status:"compacting",actionInfo:{actionType:"context_compaction",actionLabel:e.data.actionLabel,actionDetail:e.data.actionDetail,...e.data.actionId?{actionId:e.data.actionId}:{},...e.data.parentId?{parentId:e.data.parentId}:{}}};if(e.type==="runtime_capabilities")return{status:n||"waiting_input",actionInfo:{actionType:"runtime_capabilities",actionLabel:e.data.actionLabel||"\u8FD0\u884C\u65F6\u80FD\u529B",actionDetail:e.data.actionDetail}}}}const x=new Map,ae=new Map,ce=new Map,G=new Map,hn=20,In=500,Sn=3e4;async function ue(e,n=Sn,t=2){for(let o=0;o<=t;o++){const r=new AbortController;let s;try{const i=e(r.signal);i.catch(()=>{}),await Promise.race([i,new Promise((a,c)=>{s=setTimeout(()=>{r.abort(),c(new Error(`sendOutput timeout after ${n}ms`))},n)})]),s&&clearTimeout(s);return}catch(i){s&&clearTimeout(s);const a=i instanceof Error?i.message:String(i);if(o<t){const c=1e3*(o+1);h.warn(`sendOutput attempt ${o+1}/${t+1} failed (${a}), retrying in ${c}ms...`),await new Promise(d=>setTimeout(d,c));continue}h.warn(`sendOutput failed after ${t+1} attempts (${a}), giving up to unblock serial queue`)}}}function de(e,n){const t=n?`${e}:${n}`:void 0;let o,r;if(t)o=G.get(t),r=t;else{const p=[];for(const[T,y]of G)T.startsWith(e+":")&&y.buffer&&p.push(y.sourceEventType);for(const T of p)de(e,T);return}if(!o||!o.buffer)return;o.timer=null;const s=o.buffer,i=o.seq,a=o.entry,c=o.sourceEventType;o.buffer="",r&&G.delete(r);const d={sourceEventType:c,logCategory:"acode"},u={runtimeAccessToken:a.runtimeAccessToken,schedulerBaseUrl:a.schedulerBaseUrl},m=(x.get(e)??Promise.resolve()).then(()=>ue(p=>X(a.agentId,s,e,i,d,u,p)),()=>ue(p=>X(a.agentId,s,e,i,d,u,p)));x.set(e,m),m.finally(()=>{x.get(e)===m&&x.delete(e)})}function An(e,n){const t=en(e);if(!t)return;n.seq+=1;const o=n.seq,r=tn(e),s={runtimeAccessToken:n.runtimeAccessToken,schedulerBaseUrl:n.schedulerBaseUrl};if((e.type==="command_output"||e.type==="text_delta"||e.type==="thinking")&&t.length<hn){const c=`${e.sessionId}:${e.type}`;let d=G.get(c);if(d||(d={buffer:"",seq:0,timer:null,entry:n,sourceEventType:e.type}),d.buffer+=t,d.seq=o,d.entry=n,!d.timer){const u=e.sessionId,l=e.type;d.timer=setTimeout(()=>de(u,l),In)}G.set(c,d);return}de(e.sessionId);const a=(x.get(e.sessionId)??Promise.resolve()).then(()=>ue(c=>X(n.agentId,t,e.sessionId,o,r,s,c)),()=>ue(c=>X(n.agentId,t,e.sessionId,o,r,s,c)));x.set(e.sessionId,a),a.finally(()=>{x.get(e.sessionId)===a&&x.delete(e.sessionId)})}function Ke(e){return Ye(e)}let ze=!1;function Tn(){ze||(Je(w,kn),pt(),ze=!0)}function kn(e,n){e.on("event",t=>{const o=f.get(t.sessionId);if(o){if(t.type==="tool_use_start"?yt(o.sessionId,t.data.toolUseId||t.data.actionId,t.data.toolInput,t.data.toolName,o.workspacePath):t.type==="tool_use_end"&&gt(t,{sessionId:o.sessionId,agentId:o.agentId,workspacePath:o.workspacePath,providerId:o.providerId}),console.log(`[${n.displayName} Adapter] Event: ${t.type} for session ${t.sessionId}`),!(t.type==="thinking"||t.type==="text_delta"||t.type==="tool_use_start"||t.type==="context_compaction"||t.type==="ai_request")){t.type==="runtime_capabilities"&&t.data.actionDetail&&(o.cachedCapabilitiesActionDetail=t.data.actionDetail);const i=yn(t,o.currentRuntimeStatus);i&&_(o.agentId,t.sessionId,i.status,i.actionInfo,oe(i.actionInfo),{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl},t.timestamp?new Date(t.timestamp).getTime():void 0,t.type)}An(t,o);const s=Zt(t);if(s){const i={runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl},a=t.timestamp?new Date(t.timestamp).getTime():void 0,c=String(t.data?.toolName||"").toLowerCase()==="browser_launch",d=t.type==="tool_use_end"&&String(t.data?.rawToolName||t.data?.toolName||"").toLowerCase().replace(/[_-]/g,"").includes("todowrite");c?(async()=>{for(let l=0;l<3;l++){if(await _(o.agentId,t.sessionId,"tool_result",s,void 0,i,a,t.type)!==void 0)return;l<2&&await new Promise(p=>setTimeout(p,3e3*(l+1)))}})().catch(u=>console.warn("[Runtime] browser_launch sendStatus retry exhausted:",u)):d?(async()=>{for(let l=0;l<3;l++){if(await _(o.agentId,t.sessionId,"tool_result",s,void 0,i,a,t.type)!==void 0)return;l<2&&await new Promise(p=>setTimeout(p,1e3*(l+1)))}})().catch(u=>console.warn("[Runtime] todo_write sendStatus retry exhausted:",u)):_(o.agentId,t.sessionId,"tool_result",s,void 0,i,a,t.type)}}}),e.on("status-change",(t,o,r)=>{const s=f.get(t);if(s){de(t),o==="thinking"||o==="tool_using"||o==="compacting"?bt(t):L(t);const i=Et(o,r);s.currentRuntimeStatus=i.status;const a=s.currentRuntimeActionDetail??"",c=a.includes("poll_message")||a.includes("get_message"),u=!(i.actionInfo?.actionType==="ai_request")&&(i.status==="thinking"||i.status==="waiting_input")&&(s.currentRuntimeActionType==="idle"||s.currentRuntimeActionType==="mcp")&&c;(i.actionInfo?.actionType||!u)&&(s.currentRuntimeActionType=i.actionInfo?.actionType,s.currentRuntimeActionLabel=i.actionInfo?.actionLabel,s.currentRuntimeActionDetail=i.actionInfo?.actionDetail,s.currentRuntimeActionInput=i.actionInfo?.actionInput),console.log(`[${n.displayName} Adapter] Status changed: ${i.status} for agent ${s.agentId}`,i.actionInfo||""),At(t,{runtimeStatus:i.status,runtimeActionType:s.currentRuntimeActionType,runtimeActionLabel:s.currentRuntimeActionLabel,runtimeActionDetail:s.currentRuntimeActionDetail});const l=i.actionInfo?.actionType?i.actionInfo:s.currentRuntimeActionType?{actionType:s.currentRuntimeActionType,actionLabel:s.currentRuntimeActionLabel??"",actionDetail:s.currentRuntimeActionDetail,actionInput:s.currentRuntimeActionInput}:void 0;if(i.status==="compacting"){const p=(ae.get(t)??Promise.resolve()).then(async()=>{for(let y=0;y<=2;y++){if(await _(s.agentId,t,i.status,l,oe(i.actionInfo),{runtimeAccessToken:s.runtimeAccessToken,schedulerBaseUrl:s.schedulerBaseUrl})!==void 0)return;y<2&&(h.warn(`[${n.displayName}] compaction sendStatus attempt ${y+1} failed (HTTP), retrying in ${1e3*(y+1)}ms...`),await new Promise(C=>setTimeout(C,1e3*(y+1))))}h.warn(`[${n.displayName}] compaction sendStatus failed after 3 attempts, event may be lost`)}).catch(T=>{h.warn(`[${n.displayName}] compaction status chain error:`,T)});ae.set(t,p),p.finally(()=>{ae.get(t)===p&&ae.delete(t)})}else{const m=u&&!i.actionInfo?.actionType;if(l?.actionType==="idle"||s.currentRuntimeActionType==="idle"&&u){const y=(ce.get(t)??Promise.resolve()).then(async()=>{for(let C=0;C<=2;C++){if(await _(s.agentId,t,i.status,m?void 0:l,oe(i.actionInfo),{runtimeAccessToken:s.runtimeAccessToken,schedulerBaseUrl:s.schedulerBaseUrl})!==void 0)return;C<2&&await new Promise(M=>setTimeout(M,1e3*(C+1)))}h.warn(`[${n.displayName}] idle tool sendStatus failed after 3 attempts, status may be stale (frontend will fall back to timeline tool_use event)`)}).catch(g=>{h.warn(`[${n.displayName}] idle status chain error:`,g)});ce.set(t,y),y.finally(()=>{ce.get(t)===y&&ce.delete(t)})}else _(s.agentId,t,i.status,m?void 0:l,oe(i.actionInfo),{runtimeAccessToken:s.runtimeAccessToken,schedulerBaseUrl:s.schedulerBaseUrl})}if(i.status==="waiting_input"&&s.cachedCapabilitiesActionDetail){const m=s.cachedCapabilitiesActionDetail;s.cachedCapabilitiesActionDetail=void 0,console.log(`[${n.displayName} Adapter] Re-sending cached runtime_capabilities for agent ${s.agentId} (session stabilized to waiting_input)`),_(s.agentId,t,"waiting_input",{actionType:"runtime_capabilities",actionLabel:"\u8FD0\u884C\u65F6\u80FD\u529B",actionDetail:m},void 0,{runtimeAccessToken:s.runtimeAccessToken,schedulerBaseUrl:s.schedulerBaseUrl})}}}),e.on("ask-user-question",t=>{const o=f.get(t.sessionId);o&&(console.log(`[${n.displayName} Adapter] AskUserQuestion for agent ${o.agentId}`),lt(o.agentId,t.sessionId,Array.isArray(t.questions)?t.questions:[],{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl},t.toolCallId))}),e.on("tool-permission-request",t=>{const o=f.get(t.sessionId);o&&t.requestId&&(console.log(`[${n.displayName} Adapter] Tool permission request (${t.capability}) for agent ${o.agentId}`),mt(o.agentId,t.sessionId,{requestId:t.requestId,capability:t.capability,...t.detail||{}},{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl}))}),e.on("permission-request",t=>{const o=f.get(t.sessionId);if(o){console.log(`[${n.displayName} Adapter] Permission request: ${t.toolName} for agent ${o.agentId}`);const r=t.toolInput?q(JSON.stringify(t.toolInput).slice(0,400)):void 0;_(o.agentId,t.sessionId,"waiting_input",{actionType:"other",actionLabel:"\u6743\u9650\u786E\u8BA4",actionDetail:r||t.toolName},void 0,{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl})}})}S.post("/start",I,async(e,n)=>{const{agentId:t,workspacePath:o,mode:r="sdk"}=e.body||{};if(!t||!o){n.status(400).json({error:"agentId and workspacePath are required"});return}const s=String(e.body?.schedulerBaseUrl||"").trim()||String(e.header("x-bridge-tunnel-source")||"").trim()||De(Pe(e))||void 0;ct({agentId:String(t),workspacePath:String(o),serverUrl:e.body?.serverUrl||s,runtimeAccessToken:e.body?.runtimeAccessToken,userId:e.body?.userId,schedulerBaseUrl:s}),e.body?.runtimeFeatures!=null&&(et(String(t),e.body.runtimeFeatures),console.log(`[Runtime] agent ${t} \u542F\u52A8\u4E0B\u53D1\u80FD\u529B\u5F00\u5173: ${JSON.stringify(tt(String(t)))}`)),e.body?.envVars!=null&&typeof e.body.envVars=="object"&&(rt(e.body.envVars),console.log(`[Runtime] agent ${t} \u4E0B\u53D1\u9762\u677F\u73AF\u5883\u53D8\u91CF: ${Object.keys(e.body.envVars).length} \u9879 \u2192 \u684C\u9762\u5DE5\u5177\u5B50\u8FDB\u7A0B`)),e.body?.changeCacheRetentionDays!==void 0&&(st(e.body.changeCacheRetentionDays),console.log(`[Runtime] agent ${t} \u4E0B\u53D1\u53D8\u66F4\u7F13\u5B58\u4FDD\u7559\u5929\u6570: ${e.body.changeCacheRetentionDays??"\u4E0D\u6E05\u7406"}`)),r&&r!=="sdk"&&console.warn(`[Runtime] Unsupported runtime mode "${r}" requested for agent ${t}; starting SDK session instead.`),await wn(e,n)});async function wn(e,n){const{agentId:t,workspacePath:o,command:r,autoAccept:s=!0,initialPrompt:i,systemPrompt:a,globalPrompt:c,rolePrompt:d,memory:u,mcpConfigPath:l,extraMcpServers:m,envOverrides:p,idleInputAutoCommand:T,nonInputAutoCommand:y,model:g,instanceAiConfig:C,subAgentModel:$,subAgentEffort:M,scopeKey:Te,browserAllowPrivate:ke}=e.body||{},z=kt();z.log({level:"info",category:"launch",message:"startSdkSession: \u6536\u5230\u542F\u52A8\u8BF7\u6C42",source:"bridge",agentId:String(t||"").trim()||void 0,details:{reqBodyKeys:Object.keys(e.body||{}),perInstanceAiConfig:C?te(C):null,perAgentModel:g??null}});let D=null;const A=String(t||"").trim(),le=String(e.body?.runtimeAccessToken||"").trim()||void 0,B=String(e.body?.schedulerBaseUrl||"").trim()||String(e.header("x-bridge-tunnel-source")||"").trim()||De(Pe(e))||void 0;B?h.info(`[startSdkSession] \u56DE\u8C03\u76EE\u6807 server: ${B} (agentId=${A})`):h.warn(`[startSdkSession] \u672A\u89E3\u6790\u5230 schedulerBaseUrl\uFF0C\u5C06\u56DE\u9000\u5230\u9ED8\u8BA4\u5730\u5740 (agentId=${A})`);try{if(Tn(),!A){n.status(400).json({error:"agentId is required"});return}const O=Be(A);if(O){n.json(await Ft(O));return}const k=await ht(A);if(k){const R=Kt(k);if(!R.reusable)console.warn(`[Runtime] Ignoring stale persisted SDK session for agentId=${A}, sessionId=${k.sessionId}, reason=${R.reason}`),await F(k.sessionId);else{const P=se(k.runtimeStatus,k.runtimeStatus,k.runtimeActionType);n.json({sessionId:k.sessionId,status:P,runtimeStatus:P,runtimeActionType:k.runtimeActionType,runtimeActionLabel:k.runtimeActionLabel,runtimeActionDetail:k.runtimeActionDetail,agentId:k.agentId,workspacePath:k.workspacePath,command:k.command,mode:k.mode||"sdk",pid:k.pid,reused:!0,persistedOnly:!0});return}}if(K.has(A)){n.status(409).json({error:"SDK session is already starting for this agent"});return}K.add(A);const $n=(r||"acode").toLowerCase(),E=Ke(r),He=w.get(E);D=Ge();const We=E==="claude-code"?await Vt():null,J=Ne(E==="claude-code"?We:null,p),H=E==="acode"?g?String(g).trim():void 0:(()=>{const R=g?String(g).trim():void 0,P=J.model?String(J.model).trim():void 0;return R||P})();z.log({level:"info",category:"resolve",message:"\u6A21\u578B\u89E3\u6790\u7ED3\u679C",source:"bridge",agentId:A,sessionId:D??void 0,details:{perAgentModel:g??null,globalModel:J.model??null,resolvedModel:H??null,providerId:E,note:E==="acode"?"adapter handles full priority":"request > global"}});const me={...J.envOverrides};H&&(me.ANTHROPIC_MODEL=H,me.CODEX_MODEL=H);let W,fe=l;if(E==="acode"){const R=C||{},P=await at({apiOverrides:Ie(R)??void 0,agentId:A,sessionId:D??void 0,runtimeBridgeBaseUrl:B});W=P.instanceConfig.config,fe=P.perInstanceConfigPath,z.log({level:"info",category:"apply",message:"prepareAcodeInstanceConfig \u5B8C\u6210",source:"bridge",agentId:A,sessionId:D??void 0,details:{sanitizedApiOverrides:Ie(R)?te(Ie(R)):null,resolvedInstanceAiConfig:W?te(W):null,perInstanceConfigPath:fe,instanceConfigSources:P.instanceConfig.source??null}})}let we=a||void 0,pe,ge,Y;if(E==="acode")if(pe=typeof c=="string"&&c.trim()||void 0,ge=typeof d=="string"&&d.trim()||void 0,typeof u=="string"&&u.trim())Y=u.trim();else{const R=await $t(o,{schedulerBaseUrl:B,runtimeAccessToken:le,agentId:A});R&&(Y=R,h.info(`[startSdkSession] Auto-loaded memories for ACode agent ${A}`))}else if(typeof c=="string"&&c.trim()||typeof d=="string"&&d.trim()||typeof u=="string"&&u.trim()){const P=[c,d,u,a].filter(Z=>typeof Z=="string"&&Z.trim().length>0).map(Z=>Z.trim());we=P.length>0?P.join(`
48
+ `:void 0}function nn(e){const n=sn(e);return{sourceEventType:e.type,logCategory:"acode",...rn(e),...n?{logLevel:on(e),logMessage:n}:{}}}function on(e){return e.type==="error"?"error":e.type==="command_output"&&e.data.stream==="stderr"?"warn":"info"}function rn(e){return e.type!=="command_output"?{}:{...typeof e.data.stream=="string"?{stream:e.data.stream}:{},...typeof e.data.sequence=="number"?{sequence:e.data.sequence}:{},...typeof e.data.cwd=="string"?{cwd:e.data.cwd}:{},...typeof e.data.commandFilePath=="string"?{commandFilePath:e.data.commandFilePath}:{},...typeof e.data.commandLineCount=="number"?{commandLineCount:e.data.commandLineCount}:{}}}function sn(e){if(e.type==="ai_request"){const n=e.data.model||"unknown-model",t=e.data.endpoint?` @ ${e.data.endpoint}`:"",o=typeof e.data.toolCount=="number"?`, tools=${e.data.toolCount}`:"";return`AI request started: ${n}${t}${o}`}if(e.type==="tool_use_start")return qe(e,"\u5F00\u59CB");if(e.type==="tool_use_end")return qe(e,"\u5B8C\u6210");if(e.type==="command_output")return un(e);if(e.type==="turn_complete")return`Turn completed${e.data.finishReason?`, finish=${e.data.finishReason}`:""}`;if(e.type==="session_complete")return`Session completed: exitCode=${e.data.exitCode??0}`;if(e.type==="error")return e.data.text||"ACode runtime error"}const an=/\x1b\[[0-9;?]*[a-zA-Z]/g;function cn(e){return e.replace(an,"")}function un(e){const n=typeof e.data.stream=="string"?e.data.stream:"mixed",t=typeof e.data.sequence=="number"?` #${e.data.sequence}`:"",o=cn(String(e.data.text||"")).replace(/\s+/g," ").trim(),r=o.length>240?`${o.slice(0,240)}...`:o;return`\u547D\u4EE4\u8F93\u51FA(${n}${t}): ${r||"(empty)"}`}function qe(e,n){const t=ye(e.data.toolName,e.data.toolInput),o=e.data.actionLabel||t.actionLabel||"\u8C03\u7528\u5DE5\u5177",r=ve(e,t);return r?`${n}${o}: ${r}`:`${n}${o}: ${e.data.actionDetail||e.data.toolName||"tool"}`}function ve(e,n){const t=e.data.toolInput;return n.actionType==="bash"?dn(t)||e.data.actionDetail||n.actionDetail:n.actionType==="read_file"||n.actionType==="edit_file"||n.actionType==="write_file"?ln(t)||e.data.actionDetail||n.actionDetail:e.data.actionDetail||n.actionDetail}function dn(e){const n=Ae(e?.command,e?.cmd);if(n)return n;if(Array.isArray(e?.argv)){const t=e.argv.map(o=>String(o??"").trim()).filter(Boolean).join(" ");return t?q(t):void 0}return Ae(e?.args)}function ln(e){const n=Fe(e?.paths);return n.length>0?n.length===1?n[0]:`${n.length}\u4E2A\u6587\u4EF6: ${n.join(", ")}`:Ae(e?.file_path,e?.filePath,e?.path,e?.target_file,e?.targetFile)}function Ae(...e){for(const n of e){if(typeof n=="string"&&n.trim())return q(n.trim());if(Array.isArray(n)){const t=Fe(n)[0];if(t)return t}}}function Fe(e){return Array.isArray(e)?e.map(n=>typeof n=="string"?n.trim():"").filter(Boolean).map(n=>q(n)):[]}function mn(e){if(!(!e||Object.keys(e).length===0))try{const n=q(JSON.stringify(e,null,2));return n.length>8e3?`${n.slice(0,8e3)}
49
+ ...\uFF08\u8F93\u5165\u53C2\u6570\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD\uFF09`:n}catch{return}}function fn(e){const n=[e.model?`\u6A21\u578B: ${e.model}`:void 0,e.endpoint||e.requestUrl?`\u63A5\u53E3: ${e.endpoint||e.requestUrl}`:void 0,e.requestMethod?`\u65B9\u6CD5: ${e.requestMethod}`:void 0,typeof e.stream=="boolean"?`\u6D41\u5F0F: ${e.stream?"\u662F":"\u5426"}`:void 0,typeof e.messageCount=="number"?`\u4E0A\u4E0B\u6587\u6D88\u606F: ${e.messageCount}`:void 0,typeof e.toolCount=="number"?`\u53EF\u7528\u5DE5\u5177: ${e.toolCount}`:void 0,e.lastUserMessagePreview?`\u6700\u540E\u8BF7\u6C42: ${e.lastUserMessagePreview}`:void 0].filter(i=>!!i),t=pn(e.requestHeaders),o=n.join(`
50
+ `)||"ACode \u6B63\u5728\u53D1\u9001 AI \u8BF7\u6C42",r=t.length>0?`${$t}${t.join(`
51
+ `)}`:"",s=e.requestBody?`${_t}${e.requestBody}`:"";return`${o}${r}${s}`}function pn(e){return e?Object.entries(e).map(([n,t])=>`${n}: ${t}`).filter(n=>n.trim().length>0):[]}function gn(e,n){return String(n||"").trim().toLowerCase()!=="waiting_input"?!1:e.type==="thinking"||e.type==="text_delta"}function yn(e){for(const n of["estimatedContextTokens","contextTokens","context_tokens","contextUsedTokens","context_used_tokens"]){const t=e[n],o=Number(t);if(Number.isFinite(o)&&o>0)return o}}function hn(e,n){if(!gn(e,n)){if(e.type==="ai_request"){const t=yn(e.data);return{status:"thinking",actionInfo:{actionType:"ai_request",actionLabel:"AI\u8BF7\u6C42",actionDetail:fn(e.data),...t!==void 0?{usage:{inputTokens:t,outputTokens:0}}:{}}}}if(e.type==="background_command_completed")return{status:"tool_result",actionInfo:{actionType:"background_command",actionLabel:"\u540E\u53F0\u547D\u4EE4",actionDetail:"background_command_completed"}};if(e.type==="thinking"||e.type==="text_delta")return{status:"thinking"};if(e.type==="tool_use_start"){const t=ye(e.data.toolName,e.data.toolInput),o=ve(e,t),r=mn(e.data.toolInput);return e.data.actionType==="idle"||t.actionType==="idle"?{status:"waiting_input",actionInfo:{actionType:e.data.actionType||t.actionType,actionLabel:e.data.actionLabel||t.actionLabel,actionDetail:o||e.data.actionDetail||t.actionDetail||e.data.toolName,actionInput:r,actionId:e.data.actionId||e.data.toolUseId}}:{status:"tool_using",actionInfo:{actionType:e.data.actionType||t.actionType,actionLabel:e.data.actionLabel||t.actionLabel,actionDetail:o||e.data.actionDetail||t.actionDetail||e.data.toolName,actionInput:r,actionId:e.data.actionId||e.data.toolUseId}}}if(e.type==="turn_complete")return{status:"waiting_input",actionInfo:e.data.usage?{usage:e.data.usage}:void 0};if(e.type==="error")return{status:"error"};if(e.type==="context_compaction")return{status:"compacting",actionInfo:{actionType:"context_compaction",actionLabel:e.data.actionLabel,actionDetail:e.data.actionDetail,...e.data.actionId?{actionId:e.data.actionId}:{},...e.data.parentId?{parentId:e.data.parentId}:{}}};if(e.type==="runtime_capabilities")return{status:n||"waiting_input",actionInfo:{actionType:"runtime_capabilities",actionLabel:e.data.actionLabel||"\u8FD0\u884C\u65F6\u80FD\u529B",actionDetail:e.data.actionDetail}}}}const x=new Map,ae=new Map,ce=new Map,G=new Map,In=20,Sn=500,An=3e4;async function ue(e,n=An,t=2){for(let o=0;o<=t;o++){const r=new AbortController;let s;try{const i=e(r.signal);i.catch(()=>{}),await Promise.race([i,new Promise((a,c)=>{s=setTimeout(()=>{r.abort(),c(new Error(`sendOutput timeout after ${n}ms`))},n)})]),s&&clearTimeout(s);return}catch(i){s&&clearTimeout(s);const a=i instanceof Error?i.message:String(i);if(o<t){const c=1e3*(o+1);h.warn(`sendOutput attempt ${o+1}/${t+1} failed (${a}), retrying in ${c}ms...`),await new Promise(d=>setTimeout(d,c));continue}h.warn(`sendOutput failed after ${t+1} attempts (${a}), giving up to unblock serial queue`)}}}function de(e,n){const t=n?`${e}:${n}`:void 0;let o,r;if(t)o=G.get(t),r=t;else{const p=[];for(const[T,y]of G)T.startsWith(e+":")&&y.buffer&&p.push(y.sourceEventType);for(const T of p)de(e,T);return}if(!o||!o.buffer)return;o.timer=null;const s=o.buffer,i=o.seq,a=o.entry,c=o.sourceEventType;o.buffer="",r&&G.delete(r);const d={sourceEventType:c,logCategory:"acode"},u={runtimeAccessToken:a.runtimeAccessToken,schedulerBaseUrl:a.schedulerBaseUrl},m=(x.get(e)??Promise.resolve()).then(()=>ue(p=>X(a.agentId,s,e,i,d,u,p)),()=>ue(p=>X(a.agentId,s,e,i,d,u,p)));x.set(e,m),m.finally(()=>{x.get(e)===m&&x.delete(e)})}function Tn(e,n){const t=tn(e);if(!t)return;n.seq+=1;const o=n.seq,r=nn(e),s={runtimeAccessToken:n.runtimeAccessToken,schedulerBaseUrl:n.schedulerBaseUrl};if((e.type==="command_output"||e.type==="text_delta"||e.type==="thinking")&&t.length<In){const c=`${e.sessionId}:${e.type}`;let d=G.get(c);if(d||(d={buffer:"",seq:0,timer:null,entry:n,sourceEventType:e.type}),d.buffer+=t,d.seq=o,d.entry=n,!d.timer){const u=e.sessionId,l=e.type;d.timer=setTimeout(()=>de(u,l),Sn)}G.set(c,d);return}de(e.sessionId);const a=(x.get(e.sessionId)??Promise.resolve()).then(()=>ue(c=>X(n.agentId,t,e.sessionId,o,r,s,c)),()=>ue(c=>X(n.agentId,t,e.sessionId,o,r,s,c)));x.set(e.sessionId,a),a.finally(()=>{x.get(e.sessionId)===a&&x.delete(e.sessionId)})}function Ke(e){return Ye(e)}let ze=!1;function kn(){ze||(Je(b,bn),ot(),ze=!0)}function bn(e,n){e.on("event",t=>{const o=f.get(t.sessionId);if(o){if(t.type==="tool_use_start"?gt(o.sessionId,t.data.toolUseId||t.data.actionId,t.data.toolInput,t.data.toolName,o.workspacePath):t.type==="tool_use_end"&&pt(t,{sessionId:o.sessionId,agentId:o.agentId,workspacePath:o.workspacePath,providerId:o.providerId}),console.log(`[${n.displayName} Adapter] Event: ${t.type} for session ${t.sessionId}`),!(t.type==="thinking"||t.type==="text_delta"||t.type==="tool_use_start"||t.type==="context_compaction"||t.type==="ai_request")){t.type==="runtime_capabilities"&&t.data.actionDetail&&(o.cachedCapabilitiesActionDetail=t.data.actionDetail);const i=hn(t,o.currentRuntimeStatus);i&&_(o.agentId,t.sessionId,i.status,i.actionInfo,oe(i.actionInfo),{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl},t.timestamp?new Date(t.timestamp).getTime():void 0,t.type)}Tn(t,o);const s=en(t);if(s){const i={runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl},a=t.timestamp?new Date(t.timestamp).getTime():void 0,c=String(t.data?.toolName||"").toLowerCase()==="browser_launch",d=t.type==="tool_use_end"&&String(t.data?.rawToolName||t.data?.toolName||"").toLowerCase().replace(/[_-]/g,"").includes("todowrite");c?(async()=>{for(let l=0;l<3;l++){if(await _(o.agentId,t.sessionId,"tool_result",s,void 0,i,a,t.type)!==void 0)return;l<2&&await new Promise(p=>setTimeout(p,3e3*(l+1)))}})().catch(u=>console.warn("[Runtime] browser_launch sendStatus retry exhausted:",u)):d?(async()=>{for(let l=0;l<3;l++){if(await _(o.agentId,t.sessionId,"tool_result",s,void 0,i,a,t.type)!==void 0)return;l<2&&await new Promise(p=>setTimeout(p,1e3*(l+1)))}})().catch(u=>console.warn("[Runtime] todo_write sendStatus retry exhausted:",u)):_(o.agentId,t.sessionId,"tool_result",s,void 0,i,a,t.type)}}}),e.on("status-change",(t,o,r)=>{const s=f.get(t);if(s){de(t),o==="thinking"||o==="tool_using"||o==="compacting"?Ct(t):L(t);const i=Mt(o,r);s.currentRuntimeStatus=i.status;const a=s.currentRuntimeActionDetail??"",c=a.includes("poll_message")||a.includes("get_message"),u=!(i.actionInfo?.actionType==="ai_request")&&(i.status==="thinking"||i.status==="waiting_input")&&(s.currentRuntimeActionType==="idle"||s.currentRuntimeActionType==="mcp")&&c;(i.actionInfo?.actionType||!u)&&(s.currentRuntimeActionType=i.actionInfo?.actionType,s.currentRuntimeActionLabel=i.actionInfo?.actionLabel,s.currentRuntimeActionDetail=i.actionInfo?.actionDetail,s.currentRuntimeActionInput=i.actionInfo?.actionInput),console.log(`[${n.displayName} Adapter] Status changed: ${i.status} for agent ${s.agentId}`,i.actionInfo||""),Tt(t,{runtimeStatus:i.status,runtimeActionType:s.currentRuntimeActionType,runtimeActionLabel:s.currentRuntimeActionLabel,runtimeActionDetail:s.currentRuntimeActionDetail});const l=i.actionInfo?.actionType?i.actionInfo:s.currentRuntimeActionType?{actionType:s.currentRuntimeActionType,actionLabel:s.currentRuntimeActionLabel??"",actionDetail:s.currentRuntimeActionDetail,actionInput:s.currentRuntimeActionInput}:void 0;if(i.status==="compacting"){const p=(ae.get(t)??Promise.resolve()).then(async()=>{for(let y=0;y<=2;y++){if(await _(s.agentId,t,i.status,l,oe(i.actionInfo),{runtimeAccessToken:s.runtimeAccessToken,schedulerBaseUrl:s.schedulerBaseUrl})!==void 0)return;y<2&&(h.warn(`[${n.displayName}] compaction sendStatus attempt ${y+1} failed (HTTP), retrying in ${1e3*(y+1)}ms...`),await new Promise(C=>setTimeout(C,1e3*(y+1))))}h.warn(`[${n.displayName}] compaction sendStatus failed after 3 attempts, event may be lost`)}).catch(T=>{h.warn(`[${n.displayName}] compaction status chain error:`,T)});ae.set(t,p),p.finally(()=>{ae.get(t)===p&&ae.delete(t)})}else{const m=u&&!i.actionInfo?.actionType;if(l?.actionType==="idle"||s.currentRuntimeActionType==="idle"&&u){const y=(ce.get(t)??Promise.resolve()).then(async()=>{for(let C=0;C<=2;C++){if(await _(s.agentId,t,i.status,m?void 0:l,oe(i.actionInfo),{runtimeAccessToken:s.runtimeAccessToken,schedulerBaseUrl:s.schedulerBaseUrl})!==void 0)return;C<2&&await new Promise(M=>setTimeout(M,1e3*(C+1)))}h.warn(`[${n.displayName}] idle tool sendStatus failed after 3 attempts, status may be stale (frontend will fall back to timeline tool_use event)`)}).catch(g=>{h.warn(`[${n.displayName}] idle status chain error:`,g)});ce.set(t,y),y.finally(()=>{ce.get(t)===y&&ce.delete(t)})}else _(s.agentId,t,i.status,m?void 0:l,oe(i.actionInfo),{runtimeAccessToken:s.runtimeAccessToken,schedulerBaseUrl:s.schedulerBaseUrl})}if(i.status==="waiting_input"&&s.cachedCapabilitiesActionDetail){const m=s.cachedCapabilitiesActionDetail;s.cachedCapabilitiesActionDetail=void 0,console.log(`[${n.displayName} Adapter] Re-sending cached runtime_capabilities for agent ${s.agentId} (session stabilized to waiting_input)`),_(s.agentId,t,"waiting_input",{actionType:"runtime_capabilities",actionLabel:"\u8FD0\u884C\u65F6\u80FD\u529B",actionDetail:m},void 0,{runtimeAccessToken:s.runtimeAccessToken,schedulerBaseUrl:s.schedulerBaseUrl})}}}),e.on("ask-user-question",t=>{const o=f.get(t.sessionId);o&&(console.log(`[${n.displayName} Adapter] AskUserQuestion for agent ${o.agentId}`),yt(o.agentId,t.sessionId,Array.isArray(t.questions)?t.questions:[],{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl},t.toolCallId))}),e.on("tool-permission-request",t=>{const o=f.get(t.sessionId);o&&t.requestId&&(console.log(`[${n.displayName} Adapter] Tool permission request (${t.capability}) for agent ${o.agentId}`),ht(o.agentId,t.sessionId,{requestId:t.requestId,capability:t.capability,...t.detail||{}},{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl}))}),e.on("permission-request",t=>{const o=f.get(t.sessionId);if(o){console.log(`[${n.displayName} Adapter] Permission request: ${t.toolName} for agent ${o.agentId}`);const r=t.toolInput?q(JSON.stringify(t.toolInput).slice(0,400)):void 0;_(o.agentId,t.sessionId,"waiting_input",{actionType:"other",actionLabel:"\u6743\u9650\u786E\u8BA4",actionDetail:r||t.toolName},void 0,{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl})}})}S.post("/start",I,async(e,n)=>{const{agentId:t,workspacePath:o,mode:r="sdk"}=e.body||{};if(!t||!o){n.status(400).json({error:"agentId and workspacePath are required"});return}const s=String(e.body?.schedulerBaseUrl||"").trim()||String(e.header("x-bridge-tunnel-source")||"").trim()||$e(Pe(e))||void 0;dt({agentId:String(t),workspacePath:String(o),serverUrl:e.body?.serverUrl||s,runtimeAccessToken:e.body?.runtimeAccessToken,userId:e.body?.userId,schedulerBaseUrl:s}),e.body?.runtimeFeatures!=null&&(st(String(t),e.body.runtimeFeatures),console.log(`[Runtime] agent ${t} \u542F\u52A8\u4E0B\u53D1\u80FD\u529B\u5F00\u5173: ${JSON.stringify(at(String(t)))}`)),e.body?.capabilities!==void 0&&it(String(t),e.body.capabilities),e.body?.envVars!=null&&typeof e.body.envVars=="object"&&(lt(e.body.envVars),console.log(`[Runtime] agent ${t} \u4E0B\u53D1\u9762\u677F\u73AF\u5883\u53D8\u91CF: ${Object.keys(e.body.envVars).length} \u9879 \u2192 \u684C\u9762\u5DE5\u5177\u5B50\u8FDB\u7A0B`)),e.body?.changeCacheRetentionDays!==void 0&&(tt(e.body.changeCacheRetentionDays),console.log(`[Runtime] agent ${t} \u4E0B\u53D1\u53D8\u66F4\u7F13\u5B58\u4FDD\u7559\u5929\u6570: ${e.body.changeCacheRetentionDays??"\u4E0D\u6E05\u7406"}`)),r&&r!=="sdk"&&console.warn(`[Runtime] Unsupported runtime mode "${r}" requested for agent ${t}; starting SDK session instead.`),await wn(e,n)});async function wn(e,n){const{agentId:t,workspacePath:o,command:r,autoAccept:s=!0,initialPrompt:i,systemPrompt:a,globalPrompt:c,rolePrompt:d,memory:u,mcpConfigPath:l,extraMcpServers:m,envOverrides:p,idleInputAutoCommand:T,nonInputAutoCommand:y,model:g,instanceAiConfig:C,subAgentModel:$,subAgentEffort:M,scopeKey:Te,browserAllowPrivate:ke}=e.body||{},z=bt();z.log({level:"info",category:"launch",message:"startSdkSession: \u6536\u5230\u542F\u52A8\u8BF7\u6C42",source:"bridge",agentId:String(t||"").trim()||void 0,details:{reqBodyKeys:Object.keys(e.body||{}),perInstanceAiConfig:C?te(C):null,perAgentModel:g??null}});let D=null;const A=String(t||"").trim(),le=String(e.body?.runtimeAccessToken||"").trim()||void 0,B=String(e.body?.schedulerBaseUrl||"").trim()||String(e.header("x-bridge-tunnel-source")||"").trim()||$e(Pe(e))||void 0;B?h.info(`[startSdkSession] \u56DE\u8C03\u76EE\u6807 server: ${B} (agentId=${A})`):h.warn(`[startSdkSession] \u672A\u89E3\u6790\u5230 schedulerBaseUrl\uFF0C\u5C06\u56DE\u9000\u5230\u9ED8\u8BA4\u5730\u5740 (agentId=${A})`);try{if(kn(),!A){n.status(400).json({error:"agentId is required"});return}const O=Be(A);if(O){n.json(await Kt(O));return}const k=await It(A);if(k){const R=zt(k);if(!R.reusable)console.warn(`[Runtime] Ignoring stale persisted SDK session for agentId=${A}, sessionId=${k.sessionId}, reason=${R.reason}`),await F(k.sessionId);else{const P=se(k.runtimeStatus,k.runtimeStatus,k.runtimeActionType);n.json({sessionId:k.sessionId,status:P,runtimeStatus:P,runtimeActionType:k.runtimeActionType,runtimeActionLabel:k.runtimeActionLabel,runtimeActionDetail:k.runtimeActionDetail,agentId:k.agentId,workspacePath:k.workspacePath,command:k.command,mode:k.mode||"sdk",pid:k.pid,reused:!0,persistedOnly:!0});return}}if(K.has(A)){n.status(409).json({error:"SDK session is already starting for this agent"});return}K.add(A);const Dn=(r||"acode").toLowerCase(),E=Ke(r),He=b.get(E);D=Ge();const We=E==="claude-code"?await Gt():null,J=Ne(E==="claude-code"?We:null,p),H=E==="acode"?g?String(g).trim():void 0:(()=>{const R=g?String(g).trim():void 0,P=J.model?String(J.model).trim():void 0;return R||P})();z.log({level:"info",category:"resolve",message:"\u6A21\u578B\u89E3\u6790\u7ED3\u679C",source:"bridge",agentId:A,sessionId:D??void 0,details:{perAgentModel:g??null,globalModel:J.model??null,resolvedModel:H??null,providerId:E,note:E==="acode"?"adapter handles full priority":"request > global"}});const me={...J.envOverrides};H&&(me.ANTHROPIC_MODEL=H,me.CODEX_MODEL=H);let W,fe=l;if(E==="acode"){const R=C||{},P=await rt({apiOverrides:Ie(R)??void 0,agentId:A,sessionId:D??void 0,runtimeBridgeBaseUrl:B});W=P.instanceConfig.config,fe=P.perInstanceConfigPath,z.log({level:"info",category:"apply",message:"prepareAcodeInstanceConfig \u5B8C\u6210",source:"bridge",agentId:A,sessionId:D??void 0,details:{sanitizedApiOverrides:Ie(R)?te(Ie(R)):null,resolvedInstanceAiConfig:W?te(W):null,perInstanceConfigPath:fe,instanceConfigSources:P.instanceConfig.source??null}})}let be=a||void 0,pe,ge,Y;if(E==="acode")if(pe=typeof c=="string"&&c.trim()||void 0,ge=typeof d=="string"&&d.trim()||void 0,typeof u=="string"&&u.trim())Y=u.trim();else{const R=await Dt(o,{schedulerBaseUrl:B,runtimeAccessToken:le,agentId:A});R&&(Y=R,h.info(`[startSdkSession] Auto-loaded memories for ACode agent ${A}`))}else if(typeof c=="string"&&c.trim()||typeof d=="string"&&d.trim()||typeof u=="string"&&u.trim()){const P=[c,d,u,a].filter(Z=>typeof Z=="string"&&Z.trim().length>0).map(Z=>Z.trim());be=P.length>0?P.join(`
52
52
 
53
- `):void 0}const U={command:r||"acode",workingDirectory:o,agentId:A,...Te?{scopeKey:Te}:{},...typeof ke=="boolean"?{browserAllowPrivate:ke}:{},autoAccept:!!s,initialPrompt:i,systemPrompt:we,...pe!==void 0?{globalPrompt:pe}:{},...ge!==void 0?{rolePrompt:ge}:{},...Y!==void 0?{memory:Y}:{},model:H,mcpConfigPath:fe,...W?{instanceAiConfig:W}:{},...typeof $=="string"&&$.trim()?{subAgentModel:$.trim()}:{},...typeof M=="string"&&M.trim()?{subAgentEffort:M.trim()}:{},extraMcpServers:m||{},envOverrides:Oe(String(t),String(o),process.env,me)};z.log({level:"info",category:"launch",message:"\u4F20\u9012\u7ED9 Adapter \u7684\u5B8C\u6574 AdapterSessionConfig",source:"bridge",agentId:A,sessionId:D,details:{adapterModel:U.model??null,adapterInstanceAiConfig:U.instanceAiConfig?te(U.instanceAiConfig):null,adapterMcpConfigPath:U.mcpConfigPath??null}}),await z.flush(),f.set(D,{agentId:A,workspacePath:o,sessionId:D,config:U,providerId:E,seq:0,runtimeAccessToken:le,schedulerBaseUrl:B}),n.json({sessionId:D,status:"starting",runtimeStatus:"starting",agentId:A,workspacePath:o,command:U.command,mode:"sdk"}),bn({sessionId:D,agentId:A,config:U,adapter:He,providerId:E,idleInputAutoCommand:T,nonInputAutoCommand:y,runtimeAccessToken:le,requestedSchedulerBaseUrl:B})}catch(O){if(D&&(L(D),f.delete(D),v(D)),A&&K.delete(A),!n.headersSent){const k=O instanceof Error?O.message:String(O);n.status(500).json({error:`Failed to start SDK session: ${k}`})}}}async function bn(e){const{sessionId:n,agentId:t,config:o,adapter:r,providerId:s,idleInputAutoCommand:i,nonInputAutoCommand:a,runtimeAccessToken:c,requestedSchedulerBaseUrl:d}=e;try{await r.startSession(n,o),(i||a)&&r.setIdleCommands?.(n,{idleInputCommand:i||"",nonInputCommand:a||""});let u;if(Rt(s))try{if(await new Promise(m=>setTimeout(m,500)),u=r.getSessionPid?.(n),!u){const p=(await ut()).find(T=>T.agentId===t||T.cwd===o.workingDirectory||T.command.includes(o.workingDirectory));p&&(u=p.pid,console.log(`[Runtime] Found SDK process PID: ${u} for agentId=${t}`))}}catch(m){console.warn(`[Runtime] Failed to get SDK PID for agentId=${t}:`,m)}const l=se(r.getSessionStatus(n),f.get(n)?.currentRuntimeStatus,f.get(n)?.currentRuntimeActionType);await Tt({sessionId:n,agentId:t,workspacePath:o.workingDirectory,command:o.command,startedAt:new Date().toISOString(),status:"running",runtimeStatus:l,mode:"sdk",pid:u,providerSessionId:r.getProviderSessionId(n)}),u&&await he().startProcess({agentId:t,sessionId:n,pid:u,mode:"sdk",workspacePath:o.workingDirectory,command:o.command}),await Cn({agentId:t,sessionId:n,sdkPid:u,status:l,schedulerBaseUrl:d,runtimeAccessToken:c})}catch(u){L(n),f.delete(n),v(n),await F(n);const l=u instanceof Error?u.message:String(u);console.error(`[Runtime] Background SDK session startup failed for agentId=${t}: ${l}`),await _n({agentId:t,sessionId:n,schedulerBaseUrl:d,runtimeAccessToken:c,errorMessage:l})}finally{K.delete(t)}}async function Cn(e){const{agentId:n,sessionId:t,sdkPid:o,status:r,schedulerBaseUrl:s,runtimeAccessToken:i}=e;if(!s||!i){h.debug(`[Runtime] notifyServerSessionReady skipped: missing schedulerBaseUrl or runtimeAccessToken for agentId=${n}`);return}const a=`${s.replace(/\/+$/,"")}/api/runtime/callback/status`;try{await be.post(a,{agentId:n,sessionId:t,status:r,pid:o},{headers:{"X-Runtime-Token":i,"Content-Type":"application/json"},timeout:5e3}),h.debug(`[Runtime] Notified server session ready: agentId=${n}, sessionId=${t}, status=${r}`)}catch(c){const d=c instanceof Error?c.message:String(c);h.warn(`[Runtime] Failed to notify server session ready: agentId=${n}, error=${d}`)}}async function _n(e){const{agentId:n,sessionId:t,schedulerBaseUrl:o,runtimeAccessToken:r}=e;if(!o||!r)return;const s=`${o.replace(/\/+$/,"")}/api/runtime/callback/status`;try{await be.post(s,{agentId:n,sessionId:t,status:"stopped"},{headers:{"X-Runtime-Token":r,"Content-Type":"application/json"},timeout:5e3}),h.debug(`[Runtime] Notified server session failed: agentId=${n}, sessionId=${t}`)}catch(i){const a=i instanceof Error?i.message:String(i);h.warn(`[Runtime] Failed to notify server session failed: agentId=${n}, error=${a}`)}}S.post("/sdk/message",I,async(e,n)=>{const{sessionId:t,message:o}=e.body||{};if(!t||!o){n.status(400).json({error:"sessionId and message are required"});return}const r=f.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const s=r.providerId||"claude-code";await w.get(s).sendMessage(t,o),n.json({ok:!0})}catch(s){const i=s instanceof Error?s.message:String(s);n.status(500).json({error:i})}}),S.post("/sdk/answer",I,async(e,n)=>{const{sessionId:t,answers:o}=e.body||{};if(!t||!o){n.status(400).json({error:"sessionId and answers are required"});return}const r=f.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const s=r.providerId||"claude-code",i=w.get(s);i.sendQuestionAnswer&&await i.sendQuestionAnswer(t,o),n.json({ok:!0})}catch(s){const i=s instanceof Error?s.message:String(s);n.status(500).json({error:i})}}),S.post("/tool-auth/answer",I,async(e,n)=>{const{sessionId:t,requestId:o,allowed:r}=e.body||{};if(!t||!o){n.status(400).json({error:"sessionId and requestId are required"});return}const s=f.get(t);if(!s){n.status(404).json({error:"SDK session not found"});return}try{const i=s.providerId||"claude-code",a=w.get(i);if(!a.submitToolPermissionDecision){n.status(400).json({error:"adapter does not support tool authorization"});return}const c=a.submitToolPermissionDecision(t,String(o),!!r);n.json({ok:!0,existed:c})}catch(i){const a=i instanceof Error?i.message:String(i);n.status(500).json({error:a})}}),S.get("/tool-auth/pending/:sessionId",I,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const o=f.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const r=o.providerId||"claude-code",i=w.get(r).getPendingToolAuthRequests?.(t)??[];n.json({ok:!0,sessionId:t,agentId:o.agentId,pendingRequests:i,fetchedAt:Date.now()})}catch(r){const s=r instanceof Error?r.message:String(r);n.status(500).json({error:s})}}),S.post("/sdk/confirm",I,async(e,n)=>{const{sessionId:t,accept:o}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const r=f.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const s=r.providerId||"claude-code";await w.get(s).sendConfirmation(t,!!o),n.json({ok:!0})}catch(s){const i=s instanceof Error?s.message:String(s);n.status(500).json({error:i})}}),S.post("/sdk/abort",I,async(e,n)=>{const{sessionId:t}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const o=f.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const r=o.providerId||"claude-code";await w.get(r).abortCurrentTurn(t),n.json({ok:!0})}catch(r){const s=r instanceof Error?r.message:String(r);n.status(500).json({error:s})}}),S.post("/sdk/stop",I,async(e,n)=>{const{sessionId:t}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const o=f.get(t);if(!o){n.json({ok:!0,status:"stopped"});return}try{const r=o.providerId||"claude-code",s=w.get(r);s.abortCurrentTurn(t).catch(()=>{}),await s.terminateSession(t),L(t),f.delete(t),v(t),ie(t),await F(t),await he().removeProcess(o.agentId),await _(o.agentId,null,"stopped",void 0,void 0,{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl}),n.json({ok:!0,status:"stopped"})}catch(r){const s=r instanceof Error?r.message:String(r);n.status(500).json({error:s})}}),S.get("/sdk/status/:sessionId",I,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const o=f.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const r=o.providerId||"claude-code",s=w.get(r),i=s.getSessionStatus(t),a=s.getConversation(t);n.json({sessionId:t,status:i,agentId:o.agentId,workspacePath:o.workspacePath,messageCount:a.length})}catch(r){const s=r instanceof Error?r.message:String(r);n.status(500).json({error:s})}}),S.get("/sdk/capabilities/:sessionId",I,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const o=f.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const r=o.providerId||"claude-code",i=w.get(r).getCapabilities?.(t)??null;n.json({ok:!0,sessionId:t,agentId:o.agentId,capabilities:i,fetchedAt:Date.now()})}catch(r){const s=r instanceof Error?r.message:String(r);n.status(500).json({error:s})}}),S.get("/sdk/pending-questions/:sessionId",I,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const o=f.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const r=o.providerId||"claude-code",i=w.get(r).getPendingQuestion?.(t)??null;n.json({ok:!0,sessionId:t,agentId:o.agentId,pendingQuestion:i?{toolCallId:i.toolCallId,questions:i.questions}:null,fetchedAt:Date.now()})}catch(r){const s=r instanceof Error?r.message:String(r);n.status(500).json({error:s})}}),S.post("/command",I,async(e,n)=>{const{sessionId:t,command:o}=e.body||{};if(!t||o===void 0||o===null){n.status(400).json({error:"sessionId and command are required"});return}try{const r=await Wt(String(t),o);n.json({ok:!0,mode:"terminal",...r})}catch(r){const s=r instanceof Error?r.message:String(r);n.status(500).json({error:s})}}),S.post("/input",I,async(e,n)=>{const{sessionId:t,input:o,mode:r}=e.body||{};if(!t||o===void 0||o===null){n.status(400).json({error:"sessionId and input are required"});return}const s=f.get(t);if(!s){n.status(404).json({error:"SDK session not found"});return}try{const i=s.providerId||"claude-code",a=w.get(i);if(r==="shortcut"){if(!a.sendShortcutInput){n.status(400).json({error:"shortcut input is not supported by this SDK provider"});return}await a.sendShortcutInput(t,String(o)),n.json({ok:!0,mode:"shortcut"});return}await a.sendMessage(t,await Qt(o)),n.json({ok:!0,mode:"sdk"})}catch(i){const a=i instanceof Error?i.message:String(i);n.status(500).json({error:a})}}),S.post("/update-auto-commands",I,async(e,n)=>{const{agentId:t,idleInputAutoCommand:o="",nonInputAutoCommand:r=""}=e.body||{},s=String(t||"").trim();if(!s){n.status(400).json({error:"agentId is required"});return}const i=[...f.values()].find(c=>c.agentId===s),a={idleInputCommand:String(o||""),nonInputCommand:String(r||"")};try{let c=!1;i&&(w.get(i.providerId||"claude-code").setIdleCommands?.(i.sessionId,a),c=!0);const d=await St(s,{idleInputAutoCommand:a.idleInputCommand,nonInputAutoCommand:a.nonInputCommand});n.json({ok:!0,mode:"sdk",sessionUpdated:c,persistedUpdated:d})}catch(c){const d=c instanceof Error?c.message:String(c);n.status(500).json({ok:!1,mode:"sdk",error:d})}}),S.post("/resize",I,(e,n)=>{const{sessionId:t,cols:o,rows:r}=e.body||{};if(!t||!o||!r){n.status(400).json({error:"sessionId, cols, rows are required"});return}if(!f.has(t)){n.status(404).json({error:"SDK session not found"});return}n.json({ok:!0,mode:"sdk",noop:!0,cols:Number(o),rows:Number(r)})}),S.post("/reset-context",I,async(e,n)=>{const{sessionId:t,reason:o}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const r=f.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}const s=r.providerId||"claude-code",i=w.get(s),a=i.resetContext?.bind(i),c=Dt(s,!!a);if(!c.supported){n.status(c.statusCode).json({error:c.error});return}if(!a){n.status(500).json({error:"ACode adapter does not expose resetContext"});return}try{await a(String(t));const d=se(i.getSessionStatus(String(t)),r.currentRuntimeStatus,r.currentRuntimeActionType);n.json({ok:!0,contextReset:!0,sessionId:t,status:d,runtimeStatus:d,agentId:r.agentId,mode:"sdk",providerId:s,reason:typeof o=="string"&&o.trim()?o.trim():void 0})}catch(d){const u=d instanceof Error?d.message:String(d);n.status(500).json({ok:!1,contextReset:!1,mode:"sdk",error:u})}}),S.post("/stop",I,async(e,n)=>{const{sessionId:t}=e.body||{},o=Pt(e.body);if(!t){n.status(400).json({error:"sessionId is required"});return}const r=f.get(t);if(!r){await F(t),n.json({ok:!0,status:"stopped",mode:"none",statusNotified:!1,reason:o.reason});return}const s=r.agentId;try{console.log(`[Runtime] Stopping SDK session ${t}; suppressStatus=${!o.statusNotified}, reason=${o.reason||"unspecified"}`);const i=r.providerId||"claude-code",a=w.get(i);a.abortCurrentTurn(t).catch(()=>{}),await a.terminateSession(t),L(t),f.delete(t),v(t),ie(t),await F(t),await he().removeProcess(s),o.statusNotified?await _(s,null,"stopped",void 0,void 0,{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl}):console.log(`[Runtime] Stopped status notification suppressed for SDK session ${t}; reason=${o.reason||"unspecified"}`),n.json({ok:!0,status:"stopped",mode:"sdk",statusNotified:o.statusNotified,reason:o.reason})}catch(i){const a=i instanceof Error?i.message:String(i);console.error(`[Runtime] Failed to terminate SDK session ${t}:`,a),n.status(500).json({ok:!1,status:"stop_failed",mode:"sdk",error:a})}}),S.post("/stop-all",I,async(e,n)=>{const t=[],o=[];for(const[r,s]of f.entries())try{const i=s.providerId||"claude-code",a=w.get(i);a.abortCurrentTurn(r).catch(()=>{}),await a.terminateSession(r),L(r),f.delete(r),v(r),ie(r),t.push(r),await _(s.agentId,null,"stopped",void 0,void 0,{runtimeAccessToken:s.runtimeAccessToken,schedulerBaseUrl:s.schedulerBaseUrl})}catch(i){const a=i instanceof Error?i.message:String(i);o.push(`SDK ${r}: ${a}`)}try{await It([]),console.log("[Runtime] \u5DF2\u6E05\u7A7A\u6240\u6709\u6301\u4E45\u5316\u4F1A\u8BDD")}catch(r){const s=r instanceof Error?r.message:String(r);o.push(`Persistence: ${s}`)}n.json({ok:!0,stopped:{sdk:t.length},errors:o.length>0?o:void 0})}),S.get("/events/last/:n",I,(e,n)=>{const t=parseInt(e.params.n,10);if(!Number.isFinite(t)||t<1){n.status(400).json({error:":n must be a positive integer"});return}const o=Re.getLastN(t);n.json({ok:!0,count:o.length,entries:o})}),S.get("/events/since/:index",I,(e,n)=>{const t=parseInt(e.params.index,10);if(!Number.isFinite(t)||t<0){n.status(400).json({error:":index must be a non-negative integer"});return}const o=Re.getSinceIndex(t);n.json({ok:!0,entries:o.entries,nextIndex:o.nextIndex,oldestIndex:o.oldestIndex,dataLoss:o.oldestIndex>t+1})}),S.get("/events/push-stats",I,(e,n)=>{const t=ft();n.json({ok:!0,count:t.length,agents:t})});export{Lt as buildAcodeCommandOutputPath,Ne as buildClaudeCodeLaunchConfig,Oe as buildRuntimeEnv,tn as buildSdkOutputMetadata,Zt as buildToolResultTimelineActionInfo,eo as cleanupSdkSessionByAgentId,xt as countTerminalOutputLines,je as createTerminalOutputDecoder,re as decodeTerminalOutputChunk,Kt as evaluatePersistedSessionReuse,jt as formatCommandInactivityTimeoutNotice,Ut as formatCommandOutputSpilloverNotice,en as formatSdkOutputEvent,Se as formatTerminalPrompt,Bt as normalizeTerminalCommandInput,Pt as parseRuntimeStopOptions,qt as parseTerminalDirectoryChangeTarget,ue as raceSendOutputWithRetry,Dt as resolveRuntimeContextResetSupport,yn as resolveRuntimeStatusFromProviderEvent,Qt as resolveSdkInputMessage,Ke as resolveSdkProviderId,se as resolveSdkSessionDisplayStatus,Et as resolveStatusChangeRuntimeState,oe as resolveStatusChangeUsage,Ot as resolveTerminalOutputEncoding,f as sdkSessions,Rt as shouldProbeSdkProcessPid,S as terminalRouter};
53
+ `):void 0}const U={command:r||"acode",workingDirectory:o,agentId:A,...Te?{scopeKey:Te}:{},...typeof ke=="boolean"?{browserAllowPrivate:ke}:{},autoAccept:!!s,initialPrompt:i,systemPrompt:be,...pe!==void 0?{globalPrompt:pe}:{},...ge!==void 0?{rolePrompt:ge}:{},...Y!==void 0?{memory:Y}:{},model:H,mcpConfigPath:fe,...W?{instanceAiConfig:W}:{},...typeof $=="string"&&$.trim()?{subAgentModel:$.trim()}:{},...typeof M=="string"&&M.trim()?{subAgentEffort:M.trim()}:{},extraMcpServers:m||{},envOverrides:Oe(String(t),String(o),process.env,me)};z.log({level:"info",category:"launch",message:"\u4F20\u9012\u7ED9 Adapter \u7684\u5B8C\u6574 AdapterSessionConfig",source:"bridge",agentId:A,sessionId:D,details:{adapterModel:U.model??null,adapterInstanceAiConfig:U.instanceAiConfig?te(U.instanceAiConfig):null,adapterMcpConfigPath:U.mcpConfigPath??null}}),await z.flush(),f.set(D,{agentId:A,workspacePath:o,sessionId:D,config:U,providerId:E,seq:0,runtimeAccessToken:le,schedulerBaseUrl:B}),n.json({sessionId:D,status:"starting",runtimeStatus:"starting",agentId:A,workspacePath:o,command:U.command,mode:"sdk"}),Cn({sessionId:D,agentId:A,config:U,adapter:He,providerId:E,idleInputAutoCommand:T,nonInputAutoCommand:y,runtimeAccessToken:le,requestedSchedulerBaseUrl:B})}catch(O){if(D&&(L(D),f.delete(D),v(D)),A&&K.delete(A),!n.headersSent){const k=O instanceof Error?O.message:String(O);n.status(500).json({error:`Failed to start SDK session: ${k}`})}}}async function Cn(e){const{sessionId:n,agentId:t,config:o,adapter:r,providerId:s,idleInputAutoCommand:i,nonInputAutoCommand:a,runtimeAccessToken:c,requestedSchedulerBaseUrl:d}=e;try{await r.startSession(n,o),(i||a)&&r.setIdleCommands?.(n,{idleInputCommand:i||"",nonInputCommand:a||""});let u;if(Pt(s))try{if(await new Promise(m=>setTimeout(m,500)),u=r.getSessionPid?.(n),!u){const p=(await mt()).find(T=>T.agentId===t||T.cwd===o.workingDirectory||T.command.includes(o.workingDirectory));p&&(u=p.pid,console.log(`[Runtime] Found SDK process PID: ${u} for agentId=${t}`))}}catch(m){console.warn(`[Runtime] Failed to get SDK PID for agentId=${t}:`,m)}const l=se(r.getSessionStatus(n),f.get(n)?.currentRuntimeStatus,f.get(n)?.currentRuntimeActionType);await kt({sessionId:n,agentId:t,workspacePath:o.workingDirectory,command:o.command,startedAt:new Date().toISOString(),status:"running",runtimeStatus:l,mode:"sdk",pid:u,providerSessionId:r.getProviderSessionId(n)}),u&&await he().startProcess({agentId:t,sessionId:n,pid:u,mode:"sdk",workspacePath:o.workingDirectory,command:o.command}),await _n({agentId:t,sessionId:n,sdkPid:u,status:l,schedulerBaseUrl:d,runtimeAccessToken:c})}catch(u){L(n),f.delete(n),v(n),await F(n);const l=u instanceof Error?u.message:String(u);console.error(`[Runtime] Background SDK session startup failed for agentId=${t}: ${l}`),await $n({agentId:t,sessionId:n,schedulerBaseUrl:d,runtimeAccessToken:c,errorMessage:l})}finally{K.delete(t)}}async function _n(e){const{agentId:n,sessionId:t,sdkPid:o,status:r,schedulerBaseUrl:s,runtimeAccessToken:i}=e;if(!s||!i){h.debug(`[Runtime] notifyServerSessionReady skipped: missing schedulerBaseUrl or runtimeAccessToken for agentId=${n}`);return}const a=`${s.replace(/\/+$/,"")}/api/runtime/callback/status`;try{await we.post(a,{agentId:n,sessionId:t,status:r,pid:o},{headers:{"X-Runtime-Token":i,"Content-Type":"application/json"},timeout:5e3}),h.debug(`[Runtime] Notified server session ready: agentId=${n}, sessionId=${t}, status=${r}`)}catch(c){const d=c instanceof Error?c.message:String(c);h.warn(`[Runtime] Failed to notify server session ready: agentId=${n}, error=${d}`)}}async function $n(e){const{agentId:n,sessionId:t,schedulerBaseUrl:o,runtimeAccessToken:r}=e;if(!o||!r)return;const s=`${o.replace(/\/+$/,"")}/api/runtime/callback/status`;try{await we.post(s,{agentId:n,sessionId:t,status:"stopped"},{headers:{"X-Runtime-Token":r,"Content-Type":"application/json"},timeout:5e3}),h.debug(`[Runtime] Notified server session failed: agentId=${n}, sessionId=${t}`)}catch(i){const a=i instanceof Error?i.message:String(i);h.warn(`[Runtime] Failed to notify server session failed: agentId=${n}, error=${a}`)}}S.post("/sdk/message",I,async(e,n)=>{const{sessionId:t,message:o}=e.body||{};if(!t||!o){n.status(400).json({error:"sessionId and message are required"});return}const r=f.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const s=r.providerId||"claude-code";await b.get(s).sendMessage(t,o),n.json({ok:!0})}catch(s){const i=s instanceof Error?s.message:String(s);n.status(500).json({error:i})}}),S.post("/sdk/answer",I,async(e,n)=>{const{sessionId:t,answers:o}=e.body||{};if(!t||!o){n.status(400).json({error:"sessionId and answers are required"});return}const r=f.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const s=r.providerId||"claude-code",i=b.get(s);i.sendQuestionAnswer&&await i.sendQuestionAnswer(t,o),n.json({ok:!0})}catch(s){const i=s instanceof Error?s.message:String(s);n.status(500).json({error:i})}}),S.post("/tool-auth/answer",I,async(e,n)=>{const{sessionId:t,requestId:o,allowed:r}=e.body||{};if(!t||!o){n.status(400).json({error:"sessionId and requestId are required"});return}const s=f.get(t);if(!s){n.status(404).json({error:"SDK session not found"});return}try{const i=s.providerId||"claude-code",a=b.get(i);if(!a.submitToolPermissionDecision){n.status(400).json({error:"adapter does not support tool authorization"});return}const c=a.submitToolPermissionDecision(t,String(o),!!r);n.json({ok:!0,existed:c})}catch(i){const a=i instanceof Error?i.message:String(i);n.status(500).json({error:a})}}),S.get("/tool-auth/pending/:sessionId",I,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const o=f.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const r=o.providerId||"claude-code",i=b.get(r).getPendingToolAuthRequests?.(t)??[];n.json({ok:!0,sessionId:t,agentId:o.agentId,pendingRequests:i,fetchedAt:Date.now()})}catch(r){const s=r instanceof Error?r.message:String(r);n.status(500).json({error:s})}}),S.post("/sdk/confirm",I,async(e,n)=>{const{sessionId:t,accept:o}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const r=f.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}try{const s=r.providerId||"claude-code";await b.get(s).sendConfirmation(t,!!o),n.json({ok:!0})}catch(s){const i=s instanceof Error?s.message:String(s);n.status(500).json({error:i})}}),S.post("/sdk/abort",I,async(e,n)=>{const{sessionId:t}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const o=f.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const r=o.providerId||"claude-code";await b.get(r).abortCurrentTurn(t),n.json({ok:!0})}catch(r){const s=r instanceof Error?r.message:String(r);n.status(500).json({error:s})}}),S.post("/sdk/stop",I,async(e,n)=>{const{sessionId:t}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const o=f.get(t);if(!o){n.json({ok:!0,status:"stopped"});return}try{const r=o.providerId||"claude-code",s=b.get(r);s.abortCurrentTurn(t).catch(()=>{}),await s.terminateSession(t),L(t),f.delete(t),v(t),ie(t),await F(t),await he().removeProcess(o.agentId),await _(o.agentId,null,"stopped",void 0,void 0,{runtimeAccessToken:o.runtimeAccessToken,schedulerBaseUrl:o.schedulerBaseUrl}),n.json({ok:!0,status:"stopped"})}catch(r){const s=r instanceof Error?r.message:String(r);n.status(500).json({error:s})}}),S.get("/sdk/status/:sessionId",I,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const o=f.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const r=o.providerId||"claude-code",s=b.get(r),i=s.getSessionStatus(t),a=s.getConversation(t);n.json({sessionId:t,status:i,agentId:o.agentId,workspacePath:o.workspacePath,messageCount:a.length})}catch(r){const s=r instanceof Error?r.message:String(r);n.status(500).json({error:s})}}),S.get("/sdk/capabilities/:sessionId",I,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const o=f.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const r=o.providerId||"claude-code",i=b.get(r).getCapabilities?.(t)??null;n.json({ok:!0,sessionId:t,agentId:o.agentId,capabilities:i,fetchedAt:Date.now()})}catch(r){const s=r instanceof Error?r.message:String(r);n.status(500).json({error:s})}}),S.get("/sdk/pending-questions/:sessionId",I,(e,n)=>{const t=e.params.sessionId;if(!t){n.status(400).json({error:"sessionId is required"});return}const o=f.get(t);if(!o){n.status(404).json({error:"SDK session not found"});return}try{const r=o.providerId||"claude-code",i=b.get(r).getPendingQuestion?.(t)??null;n.json({ok:!0,sessionId:t,agentId:o.agentId,pendingQuestion:i?{toolCallId:i.toolCallId,questions:i.questions}:null,fetchedAt:Date.now()})}catch(r){const s=r instanceof Error?r.message:String(r);n.status(500).json({error:s})}}),S.post("/command",I,async(e,n)=>{const{sessionId:t,command:o}=e.body||{};if(!t||o===void 0||o===null){n.status(400).json({error:"sessionId and command are required"});return}try{const r=await Xt(String(t),o);n.json({ok:!0,mode:"terminal",...r})}catch(r){const s=r instanceof Error?r.message:String(r);n.status(500).json({error:s})}}),S.post("/input",I,async(e,n)=>{const{sessionId:t,input:o,mode:r}=e.body||{};if(!t||o===void 0||o===null){n.status(400).json({error:"sessionId and input are required"});return}const s=f.get(t);if(!s){n.status(404).json({error:"SDK session not found"});return}try{const i=s.providerId||"claude-code",a=b.get(i);if(r==="shortcut"){if(!a.sendShortcutInput){n.status(400).json({error:"shortcut input is not supported by this SDK provider"});return}await a.sendShortcutInput(t,String(o)),n.json({ok:!0,mode:"shortcut"});return}await a.sendMessage(t,await Vt(o)),n.json({ok:!0,mode:"sdk"})}catch(i){const a=i instanceof Error?i.message:String(i);n.status(500).json({error:a})}}),S.post("/update-auto-commands",I,async(e,n)=>{const{agentId:t,idleInputAutoCommand:o="",nonInputAutoCommand:r=""}=e.body||{},s=String(t||"").trim();if(!s){n.status(400).json({error:"agentId is required"});return}const i=[...f.values()].find(c=>c.agentId===s),a={idleInputCommand:String(o||""),nonInputCommand:String(r||"")};try{let c=!1;i&&(b.get(i.providerId||"claude-code").setIdleCommands?.(i.sessionId,a),c=!0);const d=await At(s,{idleInputAutoCommand:a.idleInputCommand,nonInputAutoCommand:a.nonInputCommand});n.json({ok:!0,mode:"sdk",sessionUpdated:c,persistedUpdated:d})}catch(c){const d=c instanceof Error?c.message:String(c);n.status(500).json({ok:!1,mode:"sdk",error:d})}}),S.post("/resize",I,(e,n)=>{const{sessionId:t,cols:o,rows:r}=e.body||{};if(!t||!o||!r){n.status(400).json({error:"sessionId, cols, rows are required"});return}if(!f.has(t)){n.status(404).json({error:"SDK session not found"});return}n.json({ok:!0,mode:"sdk",noop:!0,cols:Number(o),rows:Number(r)})}),S.post("/reset-context",I,async(e,n)=>{const{sessionId:t,reason:o}=e.body||{};if(!t){n.status(400).json({error:"sessionId is required"});return}const r=f.get(t);if(!r){n.status(404).json({error:"SDK session not found"});return}const s=r.providerId||"claude-code",i=b.get(s),a=i.resetContext?.bind(i),c=Rt(s,!!a);if(!c.supported){n.status(c.statusCode).json({error:c.error});return}if(!a){n.status(500).json({error:"ACode adapter does not expose resetContext"});return}try{await a(String(t));const d=se(i.getSessionStatus(String(t)),r.currentRuntimeStatus,r.currentRuntimeActionType);n.json({ok:!0,contextReset:!0,sessionId:t,status:d,runtimeStatus:d,agentId:r.agentId,mode:"sdk",providerId:s,reason:typeof o=="string"&&o.trim()?o.trim():void 0})}catch(d){const u=d instanceof Error?d.message:String(d);n.status(500).json({ok:!1,contextReset:!1,mode:"sdk",error:u})}}),S.post("/stop",I,async(e,n)=>{const{sessionId:t}=e.body||{},o=Et(e.body);if(!t){n.status(400).json({error:"sessionId is required"});return}const r=f.get(t);if(!r){await F(t),n.json({ok:!0,status:"stopped",mode:"none",statusNotified:!1,reason:o.reason});return}const s=r.agentId;try{console.log(`[Runtime] Stopping SDK session ${t}; suppressStatus=${!o.statusNotified}, reason=${o.reason||"unspecified"}`);const i=r.providerId||"claude-code",a=b.get(i);a.abortCurrentTurn(t).catch(()=>{}),await a.terminateSession(t),L(t),f.delete(t),v(t),ie(t),await F(t),await he().removeProcess(s),o.statusNotified?await _(s,null,"stopped",void 0,void 0,{runtimeAccessToken:r.runtimeAccessToken,schedulerBaseUrl:r.schedulerBaseUrl}):console.log(`[Runtime] Stopped status notification suppressed for SDK session ${t}; reason=${o.reason||"unspecified"}`),n.json({ok:!0,status:"stopped",mode:"sdk",statusNotified:o.statusNotified,reason:o.reason})}catch(i){const a=i instanceof Error?i.message:String(i);console.error(`[Runtime] Failed to terminate SDK session ${t}:`,a),n.status(500).json({ok:!1,status:"stop_failed",mode:"sdk",error:a})}}),S.post("/stop-all",I,async(e,n)=>{const t=[],o=[];for(const[r,s]of f.entries())try{const i=s.providerId||"claude-code",a=b.get(i);a.abortCurrentTurn(r).catch(()=>{}),await a.terminateSession(r),L(r),f.delete(r),v(r),ie(r),t.push(r),await _(s.agentId,null,"stopped",void 0,void 0,{runtimeAccessToken:s.runtimeAccessToken,schedulerBaseUrl:s.schedulerBaseUrl})}catch(i){const a=i instanceof Error?i.message:String(i);o.push(`SDK ${r}: ${a}`)}try{await St([]),console.log("[Runtime] \u5DF2\u6E05\u7A7A\u6240\u6709\u6301\u4E45\u5316\u4F1A\u8BDD")}catch(r){const s=r instanceof Error?r.message:String(r);o.push(`Persistence: ${s}`)}n.json({ok:!0,stopped:{sdk:t.length},errors:o.length>0?o:void 0})}),S.get("/events/last/:n",I,(e,n)=>{const t=parseInt(e.params.n,10);if(!Number.isFinite(t)||t<1){n.status(400).json({error:":n must be a positive integer"});return}const o=Re.getLastN(t);n.json({ok:!0,count:o.length,entries:o})}),S.get("/events/since/:index",I,(e,n)=>{const t=parseInt(e.params.index,10);if(!Number.isFinite(t)||t<0){n.status(400).json({error:":index must be a non-negative integer"});return}const o=Re.getSinceIndex(t);n.json({ok:!0,entries:o.entries,nextIndex:o.nextIndex,oldestIndex:o.oldestIndex,dataLoss:o.oldestIndex>t+1})}),S.get("/events/push-stats",I,(e,n)=>{const t=nt();n.json({ok:!0,count:t.length,agents:t})});export{xt as buildAcodeCommandOutputPath,Ne as buildClaudeCodeLaunchConfig,Oe as buildRuntimeEnv,nn as buildSdkOutputMetadata,en as buildToolResultTimelineActionInfo,to as cleanupSdkSessionByAgentId,Ut as countTerminalOutputLines,je as createTerminalOutputDecoder,re as decodeTerminalOutputChunk,zt as evaluatePersistedSessionReuse,Bt as formatCommandInactivityTimeoutNotice,jt as formatCommandOutputSpilloverNotice,tn as formatSdkOutputEvent,Se as formatTerminalPrompt,Ot as normalizeTerminalCommandInput,Et as parseRuntimeStopOptions,vt as parseTerminalDirectoryChangeTarget,ue as raceSendOutputWithRetry,Rt as resolveRuntimeContextResetSupport,hn as resolveRuntimeStatusFromProviderEvent,Vt as resolveSdkInputMessage,Ke as resolveSdkProviderId,se as resolveSdkSessionDisplayStatus,Mt as resolveStatusChangeRuntimeState,oe as resolveStatusChangeUsage,Nt as resolveTerminalOutputEncoding,f as sdkSessions,Pt as shouldProbeSdkProcessPid,S as terminalRouter};
54
54
 
@@ -1,2 +1,2 @@
1
- import{Router as x}from"express";import{promises as y}from"node:fs";import r from"node:path";import{validateToken as S}from"../middleware/auth.js";import{createLogger as E}from"../utils/logger.js";import{resolveWorkspaceFilePath as b}from"../utils/path-utils.js";import{loadYmlWithUpwardSearch as D,extractAgentConfigOrTemplate as A,generateEmptyTemplate as C,autoFillPathInYml as $}from"../utils/yaml-utils.js";const T=E("yml-routes"),I=x();I.post("/read-yml",S,async(w,a)=>{const{workspacePath:k,ymlPath:l}=w.body||{};try{const{normalizedWorkspace:o,resolvedTarget:e}=b(k,l,".agentswork/my.yml"),c=l&&String(l).trim()||".agentswork/my.yml";if(r.isAbsolute(c)){let i="",g=!0;try{i=await y.readFile(e,"utf-8")}catch(P){if(P?.code==="ENOENT")g=!1;else throw P}const h=r.dirname(e),R=r.dirname(h);let p=r.relative(R,o);p===""&&(p=".");let d,j=!1,F=null;if(g&&i){const P=A(i,p);d=P.content,j=P.isTemplate,F=P.projectFromSibling}else d=C(p),j=!0;a.json({ok:!0,workspacePath:o,filePath:e,exists:g,content:d,fullContent:g?i:null,foundInParent:!1,isTemplate:j,projectFromSibling:F});return}const t=await D(o,c);T.info(`loadResult.content length: ${t.content?.length||0}`);const s=r.dirname(t.resolvedPath),m=r.dirname(s);let n=r.relative(m,o);n===""&&(n=".");let u,v=!1,f=null;if(t.content!==null){const i=A(t.content,n);u=i.content,v=i.isTemplate,f=i.projectFromSibling}else u=C(n),v=!0;T.info(`returning fullContent length: ${t.content?.length||0}`),a.json({ok:!0,workspacePath:o,filePath:t.resolvedPath,exists:t.content!==null,content:u,fullContent:t.content,foundInParent:t.foundInParent,matchedAgentPath:t.matchedAgentPath,isTemplate:v,projectFromSibling:f})}catch(o){const e=o;a.status(400).json({error:e?.message||"read yml failed"})}}),I.post("/load-yml",S,async(w,a)=>{const{workspacePath:k,ymlPath:l}=w.body||{};try{const{normalizedWorkspace:o,resolvedTarget:e}=b(k,l,".agentswork/my.yml"),c=l&&String(l).trim()||".agentswork/my.yml";if(r.isAbsolute(c)){let s=null,m=!0;try{s=await y.readFile(e,"utf-8"),T.info(`\u7EDD\u5BF9\u8DEF\u5F84\u8BFB\u53D6\u6210\u529F: ${e}, \u5185\u5BB9\u957F\u5EA6: ${s.length}`)}catch(n){if(n?.code==="ENOENT")m=!1,T.info(`\u7EDD\u5BF9\u8DEF\u5F84\u6587\u4EF6\u4E0D\u5B58\u5728: ${e}`);else throw n}a.json({ok:!0,workspacePath:o,filePath:e,exists:m,content:m?s:null});return}const t=await D(o,c);T.info(`\u5411\u4E0A\u67E5\u627E\u7ED3\u679C: filePath=${t.resolvedPath}, exists=${t.content!==null}, contentLength=${t.content?.length||0}`),a.json({ok:!0,workspacePath:o,filePath:t.resolvedPath,exists:t.content!==null,content:t.content,foundInParent:t.foundInParent})}catch(o){const e=o;a.status(400).json({error:e?.message||"load yml failed"})}}),I.post("/write-yml",S,async(w,a)=>{const{workspacePath:k,ymlPath:l,content:o}=w.body||{};if(!o||!String(o).trim()){a.status(400).json({error:"content is required"});return}try{const{normalizedWorkspace:e,resolvedTarget:c}=b(k,l,".agentswork/my.yml"),t=l&&String(l).trim()||".agentswork/my.yml";if(r.isAbsolute(t)){const h=c,R=r.dirname(h),p=r.dirname(R);let d=r.relative(p,e);d===""&&(d=".");const j=$(String(o),d),F=r.dirname(h);await y.mkdir(F,{recursive:!0}),await y.writeFile(h,j,"utf-8"),a.json({ok:!0,workspacePath:e,filePath:h,foundInParent:!1});return}const s=await D(e,t),m=r.resolve(e,t),n=s.content!==null?s.resolvedPath:m,u=r.dirname(n),v=r.dirname(u);let f=r.relative(v,e);f===""&&(f=".");const i=$(String(o),f),g=r.dirname(n);await y.mkdir(g,{recursive:!0}),await y.writeFile(n,i,"utf-8"),a.json({ok:!0,workspacePath:e,filePath:n,foundInParent:s.foundInParent,matchedAgentPath:s.matchedAgentPath,originalTarget:m!==n?m:void 0})}catch(e){const c=e;a.status(400).json({error:c?.message||"write yml failed"})}});export{I as ymlRouter};
1
+ import{promises as y}from"node:fs";import r from"node:path";import{Router as x}from"express";import{validateToken as S}from"../middleware/auth.js";import{createLogger as E}from"../utils/logger.js";import{resolveWorkspaceFilePath as b}from"../utils/path-utils.js";import{loadYmlWithUpwardSearch as D,extractAgentConfigOrTemplate as A,generateEmptyTemplate as C,autoFillPathInYml as $}from"../utils/yaml-utils.js";const T=E("yml-routes"),I=x();I.post("/read-yml",S,async(w,a)=>{const{workspacePath:k,ymlPath:l}=w.body||{};try{const{normalizedWorkspace:o,resolvedTarget:e}=b(k,l,".agentswork/my.yml"),c=l&&String(l).trim()||".agentswork/my.yml";if(r.isAbsolute(c)){let i="",g=!0;try{i=await y.readFile(e,"utf-8")}catch(P){if(P?.code==="ENOENT")g=!1;else throw P}const h=r.dirname(e),R=r.dirname(h);let p=r.relative(R,o);p===""&&(p=".");let d,j=!1,F=null;if(g&&i){const P=A(i,p);d=P.content,j=P.isTemplate,F=P.projectFromSibling}else d=C(p),j=!0;a.json({ok:!0,workspacePath:o,filePath:e,exists:g,content:d,fullContent:g?i:null,foundInParent:!1,isTemplate:j,projectFromSibling:F});return}const t=await D(o,c);T.info(`loadResult.content length: ${t.content?.length||0}`);const s=r.dirname(t.resolvedPath),m=r.dirname(s);let n=r.relative(m,o);n===""&&(n=".");let u,v=!1,f=null;if(t.content!==null){const i=A(t.content,n);u=i.content,v=i.isTemplate,f=i.projectFromSibling}else u=C(n),v=!0;T.info(`returning fullContent length: ${t.content?.length||0}`),a.json({ok:!0,workspacePath:o,filePath:t.resolvedPath,exists:t.content!==null,content:u,fullContent:t.content,foundInParent:t.foundInParent,matchedAgentPath:t.matchedAgentPath,isTemplate:v,projectFromSibling:f})}catch(o){const e=o;a.status(400).json({error:e?.message||"read yml failed"})}}),I.post("/load-yml",S,async(w,a)=>{const{workspacePath:k,ymlPath:l}=w.body||{};try{const{normalizedWorkspace:o,resolvedTarget:e}=b(k,l,".agentswork/my.yml"),c=l&&String(l).trim()||".agentswork/my.yml";if(r.isAbsolute(c)){let s=null,m=!0;try{s=await y.readFile(e,"utf-8"),T.info(`\u7EDD\u5BF9\u8DEF\u5F84\u8BFB\u53D6\u6210\u529F: ${e}, \u5185\u5BB9\u957F\u5EA6: ${s.length}`)}catch(n){if(n?.code==="ENOENT")m=!1,T.info(`\u7EDD\u5BF9\u8DEF\u5F84\u6587\u4EF6\u4E0D\u5B58\u5728: ${e}`);else throw n}a.json({ok:!0,workspacePath:o,filePath:e,exists:m,content:m?s:null});return}const t=await D(o,c);T.info(`\u5411\u4E0A\u67E5\u627E\u7ED3\u679C: filePath=${t.resolvedPath}, exists=${t.content!==null}, contentLength=${t.content?.length||0}`),a.json({ok:!0,workspacePath:o,filePath:t.resolvedPath,exists:t.content!==null,content:t.content,foundInParent:t.foundInParent})}catch(o){const e=o;a.status(400).json({error:e?.message||"load yml failed"})}}),I.post("/write-yml",S,async(w,a)=>{const{workspacePath:k,ymlPath:l,content:o}=w.body||{};if(!o||!String(o).trim()){a.status(400).json({error:"content is required"});return}try{const{normalizedWorkspace:e,resolvedTarget:c}=b(k,l,".agentswork/my.yml"),t=l&&String(l).trim()||".agentswork/my.yml";if(r.isAbsolute(t)){const h=c,R=r.dirname(h),p=r.dirname(R);let d=r.relative(p,e);d===""&&(d=".");const j=$(String(o),d),F=r.dirname(h);await y.mkdir(F,{recursive:!0}),await y.writeFile(h,j,"utf-8"),a.json({ok:!0,workspacePath:e,filePath:h,foundInParent:!1});return}const s=await D(e,t),m=r.resolve(e,t),n=s.content!==null?s.resolvedPath:m,u=r.dirname(n),v=r.dirname(u);let f=r.relative(v,e);f===""&&(f=".");const i=$(String(o),f),g=r.dirname(n);await y.mkdir(g,{recursive:!0}),await y.writeFile(n,i,"utf-8"),a.json({ok:!0,workspacePath:e,filePath:n,foundInParent:s.foundInParent,matchedAgentPath:s.matchedAgentPath,originalTarget:m!==n?m:void 0})}catch(e){const c=e;a.status(400).json({error:c?.message||"write yml failed"})}});export{I as ymlRouter};
2
2
 
@@ -1,4 +1,4 @@
1
- import{existsSync as S,readFileSync as w,statSync as C}from"node:fs";import f from"node:net";import{getAutoRegisterConfigFilePath as $}from"./auto-register.js";import{createLogger as y}from"../utils/logger.js";const p=y("access-control"),I=new Set(["0.0.0.0","*"]);function P(n){const[t,r,e,s]=n.split(".").map(Number);return BigInt(t)<<24n|BigInt(r)<<16n|BigInt(e)<<8n|BigInt(s)}function b(n){let t=n;const r=t.lastIndexOf(":"),e=t.slice(r+1);if(e.includes(".")){if(!f.isIPv4(e))return null;t=`${t.slice(0,r+1)}0:0`}const s=(t.match(/::/g)||[]).length;if(s>1)return null;if(s===1){const l=t.indexOf("::"),d=t.slice(0,l)?t.slice(0,l).split(":").filter(Boolean):[],a=t.slice(l+2)?t.slice(l+2).split(":").filter(Boolean):[],g=8-d.length-a.length;if(g<1)return null;t=[...d,...Array(g).fill("0"),...a].join(":")}const i=t.split(":");if(i.length!==8)return null;let o=0n;for(const l of i){if(!/^[0-9a-fA-F]{1,4}$/.test(l))return null;o=o<<16n|BigInt(parseInt(l,16))}return o}function m(n){return f.isIPv4(n)?P(n):f.isIPv6(n)?b(n):null}function u(n){let t=String(n||"").trim();const r=t.indexOf("%");r!==-1&&(t=t.slice(0,r));const e=t.match(/^::ffff:(\d+\.\d+\.\d+\.\d+)$/i);return e&&f.isIPv4(e[1])?e[1]:t}function h(n){const t=String(n.socket?.remoteAddress||""),r=u(t);if(r==="127.0.0.1"||r==="::1"){const e=n.headers?.["x-forwarded-for"];if(typeof e=="string"&&e.trim()){const s=e.split(",").map(i=>u(i.trim())).filter(Boolean);for(let i=s.length-1;i>=0;i--){const o=s[i];if(o&&!x(o)&&m(o)!==null)return o}}}return t}function x(n){return n==="::1"||/^127\./.test(n)}function v(n,t,r){const e=n.lastIndexOf("/");let s=n.slice(0,e),i=Number(n.slice(e+1));const o=s.match(/^::ffff:(\d+\.\d+\.\d+\.\d+)$/i);if(o){if(r!==32||i<96)return!1;s=o[1],i=i-96}const l=m(s);if(l===null||!Number.isInteger(i)||i<0||i>r||(s.includes(":")?128:32)!==r)return!1;const a=BigInt(r-i);return t>>a===l>>a}function N(n){let t;if(typeof n=="string")t=n.split(/[\n,;]+/);else if(Array.isArray(n))t=n.map(s=>String(s));else return[];const r=new Set,e=[];for(const s of t){const i=s.trim();!i||r.has(i)||(r.add(i),e.push(i))}return e}function E(n){const t=String(n||"").trim();if(!t)return!1;if(I.has(t))return!0;const r=t.lastIndexOf("/");if(r===-1)return f.isIP(t)!==0;const e=t.slice(0,r),s=Number(t.slice(r+1));if(f.isIP(e)===0||!/^\d+$/.test(t.slice(r+1)))return!1;const i=e.includes(":")?128:32;return Number.isInteger(s)&&s>=0&&s<=i}function B(n,t){const r=(t||[]).map(o=>u(String(o||"").trim())).filter(Boolean);if(r.length===0||r.some(o=>I.has(o)))return!0;const e=u(n);if(x(e))return!0;const s=m(e);if(s===null)return!1;const i=e.includes(":")?128:32;return r.some(o=>o===e||o.includes("/")&&v(o,s,i))}let c=null;function A(){try{const n=$();if(!S(n))return[];const t=C(n).mtimeMs;if(c&&c.mtimeMs===t)return c.entries;const r=JSON.parse(w(n,"utf-8")),e=N(r?.accessControl?.allowIps);return c={mtimeMs:t,entries:e},e}catch(n){return p.warn(`[access-control] \u8BFB\u53D6 config.json \u5931\u8D25\uFF0C\u6CBF\u7528\u7F13\u5B58${c?"":"\uFF08\u65E0\u7F13\u5B58\uFF0C\u9ED8\u8BA4\u5168\u653E\u884C\uFF09"}: ${n.message}`),c?.entries??[]}}function F(){c=null}function M(n,t,r){const e=A(),s=h(n);if(!B(s,e)){p.warn(`[access-control] \u62D2\u7EDD\u6765\u81EA ${u(s)||"unknown"} \u7684\u8BF7\u6C42: ${n.method} ${n.originalUrl||n.url}`),t.status(403).json({ok:!1,error:"access denied: client IP is not allowed"});return}r()}function j(n,t){const r=A(),e=h(n);if(B(e,r))return!0;p.warn(`[access-control] \u62D2\u7EDD\u6765\u81EA ${u(e)||"unknown"} \u7684 WebSocket \u8FDE\u63A5: ${n.url}`);try{t.write(`HTTP/1.1 403 Forbidden\r
1
+ import{existsSync as S,readFileSync as w,statSync as C}from"node:fs";import f from"node:net";import{createLogger as $}from"../utils/logger.js";import{getAutoRegisterConfigFilePath as y}from"./auto-register.js";const p=$("access-control"),I=new Set(["0.0.0.0","*"]);function P(n){const[t,r,e,s]=n.split(".").map(Number);return BigInt(t)<<24n|BigInt(r)<<16n|BigInt(e)<<8n|BigInt(s)}function b(n){let t=n;const r=t.lastIndexOf(":"),e=t.slice(r+1);if(e.includes(".")){if(!f.isIPv4(e))return null;t=`${t.slice(0,r+1)}0:0`}const s=(t.match(/::/g)||[]).length;if(s>1)return null;if(s===1){const l=t.indexOf("::"),d=t.slice(0,l)?t.slice(0,l).split(":").filter(Boolean):[],a=t.slice(l+2)?t.slice(l+2).split(":").filter(Boolean):[],g=8-d.length-a.length;if(g<1)return null;t=[...d,...Array(g).fill("0"),...a].join(":")}const i=t.split(":");if(i.length!==8)return null;let o=0n;for(const l of i){if(!/^[0-9a-fA-F]{1,4}$/.test(l))return null;o=o<<16n|BigInt(parseInt(l,16))}return o}function m(n){return f.isIPv4(n)?P(n):f.isIPv6(n)?b(n):null}function u(n){let t=String(n||"").trim();const r=t.indexOf("%");r!==-1&&(t=t.slice(0,r));const e=t.match(/^::ffff:(\d+\.\d+\.\d+\.\d+)$/i);return e&&f.isIPv4(e[1])?e[1]:t}function h(n){const t=String(n.socket?.remoteAddress||""),r=u(t);if(r==="127.0.0.1"||r==="::1"){const e=n.headers?.["x-forwarded-for"];if(typeof e=="string"&&e.trim()){const s=e.split(",").map(i=>u(i.trim())).filter(Boolean);for(let i=s.length-1;i>=0;i--){const o=s[i];if(o&&!x(o)&&m(o)!==null)return o}}}return t}function x(n){return n==="::1"||/^127\./.test(n)}function v(n,t,r){const e=n.lastIndexOf("/");let s=n.slice(0,e),i=Number(n.slice(e+1));const o=s.match(/^::ffff:(\d+\.\d+\.\d+\.\d+)$/i);if(o){if(r!==32||i<96)return!1;s=o[1],i=i-96}const l=m(s);if(l===null||!Number.isInteger(i)||i<0||i>r||(s.includes(":")?128:32)!==r)return!1;const a=BigInt(r-i);return t>>a===l>>a}function N(n){let t;if(typeof n=="string")t=n.split(/[\n,;]+/);else if(Array.isArray(n))t=n.map(s=>String(s));else return[];const r=new Set,e=[];for(const s of t){const i=s.trim();!i||r.has(i)||(r.add(i),e.push(i))}return e}function E(n){const t=String(n||"").trim();if(!t)return!1;if(I.has(t))return!0;const r=t.lastIndexOf("/");if(r===-1)return f.isIP(t)!==0;const e=t.slice(0,r),s=Number(t.slice(r+1));if(f.isIP(e)===0||!/^\d+$/.test(t.slice(r+1)))return!1;const i=e.includes(":")?128:32;return Number.isInteger(s)&&s>=0&&s<=i}function B(n,t){const r=(t||[]).map(o=>u(String(o||"").trim())).filter(Boolean);if(r.length===0||r.some(o=>I.has(o)))return!0;const e=u(n);if(x(e))return!0;const s=m(e);if(s===null)return!1;const i=e.includes(":")?128:32;return r.some(o=>o===e||o.includes("/")&&v(o,s,i))}let c=null;function A(){try{const n=y();if(!S(n))return[];const t=C(n).mtimeMs;if(c&&c.mtimeMs===t)return c.entries;const r=JSON.parse(w(n,"utf-8")),e=N(r?.accessControl?.allowIps);return c={mtimeMs:t,entries:e},e}catch(n){return p.warn(`[access-control] \u8BFB\u53D6 config.json \u5931\u8D25\uFF0C\u6CBF\u7528\u7F13\u5B58${c?"":"\uFF08\u65E0\u7F13\u5B58\uFF0C\u9ED8\u8BA4\u5168\u653E\u884C\uFF09"}: ${n.message}`),c?.entries??[]}}function F(){c=null}function M(n,t,r){const e=A(),s=h(n);if(!B(s,e)){p.warn(`[access-control] \u62D2\u7EDD\u6765\u81EA ${u(s)||"unknown"} \u7684\u8BF7\u6C42: ${n.method} ${n.originalUrl||n.url}`),t.status(403).json({ok:!1,error:"access denied: client IP is not allowed"});return}r()}function j(n,t){const r=A(),e=h(n);if(B(e,r))return!0;p.warn(`[access-control] \u62D2\u7EDD\u6765\u81EA ${u(e)||"unknown"} \u7684 WebSocket \u8FDE\u63A5: ${n.url}`);try{t.write(`HTTP/1.1 403 Forbidden\r
2
2
  Connection: close\r
3
3
  \r
4
4
  `)}catch{}return t.destroy(),!1}export{M as accessControlMiddleware,A as getAccessControlEntries,B as isIpAllowed,j as isUpgradeAllowed,E as isValidIpEntry,N as parseAllowIps,F as refreshAccessControlCache};
@@ -1,2 +1,2 @@
1
- import e from"node:path";import{pathToFileURL as m}from"node:url";import{getReleasedAcodeEntryPath as g}from"./acode-package.js";import{logger as o}from"../utils/logger.js";let a=null;function u(){return a||(a=(async()=>{try{const r=g(),t=e.join(e.dirname(r),"background-command-manager.js"),n=await import(m(t).href);return n.backgroundCommandManager?n.backgroundCommandManager:(o.warn("[acode-bg-manager] manager \u5355\u4F8B\u7F3A\u5931\uFF0C\u540E\u53F0\u547D\u4EE4\u8BE6\u60C5/\u6D41\u4E0D\u53EF\u7528"),null)}catch(r){return o.warn("[acode-bg-manager] \u52A0\u8F7D manager \u5931\u8D25: %s",r?.message),null}})().then(r=>(r||(a=null),r))),a}export{u as getAcodeBgManager};
1
+ import e from"node:path";import{pathToFileURL as m}from"node:url";import{logger as o}from"../utils/logger.js";import{getReleasedAcodeEntryPath as g}from"./acode-package.js";let a=null;function u(){return a||(a=(async()=>{try{const r=g(),t=e.join(e.dirname(r),"background-command-manager.js"),n=await import(m(t).href);return n.backgroundCommandManager?n.backgroundCommandManager:(o.warn("[acode-bg-manager] manager \u5355\u4F8B\u7F3A\u5931\uFF0C\u540E\u53F0\u547D\u4EE4\u8BE6\u60C5/\u6D41\u4E0D\u53EF\u7528"),null)}catch(r){return o.warn("[acode-bg-manager] \u52A0\u8F7D manager \u5931\u8D25: %s",r?.message),null}})().then(r=>(r||(a=null),r))),a}export{u as getAcodeBgManager};
2
2
 
@@ -0,0 +1,7 @@
1
+
2
+
3
+ export declare function getSkillFarmRoot(): string;
4
+
5
+ export declare function getAgentSkillsFarmDir(agentId: string): string;
6
+
7
+ export declare function syncAgentSkillFarm(agentId: string): string | null;