@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.
- package/README.md +13 -0
- package/bin/codingns.mjs +880 -9
- package/dist/public/assets/{TerminalPage-Dfw1QUqW.js → TerminalPage-D00S4KM6.js} +19 -19
- package/dist/public/assets/index-BlOinYqR.js +122 -0
- package/dist/public/assets/index-Dg_7g6lA.css +1 -0
- package/dist/public/index.html +2 -2
- package/dist/server/config/env.d.ts +2 -0
- package/dist/server/config/env.js +35 -0
- package/dist/server/config/env.js.map +1 -1
- package/dist/server/config/opencode-base-url-resolver.d.ts +7 -0
- package/dist/server/config/opencode-base-url-resolver.js +48 -11
- package/dist/server/config/opencode-base-url-resolver.js.map +1 -1
- package/dist/server/config/opencode-system-probe-helper-client.d.ts +4 -0
- package/dist/server/config/opencode-system-probe-helper-client.js +29 -0
- package/dist/server/config/opencode-system-probe-helper-client.js.map +1 -1
- package/dist/server/config/opencode-system-probe-helper-process.d.ts +12 -0
- package/dist/server/config/opencode-system-probe-helper-process.js +34 -7
- package/dist/server/config/opencode-system-probe-helper-process.js.map +1 -1
- package/dist/server/modules/assistant-capability/assistant-capability-controller.d.ts +144 -0
- package/dist/server/modules/assistant-capability/assistant-capability-controller.js +242 -1
- package/dist/server/modules/assistant-capability/assistant-capability-controller.js.map +1 -1
- package/dist/server/modules/assistant-capability/assistant-capability-service.d.ts +133 -2
- package/dist/server/modules/assistant-capability/assistant-capability-service.js +395 -2
- package/dist/server/modules/assistant-capability/assistant-capability-service.js.map +1 -1
- package/dist/server/modules/auth/auth-service.d.ts +18 -1
- package/dist/server/modules/auth/auth-service.js +168 -7
- package/dist/server/modules/auth/auth-service.js.map +1 -1
- package/dist/server/modules/butler/butler-codex-model-policy.d.ts +1 -0
- package/dist/server/modules/butler/butler-codex-model-policy.js +36 -0
- package/dist/server/modules/butler/butler-codex-model-policy.js.map +1 -0
- package/dist/server/modules/butler/butler-control-session-service.d.ts +13 -1
- package/dist/server/modules/butler/butler-control-session-service.js +55 -231
- package/dist/server/modules/butler/butler-control-session-service.js.map +1 -1
- package/dist/server/modules/butler/butler-controller.d.ts +17 -0
- package/dist/server/modules/butler/butler-controller.js +20 -1
- package/dist/server/modules/butler/butler-controller.js.map +1 -1
- package/dist/server/modules/butler/butler-follow-up-service.js +7 -3
- package/dist/server/modules/butler/butler-follow-up-service.js.map +1 -1
- package/dist/server/modules/butler/butler-inbox-analysis-service.d.ts +36 -0
- package/dist/server/modules/butler/butler-inbox-analysis-service.js +375 -0
- package/dist/server/modules/butler/butler-inbox-analysis-service.js.map +1 -0
- package/dist/server/modules/butler/butler-inbox-instruction-adapter.d.ts +23 -0
- package/dist/server/modules/butler/butler-inbox-instruction-adapter.js +97 -0
- package/dist/server/modules/butler/butler-inbox-instruction-adapter.js.map +1 -0
- package/dist/server/modules/butler/butler-inbox-service.d.ts +39 -2
- package/dist/server/modules/butler/butler-inbox-service.js +392 -2
- package/dist/server/modules/butler/butler-inbox-service.js.map +1 -1
- package/dist/server/modules/butler/butler-session-service.d.ts +8 -0
- package/dist/server/modules/butler/butler-session-service.js +205 -53
- package/dist/server/modules/butler/butler-session-service.js.map +1 -1
- package/dist/server/modules/butler/butler-session-summary-service.d.ts +1 -0
- package/dist/server/modules/butler/butler-session-summary-service.js +48 -23
- package/dist/server/modules/butler/butler-session-summary-service.js.map +1 -1
- package/dist/server/modules/butler/butler-workspace-context.d.ts +13 -0
- package/dist/server/modules/butler/butler-workspace-context.js +234 -0
- package/dist/server/modules/butler/butler-workspace-context.js.map +1 -0
- package/dist/server/modules/client/client-controller.d.ts +6 -0
- package/dist/server/modules/client/client-controller.js +30 -8
- package/dist/server/modules/client/client-controller.js.map +1 -1
- package/dist/server/modules/client/client-service.d.ts +22 -10
- package/dist/server/modules/client/client-service.js +77 -100
- package/dist/server/modules/client/client-service.js.map +1 -1
- package/dist/server/modules/client/npm-global-package-service.d.ts +21 -0
- package/dist/server/modules/client/npm-global-package-service.js +210 -0
- package/dist/server/modules/client/npm-global-package-service.js.map +1 -0
- package/dist/server/modules/client/service-update-task-service.d.ts +15 -0
- package/dist/server/modules/client/service-update-task-service.js +147 -0
- package/dist/server/modules/client/service-update-task-service.js.map +1 -0
- package/dist/server/modules/client/service-update-types.d.ts +30 -0
- package/dist/server/modules/client/service-update-types.js +2 -0
- package/dist/server/modules/client/service-update-types.js.map +1 -0
- package/dist/server/modules/debug-target/debug-target-controller.d.ts +13 -0
- package/dist/server/modules/debug-target/debug-target-controller.js +77 -2
- package/dist/server/modules/debug-target/debug-target-controller.js.map +1 -1
- package/dist/server/modules/debug-target/debug-target-service.d.ts +11 -2
- package/dist/server/modules/debug-target/debug-target-service.js +138 -3
- package/dist/server/modules/debug-target/debug-target-service.js.map +1 -1
- package/dist/server/modules/git/git-command-helper-client.d.ts +2 -0
- package/dist/server/modules/git/git-command-helper-client.js +52 -3
- package/dist/server/modules/git/git-command-helper-client.js.map +1 -1
- package/dist/server/modules/git/git-command-helper-process.js +62 -9
- package/dist/server/modules/git/git-command-helper-process.js.map +1 -1
- package/dist/server/modules/git/git-command-runner.d.ts +1 -0
- package/dist/server/modules/git/git-command-runner.js +25 -0
- package/dist/server/modules/git/git-command-runner.js.map +1 -1
- package/dist/server/modules/git/git-controller.js +8 -7
- package/dist/server/modules/git/git-controller.js.map +1 -1
- package/dist/server/modules/git/git-read-service.d.ts +7 -7
- package/dist/server/modules/git/git-read-service.js +41 -24
- package/dist/server/modules/git/git-read-service.js.map +1 -1
- package/dist/server/modules/model-switch/cc-switch-adapter.d.ts +36 -0
- package/dist/server/modules/model-switch/cc-switch-adapter.js +321 -0
- package/dist/server/modules/model-switch/cc-switch-adapter.js.map +1 -0
- package/dist/server/modules/model-switch/model-switch-controller.d.ts +11 -0
- package/dist/server/modules/model-switch/model-switch-controller.js +30 -0
- package/dist/server/modules/model-switch/model-switch-controller.js.map +1 -0
- package/dist/server/modules/model-switch/model-switch-service.d.ts +16 -0
- package/dist/server/modules/model-switch/model-switch-service.js +29 -0
- package/dist/server/modules/model-switch/model-switch-service.js.map +1 -0
- package/dist/server/modules/preferences/profile-service.d.ts +1 -0
- package/dist/server/modules/preferences/profile-service.js +9 -0
- package/dist/server/modules/preferences/profile-service.js.map +1 -1
- package/dist/server/modules/provider/codex-model-options.js +2 -3
- package/dist/server/modules/provider/codex-model-options.js.map +1 -1
- package/dist/server/modules/provider/opencode-model-options.js +2 -3
- package/dist/server/modules/provider/opencode-model-options.js.map +1 -1
- package/dist/server/modules/provider/provider-discovery-helper-client.d.ts +9 -4
- package/dist/server/modules/provider/provider-discovery-helper-client.js +87 -11
- package/dist/server/modules/provider/provider-discovery-helper-client.js.map +1 -1
- package/dist/server/modules/provider/provider-discovery-helper-process.js +52 -47
- package/dist/server/modules/provider/provider-discovery-helper-process.js.map +1 -1
- package/dist/server/modules/provider/provider-discovery-runtime.d.ts +4 -0
- package/dist/server/modules/provider/provider-discovery-runtime.js +65 -0
- package/dist/server/modules/provider/provider-discovery-runtime.js.map +1 -0
- package/dist/server/modules/sessions/codex-app-server-helper-process.js +3 -0
- package/dist/server/modules/sessions/codex-app-server-helper-process.js.map +1 -1
- package/dist/server/modules/sessions/session-activity-authority-service.d.ts +3 -1
- package/dist/server/modules/sessions/session-activity-authority-service.js +3 -0
- package/dist/server/modules/sessions/session-activity-authority-service.js.map +1 -1
- package/dist/server/modules/sessions/session-activity-inspector.d.ts +1 -1
- package/dist/server/modules/sessions/session-activity-inspector.js +43 -16
- package/dist/server/modules/sessions/session-activity-inspector.js.map +1 -1
- package/dist/server/modules/sessions/session-controller.d.ts +3 -3
- package/dist/server/modules/sessions/session-controller.js +3 -3
- package/dist/server/modules/sessions/session-controller.js.map +1 -1
- package/dist/server/modules/sessions/session-history-service.d.ts +8 -2
- package/dist/server/modules/sessions/session-history-service.js +473 -65
- package/dist/server/modules/sessions/session-history-service.js.map +1 -1
- package/dist/server/modules/sessions/session-live-runtime-service.d.ts +9 -3
- package/dist/server/modules/sessions/session-live-runtime-service.js +114 -34
- package/dist/server/modules/sessions/session-live-runtime-service.js.map +1 -1
- package/dist/server/modules/sessions/session-message-attachment-service.d.ts +8 -8
- package/dist/server/modules/sessions/session-message-attachment-service.js +25 -34
- package/dist/server/modules/sessions/session-message-attachment-service.js.map +1 -1
- package/dist/server/modules/sessions/session-provider-error-mapper.js +7 -0
- package/dist/server/modules/sessions/session-provider-error-mapper.js.map +1 -1
- package/dist/server/modules/skills/builtin-skill-service.d.ts +12 -0
- package/dist/server/modules/skills/builtin-skill-service.js +49 -0
- package/dist/server/modules/skills/builtin-skill-service.js.map +1 -0
- package/dist/server/modules/skills/builtin-skills/codingns-assistant/SKILL.md +75 -0
- package/dist/server/modules/skills/builtin-skills/codingns-assistant/agents/openai.yaml +4 -0
- package/dist/server/modules/skills/builtin-skills/codingns-assistant/references/cli-workflow.md +130 -0
- package/dist/server/modules/skills/skill-manager-service.d.ts +7 -0
- package/dist/server/modules/skills/skill-manager-service.js +98 -0
- package/dist/server/modules/skills/skill-manager-service.js.map +1 -1
- package/dist/server/modules/tailscale/tailscale-helper-client.d.ts +1 -0
- package/dist/server/modules/tailscale/tailscale-helper-client.js +12 -0
- package/dist/server/modules/tailscale/tailscale-helper-client.js.map +1 -1
- package/dist/server/modules/tailscale/tailscale-manager.js +5 -1
- package/dist/server/modules/tailscale/tailscale-manager.js.map +1 -1
- package/dist/server/modules/tasks/task-helper-client.d.ts +5 -0
- package/dist/server/modules/tasks/task-helper-client.js +45 -0
- package/dist/server/modules/tasks/task-helper-client.js.map +1 -1
- package/dist/server/modules/tasks/task-helper-process-handlers.d.ts +10 -3
- package/dist/server/modules/tasks/task-helper-process-handlers.js +7 -5
- package/dist/server/modules/tasks/task-helper-process-handlers.js.map +1 -1
- package/dist/server/modules/tasks/task-helper-process.js +11 -1
- package/dist/server/modules/tasks/task-helper-process.js.map +1 -1
- package/dist/server/modules/tasks/task-lane-executors.js +5 -2
- package/dist/server/modules/tasks/task-lane-executors.js.map +1 -1
- package/dist/server/modules/tasks/task-types.d.ts +3 -0
- package/dist/server/modules/tasks/task-types.js +4 -1
- package/dist/server/modules/tasks/task-types.js.map +1 -1
- package/dist/server/modules/terminal/command-template-service.d.ts +2 -2
- package/dist/server/modules/terminal/command-template-service.js +14 -5
- package/dist/server/modules/terminal/command-template-service.js.map +1 -1
- package/dist/server/modules/terminal/runtime/terminal-log-writer-client.js +1 -1
- package/dist/server/modules/terminal/runtime/terminal-log-writer-client.js.map +1 -1
- package/dist/server/modules/terminal/runtime/terminal-log-writer-process.js +160 -11
- package/dist/server/modules/terminal/runtime/terminal-log-writer-process.js.map +1 -1
- package/dist/server/modules/terminal/template-port-runtime.d.ts +13 -2
- package/dist/server/modules/terminal/template-port-runtime.js +266 -44
- package/dist/server/modules/terminal/template-port-runtime.js.map +1 -1
- package/dist/server/modules/terminal/terminal-service.d.ts +4 -0
- package/dist/server/modules/terminal/terminal-service.js +65 -4
- package/dist/server/modules/terminal/terminal-service.js.map +1 -1
- package/dist/server/modules/workbench/workbench-service.js +3 -3
- package/dist/server/modules/workbench/workbench-service.js.map +1 -1
- package/dist/server/modules/workbench/workspace-panel-snapshot-service.d.ts +1 -0
- package/dist/server/modules/workbench/workspace-panel-snapshot-service.js +118 -39
- package/dist/server/modules/workbench/workspace-panel-snapshot-service.js.map +1 -1
- package/dist/server/modules/workspace/workspace-code-composition.d.ts +1 -0
- package/dist/server/modules/workspace/workspace-code-composition.js +277 -2
- package/dist/server/modules/workspace/workspace-code-composition.js.map +1 -1
- package/dist/server/modules/workspace/workspace-service.js +54 -17
- package/dist/server/modules/workspace/workspace-service.js.map +1 -1
- package/dist/server/modules/worktree/worktree-cleanup-service.d.ts +1 -1
- package/dist/server/modules/worktree/worktree-cleanup-service.js +22 -17
- package/dist/server/modules/worktree/worktree-cleanup-service.js.map +1 -1
- package/dist/server/modules/worktree/worktree-controller.js +6 -5
- package/dist/server/modules/worktree/worktree-controller.js.map +1 -1
- package/dist/server/modules/worktree/worktree-manager.d.ts +1 -1
- package/dist/server/modules/worktree/worktree-manager.js +26 -19
- package/dist/server/modules/worktree/worktree-manager.js.map +1 -1
- package/dist/server/modules/worktree/worktree-merge-service.d.ts +2 -2
- package/dist/server/modules/worktree/worktree-merge-service.js +34 -27
- package/dist/server/modules/worktree/worktree-merge-service.js.map +1 -1
- package/dist/server/modules/worktree/worktree-sync-service.d.ts +1 -1
- package/dist/server/modules/worktree/worktree-sync-service.js +5 -3
- package/dist/server/modules/worktree/worktree-sync-service.js.map +1 -1
- package/dist/server/routes/assistant.js +24 -0
- package/dist/server/routes/assistant.js.map +1 -1
- package/dist/server/routes/butler.js +4 -0
- package/dist/server/routes/butler.js.map +1 -1
- package/dist/server/routes/client.js +2 -0
- package/dist/server/routes/client.js.map +1 -1
- package/dist/server/routes/sessions.js +1 -1
- package/dist/server/routes/sessions.js.map +1 -1
- package/dist/server/routes/system.d.ts +2 -1
- package/dist/server/routes/system.js +3 -1
- package/dist/server/routes/system.js.map +1 -1
- package/dist/server/server/create-server.d.ts +4 -0
- package/dist/server/server/create-server.js +67 -8
- package/dist/server/server/create-server.js.map +1 -1
- package/dist/server/shared/errors/app-error.d.ts +2 -0
- package/dist/server/shared/errors/app-error.js +2 -0
- package/dist/server/shared/errors/app-error.js.map +1 -1
- package/dist/server/shared/http/error-handler.d.ts +2 -1
- package/dist/server/shared/http/error-handler.js +3 -2
- package/dist/server/shared/http/error-handler.js.map +1 -1
- package/dist/server/shared/http/request-abort.d.ts +2 -0
- package/dist/server/shared/http/request-abort.js +38 -0
- package/dist/server/shared/http/request-abort.js.map +1 -0
- package/dist/server/storage/repositories/auth-login-attempt-repository.d.ts +9 -0
- package/dist/server/storage/repositories/auth-login-attempt-repository.js +59 -0
- package/dist/server/storage/repositories/auth-login-attempt-repository.js.map +1 -0
- package/dist/server/storage/repositories/butler-control-session-repository.d.ts +3 -0
- package/dist/server/storage/repositories/butler-control-session-repository.js +80 -4
- package/dist/server/storage/repositories/butler-control-session-repository.js.map +1 -1
- package/dist/server/storage/repositories/butler-inbox-item-repository.js +54 -3
- package/dist/server/storage/repositories/butler-inbox-item-repository.js.map +1 -1
- package/dist/server/storage/repositories/terminal-instance-repository.js +1 -1
- package/dist/server/storage/repositories/terminal-instance-repository.js.map +1 -1
- package/dist/server/storage/repositories/user-preference-profile-repository.js +6 -3
- package/dist/server/storage/repositories/user-preference-profile-repository.js.map +1 -1
- package/dist/server/storage/sqlite/client.js +127 -0
- package/dist/server/storage/sqlite/client.js.map +1 -1
- package/dist/server/storage/sqlite/schema.sql +19 -1
- package/dist/server/types/domain.d.ts +37 -1
- package/dist/server/ws/workbench-ws-hub.d.ts +1 -0
- package/dist/server/ws/workbench-ws-hub.js +25 -3
- package/dist/server/ws/workbench-ws-hub.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/patch-builder.d.ts +23 -0
- package/node_modules/@codingns/session-sync-core/dist/patch-builder.js +162 -0
- package/node_modules/@codingns/session-sync-core/dist/patch-builder.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/providers/codex.d.ts +1 -0
- package/node_modules/@codingns/session-sync-core/dist/providers/codex.js +89 -33
- package/node_modules/@codingns/session-sync-core/dist/providers/codex.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/runtime/active-run-registry.js +18 -2
- package/node_modules/@codingns/session-sync-core/dist/runtime/active-run-registry.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.d.ts +3 -1
- package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js +238 -53
- package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/runtime/provider-runtime-service.js +1 -0
- package/node_modules/@codingns/session-sync-core/dist/runtime/provider-runtime-service.js.map +1 -1
- package/node_modules/@codingns/session-sync-core/dist/runtime/types.d.ts +6 -2
- package/node_modules/@codingns/session-sync-core/dist/types.d.ts +1 -1
- package/package.json +1 -1
- package/scripts/postinstall.mjs +33 -0
- package/dist/public/assets/index-DR2rPNi7.css +0 -1
- 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(
|
|
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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
|
135
|
-
|
|
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
|
-
|
|
139
|
-
|
|
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",
|
|
246
|
+
child.on("error", (error) => {
|
|
247
|
+
finish(() => {
|
|
248
|
+
reject(error);
|
|
249
|
+
});
|
|
250
|
+
});
|
|
165
251
|
child.on("close", (exitCode) => {
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
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.
|
|
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
|
-
|
|
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)) {
|