@adhdev/daemon-core 0.9.82-rc.44 → 0.9.82-rc.440
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/dist/boot/daemon-lifecycle.d.ts +9 -0
- package/dist/boot/process-hardening.d.ts +50 -0
- package/dist/build-info.d.ts +37 -0
- package/dist/chat/source-machine.d.ts +166 -0
- package/dist/chat/source-resolver.d.ts +104 -0
- package/dist/chat/subscription-updates.d.ts +1 -0
- package/dist/cli-adapter-types.d.ts +68 -2
- package/dist/cli-adapters/cli-script-runner.d.ts +117 -0
- package/dist/cli-adapters/cli-state-engine.d.ts +200 -0
- package/dist/cli-adapters/provider-cli-adapter.d.ts +126 -64
- package/dist/cli-adapters/provider-cli-parse.d.ts +5 -0
- package/dist/cli-adapters/provider-cli-runtime.d.ts +34 -0
- package/dist/cli-adapters/provider-cli-shared.d.ts +74 -0
- package/dist/cli-adapters/pty-write-chunking.d.ts +34 -0
- package/dist/cli-adapters/raw-terminal-io.d.ts +37 -0
- package/dist/cli-adapters/resolve-executable.d.ts +69 -0
- package/dist/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +6 -3
- package/dist/cli-adapters/terminal-backends/types.d.ts +10 -2
- package/dist/cli-adapters/terminal-screen.d.ts +4 -11
- package/dist/commands/chat-commands-debug-bundle.d.ts +14 -0
- package/dist/commands/chat-commands-read.d.ts +7 -0
- package/dist/commands/chat-commands-scope.d.ts +39 -0
- package/dist/commands/chat-commands-shared.d.ts +33 -0
- package/dist/commands/chat-commands-write.d.ts +14 -0
- package/dist/commands/chat-commands.d.ts +10 -23
- package/dist/commands/cli-manager.d.ts +15 -1
- package/dist/commands/handler.d.ts +125 -0
- package/dist/commands/high-family/index.d.ts +3 -0
- package/dist/commands/high-family/mesh-coordinator-launch.d.ts +2 -0
- package/dist/commands/high-family/mesh-events.d.ts +2 -0
- package/dist/commands/high-family/mesh-status.d.ts +2 -0
- package/dist/commands/high-family/types.d.ts +60 -0
- package/dist/commands/low-family/coordinator-prompt.d.ts +9 -0
- package/dist/commands/low-family/daemon-lifecycle.d.ts +2 -0
- package/dist/commands/low-family/diagnostics.d.ts +2 -0
- package/dist/commands/low-family/index.d.ts +3 -0
- package/dist/commands/low-family/mesh-ledger.d.ts +10 -0
- package/dist/commands/low-family/mesh-node-logs.d.ts +2 -0
- package/dist/commands/low-family/notification.d.ts +2 -0
- package/dist/commands/low-family/refine-config.d.ts +2 -0
- package/dist/commands/low-family/session-host.d.ts +2 -0
- package/dist/commands/low-family/spec-providerdev.d.ts +11 -0
- package/dist/commands/low-family/status-meta.d.ts +2 -0
- package/dist/commands/low-family/types.d.ts +33 -0
- package/dist/commands/med-family/cli-agent.d.ts +2 -0
- package/dist/commands/med-family/fast-forward.d.ts +2 -0
- package/dist/commands/med-family/ide.d.ts +10 -0
- package/dist/commands/med-family/index.d.ts +3 -0
- package/dist/commands/med-family/mesh-crud.d.ts +29 -0
- package/dist/commands/med-family/mesh-host-pairing.d.ts +2 -0
- package/dist/commands/med-family/mesh-queue.d.ts +2 -0
- package/dist/commands/med-family/mesh-restart.d.ts +2 -0
- package/dist/commands/med-family/types.d.ts +142 -0
- package/dist/commands/mesh-coordinator.d.ts +85 -1
- package/dist/commands/router.d.ts +276 -2
- package/dist/commands/upgrade-helper.d.ts +41 -1
- package/dist/config/chat-history.d.ts +9 -0
- package/dist/config/config.d.ts +5 -0
- package/dist/config/mesh-config.d.ts +120 -1
- package/dist/config/mesh-json-config.d.ts +199 -0
- package/dist/config/repo-settings.d.ts +77 -0
- package/dist/daemon/dev-server.d.ts +0 -2
- package/dist/detection/ide-detector.d.ts +13 -0
- package/dist/detection/win32-ide-version.d.ts +37 -0
- package/dist/git/change-impact-config.d.ts +159 -0
- package/dist/git/git-commands.d.ts +11 -1
- package/dist/git/git-diff.d.ts +6 -0
- package/dist/git/git-executor.d.ts +11 -0
- package/dist/git/git-status.d.ts +57 -0
- package/dist/git/git-types.d.ts +2 -50
- package/dist/git/git-worktree.d.ts +71 -1
- package/dist/git/index.d.ts +3 -1
- package/dist/index.d.ts +64 -14
- package/dist/index.js +50679 -20122
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +47546 -17153
- package/dist/index.mjs.map +1 -1
- package/dist/installer.d.ts +1 -4
- package/dist/ipc/local-ipc-server.d.ts +91 -0
- package/dist/launch.d.ts +1 -1
- package/dist/logging/async-batch-writer.d.ts +10 -0
- package/dist/logging/log-redactor.d.ts +24 -0
- package/dist/logging/log-tail-reader.d.ts +81 -0
- package/dist/logging/logger.d.ts +1 -1
- package/dist/mesh/contracts.d.ts +164 -0
- package/dist/mesh/coordinator-prompt.d.ts +89 -0
- package/dist/mesh/coordinator-registry.d.ts +59 -0
- package/dist/mesh/mesh-active-work.d.ts +174 -0
- package/dist/mesh/mesh-clone-grace.d.ts +8 -0
- package/dist/mesh/mesh-coordinator-config.d.ts +21 -0
- package/dist/mesh/mesh-delivery-policy.d.ts +131 -0
- package/dist/mesh/mesh-event-classify.d.ts +5 -0
- package/dist/mesh/mesh-event-forwarding.d.ts +41 -0
- package/dist/mesh/mesh-event-trace.d.ts +21 -0
- package/dist/mesh/mesh-events-coordinator.d.ts +4 -0
- package/dist/mesh/mesh-events-pending.d.ts +69 -0
- package/dist/mesh/mesh-events-stale.d.ts +61 -0
- package/dist/mesh/mesh-events-utils.d.ts +75 -0
- package/dist/mesh/mesh-events.d.ts +6 -49
- package/dist/mesh/mesh-fast-forward.d.ts +81 -0
- package/dist/mesh/mesh-host-ownership.d.ts +29 -0
- package/dist/mesh/mesh-init.d.ts +128 -0
- package/dist/mesh/mesh-ledger-reconciliation.d.ts +23 -4
- package/dist/mesh/mesh-ledger.d.ts +77 -1
- package/dist/mesh/mesh-magi-status.d.ts +63 -0
- package/dist/mesh/mesh-missions.d.ts +189 -0
- package/dist/mesh/mesh-node-identity.d.ts +289 -0
- package/dist/mesh/mesh-queue-assignment.d.ts +113 -0
- package/dist/mesh/mesh-reconcile-loop.d.ts +65 -0
- package/dist/mesh/mesh-refine-batch.d.ts +68 -0
- package/dist/mesh/mesh-refine-gates.d.ts +428 -0
- package/dist/mesh/mesh-refine-status.d.ts +62 -0
- package/dist/mesh/mesh-review-inbox.d.ts +90 -0
- package/dist/mesh/mesh-routing.d.ts +70 -0
- package/dist/mesh/mesh-runtime-store.d.ts +450 -0
- package/dist/mesh/mesh-scheduling-runtime.d.ts +78 -0
- package/dist/mesh/mesh-task-inflight.d.ts +46 -0
- package/dist/mesh/mesh-task-stats.d.ts +49 -0
- package/dist/mesh/mesh-unresolved-forward-outbox.d.ts +30 -0
- package/dist/mesh/mesh-warmup-deadline.d.ts +68 -0
- package/dist/mesh/mesh-work-queue.d.ts +300 -5
- package/dist/mesh/preview-freshness.d.ts +18 -0
- package/dist/mesh/refine-config.d.ts +216 -0
- package/dist/mesh/worktree-bootstrap-config.d.ts +145 -0
- package/dist/providers/acp-provider-instance.d.ts +5 -0
- package/dist/providers/approval-utils.d.ts +20 -0
- package/dist/providers/chat-message-normalization.d.ts +31 -1
- package/dist/providers/cli-provider-instance.d.ts +252 -3
- package/dist/providers/contracts.d.ts +149 -6
- package/dist/providers/external-sources.d.ts +71 -0
- package/dist/providers/manual-attendance.d.ts +63 -0
- package/dist/providers/native-history/antigravity-cli-transcript.d.ts +100 -0
- package/dist/providers/native-history/claude-cli-transcript.d.ts +70 -0
- package/dist/providers/native-history/codex-cli-transcript.d.ts +73 -0
- package/dist/providers/native-history/constants.d.ts +12 -0
- package/dist/providers/native-history/dispatcher.d.ts +27 -0
- package/dist/providers/native-history/hermes-cli-transcript.d.ts +30 -0
- package/dist/providers/native-history/index.d.ts +13 -0
- package/dist/providers/provider-instance-manager.d.ts +29 -0
- package/dist/providers/provider-instance.d.ts +23 -1
- package/dist/providers/provider-loader.d.ts +26 -4
- package/dist/providers/provider-trust.d.ts +31 -0
- package/dist/providers/read-chat-contract.d.ts +29 -0
- package/dist/providers/sdk/v1/builders/acp/detect-status.d.ts +68 -0
- package/dist/providers/sdk/v1/builders/cli/detect-status.d.ts +86 -0
- package/dist/providers/sdk/v1/builders/cli/parse-approval-squash.d.ts +59 -0
- package/dist/providers/sdk/v1/builders/cli/parse-approval.d.ts +65 -0
- package/dist/providers/sdk/v1/builders/cli/parse-session.d.ts +91 -0
- package/dist/providers/sdk/v1/builders/cli/visible-region.d.ts +42 -0
- package/dist/providers/sdk/v1/fixture-tooling/format.d.ts +126 -0
- package/dist/providers/sdk/v1/fixture-tooling/index.d.ts +8 -0
- package/dist/providers/sdk/v1/fixture-tooling/replay.d.ts +38 -0
- package/dist/providers/sdk/v1/index.d.ts +30 -0
- package/dist/providers/sdk/v1/sandbox/README-design.d.ts +193 -0
- package/dist/providers/sdk/v1/sandbox/require-whitelist.d.ts +74 -0
- package/dist/providers/sdk/v1/sandbox/script-runner.d.ts +98 -0
- package/dist/providers/sdk/v1/types/cli/index.d.ts +277 -0
- package/dist/providers/sdk/v1/types/common/index.d.ts +203 -0
- package/dist/providers/sdk/v1/validators/index.d.ts +5 -0
- package/dist/providers/sdk/v1/validators/manifest.d.ts +40 -0
- package/dist/providers/sdk/v1/validators/taint.d.ts +52 -0
- package/dist/providers/spec/adapter.d.ts +91 -0
- package/dist/providers/spec/cli-adapter.d.ts +223 -0
- package/dist/providers/spec/evaluator.d.ts +45 -0
- package/dist/providers/spec/fsm-driver.d.ts +422 -0
- package/dist/providers/spec/fsm-evaluator.d.ts +76 -0
- package/dist/providers/spec/fsm-loader.d.ts +14 -0
- package/dist/providers/spec/fsm-types.d.ts +174 -0
- package/dist/providers/spec/native-history-executor.d.ts +41 -0
- package/dist/providers/spec/pre-launch-trust.d.ts +16 -0
- package/dist/providers/spec/route.d.ts +4 -0
- package/dist/providers/spec/types.d.ts +222 -0
- package/dist/providers/status-monitor.d.ts +7 -7
- package/dist/providers/transcript-v2.d.ts +176 -0
- package/dist/providers/types/interactive-prompt.d.ts +84 -0
- package/dist/providers/working-dir.d.ts +17 -0
- package/dist/repo-mesh-types.d.ts +509 -13
- package/dist/runtime-defaults.d.ts +2 -0
- package/dist/sessions/registry.d.ts +6 -0
- package/dist/shared-types-extra.d.ts +2 -4
- package/dist/shared-types.d.ts +59 -2
- package/dist/status/normalize.d.ts +1 -1
- package/dist/status/normalize.js +1 -0
- package/dist/status/normalize.js.map +1 -1
- package/dist/status/normalize.mjs +1 -0
- package/dist/status/normalize.mjs.map +1 -1
- package/dist/status/reporter.d.ts +2 -0
- package/dist/status/snapshot.d.ts +26 -0
- package/dist/system/hash.d.ts +8 -0
- package/dist/system/load-better-sqlite3.d.ts +21 -0
- package/dist/types.d.ts +5 -0
- package/package.json +7 -3
- package/src/agent-stream/poller.ts +2 -3
- package/src/agent-stream/provider-adapter.ts +1 -1
- package/src/boot/daemon-lifecycle.ts +63 -12
- package/src/boot/process-hardening.ts +89 -0
- package/src/build-info.ts +73 -0
- package/src/chat/source-machine.ts +534 -0
- package/src/chat/source-resolver.ts +0 -0
- package/src/chat/subscription-updates.ts +20 -1
- package/src/cli-adapter-types.d.ts +3 -1
- package/src/cli-adapter-types.ts +68 -2
- package/src/cli-adapters/cli-script-runner.ts +421 -0
- package/src/cli-adapters/cli-state-engine.ts +1246 -0
- package/src/cli-adapters/provider-cli-adapter.d.ts +1 -1
- package/src/cli-adapters/provider-cli-adapter.ts +914 -1144
- package/src/cli-adapters/provider-cli-parse.d.ts +2 -0
- package/src/cli-adapters/provider-cli-parse.ts +19 -0
- package/src/cli-adapters/provider-cli-runtime.ts +56 -7
- package/src/cli-adapters/provider-cli-shared.d.ts +4 -0
- package/src/cli-adapters/provider-cli-shared.ts +121 -11
- package/src/cli-adapters/pty-transport.ts +2 -1
- package/src/cli-adapters/pty-write-chunking.ts +106 -0
- package/src/cli-adapters/raw-terminal-io.ts +252 -0
- package/src/cli-adapters/resolve-executable.ts +204 -0
- package/src/cli-adapters/session-host-transport.ts +2 -1
- package/src/cli-adapters/terminal-backends/ghostty-vt-backend.ts +63 -29
- package/src/cli-adapters/terminal-backends/types.ts +10 -3
- package/src/cli-adapters/terminal-screen.ts +16 -81
- package/src/commands/WINDOWS-UPGRADE-LOCK-FAILURE.md +198 -0
- package/src/commands/chat-commands-debug-bundle.ts +398 -0
- package/src/commands/chat-commands-read.ts +2327 -0
- package/src/commands/chat-commands-scope.ts +54 -0
- package/src/commands/chat-commands-shared.ts +114 -0
- package/src/commands/chat-commands-write.ts +891 -0
- package/src/commands/chat-commands.ts +19 -1841
- package/src/commands/cli-manager.ts +572 -27
- package/src/commands/handler.ts +841 -2
- package/src/commands/high-family/index.ts +28 -0
- package/src/commands/high-family/mesh-coordinator-launch.ts +678 -0
- package/src/commands/high-family/mesh-events.ts +80 -0
- package/src/commands/high-family/mesh-status.ts +714 -0
- package/src/commands/high-family/types.ts +76 -0
- package/src/commands/low-family/coordinator-prompt.ts +72 -0
- package/src/commands/low-family/daemon-lifecycle.ts +107 -0
- package/src/commands/low-family/diagnostics.ts +57 -0
- package/src/commands/low-family/index.ts +37 -0
- package/src/commands/low-family/mesh-ledger.ts +62 -0
- package/src/commands/low-family/mesh-node-logs.ts +87 -0
- package/src/commands/low-family/notification.ts +116 -0
- package/src/commands/low-family/refine-config.ts +106 -0
- package/src/commands/low-family/session-host.ts +274 -0
- package/src/commands/low-family/spec-providerdev.ts +217 -0
- package/src/commands/low-family/status-meta.ts +112 -0
- package/src/commands/low-family/types.ts +39 -0
- package/src/commands/med-family/cli-agent.ts +238 -0
- package/src/commands/med-family/fast-forward.ts +230 -0
- package/src/commands/med-family/ide.ts +163 -0
- package/src/commands/med-family/index.ts +37 -0
- package/src/commands/med-family/mesh-crud.ts +1242 -0
- package/src/commands/med-family/mesh-host-pairing.ts +234 -0
- package/src/commands/med-family/mesh-queue.ts +167 -0
- package/src/commands/med-family/mesh-restart.ts +92 -0
- package/src/commands/med-family/types.ts +143 -0
- package/src/commands/mesh-coordinator.ts +334 -124
- package/src/commands/router.ts +2846 -3484
- package/src/commands/stream-commands.ts +8 -0
- package/src/commands/upgrade-helper.ts +310 -45
- package/src/config/chat-history.ts +493 -24
- package/src/config/config.ts +12 -0
- package/src/config/mesh-config.ts +593 -22
- package/src/config/mesh-json-config.ts +376 -0
- package/src/config/recent-activity.ts +8 -2
- package/src/config/repo-settings.ts +111 -0
- package/src/daemon/dev-auto-implement.ts +3 -2
- package/src/daemon/dev-cli-debug.ts +10 -1
- package/src/daemon/dev-server.ts +0 -541
- package/src/detection/cli-detector.ts +28 -9
- package/src/detection/ide-detector.ts +55 -16
- package/src/detection/win32-ide-version.ts +106 -0
- package/src/git/change-impact-config.ts +354 -0
- package/src/git/git-commands.ts +59 -15
- package/src/git/git-diff.ts +81 -11
- package/src/git/git-executor.ts +12 -0
- package/src/git/git-status.ts +767 -48
- package/src/git/git-types.ts +14 -62
- package/src/git/git-worktree.ts +261 -4
- package/src/git/index.ts +17 -0
- package/src/index.ts +196 -12
- package/src/installer.d.ts +1 -1
- package/src/installer.ts +8 -6
- package/src/ipc/local-ipc-server.ts +278 -0
- package/src/launch.d.ts +1 -1
- package/src/launch.ts +37 -28
- package/src/logging/async-batch-writer.ts +55 -0
- package/src/logging/command-log.ts +7 -5
- package/src/logging/log-redactor.ts +100 -0
- package/src/logging/log-tail-reader.ts +341 -0
- package/src/logging/logger.ts +14 -7
- package/src/mesh/contracts.ts +338 -0
- package/src/mesh/coordinator-prompt.ts +415 -34
- package/src/mesh/coordinator-registry.ts +121 -0
- package/src/mesh/mesh-active-work.ts +645 -0
- package/src/mesh/mesh-clone-grace.ts +68 -0
- package/src/mesh/mesh-coordinator-config.ts +97 -0
- package/src/mesh/mesh-delivery-policy.ts +315 -0
- package/src/mesh/mesh-event-classify.ts +51 -0
- package/src/mesh/mesh-event-forwarding.ts +1897 -0
- package/src/mesh/mesh-event-trace.ts +67 -0
- package/src/mesh/mesh-events-coordinator.ts +32 -0
- package/src/mesh/mesh-events-pending.ts +656 -0
- package/src/mesh/mesh-events-stale.ts +389 -0
- package/src/mesh/mesh-events-utils.ts +443 -0
- package/src/mesh/mesh-events.ts +33 -1035
- package/src/mesh/mesh-fast-forward.ts +843 -0
- package/src/mesh/mesh-host-ownership.ts +111 -0
- package/src/mesh/mesh-init.ts +350 -0
- package/src/mesh/mesh-ledger-reconciliation.ts +12 -7
- package/src/mesh/mesh-ledger.ts +656 -102
- package/src/mesh/mesh-magi-status.ts +223 -0
- package/src/mesh/mesh-missions.ts +449 -0
- package/src/mesh/mesh-node-identity.ts +1887 -0
- package/src/mesh/mesh-queue-assignment.ts +1924 -0
- package/src/mesh/mesh-reconcile-loop.ts +1997 -0
- package/src/mesh/mesh-refine-batch.ts +205 -0
- package/src/mesh/mesh-refine-gates.ts +1673 -0
- package/src/mesh/mesh-refine-status.ts +231 -0
- package/src/mesh/mesh-review-inbox.ts +307 -0
- package/src/mesh/mesh-routing.ts +291 -0
- package/src/mesh/mesh-runtime-store.ts +1853 -0
- package/src/mesh/mesh-scheduling-runtime.ts +198 -0
- package/src/mesh/mesh-task-inflight.ts +70 -0
- package/src/mesh/mesh-task-stats.ts +161 -0
- package/src/mesh/mesh-unresolved-forward-outbox.ts +185 -0
- package/src/mesh/mesh-warmup-deadline.ts +152 -0
- package/src/mesh/mesh-work-queue.ts +1254 -141
- package/src/mesh/preview-freshness.ts +118 -0
- package/src/mesh/refine-config.ts +423 -0
- package/src/mesh/worktree-bootstrap-config.ts +450 -0
- package/src/providers/acp-provider-instance.ts +43 -10
- package/src/providers/approval-utils.d.ts +5 -0
- package/src/providers/approval-utils.ts +57 -5
- package/src/providers/chat-message-normalization.ts +92 -4
- package/src/providers/cli-provider-instance.ts +2001 -106
- package/src/providers/contracts.d.ts +55 -0
- package/src/providers/contracts.ts +160 -6
- package/src/providers/extension-provider-instance.ts +12 -7
- package/src/providers/external-sources.ts +218 -0
- package/src/providers/ide-provider-instance.ts +35 -12
- package/src/providers/manual-attendance.ts +85 -0
- package/src/providers/native-history/antigravity-cli-transcript.ts +643 -0
- package/src/providers/native-history/claude-cli-transcript.ts +396 -0
- package/src/providers/native-history/codex-cli-transcript.ts +479 -0
- package/src/providers/native-history/constants.ts +19 -0
- package/src/providers/native-history/dispatcher.ts +345 -0
- package/src/providers/native-history/hermes-cli-transcript.ts +260 -0
- package/src/providers/native-history/index.ts +30 -0
- package/src/providers/provider-instance-manager.ts +71 -0
- package/src/providers/provider-instance.ts +19 -1
- package/src/providers/provider-loader.ts +668 -50
- package/src/providers/provider-schema.ts +87 -14
- package/src/providers/provider-trust.ts +114 -0
- package/src/providers/read-chat-contract.ts +76 -16
- package/src/providers/sdk/README.md +49 -0
- package/src/providers/sdk/v1/builders/acp/detect-status.ts +144 -0
- package/src/providers/sdk/v1/builders/cli/detect-status.ts +313 -0
- package/src/providers/sdk/v1/builders/cli/parse-approval-squash.ts +158 -0
- package/src/providers/sdk/v1/builders/cli/parse-approval.ts +250 -0
- package/src/providers/sdk/v1/builders/cli/parse-session.ts +276 -0
- package/src/providers/sdk/v1/builders/cli/visible-region.ts +143 -0
- package/src/providers/sdk/v1/fixture-tooling/format.ts +130 -0
- package/src/providers/sdk/v1/fixture-tooling/index.ts +22 -0
- package/src/providers/sdk/v1/fixture-tooling/replay.ts +352 -0
- package/src/providers/sdk/v1/index.ts +152 -0
- package/src/providers/sdk/v1/sandbox/README-design.ts +195 -0
- package/src/providers/sdk/v1/sandbox/require-whitelist.ts +472 -0
- package/src/providers/sdk/v1/sandbox/script-runner.ts +150 -0
- package/src/providers/sdk/v1/schemas/cli/provider.schema.json +509 -0
- package/src/providers/sdk/v1/schemas/primitives/acp-session-protocol-v1.json +131 -0
- package/src/providers/sdk/v1/schemas/primitives/native-history-codex-rollout-v1.json +66 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-approval-squash-v1.json +91 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-assistant-block-v1.json +91 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-cue-ordering-v1.json +47 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-dispatch-order-v1.json +32 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-footer-chrome-v1.json +42 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-index-finder-v1.json +27 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-modal-v1.json +125 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-prompt-marker-v1.json +45 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-session-id-extraction-v1.json +46 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-settled-prompt-v1.json +71 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-spinner-v1.json +83 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-transcript-pty-v1.json +83 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-visible-region-v1.json +57 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-welcome-screen-v1.json +35 -0
- package/src/providers/sdk/v1/types/cli/index.ts +365 -0
- package/src/providers/sdk/v1/types/common/index.ts +229 -0
- package/src/providers/sdk/v1/validators/index.ts +19 -0
- package/src/providers/sdk/v1/validators/manifest.ts +110 -0
- package/src/providers/sdk/v1/validators/taint.ts +309 -0
- package/src/providers/spec/adapter.ts +235 -0
- package/src/providers/spec/cli-adapter.ts +1056 -0
- package/src/providers/spec/evaluator.ts +407 -0
- package/src/providers/spec/fsm-driver.ts +1410 -0
- package/src/providers/spec/fsm-evaluator.ts +272 -0
- package/src/providers/spec/fsm-loader.ts +120 -0
- package/src/providers/spec/fsm-types.ts +273 -0
- package/src/providers/spec/native-history-executor.ts +1143 -0
- package/src/providers/spec/pre-launch-trust.ts +104 -0
- package/src/providers/spec/route.ts +51 -0
- package/src/providers/spec/types.ts +262 -0
- package/src/providers/status-monitor.d.ts +7 -7
- package/src/providers/status-monitor.ts +37 -22
- package/src/providers/transcript-v2.ts +567 -0
- package/src/providers/types/interactive-prompt.ts +536 -0
- package/src/providers/version-archive.ts +64 -24
- package/src/providers/working-dir.ts +23 -0
- package/src/repo-mesh-types.ts +748 -14
- package/src/runtime-defaults.ts +39 -0
- package/src/sessions/registry.ts +6 -0
- package/src/shared-types-extra.ts +2 -4
- package/src/shared-types.d.ts +8 -0
- package/src/shared-types.ts +64 -1
- package/src/status/builders.ts +26 -6
- package/src/status/normalize.ts +2 -0
- package/src/status/reporter.ts +19 -1
- package/src/status/snapshot.ts +95 -26
- package/src/system/hash.ts +23 -0
- package/src/system/host-memory.ts +29 -12
- package/src/system/load-better-sqlite3.ts +68 -0
- package/src/types.ts +5 -0
- package/dist/cli-adapters/terminal-backends/xterm-backend.d.ts +0 -17
- package/dist/mesh/mesh-sync.d.ts +0 -53
- package/src/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +0 -16
- package/src/cli-adapters/terminal-backends/xterm-backend.ts +0 -97
- package/src/mesh/mesh-sync.ts +0 -111
|
@@ -245,6 +245,14 @@ export function normalizeProviderScriptArgs(args: any, scriptName?: string): Rec
|
|
|
245
245
|
function buildControlScriptResult(scriptName: string, payload: any): Record<string, unknown> {
|
|
246
246
|
if (!payload || typeof payload !== 'object') return {};
|
|
247
247
|
|
|
248
|
+
// The spec-driven control adapter (open_picker LIST/SELECT) already
|
|
249
|
+
// produced a structured controlResult by parsing the live screen. Honour
|
|
250
|
+
// it verbatim instead of re-deriving one from legacy payload shapes —
|
|
251
|
+
// otherwise the screen-parsed options/currentValue get clobbered.
|
|
252
|
+
if (payload.controlResult && typeof payload.controlResult === 'object') {
|
|
253
|
+
return { controlResult: payload.controlResult };
|
|
254
|
+
}
|
|
255
|
+
|
|
248
256
|
const legacyListPayload = (() => {
|
|
249
257
|
if (Array.isArray(payload.options)) return payload;
|
|
250
258
|
if (/^listmodels$/i.test(scriptName) && Array.isArray(payload.models)) {
|
|
@@ -169,6 +169,43 @@ export function buildPinnedGlobalInstallCommand(options: {
|
|
|
169
169
|
};
|
|
170
170
|
}
|
|
171
171
|
|
|
172
|
+
/**
|
|
173
|
+
* Build an env for the `npm install` child whose PATH is prefixed with the
|
|
174
|
+
* directory of the node binary currently running this helper.
|
|
175
|
+
*
|
|
176
|
+
* npm runs lifecycle scripts (e.g. adhdev's `preinstall` Node-version guard) by
|
|
177
|
+
* spawning a bare `node`, which resolves from PATH — NOT from the node that runs
|
|
178
|
+
* npm. On Windows a machine can have several node installs (e.g. a standalone
|
|
179
|
+
* `C:\Program Files\nodejs` ahead of an nvm-managed node on PATH). Without this,
|
|
180
|
+
* the guard sees the wrong (unsupported) node version and aborts the upgrade,
|
|
181
|
+
* even though npm/adhdev actually run under a supported node. Pinning the
|
|
182
|
+
* running node's dir to the front of PATH makes lifecycle scripts use the same
|
|
183
|
+
* node as the install itself.
|
|
184
|
+
*/
|
|
185
|
+
function buildInstallEnvWithNodeOnPath(baseEnv: NodeJS.ProcessEnv = process.env): NodeJS.ProcessEnv {
|
|
186
|
+
// The Node-version guard this works around only fires on Windows, so scope the
|
|
187
|
+
// PATH rewrite to win32 — POSIX keeps its env untouched.
|
|
188
|
+
if (process.platform !== 'win32') return { ...baseEnv };
|
|
189
|
+
const nodeBinDir = path.dirname(process.execPath);
|
|
190
|
+
if (!nodeBinDir) return { ...baseEnv };
|
|
191
|
+
const env: NodeJS.ProcessEnv = { ...baseEnv };
|
|
192
|
+
// Windows env keys are case-insensitive and conventionally spelled `Path`;
|
|
193
|
+
// prepend to the existing key (whatever its case) to avoid creating a dupe.
|
|
194
|
+
const pathKey = Object.keys(env).find((k) => k.toLowerCase() === 'path') || 'PATH';
|
|
195
|
+
const current = env[pathKey] || '';
|
|
196
|
+
env[pathKey] = current ? `${nodeBinDir};${current}` : nodeBinDir;
|
|
197
|
+
// Belt-and-suspenders for the same Node-version guard: the PATH prepend above
|
|
198
|
+
// only works if the running helper's node is itself a supported version, but a
|
|
199
|
+
// helper launched via an nvm shim (e.g. `C:\nvm4w\nodejs\node.exe`) can resolve
|
|
200
|
+
// to Node 24 even though the real install target node is pinned via `--prefix`.
|
|
201
|
+
// In the AUTOMATIC upgrade path the install target is already pinned/verified,
|
|
202
|
+
// so authorize the lifecycle guard to proceed via the same bootstrap escape
|
|
203
|
+
// hatch the guard already honors. This is scoped to the helper-built env only —
|
|
204
|
+
// it never weakens the guard for a user-run `npm i -g adhdev`.
|
|
205
|
+
env.ADHDEV_BOOTSTRAP = '1';
|
|
206
|
+
return env;
|
|
207
|
+
}
|
|
208
|
+
|
|
172
209
|
export function getNpmExecOptions(platform: NodeJS.Platform = process.platform): NpmExecOptions {
|
|
173
210
|
if (platform === 'win32') {
|
|
174
211
|
return { shell: false, windowsHide: true };
|
|
@@ -264,13 +301,14 @@ async function waitForPidExit(pid: number, timeoutMs: number): Promise<void> {
|
|
|
264
301
|
}
|
|
265
302
|
}
|
|
266
303
|
|
|
267
|
-
export function stopSessionHostProcesses(appName: string): void {
|
|
304
|
+
export async function stopSessionHostProcesses(appName: string): Promise<void> {
|
|
268
305
|
const pidFile = path.join(os.homedir(), '.adhdev', `${appName}-session-host.pid`);
|
|
306
|
+
let killedPid: number | null = null;
|
|
269
307
|
try {
|
|
270
308
|
if (fs.existsSync(pidFile)) {
|
|
271
309
|
const pid = Number.parseInt(fs.readFileSync(pidFile, 'utf8').trim(), 10);
|
|
272
310
|
if (Number.isFinite(pid) && pid !== process.pid && isManagedSessionHostPid(pid)) {
|
|
273
|
-
killPid(pid);
|
|
311
|
+
if (killPid(pid)) killedPid = pid;
|
|
274
312
|
}
|
|
275
313
|
}
|
|
276
314
|
} catch {
|
|
@@ -282,6 +320,164 @@ export function stopSessionHostProcesses(appName: string): void {
|
|
|
282
320
|
// noop
|
|
283
321
|
}
|
|
284
322
|
}
|
|
323
|
+
|
|
324
|
+
// The session-host process keeps node-pty's `conpty.node` memory-mapped. On
|
|
325
|
+
// Windows a mapped native addon stays EXCLUSIVELY locked until the process
|
|
326
|
+
// fully exits and tears down the mapping — and that teardown lags `taskkill`
|
|
327
|
+
// by an indeterminate interval. `taskkill` only *requests* termination, so
|
|
328
|
+
// returning immediately lets the caller run `npm install` while conpty.node
|
|
329
|
+
// is still locked, which makes npm's copy-to-staging fail with EBUSY (the
|
|
330
|
+
// intermittent Windows upgrade failure). Wait for the killed process to
|
|
331
|
+
// actually disappear — like we already do for the parent daemon pid — so the
|
|
332
|
+
// file handle is released before the install runs. (POSIX can replace an open
|
|
333
|
+
// file freely, so the wait is harmless there.)
|
|
334
|
+
if (killedPid !== null) {
|
|
335
|
+
await waitForPidExit(killedPid, 15000);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
// Native addons that stay EXCLUSIVELY locked on Windows while any process keeps
|
|
340
|
+
// them memory-mapped. node-pty's `conpty.node` is the confirmed offender; the
|
|
341
|
+
// ghostty VT dll has the same lifetime, so guard both.
|
|
342
|
+
const LOCKED_NATIVE_ADDON_BASENAMES = ['conpty.node', 'ghostty-vt.dll'];
|
|
343
|
+
|
|
344
|
+
/**
|
|
345
|
+
* Enumerate processes that have a locked native addon (conpty.node /
|
|
346
|
+
* ghostty-vt.dll) of *this* install memory-mapped.
|
|
347
|
+
*
|
|
348
|
+
* `stopSessionHostProcesses()` only knows the single managed session-host pid, so
|
|
349
|
+
* any *foreign* holder — e.g. an orphaned `pty_*probe*.cjs` left in `%TEMP%` — is
|
|
350
|
+
* invisible to it and keeps the addon locked through every install retry, dooming
|
|
351
|
+
* the upgrade with EBUSY. This scans by the module's full path so we only ever
|
|
352
|
+
* target a holder of the exact `packageRoot` being replaced (never an unrelated
|
|
353
|
+
* install's copy). Windows-only — these locks don't exist on POSIX.
|
|
354
|
+
*/
|
|
355
|
+
export function listForeignNativeAddonHolders(
|
|
356
|
+
packageRoot: string | null | undefined,
|
|
357
|
+
): Array<{ pid: number; commandLine: string | null }> {
|
|
358
|
+
if (process.platform !== 'win32' || !packageRoot) return [];
|
|
359
|
+
const rootLower = packageRoot.replace(/\//g, '\\').replace(/'/g, "''").toLowerCase();
|
|
360
|
+
const endsWithChecks = LOCKED_NATIVE_ADDON_BASENAMES
|
|
361
|
+
.map((name) => `$lf.EndsWith('${name}')`)
|
|
362
|
+
.join(' -or ');
|
|
363
|
+
// List pids of node processes whose loaded modules include a locked native
|
|
364
|
+
// addon living UNDER this install's package root. Accessing .Modules for a
|
|
365
|
+
// process we can't open throws — swallow per-process so one inaccessible
|
|
366
|
+
// process doesn't abort the whole scan.
|
|
367
|
+
const script = [
|
|
368
|
+
`$root = '${rootLower}'`,
|
|
369
|
+
`Get-Process node -ErrorAction SilentlyContinue | ForEach-Object {`,
|
|
370
|
+
` $p = $_`,
|
|
371
|
+
` try {`,
|
|
372
|
+
` foreach ($m in $p.Modules) {`,
|
|
373
|
+
` $fn = $m.FileName`,
|
|
374
|
+
` if ($fn) {`,
|
|
375
|
+
` $lf = $fn.ToLower()`,
|
|
376
|
+
` if ($lf.StartsWith($root) -and (${endsWithChecks})) { $p.Id; break }`,
|
|
377
|
+
` }`,
|
|
378
|
+
` }`,
|
|
379
|
+
` } catch {}`,
|
|
380
|
+
`}`,
|
|
381
|
+
].join('\n');
|
|
382
|
+
|
|
383
|
+
let out = '';
|
|
384
|
+
try {
|
|
385
|
+
out = String(execFileSync('powershell.exe', [
|
|
386
|
+
'-NoProfile',
|
|
387
|
+
'-NonInteractive',
|
|
388
|
+
'-ExecutionPolicy', 'Bypass',
|
|
389
|
+
'-Command', script,
|
|
390
|
+
], { encoding: 'utf8', timeout: 8000, stdio: ['ignore', 'pipe', 'ignore'], windowsHide: true })).trim();
|
|
391
|
+
} catch {
|
|
392
|
+
return [];
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
const selfPid = process.pid;
|
|
396
|
+
const seen = new Set<number>();
|
|
397
|
+
const holders: Array<{ pid: number; commandLine: string | null }> = [];
|
|
398
|
+
for (const line of out.split(/\r?\n/)) {
|
|
399
|
+
const pid = Number.parseInt(line.trim(), 10);
|
|
400
|
+
if (!Number.isFinite(pid) || pid <= 0 || pid === selfPid || seen.has(pid)) continue;
|
|
401
|
+
seen.add(pid);
|
|
402
|
+
holders.push({ pid, commandLine: getProcessCommandLine(pid) });
|
|
403
|
+
}
|
|
404
|
+
return holders;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
/**
|
|
408
|
+
* Terminate every foreign process holding this install's native addon mapped,
|
|
409
|
+
* then wait for each to actually exit so the mapping is released before npm
|
|
410
|
+
* copies the file into its staging dir. Returns what it found/killed so the
|
|
411
|
+
* caller can surface an actionable recovery message on failure.
|
|
412
|
+
*/
|
|
413
|
+
export async function stopForeignNativeAddonHolders(
|
|
414
|
+
packageRoot: string | null | undefined,
|
|
415
|
+
options: { parentPid?: number } = {},
|
|
416
|
+
): Promise<Array<{ pid: number; commandLine: string | null; killed: boolean }>> {
|
|
417
|
+
if (process.platform !== 'win32' || !packageRoot) return [];
|
|
418
|
+
const parentPid = Number.isFinite(options.parentPid) ? Number(options.parentPid) : -1;
|
|
419
|
+
const holders = listForeignNativeAddonHolders(packageRoot);
|
|
420
|
+
const results: Array<{ pid: number; commandLine: string | null; killed: boolean }> = [];
|
|
421
|
+
for (const holder of holders) {
|
|
422
|
+
// The parent daemon pid is already awaited for exit separately; never
|
|
423
|
+
// double-handle it here.
|
|
424
|
+
if (holder.pid === parentPid) continue;
|
|
425
|
+
appendUpgradeLog(
|
|
426
|
+
`Foreign native-addon holder found: pid ${holder.pid}${holder.commandLine ? ` — ${holder.commandLine}` : ''}`,
|
|
427
|
+
);
|
|
428
|
+
const killed = killPid(holder.pid);
|
|
429
|
+
if (killed) {
|
|
430
|
+
await waitForPidExit(holder.pid, 15000);
|
|
431
|
+
appendUpgradeLog(`Terminated foreign native-addon holder pid ${holder.pid}`);
|
|
432
|
+
} else {
|
|
433
|
+
appendUpgradeLog(`Failed to terminate foreign native-addon holder pid ${holder.pid}`);
|
|
434
|
+
}
|
|
435
|
+
results.push({ ...holder, killed });
|
|
436
|
+
}
|
|
437
|
+
return results;
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
function getUpgradeFailureNoticePath(): string {
|
|
441
|
+
const home = os.homedir();
|
|
442
|
+
const dir = path.join(home, '.adhdev');
|
|
443
|
+
try {
|
|
444
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
445
|
+
} catch {
|
|
446
|
+
// noop — appendUpgradeLog already creates the dir; this is best-effort.
|
|
447
|
+
}
|
|
448
|
+
return path.join(dir, 'daemon-upgrade-last-error.txt');
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
function buildManualRecoveryCommand(installCommand: PinnedGlobalInstallCommand): string {
|
|
452
|
+
return [installCommand.command, ...installCommand.args]
|
|
453
|
+
.map((part) => (/\s/.test(part) ? `"${part}"` : part))
|
|
454
|
+
.join(' ');
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
/**
|
|
458
|
+
* On final failure, leave the user something actionable instead of only a buried
|
|
459
|
+
* log line: the pids/commandlines still holding the lock and a paste-ready
|
|
460
|
+
* recovery command. Written to a stable path the CLI can surface on next boot.
|
|
461
|
+
*/
|
|
462
|
+
function emitUpgradeFailureNotice(lines: string[]): void {
|
|
463
|
+
const body = lines.join('\n');
|
|
464
|
+
appendUpgradeLog(`Upgrade blocked — user action required:\n${body}`);
|
|
465
|
+
try {
|
|
466
|
+
fs.writeFileSync(getUpgradeFailureNoticePath(), `[${new Date().toISOString()}]\n${body}\n`, 'utf8');
|
|
467
|
+
} catch {
|
|
468
|
+
// noop
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
// npm copies the current install's files into a staging dir before swapping in
|
|
473
|
+
// the new version. On Windows that copy of `conpty.node` can still race a
|
|
474
|
+
// just-killed session-host whose mapping hasn't been released yet, surfacing as
|
|
475
|
+
// EBUSY/EPERM. Treat those as transient and retry with backoff.
|
|
476
|
+
function isRetriableInstallLockError(error: any): boolean {
|
|
477
|
+
const code = error?.code;
|
|
478
|
+
if (code === 'EBUSY' || code === 'EPERM') return true;
|
|
479
|
+
const text = `${error?.message || ''} ${error?.stderr || ''}`;
|
|
480
|
+
return /\bEBUSY\b|\bEPERM\b|resource busy or locked/i.test(text);
|
|
285
481
|
}
|
|
286
482
|
|
|
287
483
|
function removeDaemonPidFile(): void {
|
|
@@ -293,42 +489,64 @@ function removeDaemonPidFile(): void {
|
|
|
293
489
|
}
|
|
294
490
|
}
|
|
295
491
|
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
492
|
+
/**
|
|
493
|
+
* Best-effort removal of a leftover npm staging entry.
|
|
494
|
+
*
|
|
495
|
+
* A stale staging dir can hold a locked native binary — e.g. `ghostty-vt.dll`
|
|
496
|
+
* from `@adhdev/ghostty-vt-node` still mapped by a lingering session-host
|
|
497
|
+
* process — which makes `rmSync` throw `EPERM` on Windows. Staging cleanup is
|
|
498
|
+
* only housekeeping: the leftover is inert and npm creates its own fresh
|
|
499
|
+
* staging dir for the real install, so a lock on an old leftover must NOT abort
|
|
500
|
+
* the upgrade. Log and continue instead of letting the error propagate.
|
|
501
|
+
*/
|
|
502
|
+
export function safeRemoveStaleEntry(target: string, label: string): void {
|
|
503
|
+
try {
|
|
504
|
+
fs.rmSync(target, { recursive: true, force: true });
|
|
505
|
+
appendUpgradeLog(`${label}: ${target}`);
|
|
506
|
+
} catch (error: any) {
|
|
507
|
+
appendUpgradeLog(`Skipped locked stale entry (${error?.code || 'error'}): ${target} — ${error?.message || String(error)}`);
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
export function cleanupStaleGlobalInstallDirs(pkgName: string, surface: CurrentGlobalInstallSurface): void {
|
|
512
|
+
// The whole routine is housekeeping — never let it throw out and abort the
|
|
513
|
+
// upgrade (npm root/prefix probing or readdir can fail for unrelated reasons).
|
|
514
|
+
try {
|
|
515
|
+
const prefixArgs = surface.installPrefix ? ['--prefix', surface.installPrefix] : [];
|
|
516
|
+
const npmRoot = String(execNpmCommandSync(['root', '-g', ...prefixArgs], { encoding: 'utf8' }, surface)).trim();
|
|
517
|
+
if (!npmRoot) return;
|
|
518
|
+
const npmPrefix = surface.installPrefix
|
|
519
|
+
|| String(execNpmCommandSync(['prefix', '-g', ...prefixArgs], { encoding: 'utf8' }, surface)).trim();
|
|
520
|
+
const binDir = process.platform === 'win32' ? npmPrefix : path.join(npmPrefix, 'bin');
|
|
521
|
+
const packageBaseName = pkgName.startsWith('@') ? pkgName.split('/')[1] : pkgName;
|
|
522
|
+
const binNames = new Set<string>([packageBaseName]);
|
|
523
|
+
if (pkgName === '@adhdev/daemon-standalone') {
|
|
524
|
+
binNames.add('adhdev-standalone');
|
|
317
525
|
}
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
526
|
+
|
|
527
|
+
if (pkgName.startsWith('@')) {
|
|
528
|
+
const [scope, name] = pkgName.split('/');
|
|
529
|
+
const scopeDir = path.join(npmRoot, scope);
|
|
530
|
+
if (!fs.existsSync(scopeDir)) return;
|
|
531
|
+
for (const entry of fs.readdirSync(scopeDir)) {
|
|
532
|
+
if (!entry.startsWith(`.${name}-`)) continue;
|
|
533
|
+
safeRemoveStaleEntry(path.join(scopeDir, entry), 'Removed stale scoped staging dir');
|
|
534
|
+
}
|
|
535
|
+
} else {
|
|
536
|
+
for (const entry of fs.readdirSync(npmRoot)) {
|
|
537
|
+
if (!entry.startsWith(`.${pkgName}-`)) continue;
|
|
538
|
+
safeRemoveStaleEntry(path.join(npmRoot, entry), 'Removed stale staging dir');
|
|
539
|
+
}
|
|
323
540
|
}
|
|
324
|
-
}
|
|
325
541
|
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
542
|
+
if (fs.existsSync(binDir)) {
|
|
543
|
+
for (const entry of fs.readdirSync(binDir)) {
|
|
544
|
+
if (!Array.from(binNames).some((name) => entry.startsWith(`.${name}-`))) continue;
|
|
545
|
+
safeRemoveStaleEntry(path.join(binDir, entry), 'Removed stale bin staging entry');
|
|
546
|
+
}
|
|
331
547
|
}
|
|
548
|
+
} catch (error: any) {
|
|
549
|
+
appendUpgradeLog(`Stale staging cleanup skipped (${error?.code || 'error'}): ${error?.message || String(error)}`);
|
|
332
550
|
}
|
|
333
551
|
}
|
|
334
552
|
|
|
@@ -362,22 +580,69 @@ async function runDaemonUpgradeHelper(payload: DaemonUpgradeHelperPayload): Prom
|
|
|
362
580
|
await waitForPidExit(payload.parentPid, 15000);
|
|
363
581
|
}
|
|
364
582
|
|
|
365
|
-
stopSessionHostProcesses(sessionHostAppName);
|
|
583
|
+
await stopSessionHostProcesses(sessionHostAppName);
|
|
366
584
|
removeDaemonPidFile();
|
|
585
|
+
// Kill any *foreign* process still holding this install's conpty.node mapped
|
|
586
|
+
// (the session-host stop above only covers the single managed pid). Do this
|
|
587
|
+
// BEFORE the staging GC so the just-released file can also be cleaned up now
|
|
588
|
+
// that no process maps it.
|
|
589
|
+
await stopForeignNativeAddonHolders(installCommand.surface.packageRoot, { parentPid: payload.parentPid });
|
|
367
590
|
cleanupStaleGlobalInstallDirs(payload.packageName, installCommand.surface);
|
|
368
591
|
|
|
369
592
|
const spec = `${payload.packageName}@${payload.targetVersion || 'latest'}`;
|
|
370
593
|
appendUpgradeLog(`Installing ${spec}`);
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
594
|
+
// Windows can still race a lingering conpty.node mapping even after the
|
|
595
|
+
// session-host exits, so retry the install on transient lock errors there.
|
|
596
|
+
const maxInstallAttempts = process.platform === 'win32' ? 3 : 1;
|
|
597
|
+
let installOutput = '';
|
|
598
|
+
for (let attempt = 1; attempt <= maxInstallAttempts; attempt++) {
|
|
599
|
+
try {
|
|
600
|
+
installOutput = String(execFileSync(
|
|
601
|
+
installCommand.command,
|
|
602
|
+
installCommand.args,
|
|
603
|
+
{
|
|
604
|
+
encoding: 'utf8',
|
|
605
|
+
stdio: 'pipe',
|
|
606
|
+
maxBuffer: 20 * 1024 * 1024,
|
|
607
|
+
env: buildInstallEnvWithNodeOnPath(),
|
|
608
|
+
...installCommand.execOptions,
|
|
609
|
+
},
|
|
610
|
+
));
|
|
611
|
+
break;
|
|
612
|
+
} catch (error: any) {
|
|
613
|
+
if (attempt < maxInstallAttempts && isRetriableInstallLockError(error)) {
|
|
614
|
+
appendUpgradeLog(`Install attempt ${attempt} hit a file lock (${error?.code || 'lock'}); clearing holders + staging and retrying after backoff`);
|
|
615
|
+
// Re-run the active cleanup ("정리 → 확인 → 설치") rather than relying on
|
|
616
|
+
// backoff alone: a never-exiting foreign holder won't disappear on its
|
|
617
|
+
// own, so kill it again before the next attempt.
|
|
618
|
+
await stopForeignNativeAddonHolders(installCommand.surface.packageRoot, { parentPid: payload.parentPid });
|
|
619
|
+
cleanupStaleGlobalInstallDirs(payload.packageName, installCommand.surface);
|
|
620
|
+
await new Promise((resolve) => setTimeout(resolve, attempt * 1500));
|
|
621
|
+
continue;
|
|
622
|
+
}
|
|
623
|
+
// Out of retries on a lock error: leave the user an actionable recovery
|
|
624
|
+
// notice naming whoever is still holding the native addon locked.
|
|
625
|
+
if (isRetriableInstallLockError(error)) {
|
|
626
|
+
const blockers = listForeignNativeAddonHolders(installCommand.surface.packageRoot);
|
|
627
|
+
const notice: string[] = [
|
|
628
|
+
`adhdev ${spec} could not be installed: a file lock (${error?.code || 'EBUSY/EPERM'}) is blocking the native addon.`,
|
|
629
|
+
];
|
|
630
|
+
if (blockers.length > 0) {
|
|
631
|
+
notice.push('Processes still holding the lock:');
|
|
632
|
+
for (const b of blockers) {
|
|
633
|
+
notice.push(` pid ${b.pid}${b.commandLine ? ` — ${b.commandLine}` : ''}`);
|
|
634
|
+
}
|
|
635
|
+
notice.push('To recover, stop them and reinstall:');
|
|
636
|
+
notice.push(` Stop-Process -Id ${blockers.map((b) => b.pid).join(',')} -Force`);
|
|
637
|
+
} else {
|
|
638
|
+
notice.push('To recover, reinstall manually:');
|
|
639
|
+
}
|
|
640
|
+
notice.push(` ${buildManualRecoveryCommand(installCommand)}`);
|
|
641
|
+
emitUpgradeFailureNotice(notice);
|
|
642
|
+
}
|
|
643
|
+
throw error;
|
|
644
|
+
}
|
|
645
|
+
}
|
|
381
646
|
if (installOutput.trim()) {
|
|
382
647
|
appendUpgradeLog(installOutput.trim());
|
|
383
648
|
}
|