@gajae-code/coding-agent 0.16.7 → 0.17.1
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/CHANGELOG.md +180 -1
- package/dist/types/capability/fs.d.ts +37 -4
- package/dist/types/capability/index.d.ts +19 -0
- package/dist/types/capability/types.d.ts +9 -0
- package/dist/types/cli/doctor/args.d.ts +36 -0
- package/dist/types/cli/doctor/checks.d.ts +18 -0
- package/dist/types/cli/doctor/config-repairs.d.ts +38 -0
- package/dist/types/cli/doctor/context.d.ts +89 -0
- package/dist/types/cli/doctor/files.d.ts +27 -0
- package/dist/types/cli/doctor/ids.d.ts +20 -0
- package/dist/types/cli/doctor/install-repairs.d.ts +94 -0
- package/dist/types/cli/doctor/journal.d.ts +43 -0
- package/dist/types/cli/doctor/managed-link.d.ts +39 -0
- package/dist/types/cli/doctor/native-probe.d.ts +2 -0
- package/dist/types/cli/doctor/permission-repairs.d.ts +25 -0
- package/dist/types/cli/doctor/plugin-quarantine.d.ts +77 -0
- package/dist/types/cli/doctor/plugin-restore.d.ts +40 -0
- package/dist/types/cli/doctor/plugin-targets.d.ts +11 -0
- package/dist/types/cli/doctor/probe-client.d.ts +9 -0
- package/dist/types/cli/doctor/probe-types.d.ts +18 -0
- package/dist/types/cli/doctor/probe.d.ts +3 -0
- package/dist/types/cli/doctor/projection-probe.d.ts +2 -0
- package/dist/types/cli/doctor/repairs.d.ts +28 -0
- package/dist/types/cli/doctor/report.d.ts +27 -0
- package/dist/types/cli/doctor/runner.d.ts +4 -0
- package/dist/types/cli/doctor/safety.d.ts +10 -0
- package/dist/types/cli/doctor/service-repairs.d.ts +8 -0
- package/dist/types/cli/doctor/service-targets.d.ts +41 -0
- package/dist/types/cli/doctor/types.d.ts +145 -0
- package/dist/types/cli/doctor-cli.d.ts +7 -0
- package/dist/types/cli/doctor-supervisor.d.ts +121 -0
- package/dist/types/cli/doctor-worker.d.ts +29 -0
- package/dist/types/cli/install-activation.d.ts +158 -0
- package/dist/types/cli/macos-community-app.d.ts +41 -0
- package/dist/types/cli/mcp-cli.d.ts +0 -11
- package/dist/types/cli/update-cli.d.ts +41 -4
- package/dist/types/cli-main.d.ts +174 -0
- package/dist/types/cli.d.ts +1 -171
- package/dist/types/commands/doctor.d.ts +7 -0
- package/dist/types/commands/sdk.d.ts +17 -8
- package/dist/types/config/autorouting-tier-map.d.ts +19 -0
- package/dist/types/config/file-lock.d.ts +27 -3
- package/dist/types/config/model-preset-registry.d.ts +1 -0
- package/dist/types/config/model-registry.d.ts +12 -5
- package/dist/types/config/model-resolver.d.ts +16 -3
- package/dist/types/config/models-config-schema.d.ts +2 -0
- package/dist/types/config/settings-schema.d.ts +1 -1
- package/dist/types/coordinator-mcp/question-gate-codec.d.ts +1 -1
- package/dist/types/coordinator-mcp/session-reaper.d.ts +15 -5
- package/dist/types/cursor.d.ts +9 -9
- package/dist/types/discovery/agents-md.d.ts +6 -1
- package/dist/types/discovery/helpers.d.ts +36 -7
- package/dist/types/discovery/index.d.ts +1 -1
- package/dist/types/discovery/mcp-json.d.ts +2 -0
- package/dist/types/extensibility/extensions/loader.d.ts +22 -1
- package/dist/types/extensibility/gjc-plugins/lifecycle.d.ts +14 -1
- package/dist/types/extensibility/gjc-plugins/paths.d.ts +2 -1
- package/dist/types/extensibility/gjc-plugins/types.d.ts +25 -0
- package/dist/types/extensibility/plugins/manager.d.ts +33 -4
- package/dist/types/extensibility/plugins/marketplace/cache.d.ts +6 -0
- package/dist/types/extensibility/plugins/marketplace/manager.d.ts +186 -0
- package/dist/types/extensibility/plugins/marketplace/registry.d.ts +27 -0
- package/dist/types/extensibility/plugins/marketplace/source-resolver.d.ts +16 -1
- package/dist/types/extensibility/runtime-skill-discovery.d.ts +16 -3
- package/dist/types/gjc-runtime/autoresearch-runtime.d.ts +6 -0
- package/dist/types/gjc-runtime/launch-worktree.d.ts +53 -0
- package/dist/types/gjc-runtime/session-layout.d.ts +8 -0
- package/dist/types/gjc-runtime/session-state-lock.d.ts +15 -0
- package/dist/types/gjc-runtime/session-state-sidecar.d.ts +13 -0
- package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +6 -0
- package/dist/types/main.d.ts +19 -1
- package/dist/types/modes/acp/acp-agent.d.ts +40 -0
- package/dist/types/modes/components/agent-dashboard.d.ts +1 -0
- package/dist/types/modes/components/model-selector.d.ts +2 -0
- package/dist/types/modes/interactive-mode.d.ts +1 -1
- package/dist/types/runtime-mcp/config-writer.d.ts +47 -0
- package/dist/types/runtime-mcp/policy-json-edit.d.ts +60 -0
- package/dist/types/runtime-mcp/startup-policy.d.ts +4 -0
- package/dist/types/runtime-mcp/types.d.ts +2 -2
- package/dist/types/sdk/acp/adapter.d.ts +5 -1
- package/dist/types/sdk/broker/broker.d.ts +51 -0
- package/dist/types/sdk/broker/daemon-entry.d.ts +39 -0
- package/dist/types/sdk/broker/discovery.d.ts +38 -0
- package/dist/types/sdk/broker/doctor-restart.d.ts +79 -0
- package/dist/types/sdk/broker/endpoint-authority.d.ts +7 -0
- package/dist/types/sdk/broker/ensure.d.ts +14 -0
- package/dist/types/sdk/broker/lifecycle.d.ts +2 -0
- package/dist/types/sdk/broker/process-incarnation.d.ts +50 -0
- package/dist/types/sdk/broker/runtime.d.ts +26 -0
- package/dist/types/sdk/broker/session-index.d.ts +13 -4
- package/dist/types/sdk/broker/worktree-occupancy.d.ts +14 -0
- package/dist/types/sdk/bus/chat-daemon-cli.d.ts +16 -0
- package/dist/types/sdk/bus/chat-daemon-control.d.ts +101 -6
- package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +16 -0
- package/dist/types/sdk/bus/daemon-startup-exclusion.d.ts +43 -0
- package/dist/types/sdk/bus/doctor-daemon-restart-client.d.ts +51 -0
- package/dist/types/sdk/bus/doctor-daemon-restart.d.ts +39 -0
- package/dist/types/sdk/bus/index.d.ts +2 -0
- package/dist/types/sdk/bus/notification-service.d.ts +3 -0
- package/dist/types/sdk/bus/telegram-daemon-cli.d.ts +11 -0
- package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +1 -1
- package/dist/types/sdk/bus/telegram-daemon-control.d.ts +5 -0
- package/dist/types/sdk/bus/telegram-daemon-owner-registry.d.ts +1 -0
- package/dist/types/sdk/bus/telegram-daemon.d.ts +36 -5
- package/dist/types/sdk/cli/session-cli.d.ts +1 -0
- package/dist/types/sdk/host/session-runtime.d.ts +4 -0
- package/dist/types/sdk/host/surface-policy.d.ts +3 -1
- package/dist/types/sdk/lifecycle/service.d.ts +44 -10
- package/dist/types/sdk/prompt-deadline-lease.d.ts +6 -3
- package/dist/types/sdk/prompt-deadline-manager.d.ts +2 -2
- package/dist/types/sdk/prompt-failure.d.ts +47 -0
- package/dist/types/sdk/prompt-status.d.ts +19 -0
- package/dist/types/sdk/router/session-router.d.ts +3 -4
- package/dist/types/sdk/service-artifact-paths.d.ts +16 -0
- package/dist/types/sdk/session-authority.d.ts +9 -0
- package/dist/types/sdk/session.d.ts +3 -1
- package/dist/types/session/agent-session.d.ts +1 -1
- package/dist/types/session/blob-store.d.ts +1 -1
- package/dist/types/session/fallback-chain-controller.d.ts +3 -6
- package/dist/types/session/internal/managed-session-scope.d.ts +44 -0
- package/dist/types/session/primary-control-surface.d.ts +4 -0
- package/dist/types/session/session-manager.d.ts +6 -0
- package/dist/types/system-prompt.d.ts +6 -0
- package/dist/types/tools/ask.d.ts +25 -0
- package/dist/types/tools/image-gen.d.ts +0 -4
- package/dist/types/tools/skill-discovery.d.ts +7 -5
- package/dist/types/tools/ultragoal-ask-guard.d.ts +7 -4
- package/dist/types/utils/changelog.d.ts +0 -9
- package/dist/types/utils/mupdf-wasm.d.ts +1 -0
- package/package.json +9 -8
- package/scripts/compile-args.ts +8 -4
- package/src/capability/fs.ts +395 -17
- package/src/capability/index.ts +273 -10
- package/src/capability/types.ts +9 -0
- package/src/cli/customize-doctor.ts +18 -12
- package/src/cli/doctor/args.ts +236 -0
- package/src/cli/doctor/checks.ts +431 -0
- package/src/cli/doctor/config-repairs.ts +517 -0
- package/src/cli/doctor/context.ts +149 -0
- package/src/cli/doctor/files.ts +149 -0
- package/src/cli/doctor/ids.ts +115 -0
- package/src/cli/doctor/install-repairs.ts +335 -0
- package/src/cli/doctor/journal.ts +423 -0
- package/src/cli/doctor/managed-link.ts +514 -0
- package/src/cli/doctor/native-probe.ts +13 -0
- package/src/cli/doctor/permission-repairs.ts +242 -0
- package/src/cli/doctor/plugin-quarantine.ts +377 -0
- package/src/cli/doctor/plugin-restore.ts +59 -0
- package/src/cli/doctor/plugin-targets.ts +373 -0
- package/src/cli/doctor/probe-client.ts +195 -0
- package/src/cli/doctor/probe-types.ts +21 -0
- package/src/cli/doctor/probe.ts +42 -0
- package/src/cli/doctor/projection-probe.ts +249 -0
- package/src/cli/doctor/repairs.ts +1157 -0
- package/src/cli/doctor/report.ts +176 -0
- package/src/cli/doctor/runner.ts +342 -0
- package/src/cli/doctor/safety.ts +40 -0
- package/src/cli/doctor/service-repairs.ts +452 -0
- package/src/cli/doctor/service-targets.ts +274 -0
- package/src/cli/doctor/types.ts +164 -0
- package/src/cli/doctor-cli.ts +62 -0
- package/src/cli/doctor-supervisor.ts +571 -0
- package/src/cli/doctor-worker.ts +181 -0
- package/src/cli/install-activation.ts +666 -0
- package/src/cli/macos-community-app.ts +1449 -0
- package/src/cli/mcp-cli.ts +11 -21
- package/src/cli/nofile-limit.ts +5 -1
- package/src/cli/plugin-cli.ts +6 -1
- package/src/cli/update-cli.ts +362 -264
- package/src/cli-main.ts +517 -0
- package/src/cli.ts +64 -433
- package/src/commands/autoresearch.ts +11 -5
- package/src/commands/completion.ts +1 -1
- package/src/commands/doctor.ts +13 -0
- package/src/commands/sdk.ts +58 -10
- package/src/commands/ultragoal.ts +11 -5
- package/src/config/autorouting-tier-map.ts +7 -0
- package/src/config/file-lock.ts +736 -71
- package/src/config/mcp-schema.json +3 -3
- package/src/config/model-preset-registry.ts +1 -0
- package/src/config/model-registry.ts +80 -27
- package/src/config/model-resolver.ts +33 -4
- package/src/config/models-config-schema.ts +2 -0
- package/src/config/settings-schema.ts +6 -2
- package/src/coordinator-mcp/question-gate-codec.ts +1 -0
- package/src/coordinator-mcp/server.ts +534 -51
- package/src/coordinator-mcp/session-reaper.ts +64 -8
- package/src/cursor.ts +223 -53
- package/src/discovery/agents-md.ts +74 -8
- package/src/discovery/agents.ts +32 -7
- package/src/discovery/builtin.ts +184 -75
- package/src/discovery/claude-plugins.ts +85 -17
- package/src/discovery/cline.ts +38 -10
- package/src/discovery/cursor.ts +19 -6
- package/src/discovery/gemini.ts +62 -22
- package/src/discovery/github.ts +13 -3
- package/src/discovery/helpers.ts +483 -89
- package/src/discovery/index.ts +1 -0
- package/src/discovery/mcp-json.ts +36 -10
- package/src/discovery/opencode.ts +36 -19
- package/src/discovery/ssh.ts +11 -8
- package/src/discovery/windsurf.ts +12 -3
- package/src/exec/bash-executor.ts +10 -3
- package/src/exec/isolated-shell.ts +15 -2
- package/src/extensibility/extensions/loader.ts +88 -26
- package/src/extensibility/gjc-plugins/lifecycle.ts +189 -0
- package/src/extensibility/gjc-plugins/paths.ts +4 -1
- package/src/extensibility/gjc-plugins/types.ts +27 -0
- package/src/extensibility/plugins/manager.ts +200 -22
- package/src/extensibility/plugins/marketplace/cache.ts +55 -2
- package/src/extensibility/plugins/marketplace/manager.ts +1262 -162
- package/src/extensibility/plugins/marketplace/registry.ts +153 -0
- package/src/extensibility/plugins/marketplace/source-resolver.ts +116 -10
- package/src/extensibility/runtime-skill-discovery.ts +61 -9
- package/src/extensibility/skill-management.ts +7 -1
- package/src/gjc-runtime/autoresearch-runtime.ts +10 -1
- package/src/gjc-runtime/launch-worktree.test.ts +248 -0
- package/src/gjc-runtime/launch-worktree.ts +275 -38
- package/src/gjc-runtime/repository-binding.ts +26 -1
- package/src/gjc-runtime/session-layout.ts +10 -0
- package/src/gjc-runtime/session-state-lock.ts +330 -23
- package/src/gjc-runtime/session-state-sidecar.ts +328 -80
- package/src/gjc-runtime/ultragoal-runtime.ts +10 -1
- package/src/harness-control-plane/session-lease.ts +2 -2
- package/src/internal-urls/docs-index.generated.ts +28 -26
- package/src/main.ts +150 -29
- package/src/memories/index.ts +24 -2
- package/src/modes/acp/acp-agent.ts +522 -68
- package/src/modes/components/agent-dashboard.ts +3 -1
- package/src/modes/components/model-selector.ts +28 -19
- package/src/modes/components/plugin-settings.ts +2 -1
- package/src/modes/controllers/selector-controller.ts +15 -9
- package/src/modes/interactive-mode.ts +21 -3
- package/src/prompts/system/system-prompt.md +5 -1
- package/src/prompts/tools/browser.md +1 -1
- package/src/prompts/tools/move-session.md +4 -0
- package/src/prompts/tools/read.md +2 -1
- package/src/prompts/tools/skill-discovery.md +6 -5
- package/src/prompts/tools/task.md +1 -0
- package/src/runtime-mcp/config-writer.ts +228 -0
- package/src/runtime-mcp/oauth-discovery.ts +114 -14
- package/src/runtime-mcp/policy-json-edit.ts +129 -0
- package/src/runtime-mcp/startup-policy.ts +14 -0
- package/src/runtime-mcp/types.ts +2 -2
- package/src/sdk/acp/adapter.ts +27 -12
- package/src/sdk/broker/broker.ts +273 -44
- package/src/sdk/broker/daemon-entry.ts +119 -0
- package/src/sdk/broker/discovery.ts +173 -20
- package/src/sdk/broker/doctor-restart.ts +206 -0
- package/src/sdk/broker/endpoint-authority.ts +36 -0
- package/src/sdk/broker/ensure.ts +49 -14
- package/src/sdk/broker/lifecycle.ts +174 -42
- package/src/sdk/broker/process-incarnation.ts +86 -2
- package/src/sdk/broker/runtime.ts +145 -21
- package/src/sdk/broker/session-index.ts +136 -22
- package/src/sdk/broker/spawn-substrate.ts +4 -1
- package/src/sdk/broker/transport.ts +5 -0
- package/src/sdk/broker/worktree-occupancy.ts +21 -1
- package/src/sdk/bus/chat-daemon-cli.ts +63 -0
- package/src/sdk/bus/chat-daemon-control.ts +260 -64
- package/src/sdk/bus/chat-daemon-runtime.ts +141 -25
- package/src/sdk/bus/daemon-startup-exclusion.ts +119 -0
- package/src/sdk/bus/doctor-daemon-restart-client.ts +291 -0
- package/src/sdk/bus/doctor-daemon-restart.ts +92 -0
- package/src/sdk/bus/index.ts +252 -51
- package/src/sdk/bus/kind-aware-reconciliation.ts +76 -41
- package/src/sdk/bus/notification-service.ts +21 -3
- package/src/sdk/bus/reconciliation-store.ts +17 -11
- package/src/sdk/bus/telegram-daemon-cli.ts +91 -5
- package/src/sdk/bus/telegram-daemon-contract.ts +1 -1
- package/src/sdk/bus/telegram-daemon-control.ts +47 -0
- package/src/sdk/bus/telegram-daemon-owner-registry.ts +1 -1
- package/src/sdk/bus/telegram-daemon.ts +178 -13
- package/src/sdk/cli/session-cli.ts +100 -12
- package/src/sdk/host/host.ts +2 -7
- package/src/sdk/host/session-runtime.test.ts +329 -8
- package/src/sdk/host/session-runtime.ts +202 -50
- package/src/sdk/host/surface-policy.ts +8 -1
- package/src/sdk/lifecycle/service.ts +199 -22
- package/src/sdk/mcp/server.ts +1 -1
- package/src/sdk/prompt-deadline-lease.ts +12 -4
- package/src/sdk/prompt-deadline-manager.ts +5 -7
- package/src/sdk/prompt-failure.ts +148 -0
- package/src/sdk/prompt-status.ts +30 -1
- package/src/sdk/prompt-watchdog.ts +11 -3
- package/src/sdk/protocol/operation-inventory.generated.json +18 -0
- package/src/sdk/protocol/operation-registry.ts +20 -8
- package/src/sdk/router/session-router.ts +8 -3
- package/src/sdk/service-artifact-paths.ts +26 -0
- package/src/sdk/session-authority.ts +10 -0
- package/src/sdk/session.ts +361 -194
- package/src/session/agent-session.ts +398 -93
- package/src/session/blob-store.ts +9 -9
- package/src/session/fallback-chain-controller.ts +3 -7
- package/src/session/internal/managed-session-scope.ts +445 -29
- package/src/session/internal/managed-session-storage.ts +38 -6
- package/src/session/primary-control-surface.ts +12 -0
- package/src/session/session-manager.ts +11 -3
- package/src/session/session-storage.ts +1 -1
- package/src/session-import/codex.ts +6 -1
- package/src/session-import/redact.ts +7 -0
- package/src/skill-state/workflow-mutation-guard.ts +645 -39
- package/src/slash-commands/builtin-registry.ts +7 -3
- package/src/system-prompt.ts +8 -0
- package/src/task/executor.ts +36 -3
- package/src/task/types.ts +27 -5
- package/src/tools/ask.ts +114 -34
- package/src/tools/browser/actions.ts +2 -2
- package/src/tools/browser/tab-worker.ts +11 -8
- package/src/tools/descriptors.ts +6 -1
- package/src/tools/fetch.ts +7 -2
- package/src/tools/image-gen.ts +33 -34
- package/src/tools/read.ts +78 -32
- package/src/tools/skill-discovery.ts +17 -7
- package/src/tools/tool-catalog.generated.ts +8 -8
- package/src/tools/ultragoal-ask-guard.ts +16 -26
- package/src/utils/changelog.ts +7 -1
- package/src/utils/git.ts +3 -1
- package/src/utils/markit.ts +24 -2
- package/src/utils/mupdf-wasm.ts +26 -0
- package/src/web/search/providers/openai-compatible.ts +191 -14
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Doctor bootstrap isolation worker (child side).
|
|
3
|
+
*
|
|
4
|
+
* This is the ONLY module that imports the real `./doctor/runner` inside the
|
|
5
|
+
* isolated child spawned by `doctor-supervisor.ts`. Its own stdio is fully
|
|
6
|
+
* consumed by the JSON-line protocol: the parent renders the interactive
|
|
7
|
+
* confirmation prompt against the real terminal and this process forwards
|
|
8
|
+
* `confirmRepair`/`onRepairAdmitted` callback activity over the wire rather
|
|
9
|
+
* than touching `process.stdin`/TTY itself. `onRepairAdmitted` latches the
|
|
10
|
+
* "admitted" fact on the parent's side the instant the message is sent —
|
|
11
|
+
* this worker sends it synchronously before any further await, exactly once
|
|
12
|
+
* per repair attempt, and never retracts it.
|
|
13
|
+
*
|
|
14
|
+
* No raw stderr, stack trace, or uncaught exception detail ever reaches the
|
|
15
|
+
* parent: every failure path here degrades to a bounded `error` message with
|
|
16
|
+
* a fixed reason code. The parent treats worker stdout as the only channel
|
|
17
|
+
* of record and never forwards this process's own stderr into the report.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import * as fs from "node:fs";
|
|
21
|
+
import * as readline from "node:readline";
|
|
22
|
+
import { type DoctorConfirmationResult, parseDoctorArgs } from "./doctor/args";
|
|
23
|
+
import type { DoctorRepair, DoctorReport } from "./doctor/types";
|
|
24
|
+
import type { SupervisorToWorkerMessage, WorkerToSupervisorPayload } from "./doctor-supervisor";
|
|
25
|
+
import { DOCTOR_WORKER_TOKEN_ENV } from "./doctor-supervisor";
|
|
26
|
+
|
|
27
|
+
function send(token: string, message: WorkerToSupervisorPayload): void {
|
|
28
|
+
const bytes = Buffer.from(`${JSON.stringify({ ...message, token })}\n`);
|
|
29
|
+
if (bytes.byteLength > 1024 * 1024) throw new Error("worker_output_limit");
|
|
30
|
+
let offset = 0;
|
|
31
|
+
while (offset < bytes.length) {
|
|
32
|
+
const written = fs.writeSync(1, bytes, offset, bytes.length - offset);
|
|
33
|
+
if (written === 0) throw new Error("worker_output_closed");
|
|
34
|
+
offset += written;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* `--internal-doctor-worker` is only a routable protocol worker when BOTH the
|
|
40
|
+
* token env var is present with a plausible shape AND stdin is not a TTY — a
|
|
41
|
+
* user's own interactive terminal can never be silently routed onto the
|
|
42
|
+
* worker's non-interactive confirmation-refusal path. Any other invocation
|
|
43
|
+
* (missing token, short/malformed token, an attached TTY) falls back to
|
|
44
|
+
* ordinary CLI usage error and never enters the protocol at all.
|
|
45
|
+
*/
|
|
46
|
+
export function isRoutableDoctorWorkerInvocation(env: NodeJS.ProcessEnv, stdinIsTTY: boolean | undefined): boolean {
|
|
47
|
+
const token = env[DOCTOR_WORKER_TOKEN_ENV];
|
|
48
|
+
return typeof token === "string" && /^[0-9a-f]{64}$/.test(token) && !stdinIsTTY;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** Runs the isolated worker's full protocol lifecycle to completion. Never spawns anything; never talks to a TTY. */
|
|
52
|
+
export async function runDoctorWorker(): Promise<void> {
|
|
53
|
+
const token = process.env[DOCTOR_WORKER_TOKEN_ENV];
|
|
54
|
+
if (!token || !/^[0-9a-f]{64}$/.test(token) || process.stdin.isTTY) {
|
|
55
|
+
process.exitCode = 2;
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
type InitMessage = Extract<SupervisorToWorkerMessage, { readonly type: "init" }>;
|
|
60
|
+
const init = await new Promise<InitMessage | undefined>(resolve => {
|
|
61
|
+
const lineReader = readline.createInterface({ input: process.stdin, crlfDelay: Infinity });
|
|
62
|
+
const onLine = (line: string): void => {
|
|
63
|
+
lineReader.off("line", onLine);
|
|
64
|
+
try {
|
|
65
|
+
const message = JSON.parse(line) as SupervisorToWorkerMessage;
|
|
66
|
+
resolve(message.type === "init" && message.token === token ? (message as InitMessage) : undefined);
|
|
67
|
+
} catch {
|
|
68
|
+
resolve(undefined);
|
|
69
|
+
}
|
|
70
|
+
lineReader.close();
|
|
71
|
+
};
|
|
72
|
+
lineReader.on("line", onLine);
|
|
73
|
+
lineReader.once("close", () => resolve(undefined));
|
|
74
|
+
});
|
|
75
|
+
if (
|
|
76
|
+
!init ||
|
|
77
|
+
!Array.isArray(init.argv) ||
|
|
78
|
+
!init.argv.every(argument => typeof argument === "string") ||
|
|
79
|
+
typeof init.cwd !== "string" ||
|
|
80
|
+
typeof init.tty !== "boolean" ||
|
|
81
|
+
typeof init.runId !== "string" ||
|
|
82
|
+
!/^[0-9a-f-]{36}$/.test(init.runId) ||
|
|
83
|
+
!Number.isFinite(init.deadlineAt) ||
|
|
84
|
+
!Number.isInteger(init.timeoutMs) ||
|
|
85
|
+
init.timeoutMs <= 0 ||
|
|
86
|
+
init.timeoutMs > 120_000
|
|
87
|
+
) {
|
|
88
|
+
send(token, {
|
|
89
|
+
type: "error",
|
|
90
|
+
code: "worker_init_invalid",
|
|
91
|
+
message: "Worker did not receive a valid init message.",
|
|
92
|
+
});
|
|
93
|
+
process.exitCode = 2;
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const deadline = performance.now() + Math.max(0, init.deadlineAt - Date.now());
|
|
98
|
+
const parsed = parseDoctorArgs(init.argv);
|
|
99
|
+
if (parsed.error || !parsed.options) {
|
|
100
|
+
send(token, {
|
|
101
|
+
type: "error",
|
|
102
|
+
code: "worker_args_invalid",
|
|
103
|
+
message: "Worker could not parse the supplied arguments.",
|
|
104
|
+
});
|
|
105
|
+
process.exitCode = 2;
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Every remaining protocol line after init is a `confirm-result`; route each
|
|
110
|
+
// by its `id` to the pending confirmation promise the runner is awaiting.
|
|
111
|
+
const pendingConfirmations = new Map<number, (result: DoctorConfirmationResult) => void>();
|
|
112
|
+
let nextConfirmId = 0;
|
|
113
|
+
const lineReader = readline.createInterface({ input: process.stdin, crlfDelay: Infinity });
|
|
114
|
+
lineReader.on("line", line => {
|
|
115
|
+
let message: SupervisorToWorkerMessage;
|
|
116
|
+
try {
|
|
117
|
+
message = JSON.parse(line) as SupervisorToWorkerMessage;
|
|
118
|
+
} catch {
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
if (message.token !== token || message.type !== "confirm-result") return;
|
|
122
|
+
const resolve = pendingConfirmations.get(message.id);
|
|
123
|
+
if (!resolve) return;
|
|
124
|
+
pendingConfirmations.delete(message.id);
|
|
125
|
+
resolve(message.result);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
const confirmRepair = (repair: DoctorRepair): Promise<DoctorConfirmationResult> => {
|
|
129
|
+
const id = nextConfirmId++;
|
|
130
|
+
return new Promise<DoctorConfirmationResult>(resolve => {
|
|
131
|
+
pendingConfirmations.set(id, resolve);
|
|
132
|
+
send(token, { type: "confirm", id, repair, setValue: parsed.options?.setValue });
|
|
133
|
+
});
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
// Sent synchronously, before any further await in this callback, so the
|
|
137
|
+
// parent's admission fence latches at the exact moment the repair enters
|
|
138
|
+
// its effect-capable transaction — never delayed, never re-sent, never
|
|
139
|
+
// followed by a retraction.
|
|
140
|
+
const onRepairAdmitted = (): void => {
|
|
141
|
+
send(token, { type: "admitted" });
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
// Overriding the default SIGINT disposition lets a forwarded Ctrl-C (from
|
|
145
|
+
// the supervisor) drive the runner's own cancellation checks to a prompt,
|
|
146
|
+
// correctly `interrupted: true` report — landing on exit 130 through the
|
|
147
|
+
// normal report path — instead of the process dying before it can reply.
|
|
148
|
+
const sigintController = new AbortController();
|
|
149
|
+
const onSigint = (): void => sigintController.abort();
|
|
150
|
+
process.on("SIGINT", onSigint);
|
|
151
|
+
|
|
152
|
+
try {
|
|
153
|
+
const { collectDoctorReport } = await import("./doctor/runner");
|
|
154
|
+
const report: DoctorReport = await collectDoctorReport({
|
|
155
|
+
...parsed.options,
|
|
156
|
+
cwd: init.cwd,
|
|
157
|
+
tty: init.tty,
|
|
158
|
+
runId: init.runId,
|
|
159
|
+
timeoutMs: init.timeoutMs,
|
|
160
|
+
deadline,
|
|
161
|
+
signal: sigintController.signal,
|
|
162
|
+
confirmRepair,
|
|
163
|
+
onRepairAdmitted,
|
|
164
|
+
});
|
|
165
|
+
send(token, { type: "report", report });
|
|
166
|
+
process.exitCode = 0;
|
|
167
|
+
} catch {
|
|
168
|
+
// The real error may carry filesystem paths, native addon detail, or
|
|
169
|
+
// other host-specific text; only a bounded, fixed reason code crosses
|
|
170
|
+
// the process boundary.
|
|
171
|
+
send(token, {
|
|
172
|
+
type: "error",
|
|
173
|
+
code: "worker_runner_failed",
|
|
174
|
+
message: "Doctor diagnostics could not be completed inside the isolated worker.",
|
|
175
|
+
});
|
|
176
|
+
process.exitCode = 1;
|
|
177
|
+
} finally {
|
|
178
|
+
process.off("SIGINT", onSigint);
|
|
179
|
+
lineReader.close();
|
|
180
|
+
}
|
|
181
|
+
}
|