@jingyi0605/codingns 0.3.0 → 0.3.6

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 (261) hide show
  1. package/README.md +13 -0
  2. package/bin/codingns.mjs +880 -9
  3. package/dist/public/assets/{TerminalPage-Dfw1QUqW.js → TerminalPage-D00S4KM6.js} +19 -19
  4. package/dist/public/assets/index-BlOinYqR.js +122 -0
  5. package/dist/public/assets/index-Dg_7g6lA.css +1 -0
  6. package/dist/public/index.html +2 -2
  7. package/dist/server/config/env.d.ts +2 -0
  8. package/dist/server/config/env.js +35 -0
  9. package/dist/server/config/env.js.map +1 -1
  10. package/dist/server/config/opencode-base-url-resolver.d.ts +7 -0
  11. package/dist/server/config/opencode-base-url-resolver.js +48 -11
  12. package/dist/server/config/opencode-base-url-resolver.js.map +1 -1
  13. package/dist/server/config/opencode-system-probe-helper-client.d.ts +4 -0
  14. package/dist/server/config/opencode-system-probe-helper-client.js +29 -0
  15. package/dist/server/config/opencode-system-probe-helper-client.js.map +1 -1
  16. package/dist/server/config/opencode-system-probe-helper-process.d.ts +12 -0
  17. package/dist/server/config/opencode-system-probe-helper-process.js +34 -7
  18. package/dist/server/config/opencode-system-probe-helper-process.js.map +1 -1
  19. package/dist/server/modules/assistant-capability/assistant-capability-controller.d.ts +144 -0
  20. package/dist/server/modules/assistant-capability/assistant-capability-controller.js +242 -1
  21. package/dist/server/modules/assistant-capability/assistant-capability-controller.js.map +1 -1
  22. package/dist/server/modules/assistant-capability/assistant-capability-service.d.ts +133 -2
  23. package/dist/server/modules/assistant-capability/assistant-capability-service.js +395 -2
  24. package/dist/server/modules/assistant-capability/assistant-capability-service.js.map +1 -1
  25. package/dist/server/modules/auth/auth-service.d.ts +18 -1
  26. package/dist/server/modules/auth/auth-service.js +168 -7
  27. package/dist/server/modules/auth/auth-service.js.map +1 -1
  28. package/dist/server/modules/butler/butler-codex-model-policy.d.ts +1 -0
  29. package/dist/server/modules/butler/butler-codex-model-policy.js +36 -0
  30. package/dist/server/modules/butler/butler-codex-model-policy.js.map +1 -0
  31. package/dist/server/modules/butler/butler-control-session-service.d.ts +13 -1
  32. package/dist/server/modules/butler/butler-control-session-service.js +55 -231
  33. package/dist/server/modules/butler/butler-control-session-service.js.map +1 -1
  34. package/dist/server/modules/butler/butler-controller.d.ts +17 -0
  35. package/dist/server/modules/butler/butler-controller.js +20 -1
  36. package/dist/server/modules/butler/butler-controller.js.map +1 -1
  37. package/dist/server/modules/butler/butler-follow-up-service.js +7 -3
  38. package/dist/server/modules/butler/butler-follow-up-service.js.map +1 -1
  39. package/dist/server/modules/butler/butler-inbox-analysis-service.d.ts +36 -0
  40. package/dist/server/modules/butler/butler-inbox-analysis-service.js +375 -0
  41. package/dist/server/modules/butler/butler-inbox-analysis-service.js.map +1 -0
  42. package/dist/server/modules/butler/butler-inbox-instruction-adapter.d.ts +23 -0
  43. package/dist/server/modules/butler/butler-inbox-instruction-adapter.js +97 -0
  44. package/dist/server/modules/butler/butler-inbox-instruction-adapter.js.map +1 -0
  45. package/dist/server/modules/butler/butler-inbox-service.d.ts +39 -2
  46. package/dist/server/modules/butler/butler-inbox-service.js +392 -2
  47. package/dist/server/modules/butler/butler-inbox-service.js.map +1 -1
  48. package/dist/server/modules/butler/butler-session-service.d.ts +8 -0
  49. package/dist/server/modules/butler/butler-session-service.js +205 -53
  50. package/dist/server/modules/butler/butler-session-service.js.map +1 -1
  51. package/dist/server/modules/butler/butler-session-summary-service.d.ts +1 -0
  52. package/dist/server/modules/butler/butler-session-summary-service.js +48 -23
  53. package/dist/server/modules/butler/butler-session-summary-service.js.map +1 -1
  54. package/dist/server/modules/butler/butler-workspace-context.d.ts +13 -0
  55. package/dist/server/modules/butler/butler-workspace-context.js +234 -0
  56. package/dist/server/modules/butler/butler-workspace-context.js.map +1 -0
  57. package/dist/server/modules/client/client-controller.d.ts +6 -0
  58. package/dist/server/modules/client/client-controller.js +30 -8
  59. package/dist/server/modules/client/client-controller.js.map +1 -1
  60. package/dist/server/modules/client/client-service.d.ts +22 -10
  61. package/dist/server/modules/client/client-service.js +77 -100
  62. package/dist/server/modules/client/client-service.js.map +1 -1
  63. package/dist/server/modules/client/npm-global-package-service.d.ts +21 -0
  64. package/dist/server/modules/client/npm-global-package-service.js +210 -0
  65. package/dist/server/modules/client/npm-global-package-service.js.map +1 -0
  66. package/dist/server/modules/client/service-update-task-service.d.ts +15 -0
  67. package/dist/server/modules/client/service-update-task-service.js +147 -0
  68. package/dist/server/modules/client/service-update-task-service.js.map +1 -0
  69. package/dist/server/modules/client/service-update-types.d.ts +30 -0
  70. package/dist/server/modules/client/service-update-types.js +2 -0
  71. package/dist/server/modules/client/service-update-types.js.map +1 -0
  72. package/dist/server/modules/debug-target/debug-target-controller.d.ts +13 -0
  73. package/dist/server/modules/debug-target/debug-target-controller.js +77 -2
  74. package/dist/server/modules/debug-target/debug-target-controller.js.map +1 -1
  75. package/dist/server/modules/debug-target/debug-target-service.d.ts +11 -2
  76. package/dist/server/modules/debug-target/debug-target-service.js +138 -3
  77. package/dist/server/modules/debug-target/debug-target-service.js.map +1 -1
  78. package/dist/server/modules/git/git-command-helper-client.d.ts +2 -0
  79. package/dist/server/modules/git/git-command-helper-client.js +52 -3
  80. package/dist/server/modules/git/git-command-helper-client.js.map +1 -1
  81. package/dist/server/modules/git/git-command-helper-process.js +62 -9
  82. package/dist/server/modules/git/git-command-helper-process.js.map +1 -1
  83. package/dist/server/modules/git/git-command-runner.d.ts +1 -0
  84. package/dist/server/modules/git/git-command-runner.js +25 -0
  85. package/dist/server/modules/git/git-command-runner.js.map +1 -1
  86. package/dist/server/modules/git/git-controller.js +8 -7
  87. package/dist/server/modules/git/git-controller.js.map +1 -1
  88. package/dist/server/modules/git/git-read-service.d.ts +7 -7
  89. package/dist/server/modules/git/git-read-service.js +41 -24
  90. package/dist/server/modules/git/git-read-service.js.map +1 -1
  91. package/dist/server/modules/model-switch/cc-switch-adapter.d.ts +36 -0
  92. package/dist/server/modules/model-switch/cc-switch-adapter.js +321 -0
  93. package/dist/server/modules/model-switch/cc-switch-adapter.js.map +1 -0
  94. package/dist/server/modules/model-switch/model-switch-controller.d.ts +11 -0
  95. package/dist/server/modules/model-switch/model-switch-controller.js +30 -0
  96. package/dist/server/modules/model-switch/model-switch-controller.js.map +1 -0
  97. package/dist/server/modules/model-switch/model-switch-service.d.ts +16 -0
  98. package/dist/server/modules/model-switch/model-switch-service.js +29 -0
  99. package/dist/server/modules/model-switch/model-switch-service.js.map +1 -0
  100. package/dist/server/modules/preferences/profile-service.d.ts +1 -0
  101. package/dist/server/modules/preferences/profile-service.js +9 -0
  102. package/dist/server/modules/preferences/profile-service.js.map +1 -1
  103. package/dist/server/modules/provider/codex-model-options.js +2 -3
  104. package/dist/server/modules/provider/codex-model-options.js.map +1 -1
  105. package/dist/server/modules/provider/opencode-model-options.js +2 -3
  106. package/dist/server/modules/provider/opencode-model-options.js.map +1 -1
  107. package/dist/server/modules/provider/provider-discovery-helper-client.d.ts +9 -4
  108. package/dist/server/modules/provider/provider-discovery-helper-client.js +87 -11
  109. package/dist/server/modules/provider/provider-discovery-helper-client.js.map +1 -1
  110. package/dist/server/modules/provider/provider-discovery-helper-process.js +52 -47
  111. package/dist/server/modules/provider/provider-discovery-helper-process.js.map +1 -1
  112. package/dist/server/modules/provider/provider-discovery-runtime.d.ts +4 -0
  113. package/dist/server/modules/provider/provider-discovery-runtime.js +65 -0
  114. package/dist/server/modules/provider/provider-discovery-runtime.js.map +1 -0
  115. package/dist/server/modules/sessions/codex-app-server-helper-process.js +3 -0
  116. package/dist/server/modules/sessions/codex-app-server-helper-process.js.map +1 -1
  117. package/dist/server/modules/sessions/session-activity-authority-service.d.ts +3 -1
  118. package/dist/server/modules/sessions/session-activity-authority-service.js +3 -0
  119. package/dist/server/modules/sessions/session-activity-authority-service.js.map +1 -1
  120. package/dist/server/modules/sessions/session-activity-inspector.d.ts +1 -1
  121. package/dist/server/modules/sessions/session-activity-inspector.js +43 -16
  122. package/dist/server/modules/sessions/session-activity-inspector.js.map +1 -1
  123. package/dist/server/modules/sessions/session-controller.d.ts +3 -3
  124. package/dist/server/modules/sessions/session-controller.js +3 -3
  125. package/dist/server/modules/sessions/session-controller.js.map +1 -1
  126. package/dist/server/modules/sessions/session-history-service.d.ts +8 -2
  127. package/dist/server/modules/sessions/session-history-service.js +473 -65
  128. package/dist/server/modules/sessions/session-history-service.js.map +1 -1
  129. package/dist/server/modules/sessions/session-live-runtime-service.d.ts +9 -3
  130. package/dist/server/modules/sessions/session-live-runtime-service.js +114 -34
  131. package/dist/server/modules/sessions/session-live-runtime-service.js.map +1 -1
  132. package/dist/server/modules/sessions/session-message-attachment-service.d.ts +8 -8
  133. package/dist/server/modules/sessions/session-message-attachment-service.js +25 -34
  134. package/dist/server/modules/sessions/session-message-attachment-service.js.map +1 -1
  135. package/dist/server/modules/sessions/session-provider-error-mapper.js +7 -0
  136. package/dist/server/modules/sessions/session-provider-error-mapper.js.map +1 -1
  137. package/dist/server/modules/skills/builtin-skill-service.d.ts +12 -0
  138. package/dist/server/modules/skills/builtin-skill-service.js +49 -0
  139. package/dist/server/modules/skills/builtin-skill-service.js.map +1 -0
  140. package/dist/server/modules/skills/builtin-skills/codingns-assistant/SKILL.md +75 -0
  141. package/dist/server/modules/skills/builtin-skills/codingns-assistant/agents/openai.yaml +4 -0
  142. package/dist/server/modules/skills/builtin-skills/codingns-assistant/references/cli-workflow.md +130 -0
  143. package/dist/server/modules/skills/skill-manager-service.d.ts +7 -0
  144. package/dist/server/modules/skills/skill-manager-service.js +98 -0
  145. package/dist/server/modules/skills/skill-manager-service.js.map +1 -1
  146. package/dist/server/modules/tailscale/tailscale-helper-client.d.ts +1 -0
  147. package/dist/server/modules/tailscale/tailscale-helper-client.js +12 -0
  148. package/dist/server/modules/tailscale/tailscale-helper-client.js.map +1 -1
  149. package/dist/server/modules/tailscale/tailscale-manager.js +5 -1
  150. package/dist/server/modules/tailscale/tailscale-manager.js.map +1 -1
  151. package/dist/server/modules/tasks/task-helper-client.d.ts +5 -0
  152. package/dist/server/modules/tasks/task-helper-client.js +45 -0
  153. package/dist/server/modules/tasks/task-helper-client.js.map +1 -1
  154. package/dist/server/modules/tasks/task-helper-process-handlers.d.ts +10 -3
  155. package/dist/server/modules/tasks/task-helper-process-handlers.js +7 -5
  156. package/dist/server/modules/tasks/task-helper-process-handlers.js.map +1 -1
  157. package/dist/server/modules/tasks/task-helper-process.js +11 -1
  158. package/dist/server/modules/tasks/task-helper-process.js.map +1 -1
  159. package/dist/server/modules/tasks/task-lane-executors.js +5 -2
  160. package/dist/server/modules/tasks/task-lane-executors.js.map +1 -1
  161. package/dist/server/modules/tasks/task-types.d.ts +3 -0
  162. package/dist/server/modules/tasks/task-types.js +4 -1
  163. package/dist/server/modules/tasks/task-types.js.map +1 -1
  164. package/dist/server/modules/terminal/command-template-service.d.ts +2 -2
  165. package/dist/server/modules/terminal/command-template-service.js +14 -5
  166. package/dist/server/modules/terminal/command-template-service.js.map +1 -1
  167. package/dist/server/modules/terminal/runtime/terminal-log-writer-client.js +1 -1
  168. package/dist/server/modules/terminal/runtime/terminal-log-writer-client.js.map +1 -1
  169. package/dist/server/modules/terminal/runtime/terminal-log-writer-process.js +160 -11
  170. package/dist/server/modules/terminal/runtime/terminal-log-writer-process.js.map +1 -1
  171. package/dist/server/modules/terminal/template-port-runtime.d.ts +13 -2
  172. package/dist/server/modules/terminal/template-port-runtime.js +266 -44
  173. package/dist/server/modules/terminal/template-port-runtime.js.map +1 -1
  174. package/dist/server/modules/terminal/terminal-service.d.ts +4 -0
  175. package/dist/server/modules/terminal/terminal-service.js +65 -4
  176. package/dist/server/modules/terminal/terminal-service.js.map +1 -1
  177. package/dist/server/modules/workbench/workbench-service.js +3 -3
  178. package/dist/server/modules/workbench/workbench-service.js.map +1 -1
  179. package/dist/server/modules/workbench/workspace-panel-snapshot-service.d.ts +1 -0
  180. package/dist/server/modules/workbench/workspace-panel-snapshot-service.js +118 -39
  181. package/dist/server/modules/workbench/workspace-panel-snapshot-service.js.map +1 -1
  182. package/dist/server/modules/workspace/workspace-code-composition.d.ts +1 -0
  183. package/dist/server/modules/workspace/workspace-code-composition.js +277 -2
  184. package/dist/server/modules/workspace/workspace-code-composition.js.map +1 -1
  185. package/dist/server/modules/workspace/workspace-service.js +54 -17
  186. package/dist/server/modules/workspace/workspace-service.js.map +1 -1
  187. package/dist/server/modules/worktree/worktree-cleanup-service.d.ts +1 -1
  188. package/dist/server/modules/worktree/worktree-cleanup-service.js +22 -17
  189. package/dist/server/modules/worktree/worktree-cleanup-service.js.map +1 -1
  190. package/dist/server/modules/worktree/worktree-controller.js +6 -5
  191. package/dist/server/modules/worktree/worktree-controller.js.map +1 -1
  192. package/dist/server/modules/worktree/worktree-manager.d.ts +1 -1
  193. package/dist/server/modules/worktree/worktree-manager.js +26 -19
  194. package/dist/server/modules/worktree/worktree-manager.js.map +1 -1
  195. package/dist/server/modules/worktree/worktree-merge-service.d.ts +2 -2
  196. package/dist/server/modules/worktree/worktree-merge-service.js +34 -27
  197. package/dist/server/modules/worktree/worktree-merge-service.js.map +1 -1
  198. package/dist/server/modules/worktree/worktree-sync-service.d.ts +1 -1
  199. package/dist/server/modules/worktree/worktree-sync-service.js +5 -3
  200. package/dist/server/modules/worktree/worktree-sync-service.js.map +1 -1
  201. package/dist/server/routes/assistant.js +24 -0
  202. package/dist/server/routes/assistant.js.map +1 -1
  203. package/dist/server/routes/butler.js +4 -0
  204. package/dist/server/routes/butler.js.map +1 -1
  205. package/dist/server/routes/client.js +2 -0
  206. package/dist/server/routes/client.js.map +1 -1
  207. package/dist/server/routes/sessions.js +1 -1
  208. package/dist/server/routes/sessions.js.map +1 -1
  209. package/dist/server/routes/system.d.ts +2 -1
  210. package/dist/server/routes/system.js +3 -1
  211. package/dist/server/routes/system.js.map +1 -1
  212. package/dist/server/server/create-server.d.ts +4 -0
  213. package/dist/server/server/create-server.js +67 -8
  214. package/dist/server/server/create-server.js.map +1 -1
  215. package/dist/server/shared/errors/app-error.d.ts +2 -0
  216. package/dist/server/shared/errors/app-error.js +2 -0
  217. package/dist/server/shared/errors/app-error.js.map +1 -1
  218. package/dist/server/shared/http/error-handler.d.ts +2 -1
  219. package/dist/server/shared/http/error-handler.js +3 -2
  220. package/dist/server/shared/http/error-handler.js.map +1 -1
  221. package/dist/server/shared/http/request-abort.d.ts +2 -0
  222. package/dist/server/shared/http/request-abort.js +38 -0
  223. package/dist/server/shared/http/request-abort.js.map +1 -0
  224. package/dist/server/storage/repositories/auth-login-attempt-repository.d.ts +9 -0
  225. package/dist/server/storage/repositories/auth-login-attempt-repository.js +59 -0
  226. package/dist/server/storage/repositories/auth-login-attempt-repository.js.map +1 -0
  227. package/dist/server/storage/repositories/butler-control-session-repository.d.ts +3 -0
  228. package/dist/server/storage/repositories/butler-control-session-repository.js +80 -4
  229. package/dist/server/storage/repositories/butler-control-session-repository.js.map +1 -1
  230. package/dist/server/storage/repositories/butler-inbox-item-repository.js +54 -3
  231. package/dist/server/storage/repositories/butler-inbox-item-repository.js.map +1 -1
  232. package/dist/server/storage/repositories/terminal-instance-repository.js +1 -1
  233. package/dist/server/storage/repositories/terminal-instance-repository.js.map +1 -1
  234. package/dist/server/storage/repositories/user-preference-profile-repository.js +6 -3
  235. package/dist/server/storage/repositories/user-preference-profile-repository.js.map +1 -1
  236. package/dist/server/storage/sqlite/client.js +127 -0
  237. package/dist/server/storage/sqlite/client.js.map +1 -1
  238. package/dist/server/storage/sqlite/schema.sql +19 -1
  239. package/dist/server/types/domain.d.ts +37 -1
  240. package/dist/server/ws/workbench-ws-hub.d.ts +1 -0
  241. package/dist/server/ws/workbench-ws-hub.js +25 -3
  242. package/dist/server/ws/workbench-ws-hub.js.map +1 -1
  243. package/node_modules/@codingns/session-sync-core/dist/patch-builder.d.ts +23 -0
  244. package/node_modules/@codingns/session-sync-core/dist/patch-builder.js +162 -0
  245. package/node_modules/@codingns/session-sync-core/dist/patch-builder.js.map +1 -1
  246. package/node_modules/@codingns/session-sync-core/dist/providers/codex.d.ts +1 -0
  247. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js +89 -33
  248. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js.map +1 -1
  249. package/node_modules/@codingns/session-sync-core/dist/runtime/active-run-registry.js +18 -2
  250. package/node_modules/@codingns/session-sync-core/dist/runtime/active-run-registry.js.map +1 -1
  251. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.d.ts +3 -1
  252. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js +238 -53
  253. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js.map +1 -1
  254. package/node_modules/@codingns/session-sync-core/dist/runtime/provider-runtime-service.js +1 -0
  255. package/node_modules/@codingns/session-sync-core/dist/runtime/provider-runtime-service.js.map +1 -1
  256. package/node_modules/@codingns/session-sync-core/dist/runtime/types.d.ts +6 -2
  257. package/node_modules/@codingns/session-sync-core/dist/types.d.ts +1 -1
  258. package/package.json +1 -1
  259. package/scripts/postinstall.mjs +33 -0
  260. package/dist/public/assets/index-DR2rPNi7.css +0 -1
  261. package/dist/public/assets/index-DTOruahn.js +0 -114
@@ -1,11 +1,13 @@
1
1
  import { spawn } from "node:child_process";
2
2
  import path from "node:path";
3
- export async function discoverTemplateRuntimeStatuses(items) {
3
+ export async function discoverTemplateRuntimeStatuses(items, signal) {
4
+ throwIfAborted(signal);
4
5
  const uniquePorts = [...new Set(items.map((item) => item.port))];
5
6
  const processInfoByPort = new Map();
6
7
  await Promise.all(uniquePorts.map(async (port) => {
7
- processInfoByPort.set(port, await findPortProcess(port));
8
+ processInfoByPort.set(port, await findPortProcess(port, signal));
8
9
  }));
10
+ throwIfAborted(signal);
9
11
  return items.map((item) => {
10
12
  const processInfo = processInfoByPort.get(item.port) ?? null;
11
13
  return {
@@ -13,33 +15,66 @@ export async function discoverTemplateRuntimeStatuses(items) {
13
15
  port: item.port,
14
16
  occupied: processInfo !== null,
15
17
  processId: processInfo?.processId ?? null,
18
+ parentProcessId: processInfo?.parentProcessId ?? null,
19
+ processGroupId: processInfo?.processGroupId ?? null,
16
20
  processName: processInfo?.processName ?? null,
17
- processCommandLine: processInfo?.processCommandLine ?? null
21
+ processCommandLine: processInfo?.processCommandLine ?? null,
22
+ parentProcessName: processInfo?.parentProcessName ?? null,
23
+ parentProcessCommandLine: processInfo?.parentProcessCommandLine ?? null,
24
+ terminationScope: processInfo?.terminationScope ?? null
18
25
  };
19
26
  });
20
27
  }
21
- export async function terminateRuntimeProcess(processId) {
22
- if (!Number.isInteger(processId) || processId <= 0) {
23
- throw new Error(`invalid process id: ${processId}`);
28
+ export async function terminateRuntimeProcess(processInfo) {
29
+ if (!Number.isInteger(processInfo.processId) || processInfo.processId <= 0) {
30
+ throw new Error(`invalid process id: ${processInfo.processId}`);
24
31
  }
25
32
  if (process.platform === "win32") {
26
- await runProcess("taskkill", ["/PID", String(processId), "/T", "/F"]);
33
+ await runProcess("taskkill", ["/PID", String(processInfo.processId), "/T", "/F"]);
34
+ return;
35
+ }
36
+ if (processInfo.terminationScope === "process_group" &&
37
+ Number.isInteger(processInfo.processGroupId) &&
38
+ (processInfo.processGroupId ?? 0) > 0) {
39
+ const processGroupId = processInfo.processGroupId;
40
+ // 如果目标就是当前 Host 所在进程组,改用脱离的 helper 延后执行,先把 HTTP 响应发出去。
41
+ if (await shouldDeferPosixProcessGroupTermination(processInfo.processId, processGroupId)) {
42
+ scheduleDeferredPosixTermination({
43
+ processId: processInfo.processId,
44
+ processGroupId
45
+ });
46
+ return;
47
+ }
48
+ signalPosixProcessGroup(processGroupId, "SIGTERM");
49
+ await waitForProcessGroupExit(processGroupId, 1500);
50
+ if (isProcessGroupAlive(processGroupId)) {
51
+ signalPosixProcessGroup(processGroupId, "SIGKILL");
52
+ await waitForProcessGroupExit(processGroupId, 1500);
53
+ }
27
54
  return;
28
55
  }
29
- process.kill(processId, "SIGTERM");
30
- await waitForProcessExit(processId, 1500);
31
- if (isProcessAlive(processId)) {
32
- process.kill(processId, "SIGKILL");
33
- await waitForProcessExit(processId, 1500);
56
+ if (await shouldDeferPosixProcessTermination(processInfo.processId)) {
57
+ scheduleDeferredPosixTermination({
58
+ processId: processInfo.processId,
59
+ processGroupId: null
60
+ });
61
+ return;
62
+ }
63
+ process.kill(processInfo.processId, "SIGTERM");
64
+ await waitForProcessExit(processInfo.processId, 1500);
65
+ if (isProcessAlive(processInfo.processId)) {
66
+ process.kill(processInfo.processId, "SIGKILL");
67
+ await waitForProcessExit(processInfo.processId, 1500);
34
68
  }
35
69
  }
36
- async function findPortProcess(port) {
70
+ async function findPortProcess(port, signal) {
71
+ throwIfAborted(signal);
37
72
  if (process.platform === "win32") {
38
- return await findWindowsPortProcess(port);
73
+ return await findWindowsPortProcess(port, signal);
39
74
  }
40
- return await findPosixPortProcess(port);
75
+ return await findPosixPortProcess(port, signal);
41
76
  }
42
- async function findWindowsPortProcess(port) {
77
+ async function findWindowsPortProcess(port, signal) {
43
78
  const shellPath = process.env.SYSTEMROOT
44
79
  ? path.join(process.env.SYSTEMROOT, "System32", "WindowsPowerShell", "v1.0", "powershell.exe")
45
80
  : "powershell.exe";
@@ -47,7 +82,7 @@ async function findWindowsPortProcess(port) {
47
82
  `$port=${port}`,
48
83
  "$connection = Get-NetTCPConnection -State Listen -LocalPort $port -ErrorAction SilentlyContinue | Select-Object -First 1",
49
84
  "if (-not $connection) { return }",
50
- "$process = Get-CimInstance Win32_Process -Filter \"ProcessId = $($connection.OwningProcess)\" | Select-Object ProcessId, Name, CommandLine",
85
+ "$process = Get-CimInstance Win32_Process -Filter \"ProcessId = $($connection.OwningProcess)\" | Select-Object ProcessId, ParentProcessId, Name, CommandLine",
51
86
  "if (-not $process) { return }",
52
87
  "$process | ConvertTo-Json -Compress"
53
88
  ].join("; ");
@@ -58,7 +93,7 @@ async function findWindowsPortProcess(port) {
58
93
  "Bypass",
59
94
  "-Command",
60
95
  script
61
- ]);
96
+ ], signal);
62
97
  if (!stdout?.trim()) {
63
98
  return null;
64
99
  }
@@ -66,23 +101,30 @@ async function findWindowsPortProcess(port) {
66
101
  if (!Number.isInteger(parsed.ProcessId) || parsed.ProcessId <= 0) {
67
102
  return null;
68
103
  }
104
+ const parentProcessId = normalizeOptionalPositiveInteger(parsed.ParentProcessId);
105
+ const parentProcess = parentProcessId ? await lookupWindowsProcess(parentProcessId, signal) : null;
69
106
  return {
70
107
  processId: parsed.ProcessId,
108
+ parentProcessId,
109
+ processGroupId: null,
71
110
  processName: parsed.Name?.trim() || null,
72
- processCommandLine: parsed.CommandLine?.trim() || null
111
+ processCommandLine: parsed.CommandLine?.trim() || null,
112
+ parentProcessName: parentProcess?.Name?.trim() || null,
113
+ parentProcessCommandLine: parentProcess?.CommandLine?.trim() || null,
114
+ terminationScope: "process"
73
115
  };
74
116
  }
75
- async function findPosixPortProcess(port) {
117
+ async function findPosixPortProcess(port, signal) {
76
118
  if (process.platform === "linux") {
77
- const ssInfo = await findLinuxPortProcessWithSs(port);
119
+ const ssInfo = await findLinuxPortProcessWithSs(port, signal);
78
120
  if (ssInfo) {
79
121
  return ssInfo;
80
122
  }
81
123
  }
82
- return await findPosixPortProcessWithLsof(port);
124
+ return await findPosixPortProcessWithLsof(port, signal);
83
125
  }
84
- async function findLinuxPortProcessWithSs(port) {
85
- const stdout = await tryRunProcess("ss", ["-ltnp"]);
126
+ async function findLinuxPortProcessWithSs(port, signal) {
127
+ const stdout = await tryRunProcess("ss", ["-ltnp"], signal);
86
128
  if (!stdout) {
87
129
  return null;
88
130
  }
@@ -99,17 +141,17 @@ async function findLinuxPortProcessWithSs(port) {
99
141
  if (!Number.isInteger(processId) || processId <= 0) {
100
142
  continue;
101
143
  }
102
- return await enrichPosixProcess(processId, processName);
144
+ return await enrichPosixProcess(processId, processName, signal);
103
145
  }
104
146
  return null;
105
147
  }
106
- async function findPosixPortProcessWithLsof(port) {
148
+ async function findPosixPortProcessWithLsof(port, signal) {
107
149
  const stdout = await tryRunProcess("lsof", [
108
150
  "-nP",
109
151
  `-iTCP:${port}`,
110
152
  "-sTCP:LISTEN",
111
153
  "-Fpct"
112
- ]);
154
+ ], signal);
113
155
  if (!stdout) {
114
156
  return null;
115
157
  }
@@ -125,29 +167,42 @@ async function findPosixPortProcessWithLsof(port) {
125
167
  processName = line.slice(1).trim() || null;
126
168
  }
127
169
  if (processId) {
128
- return await enrichPosixProcess(processId, processName);
170
+ return await enrichPosixProcess(processId, processName, signal);
129
171
  }
130
172
  }
131
173
  return null;
132
174
  }
133
- async function enrichPosixProcess(processId, fallbackName) {
134
- const processName = (await tryRunProcess("ps", ["-p", String(processId), "-o", "comm="]))?.trim() || fallbackName;
135
- const processCommandLine = (await tryRunProcess("ps", ["-p", String(processId), "-o", "args="]))?.trim() || null;
175
+ async function enrichPosixProcess(processId, fallbackName, signal) {
176
+ const currentProcess = await lookupPosixProcess(processId, fallbackName, signal);
177
+ if (!currentProcess) {
178
+ return null;
179
+ }
180
+ const parentProcess = currentProcess.parentProcessId !== null
181
+ ? await lookupPosixProcess(currentProcess.parentProcessId, null, signal)
182
+ : null;
136
183
  return {
137
- processId,
138
- processName,
139
- processCommandLine
184
+ processId: currentProcess.processId,
185
+ parentProcessId: currentProcess.parentProcessId,
186
+ processGroupId: currentProcess.processGroupId,
187
+ processName: currentProcess.processName,
188
+ processCommandLine: currentProcess.processCommandLine,
189
+ parentProcessName: parentProcess?.processName ?? null,
190
+ parentProcessCommandLine: parentProcess?.processCommandLine ?? null,
191
+ terminationScope: currentProcess.processGroupId ? "process_group" : "process"
140
192
  };
141
193
  }
142
- async function tryRunProcess(command, args) {
194
+ async function tryRunProcess(command, args, signal) {
143
195
  try {
144
- return await runProcess(command, args);
196
+ return await runProcess(command, args, signal);
145
197
  }
146
- catch {
198
+ catch (error) {
199
+ if (isAbortError(error)) {
200
+ throw error;
201
+ }
147
202
  return null;
148
203
  }
149
204
  }
150
- async function runProcess(command, args) {
205
+ async function runProcess(command, args, signal) {
151
206
  return await new Promise((resolve, reject) => {
152
207
  const child = spawn(command, args, {
153
208
  windowsHide: true,
@@ -155,22 +210,78 @@ async function runProcess(command, args) {
155
210
  });
156
211
  let stdout = "";
157
212
  let stderr = "";
213
+ let settled = false;
214
+ let onAbort = null;
215
+ const finish = (callback) => {
216
+ if (settled) {
217
+ return;
218
+ }
219
+ settled = true;
220
+ if (signal && onAbort) {
221
+ signal.removeEventListener("abort", onAbort);
222
+ }
223
+ callback();
224
+ };
225
+ if (signal) {
226
+ onAbort = () => {
227
+ if (!child.killed) {
228
+ child.kill("SIGTERM");
229
+ }
230
+ finish(() => {
231
+ reject(signal.reason ?? new Error("template runtime discovery aborted"));
232
+ });
233
+ };
234
+ if (signal.aborted) {
235
+ onAbort();
236
+ return;
237
+ }
238
+ signal.addEventListener("abort", onAbort, { once: true });
239
+ }
158
240
  child.stdout.on("data", (chunk) => {
159
241
  stdout += String(chunk);
160
242
  });
161
243
  child.stderr.on("data", (chunk) => {
162
244
  stderr += String(chunk);
163
245
  });
164
- child.on("error", reject);
246
+ child.on("error", (error) => {
247
+ finish(() => {
248
+ reject(error);
249
+ });
250
+ });
165
251
  child.on("close", (exitCode) => {
166
- if (exitCode !== 0) {
167
- reject(new Error(stderr.trim() || `${command} exited with code ${exitCode ?? "unknown"}`));
168
- return;
169
- }
170
- resolve(stdout);
252
+ finish(() => {
253
+ if (exitCode !== 0) {
254
+ reject(new Error(stderr.trim() || `${command} exited with code ${exitCode ?? "unknown"}`));
255
+ return;
256
+ }
257
+ resolve(stdout);
258
+ });
171
259
  });
172
260
  });
173
261
  }
262
+ async function lookupPosixProcess(processId, fallbackName, signal) {
263
+ if (!Number.isInteger(processId) || processId <= 0) {
264
+ return null;
265
+ }
266
+ const [parentProcessIdText, processGroupIdText, processNameText, processCommandLine] = await Promise.all([
267
+ tryRunProcess("ps", ["-p", String(processId), "-o", "ppid="], signal),
268
+ tryRunProcess("ps", ["-p", String(processId), "-o", "pgid="], signal),
269
+ tryRunProcess("ps", ["-p", String(processId), "-o", "comm="], signal),
270
+ tryRunProcess("ps", ["-p", String(processId), "-o", "args="], signal)
271
+ ]);
272
+ const processName = processNameText?.trim() || fallbackName;
273
+ const commandLine = processCommandLine?.trim() || null;
274
+ if (!processName && !commandLine) {
275
+ return null;
276
+ }
277
+ return {
278
+ processId,
279
+ parentProcessId: normalizeOptionalPositiveInteger(parentProcessIdText),
280
+ processGroupId: normalizeOptionalPositiveInteger(processGroupIdText),
281
+ processName,
282
+ processCommandLine: commandLine
283
+ };
284
+ }
174
285
  function isProcessAlive(processId) {
175
286
  try {
176
287
  process.kill(processId, 0);
@@ -185,6 +296,23 @@ function isProcessAlive(processId) {
185
296
  throw error;
186
297
  }
187
298
  }
299
+ function isProcessGroupAlive(processGroupId) {
300
+ try {
301
+ process.kill(-processGroupId, 0);
302
+ return true;
303
+ }
304
+ catch (error) {
305
+ if (error instanceof Error &&
306
+ "code" in error &&
307
+ error.code === "ESRCH") {
308
+ return false;
309
+ }
310
+ throw error;
311
+ }
312
+ }
313
+ function signalPosixProcessGroup(processGroupId, signal) {
314
+ process.kill(-processGroupId, signal);
315
+ }
188
316
  async function waitForProcessExit(processId, timeoutMs) {
189
317
  const startedAt = Date.now();
190
318
  while (Date.now() - startedAt < timeoutMs) {
@@ -196,4 +324,98 @@ async function waitForProcessExit(processId, timeoutMs) {
196
324
  });
197
325
  }
198
326
  }
327
+ async function waitForProcessGroupExit(processGroupId, timeoutMs) {
328
+ const startedAt = Date.now();
329
+ while (Date.now() - startedAt < timeoutMs) {
330
+ if (!isProcessGroupAlive(processGroupId)) {
331
+ return;
332
+ }
333
+ await new Promise((resolve) => {
334
+ setTimeout(resolve, 100);
335
+ });
336
+ }
337
+ }
338
+ async function lookupWindowsProcess(processId, signal) {
339
+ const shellPath = process.env.SYSTEMROOT
340
+ ? path.join(process.env.SYSTEMROOT, "System32", "WindowsPowerShell", "v1.0", "powershell.exe")
341
+ : "powershell.exe";
342
+ const script = [
343
+ `$processId=${processId}`,
344
+ "$process = Get-CimInstance Win32_Process -Filter \"ProcessId = $processId\" | Select-Object ProcessId, ParentProcessId, Name, CommandLine",
345
+ "if (-not $process) { return }",
346
+ "$process | ConvertTo-Json -Compress"
347
+ ].join("; ");
348
+ const stdout = await tryRunProcess(shellPath, [
349
+ "-NoProfile",
350
+ "-NonInteractive",
351
+ "-ExecutionPolicy",
352
+ "Bypass",
353
+ "-Command",
354
+ script
355
+ ], signal);
356
+ if (!stdout?.trim()) {
357
+ return null;
358
+ }
359
+ return JSON.parse(stdout);
360
+ }
361
+ async function shouldDeferPosixProcessTermination(processId) {
362
+ return processId === process.pid;
363
+ }
364
+ async function shouldDeferPosixProcessGroupTermination(processId, processGroupId) {
365
+ if (processId === process.pid) {
366
+ return true;
367
+ }
368
+ const currentProcessGroupId = await lookupCurrentPosixProcessGroupId();
369
+ return currentProcessGroupId !== null && currentProcessGroupId === processGroupId;
370
+ }
371
+ let currentPosixProcessGroupIdPromise = null;
372
+ async function lookupCurrentPosixProcessGroupId() {
373
+ if (!currentPosixProcessGroupIdPromise) {
374
+ currentPosixProcessGroupIdPromise = (async () => {
375
+ const stdout = await tryRunProcess("ps", ["-p", String(process.pid), "-o", "pgid="]);
376
+ return normalizeOptionalPositiveInteger(stdout);
377
+ })();
378
+ }
379
+ return await currentPosixProcessGroupIdPromise;
380
+ }
381
+ function scheduleDeferredPosixTermination(input) {
382
+ const target = input.processGroupId && input.processGroupId > 0
383
+ ? `kill -TERM -- -${input.processGroupId} 2>/dev/null || kill -TERM ${input.processId} 2>/dev/null || true`
384
+ : `kill -TERM ${input.processId} 2>/dev/null || true`;
385
+ const forceTarget = input.processGroupId && input.processGroupId > 0
386
+ ? `kill -KILL -- -${input.processGroupId} 2>/dev/null || kill -KILL ${input.processId} 2>/dev/null || true`
387
+ : `kill -KILL ${input.processId} 2>/dev/null || true`;
388
+ const script = `sleep 0.2; ${target}; sleep 1.5; ${forceTarget}`;
389
+ const helper = spawn("sh", ["-c", script], {
390
+ detached: true,
391
+ stdio: "ignore",
392
+ windowsHide: true
393
+ });
394
+ helper.unref();
395
+ }
396
+ function normalizeOptionalPositiveInteger(value) {
397
+ if (typeof value === "number") {
398
+ return Number.isInteger(value) && value > 0 ? value : null;
399
+ }
400
+ if (typeof value !== "string") {
401
+ return null;
402
+ }
403
+ const trimmed = value.trim();
404
+ if (!trimmed) {
405
+ return null;
406
+ }
407
+ const parsed = Number(trimmed);
408
+ return Number.isInteger(parsed) && parsed > 0 ? parsed : null;
409
+ }
410
+ function throwIfAborted(signal) {
411
+ if (signal?.aborted) {
412
+ throw signal.reason ?? new Error("template runtime discovery aborted");
413
+ }
414
+ }
415
+ function isAbortError(error) {
416
+ if (!(error instanceof Error)) {
417
+ return false;
418
+ }
419
+ return error.name === "AbortError" || error.message.includes("aborted");
420
+ }
199
421
  //# sourceMappingURL=template-port-runtime.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"template-port-runtime.js","sourceRoot":"","sources":["../../../../src/modules/terminal/template-port-runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"template-port-runtime.js","sourceRoot":"","sources":["../../../../src/modules/terminal/template-port-runtime.ts"],"names":[],"mappings":"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"}
@@ -76,6 +76,7 @@ export declare class TerminalService extends EventEmitter {
76
76
  private readonly outputBuffer;
77
77
  private readonly runtimeManager;
78
78
  private readonly terminalSubscriptionCounts;
79
+ private readonly pendingDetachTimersByTerminalId;
79
80
  private readonly pendingCloseReasons;
80
81
  private readonly pendingDeletedTerminalIds;
81
82
  private readonly pendingActivityByTerminalId;
@@ -126,6 +127,9 @@ export declare class TerminalService extends EventEmitter {
126
127
  private recoverRuntimeStates;
127
128
  private retainTerminalSubscription;
128
129
  private releaseTerminalSubscription;
130
+ private scheduleRuntimeDetachIfIdle;
131
+ private cancelScheduledRuntimeDetach;
132
+ private clearPendingDetachTimers;
129
133
  private detachRuntimeAttachmentIfIdle;
130
134
  private flushTerminalLogs;
131
135
  private clearTerminalLogs;
@@ -14,6 +14,7 @@ import { TerminalOutputBuffer } from "./runtime/terminal-output-buffer.js";
14
14
  import { TerminalRuntimeManager } from "./runtime/terminal-runtime-manager.js";
15
15
  const TERMINAL_ACTIVITY_FLUSH_INTERVAL_MS = 2_000;
16
16
  const TERMINAL_OUTPUT_FLUSH_INTERVAL_MS = 8;
17
+ const TERMINAL_DETACH_GRACE_PERIOD_MS = 10_000;
17
18
  export class TerminalService extends EventEmitter {
18
19
  db;
19
20
  terminalInstanceRepository;
@@ -22,6 +23,7 @@ export class TerminalService extends EventEmitter {
22
23
  outputBuffer = new TerminalOutputBuffer();
23
24
  runtimeManager = new TerminalRuntimeManager();
24
25
  terminalSubscriptionCounts = new Map();
26
+ pendingDetachTimersByTerminalId = new Map();
25
27
  pendingCloseReasons = new Map();
26
28
  pendingDeletedTerminalIds = new Set();
27
29
  pendingActivityByTerminalId = new Map();
@@ -65,6 +67,7 @@ export class TerminalService extends EventEmitter {
65
67
  }
66
68
  async createTerminal(input) {
67
69
  const workspace = this.workspaceService.getWorkspaceOrThrow(input.workspaceId);
70
+ const existingTerminals = this.terminalInstanceRepository.listByWorkspace(workspace.id);
68
71
  const now = nowIso();
69
72
  const shell = resolveRequestedShell(sanitizeShell(input.shell) ?? getDefaultShell());
70
73
  const cwd = resolveWorkspaceCwd(workspace.path, input.cwd);
@@ -74,7 +77,7 @@ export class TerminalService extends EventEmitter {
74
77
  const terminal = {
75
78
  id: createId(),
76
79
  workspaceId: workspace.id,
77
- name: input.name?.trim() || buildDefaultTerminalName(cwd),
80
+ name: input.name?.trim() || buildDefaultTerminalName(cwd, existingTerminals),
78
81
  cwd,
79
82
  shell,
80
83
  runtimeType,
@@ -229,6 +232,7 @@ export class TerminalService extends EventEmitter {
229
232
  async closeTerminal(terminalId, reason = "user_closed") {
230
233
  const terminal = this.getTerminalOrThrow(terminalId);
231
234
  const session = this.getRuntimeSessionOrThrow(terminal.runtimeSessionId);
235
+ this.cancelScheduledRuntimeDetach(terminalId);
232
236
  this.pendingCloseReasons.set(terminalId, reason);
233
237
  if (terminal.status === "closed" || terminal.status === "error") {
234
238
  this.pendingCloseReasons.delete(terminalId);
@@ -250,6 +254,7 @@ export class TerminalService extends EventEmitter {
250
254
  async deleteTerminal(terminalId) {
251
255
  const terminal = this.getTerminalOrThrow(terminalId);
252
256
  const session = this.getRuntimeSessionOrThrow(terminal.runtimeSessionId);
257
+ this.cancelScheduledRuntimeDetach(terminalId);
253
258
  this.pendingCloseReasons.delete(terminalId);
254
259
  this.pendingActivityByTerminalId.delete(terminalId);
255
260
  this.clearActivityFlushTimerIfIdle();
@@ -387,6 +392,7 @@ export class TerminalService extends EventEmitter {
387
392
  }
388
393
  async dispose() {
389
394
  this.isDisposing = true;
395
+ this.clearPendingDetachTimers();
390
396
  this.flushPendingTerminalOutput();
391
397
  this.flushPendingActivity();
392
398
  await this.terminalLogSpooler?.dispose();
@@ -740,6 +746,7 @@ export class TerminalService extends EventEmitter {
740
746
  }
741
747
  }
742
748
  retainTerminalSubscription(terminalId) {
749
+ this.cancelScheduledRuntimeDetach(terminalId);
743
750
  const currentCount = this.terminalSubscriptionCounts.get(terminalId) ?? 0;
744
751
  this.terminalSubscriptionCounts.set(terminalId, currentCount + 1);
745
752
  }
@@ -747,15 +754,43 @@ export class TerminalService extends EventEmitter {
747
754
  const currentCount = this.terminalSubscriptionCounts.get(terminalId) ?? 0;
748
755
  if (currentCount <= 1) {
749
756
  this.terminalSubscriptionCounts.delete(terminalId);
750
- this.detachRuntimeAttachmentIfIdle(terminalId);
757
+ this.scheduleRuntimeDetachIfIdle(terminalId);
751
758
  return;
752
759
  }
753
760
  this.terminalSubscriptionCounts.set(terminalId, currentCount - 1);
754
761
  }
762
+ scheduleRuntimeDetachIfIdle(terminalId) {
763
+ if (this.isDisposing) {
764
+ return;
765
+ }
766
+ this.cancelScheduledRuntimeDetach(terminalId);
767
+ const timer = setTimeout(() => {
768
+ this.pendingDetachTimersByTerminalId.delete(terminalId);
769
+ this.detachRuntimeAttachmentIfIdle(terminalId);
770
+ }, TERMINAL_DETACH_GRACE_PERIOD_MS);
771
+ this.pendingDetachTimersByTerminalId.set(terminalId, timer);
772
+ }
773
+ cancelScheduledRuntimeDetach(terminalId) {
774
+ const timer = this.pendingDetachTimersByTerminalId.get(terminalId);
775
+ if (!timer) {
776
+ return;
777
+ }
778
+ clearTimeout(timer);
779
+ this.pendingDetachTimersByTerminalId.delete(terminalId);
780
+ }
781
+ clearPendingDetachTimers() {
782
+ for (const timer of this.pendingDetachTimersByTerminalId.values()) {
783
+ clearTimeout(timer);
784
+ }
785
+ this.pendingDetachTimersByTerminalId.clear();
786
+ }
755
787
  detachRuntimeAttachmentIfIdle(terminalId) {
756
788
  if (this.isDisposing) {
757
789
  return;
758
790
  }
791
+ if ((this.terminalSubscriptionCounts.get(terminalId) ?? 0) > 0) {
792
+ return;
793
+ }
759
794
  const terminal = this.terminalInstanceRepository.findById(terminalId);
760
795
  if (!terminal || terminal.status !== "running") {
761
796
  return;
@@ -980,9 +1015,35 @@ function buildTerminalEnv(extraEnv) {
980
1015
  }
981
1016
  return env;
982
1017
  }
983
- function buildDefaultTerminalName(cwd) {
1018
+ function buildDefaultTerminalName(cwd, existingTerminals) {
984
1019
  const folderName = path.basename(cwd).trim();
985
- return folderName || "终端";
1020
+ const baseName = folderName || "终端";
1021
+ const nextSequence = resolveNextTerminalSequence(baseName, existingTerminals);
1022
+ return `${baseName} ${nextSequence}`;
1023
+ }
1024
+ function resolveNextTerminalSequence(baseName, terminals) {
1025
+ const escapedBaseName = escapeRegExp(baseName);
1026
+ const namePattern = new RegExp(`^${escapedBaseName}(?:\\s+(\\d+))?$`);
1027
+ let maxSequence = 0;
1028
+ for (const terminal of terminals) {
1029
+ const normalizedName = terminal.name.trim();
1030
+ const match = namePattern.exec(normalizedName);
1031
+ if (!match) {
1032
+ continue;
1033
+ }
1034
+ if (!match[1]) {
1035
+ maxSequence = Math.max(maxSequence, 1);
1036
+ continue;
1037
+ }
1038
+ const sequence = Number.parseInt(match[1], 10);
1039
+ if (Number.isFinite(sequence) && sequence > 0) {
1040
+ maxSequence = Math.max(maxSequence, sequence);
1041
+ }
1042
+ }
1043
+ return maxSequence + 1;
1044
+ }
1045
+ function escapeRegExp(input) {
1046
+ return input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
986
1047
  }
987
1048
  function buildMissingProcessStatusDetail(terminal) {
988
1049
  if (terminal.processId && !isProcessAlive(terminal.processId)) {