@adhdev/daemon-core 0.9.82-rc.34 → 0.9.82-rc.341

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (318) hide show
  1. package/dist/boot/daemon-lifecycle.d.ts +8 -0
  2. package/dist/boot/process-hardening.d.ts +50 -0
  3. package/dist/build-info.d.ts +37 -0
  4. package/dist/chat/source-machine.d.ts +166 -0
  5. package/dist/chat/source-resolver.d.ts +104 -0
  6. package/dist/chat/subscription-updates.d.ts +1 -0
  7. package/dist/cli-adapter-types.d.ts +46 -2
  8. package/dist/cli-adapters/cli-script-runner.d.ts +117 -0
  9. package/dist/cli-adapters/cli-state-engine.d.ts +198 -0
  10. package/dist/cli-adapters/provider-cli-adapter.d.ts +116 -64
  11. package/dist/cli-adapters/provider-cli-parse.d.ts +4 -0
  12. package/dist/cli-adapters/provider-cli-runtime.d.ts +34 -0
  13. package/dist/cli-adapters/provider-cli-shared.d.ts +53 -0
  14. package/dist/cli-adapters/raw-terminal-io.d.ts +37 -0
  15. package/dist/cli-adapters/resolve-executable.d.ts +14 -0
  16. package/dist/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +6 -3
  17. package/dist/cli-adapters/terminal-backends/types.d.ts +10 -2
  18. package/dist/cli-adapters/terminal-screen.d.ts +4 -11
  19. package/dist/commands/cli-manager.d.ts +2 -1
  20. package/dist/commands/handler.d.ts +110 -0
  21. package/dist/commands/mesh-coordinator.d.ts +85 -1
  22. package/dist/commands/router.d.ts +308 -1
  23. package/dist/commands/upgrade-helper.d.ts +12 -0
  24. package/dist/config/chat-history.d.ts +9 -0
  25. package/dist/config/config.d.ts +5 -0
  26. package/dist/config/mesh-config.d.ts +77 -1
  27. package/dist/detection/ide-detector.d.ts +13 -0
  28. package/dist/detection/win32-ide-version.d.ts +37 -0
  29. package/dist/git/change-impact-config.d.ts +159 -0
  30. package/dist/git/git-commands.d.ts +11 -1
  31. package/dist/git/git-diff.d.ts +6 -0
  32. package/dist/git/git-executor.d.ts +11 -0
  33. package/dist/git/git-status.d.ts +23 -0
  34. package/dist/git/git-types.d.ts +2 -50
  35. package/dist/git/index.d.ts +2 -0
  36. package/dist/index.d.ts +52 -13
  37. package/dist/index.js +42012 -17098
  38. package/dist/index.js.map +1 -1
  39. package/dist/index.mjs +41683 -16890
  40. package/dist/index.mjs.map +1 -1
  41. package/dist/installer.d.ts +1 -4
  42. package/dist/ipc/local-ipc-server.d.ts +91 -0
  43. package/dist/launch.d.ts +1 -1
  44. package/dist/logging/async-batch-writer.d.ts +10 -0
  45. package/dist/logging/log-redactor.d.ts +24 -0
  46. package/dist/logging/log-tail-reader.d.ts +46 -0
  47. package/dist/mesh/contracts.d.ts +164 -0
  48. package/dist/mesh/coordinator-prompt.d.ts +36 -0
  49. package/dist/mesh/coordinator-registry.d.ts +59 -0
  50. package/dist/mesh/mesh-active-work.d.ts +174 -0
  51. package/dist/mesh/mesh-delivery-policy.d.ts +131 -0
  52. package/dist/mesh/mesh-events-coordinator.d.ts +169 -0
  53. package/dist/mesh/mesh-events-pending.d.ts +45 -0
  54. package/dist/mesh/mesh-events-stale.d.ts +40 -0
  55. package/dist/mesh/mesh-events-utils.d.ts +66 -0
  56. package/dist/mesh/mesh-events.d.ts +6 -49
  57. package/dist/mesh/mesh-fast-forward.d.ts +81 -0
  58. package/dist/mesh/mesh-host-ownership.d.ts +9 -0
  59. package/dist/mesh/mesh-init.d.ts +86 -0
  60. package/dist/mesh/mesh-ledger-reconciliation.d.ts +23 -3
  61. package/dist/mesh/mesh-ledger.d.ts +77 -1
  62. package/dist/mesh/mesh-missions.d.ts +116 -0
  63. package/dist/mesh/mesh-reconcile-loop.d.ts +7 -0
  64. package/dist/mesh/mesh-refine-batch.d.ts +68 -0
  65. package/dist/mesh/mesh-refine-status.d.ts +62 -0
  66. package/dist/mesh/mesh-review-inbox.d.ts +90 -0
  67. package/dist/mesh/mesh-routing.d.ts +70 -0
  68. package/dist/mesh/mesh-runtime-store.d.ts +418 -0
  69. package/dist/mesh/mesh-task-stats.d.ts +49 -0
  70. package/dist/mesh/mesh-unresolved-forward-outbox.d.ts +30 -0
  71. package/dist/mesh/mesh-work-queue.d.ts +208 -5
  72. package/dist/mesh/preview-freshness.d.ts +18 -0
  73. package/dist/mesh/refine-config.d.ts +216 -0
  74. package/dist/mesh/worktree-bootstrap-config.d.ts +135 -0
  75. package/dist/providers/acp-provider-instance.d.ts +2 -0
  76. package/dist/providers/approval-utils.d.ts +13 -0
  77. package/dist/providers/chat-message-normalization.d.ts +12 -0
  78. package/dist/providers/cli-provider-instance.d.ts +76 -3
  79. package/dist/providers/contracts.d.ts +139 -6
  80. package/dist/providers/external-sources.d.ts +71 -0
  81. package/dist/providers/native-history/antigravity-cli-transcript.d.ts +100 -0
  82. package/dist/providers/native-history/claude-cli-transcript.d.ts +70 -0
  83. package/dist/providers/native-history/codex-cli-transcript.d.ts +73 -0
  84. package/dist/providers/native-history/dispatcher.d.ts +27 -0
  85. package/dist/providers/native-history/hermes-cli-transcript.d.ts +30 -0
  86. package/dist/providers/native-history/index.d.ts +13 -0
  87. package/dist/providers/provider-instance-manager.d.ts +13 -0
  88. package/dist/providers/provider-instance.d.ts +13 -1
  89. package/dist/providers/provider-loader.d.ts +26 -4
  90. package/dist/providers/provider-trust.d.ts +31 -0
  91. package/dist/providers/read-chat-contract.d.ts +29 -0
  92. package/dist/providers/sdk/v1/builders/acp/detect-status.d.ts +68 -0
  93. package/dist/providers/sdk/v1/builders/cli/detect-status.d.ts +85 -0
  94. package/dist/providers/sdk/v1/builders/cli/parse-approval-squash.d.ts +59 -0
  95. package/dist/providers/sdk/v1/builders/cli/parse-approval.d.ts +65 -0
  96. package/dist/providers/sdk/v1/builders/cli/parse-session.d.ts +91 -0
  97. package/dist/providers/sdk/v1/builders/cli/visible-region.d.ts +42 -0
  98. package/dist/providers/sdk/v1/fixture-tooling/format.d.ts +126 -0
  99. package/dist/providers/sdk/v1/fixture-tooling/index.d.ts +8 -0
  100. package/dist/providers/sdk/v1/fixture-tooling/replay.d.ts +38 -0
  101. package/dist/providers/sdk/v1/index.d.ts +30 -0
  102. package/dist/providers/sdk/v1/sandbox/README-design.d.ts +193 -0
  103. package/dist/providers/sdk/v1/sandbox/require-whitelist.d.ts +74 -0
  104. package/dist/providers/sdk/v1/sandbox/script-runner.d.ts +98 -0
  105. package/dist/providers/sdk/v1/types/cli/index.d.ts +277 -0
  106. package/dist/providers/sdk/v1/types/common/index.d.ts +203 -0
  107. package/dist/providers/sdk/v1/validators/index.d.ts +5 -0
  108. package/dist/providers/sdk/v1/validators/manifest.d.ts +40 -0
  109. package/dist/providers/sdk/v1/validators/taint.d.ts +52 -0
  110. package/dist/providers/spec/adapter.d.ts +69 -0
  111. package/dist/providers/spec/cli-adapter.d.ts +217 -0
  112. package/dist/providers/spec/evaluator.d.ts +23 -0
  113. package/dist/providers/spec/fsm-driver.d.ts +306 -0
  114. package/dist/providers/spec/fsm-evaluator.d.ts +72 -0
  115. package/dist/providers/spec/fsm-loader.d.ts +14 -0
  116. package/dist/providers/spec/fsm-types.d.ts +144 -0
  117. package/dist/providers/spec/native-history-executor.d.ts +41 -0
  118. package/dist/providers/spec/pre-launch-trust.d.ts +16 -0
  119. package/dist/providers/spec/route.d.ts +4 -0
  120. package/dist/providers/spec/types.d.ts +180 -0
  121. package/dist/providers/status-monitor.d.ts +7 -7
  122. package/dist/providers/transcript-v2.d.ts +176 -0
  123. package/dist/providers/types/interactive-prompt.d.ts +84 -0
  124. package/dist/providers/working-dir.d.ts +17 -0
  125. package/dist/repo-mesh-types.d.ts +295 -13
  126. package/dist/sessions/registry.d.ts +6 -0
  127. package/dist/shared-types-extra.d.ts +2 -4
  128. package/dist/shared-types.d.ts +59 -2
  129. package/dist/status/normalize.d.ts +1 -1
  130. package/dist/status/normalize.js +1 -0
  131. package/dist/status/normalize.js.map +1 -1
  132. package/dist/status/normalize.mjs +1 -0
  133. package/dist/status/normalize.mjs.map +1 -1
  134. package/dist/status/reporter.d.ts +2 -0
  135. package/dist/status/snapshot.d.ts +26 -0
  136. package/dist/system/load-better-sqlite3.d.ts +21 -0
  137. package/dist/types.d.ts +5 -0
  138. package/package.json +7 -3
  139. package/src/agent-stream/poller.ts +2 -3
  140. package/src/agent-stream/provider-adapter.ts +1 -1
  141. package/src/boot/daemon-lifecycle.ts +55 -12
  142. package/src/boot/process-hardening.ts +89 -0
  143. package/src/build-info.ts +73 -0
  144. package/src/chat/source-machine.ts +534 -0
  145. package/src/chat/source-resolver.ts +0 -0
  146. package/src/chat/subscription-updates.ts +20 -1
  147. package/src/cli-adapter-types.d.ts +1 -0
  148. package/src/cli-adapter-types.ts +47 -2
  149. package/src/cli-adapters/cli-script-runner.ts +421 -0
  150. package/src/cli-adapters/cli-state-engine.ts +1215 -0
  151. package/src/cli-adapters/provider-cli-adapter.d.ts +1 -1
  152. package/src/cli-adapters/provider-cli-adapter.ts +774 -1141
  153. package/src/cli-adapters/provider-cli-parse.d.ts +1 -0
  154. package/src/cli-adapters/provider-cli-parse.ts +13 -0
  155. package/src/cli-adapters/provider-cli-runtime.ts +56 -7
  156. package/src/cli-adapters/provider-cli-shared.d.ts +4 -0
  157. package/src/cli-adapters/provider-cli-shared.ts +100 -11
  158. package/src/cli-adapters/pty-transport.ts +2 -1
  159. package/src/cli-adapters/raw-terminal-io.ts +252 -0
  160. package/src/cli-adapters/resolve-executable.ts +90 -0
  161. package/src/cli-adapters/session-host-transport.ts +2 -1
  162. package/src/cli-adapters/terminal-backends/ghostty-vt-backend.ts +53 -29
  163. package/src/cli-adapters/terminal-backends/types.ts +10 -3
  164. package/src/cli-adapters/terminal-screen.ts +16 -81
  165. package/src/commands/chat-commands.ts +1823 -62
  166. package/src/commands/cli-manager.ts +286 -14
  167. package/src/commands/handler.ts +809 -2
  168. package/src/commands/mesh-coordinator.ts +332 -122
  169. package/src/commands/router.ts +7433 -1317
  170. package/src/commands/stream-commands.ts +8 -0
  171. package/src/commands/upgrade-helper.ts +81 -30
  172. package/src/config/chat-history.ts +483 -24
  173. package/src/config/config.ts +12 -0
  174. package/src/config/mesh-config.ts +388 -6
  175. package/src/config/recent-activity.ts +8 -2
  176. package/src/daemon/dev-auto-implement.ts +3 -2
  177. package/src/daemon/dev-cli-debug.ts +10 -1
  178. package/src/detection/cli-detector.ts +28 -9
  179. package/src/detection/ide-detector.ts +55 -16
  180. package/src/detection/win32-ide-version.ts +106 -0
  181. package/src/git/change-impact-config.ts +354 -0
  182. package/src/git/git-commands.ts +55 -14
  183. package/src/git/git-diff.ts +53 -0
  184. package/src/git/git-executor.ts +12 -0
  185. package/src/git/git-status.ts +574 -43
  186. package/src/git/git-types.ts +14 -62
  187. package/src/git/git-worktree.ts +8 -1
  188. package/src/git/index.ts +16 -0
  189. package/src/index.ts +146 -12
  190. package/src/installer.d.ts +1 -1
  191. package/src/installer.ts +8 -6
  192. package/src/ipc/local-ipc-server.ts +278 -0
  193. package/src/launch.d.ts +1 -1
  194. package/src/launch.ts +37 -28
  195. package/src/logging/async-batch-writer.ts +55 -0
  196. package/src/logging/log-redactor.ts +100 -0
  197. package/src/logging/log-tail-reader.ts +220 -0
  198. package/src/logging/logger.ts +2 -1
  199. package/src/mesh/contracts.ts +329 -0
  200. package/src/mesh/coordinator-prompt.ts +234 -31
  201. package/src/mesh/coordinator-registry.ts +121 -0
  202. package/src/mesh/mesh-active-work.ts +623 -0
  203. package/src/mesh/mesh-delivery-policy.ts +315 -0
  204. package/src/mesh/mesh-events-coordinator.ts +2144 -0
  205. package/src/mesh/mesh-events-pending.ts +508 -0
  206. package/src/mesh/mesh-events-stale.ts +290 -0
  207. package/src/mesh/mesh-events-utils.ts +300 -0
  208. package/src/mesh/mesh-events.ts +30 -1035
  209. package/src/mesh/mesh-fast-forward.ts +839 -0
  210. package/src/mesh/mesh-host-ownership.ts +73 -0
  211. package/src/mesh/mesh-init.ts +260 -0
  212. package/src/mesh/mesh-ledger-reconciliation.ts +12 -5
  213. package/src/mesh/mesh-ledger.ts +589 -102
  214. package/src/mesh/mesh-missions.ts +248 -0
  215. package/src/mesh/mesh-reconcile-loop.ts +822 -0
  216. package/src/mesh/mesh-refine-batch.ts +197 -0
  217. package/src/mesh/mesh-refine-status.ts +231 -0
  218. package/src/mesh/mesh-review-inbox.ts +307 -0
  219. package/src/mesh/mesh-routing.ts +291 -0
  220. package/src/mesh/mesh-runtime-store.ts +1626 -0
  221. package/src/mesh/mesh-task-stats.ts +154 -0
  222. package/src/mesh/mesh-unresolved-forward-outbox.ts +185 -0
  223. package/src/mesh/mesh-work-queue.ts +888 -141
  224. package/src/mesh/preview-freshness.ts +118 -0
  225. package/src/mesh/refine-config.ts +423 -0
  226. package/src/mesh/worktree-bootstrap-config.ts +331 -0
  227. package/src/providers/acp-provider-instance.ts +25 -9
  228. package/src/providers/approval-utils.d.ts +4 -0
  229. package/src/providers/approval-utils.ts +47 -5
  230. package/src/providers/chat-message-normalization.ts +45 -5
  231. package/src/providers/cli-provider-instance.ts +1038 -99
  232. package/src/providers/contracts.d.ts +55 -0
  233. package/src/providers/contracts.ts +150 -6
  234. package/src/providers/extension-provider-instance.ts +12 -7
  235. package/src/providers/external-sources.ts +218 -0
  236. package/src/providers/ide-provider-instance.ts +35 -12
  237. package/src/providers/native-history/antigravity-cli-transcript.ts +643 -0
  238. package/src/providers/native-history/claude-cli-transcript.ts +396 -0
  239. package/src/providers/native-history/codex-cli-transcript.ts +479 -0
  240. package/src/providers/native-history/dispatcher.ts +340 -0
  241. package/src/providers/native-history/hermes-cli-transcript.ts +230 -0
  242. package/src/providers/native-history/index.ts +30 -0
  243. package/src/providers/provider-instance-manager.ts +30 -0
  244. package/src/providers/provider-instance.ts +10 -1
  245. package/src/providers/provider-loader.ts +670 -50
  246. package/src/providers/provider-schema.ts +87 -14
  247. package/src/providers/provider-trust.ts +114 -0
  248. package/src/providers/read-chat-contract.ts +76 -16
  249. package/src/providers/sdk/README.md +49 -0
  250. package/src/providers/sdk/v1/builders/acp/detect-status.ts +144 -0
  251. package/src/providers/sdk/v1/builders/cli/detect-status.ts +262 -0
  252. package/src/providers/sdk/v1/builders/cli/parse-approval-squash.ts +158 -0
  253. package/src/providers/sdk/v1/builders/cli/parse-approval.ts +250 -0
  254. package/src/providers/sdk/v1/builders/cli/parse-session.ts +276 -0
  255. package/src/providers/sdk/v1/builders/cli/visible-region.ts +143 -0
  256. package/src/providers/sdk/v1/fixture-tooling/format.ts +130 -0
  257. package/src/providers/sdk/v1/fixture-tooling/index.ts +22 -0
  258. package/src/providers/sdk/v1/fixture-tooling/replay.ts +352 -0
  259. package/src/providers/sdk/v1/index.ts +152 -0
  260. package/src/providers/sdk/v1/sandbox/README-design.ts +195 -0
  261. package/src/providers/sdk/v1/sandbox/require-whitelist.ts +472 -0
  262. package/src/providers/sdk/v1/sandbox/script-runner.ts +150 -0
  263. package/src/providers/sdk/v1/schemas/cli/provider.schema.json +504 -0
  264. package/src/providers/sdk/v1/schemas/primitives/acp-session-protocol-v1.json +131 -0
  265. package/src/providers/sdk/v1/schemas/primitives/native-history-codex-rollout-v1.json +66 -0
  266. package/src/providers/sdk/v1/schemas/primitives/tui-approval-squash-v1.json +91 -0
  267. package/src/providers/sdk/v1/schemas/primitives/tui-assistant-block-v1.json +91 -0
  268. package/src/providers/sdk/v1/schemas/primitives/tui-cue-ordering-v1.json +47 -0
  269. package/src/providers/sdk/v1/schemas/primitives/tui-dispatch-order-v1.json +32 -0
  270. package/src/providers/sdk/v1/schemas/primitives/tui-footer-chrome-v1.json +42 -0
  271. package/src/providers/sdk/v1/schemas/primitives/tui-index-finder-v1.json +27 -0
  272. package/src/providers/sdk/v1/schemas/primitives/tui-modal-v1.json +125 -0
  273. package/src/providers/sdk/v1/schemas/primitives/tui-prompt-marker-v1.json +45 -0
  274. package/src/providers/sdk/v1/schemas/primitives/tui-session-id-extraction-v1.json +46 -0
  275. package/src/providers/sdk/v1/schemas/primitives/tui-settled-prompt-v1.json +71 -0
  276. package/src/providers/sdk/v1/schemas/primitives/tui-spinner-v1.json +83 -0
  277. package/src/providers/sdk/v1/schemas/primitives/tui-transcript-pty-v1.json +83 -0
  278. package/src/providers/sdk/v1/schemas/primitives/tui-visible-region-v1.json +57 -0
  279. package/src/providers/sdk/v1/schemas/primitives/tui-welcome-screen-v1.json +35 -0
  280. package/src/providers/sdk/v1/types/cli/index.ts +365 -0
  281. package/src/providers/sdk/v1/types/common/index.ts +229 -0
  282. package/src/providers/sdk/v1/validators/index.ts +19 -0
  283. package/src/providers/sdk/v1/validators/manifest.ts +110 -0
  284. package/src/providers/sdk/v1/validators/taint.ts +309 -0
  285. package/src/providers/spec/adapter.ts +168 -0
  286. package/src/providers/spec/cli-adapter.ts +986 -0
  287. package/src/providers/spec/evaluator.ts +345 -0
  288. package/src/providers/spec/fsm-driver.ts +1015 -0
  289. package/src/providers/spec/fsm-evaluator.ts +255 -0
  290. package/src/providers/spec/fsm-loader.ts +120 -0
  291. package/src/providers/spec/fsm-types.ts +238 -0
  292. package/src/providers/spec/native-history-executor.ts +1136 -0
  293. package/src/providers/spec/pre-launch-trust.ts +104 -0
  294. package/src/providers/spec/route.ts +51 -0
  295. package/src/providers/spec/types.ts +226 -0
  296. package/src/providers/status-monitor.d.ts +7 -7
  297. package/src/providers/status-monitor.ts +37 -22
  298. package/src/providers/transcript-v2.ts +567 -0
  299. package/src/providers/types/interactive-prompt.ts +536 -0
  300. package/src/providers/version-archive.ts +64 -24
  301. package/src/providers/working-dir.ts +23 -0
  302. package/src/repo-mesh-types.ts +378 -14
  303. package/src/sessions/registry.ts +6 -0
  304. package/src/shared-types-extra.ts +2 -4
  305. package/src/shared-types.d.ts +8 -0
  306. package/src/shared-types.ts +64 -1
  307. package/src/status/builders.ts +26 -6
  308. package/src/status/normalize.ts +2 -0
  309. package/src/status/reporter.ts +19 -1
  310. package/src/status/snapshot.ts +95 -26
  311. package/src/system/host-memory.ts +29 -12
  312. package/src/system/load-better-sqlite3.ts +68 -0
  313. package/src/types.ts +5 -0
  314. package/dist/cli-adapters/terminal-backends/xterm-backend.d.ts +0 -17
  315. package/dist/mesh/mesh-sync.d.ts +0 -53
  316. package/src/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +0 -16
  317. package/src/cli-adapters/terminal-backends/xterm-backend.ts +0 -97
  318. package/src/mesh/mesh-sync.ts +0 -111
@@ -18,13 +18,14 @@ import { loadConfig } from '../config/config.js';
18
18
  import { loadState, saveState } from '../config/state-store.js';
19
19
  import { getWorkspaceState, resolveLaunchDirectory } from '../config/workspaces.js';
20
20
  import { appendRecentActivity } from '../config/recent-activity.js';
21
+ import { unregisterMeshCoordinator } from '../mesh/coordinator-registry.js';
21
22
  import { upsertSavedProviderSession } from '../config/saved-sessions.js';
22
23
  import { buildLegacyModelModeSummaryMetadata, normalizeProviderSummaryMetadata } from '../providers/summary-metadata.js';
23
24
  import { CliProviderInstance } from '../providers/cli-provider-instance.js';
24
25
  import { AcpProviderInstance } from '../providers/acp-provider-instance.js';
25
26
  import type { ProviderInstanceManager } from '../providers/provider-instance-manager.js';
26
27
  import { ProviderLoader } from '../providers/provider-loader.js';
27
- import { normalizeInputEnvelope, type ProviderModule, type ProviderResumeCapability } from '../providers/contracts.js';
28
+ import { normalizeInputEnvelope, type MeshCoordinatorDelegatedWorkerIsolation, type ProviderModule, type ProviderResumeCapability } from '../providers/contracts.js';
28
29
  import { assertProviderSupportsDeclaredInput, assertTextOnlyInput } from '../providers/provider-input-support.js';
29
30
  import type { CliAdapter } from '../cli-adapter-types.js';
30
31
  import type { PtyTransportFactory } from '../cli-adapters/pty-transport.js';
@@ -80,6 +81,114 @@ export interface CliManagerDeps {
80
81
 
81
82
  type CommandResult = { success: boolean;[key: string]: unknown };
82
83
 
84
+ const BUSY_AGENT_STATUSES = new Set(['generating', 'running', 'streaming', 'starting', 'busy', 'waiting', 'waiting_approval', 'no_progress', 'long_generating']);
85
+ const ZERO_MESSAGE_STARTING_SEND_WAIT_MS = 2_000;
86
+
87
+ function normalizeAgentStatus(value: unknown): string {
88
+ return typeof value === 'string' ? value.trim().toLowerCase() : '';
89
+ }
90
+
91
+ function hasNonEmptyModalButtons(activeModal: unknown): boolean {
92
+ const buttons = (activeModal as any)?.buttons;
93
+ return Array.isArray(buttons) && buttons.some((button) => String(button || '').trim().length > 0);
94
+ }
95
+
96
+ function hasAdapterPendingResponse(adapter: any): boolean {
97
+ if (adapter?.isWaitingForResponse === true) return true;
98
+ if (adapter?.currentTurnScope) return true;
99
+ try {
100
+ if (typeof adapter?.isProcessing === 'function' && adapter.isProcessing()) return true;
101
+ } catch { /* defensive: send guard should not fail on diagnostics */ }
102
+ try {
103
+ const partial = typeof adapter?.getPartialResponse === 'function' ? adapter.getPartialResponse() : '';
104
+ if (typeof partial === 'string' && partial.trim()) return true;
105
+ } catch { /* defensive: missing partial means no pending evidence */ }
106
+ return false;
107
+ }
108
+
109
+ function countMessages(value: unknown): number {
110
+ return Array.isArray(value) ? value.length : 0;
111
+ }
112
+
113
+ function hasFinalAssistantMessage(value: unknown): boolean {
114
+ const messages = Array.isArray(value) ? value : [];
115
+ const last = messages[messages.length - 1] as any;
116
+ if (!last || last.role !== 'assistant') return false;
117
+ if (last.bubbleState === 'streaming') return false;
118
+ if (last.meta?.streaming === true) return false;
119
+ return typeof last.content === 'string' && last.content.trim().length > 0;
120
+ }
121
+
122
+ function hasZeroMessageStartingLaunch(adapter: any): boolean {
123
+ const adapterStatus = adapter?.getStatus?.({ allowParse: false }) ?? adapter?.getStatus?.() ?? {};
124
+ const parsedStatus = typeof adapter?.getScriptParsedStatus === 'function'
125
+ ? adapter.getScriptParsedStatus()
126
+ : {};
127
+ const adapterRawStatus = normalizeAgentStatus(adapterStatus?.status);
128
+ const parsedRawStatus = normalizeAgentStatus(parsedStatus?.status);
129
+ if (adapterRawStatus !== 'starting') return false;
130
+ if (parsedRawStatus && parsedRawStatus !== 'starting' && parsedRawStatus !== 'generating') return false;
131
+ if (hasNonEmptyModalButtons(adapterStatus?.activeModal ?? adapterStatus?.modal ?? parsedStatus?.activeModal ?? parsedStatus?.modal)) return false;
132
+ if (countMessages(adapterStatus?.messages) > 0 || countMessages(parsedStatus?.messages) > 0) return false;
133
+ return !hasAdapterPendingResponse(adapter);
134
+ }
135
+
136
+ function hasCompletedStartingLaunch(adapter: any): boolean {
137
+ const adapterStatus = adapter?.getStatus?.({ allowParse: false }) ?? adapter?.getStatus?.() ?? {};
138
+ const adapterRawStatus = normalizeAgentStatus(adapterStatus?.status);
139
+ if (adapterRawStatus !== 'starting') return false;
140
+ if (hasAdapterPendingResponse(adapter)) return false;
141
+
142
+ const parsedStatus = typeof adapter?.getScriptParsedStatus === 'function'
143
+ ? adapter.getScriptParsedStatus()
144
+ : {};
145
+ const parsedRawStatus = normalizeAgentStatus(parsedStatus?.status);
146
+ if (parsedRawStatus !== 'idle') return false;
147
+ if (hasNonEmptyModalButtons(adapterStatus?.activeModal ?? adapterStatus?.modal ?? parsedStatus?.activeModal ?? parsedStatus?.modal)) return false;
148
+ return hasFinalAssistantMessage(parsedStatus?.messages);
149
+ }
150
+
151
+ function shouldSuppressStaleParsedBusyStatus(adapterStatus: string, parsedStatus: any, adapter: any): boolean {
152
+ const parsedRawStatus = normalizeAgentStatus(parsedStatus?.status);
153
+ if (!BUSY_AGENT_STATUSES.has(parsedRawStatus)) return false;
154
+ if (adapterStatus !== 'idle') return false;
155
+ if (hasNonEmptyModalButtons(parsedStatus?.activeModal ?? parsedStatus?.modal)) return false;
156
+ return !hasAdapterPendingResponse(adapter);
157
+ }
158
+
159
+ function getEffectiveAgentSendStatus(adapter: any): string {
160
+ const adapterStatus = normalizeAgentStatus(adapter?.getStatus?.({ allowParse: false })?.status ?? adapter?.getStatus?.()?.status);
161
+ if (adapterStatus === 'starting' && hasCompletedStartingLaunch(adapter)) return 'idle';
162
+ if (adapterStatus && adapterStatus !== 'idle') return adapterStatus;
163
+ if (adapterStatus !== 'idle') return adapterStatus;
164
+
165
+ if (typeof adapter?.getScriptParsedStatus !== 'function') return adapterStatus;
166
+ try {
167
+ const parsedStatus = adapter.getScriptParsedStatus();
168
+ const parsedRawStatus = normalizeAgentStatus(parsedStatus?.status);
169
+ if (BUSY_AGENT_STATUSES.has(parsedRawStatus) && !shouldSuppressStaleParsedBusyStatus(adapterStatus, parsedStatus, adapter)) {
170
+ return parsedRawStatus;
171
+ }
172
+ } catch {
173
+ return adapterStatus;
174
+ }
175
+ return adapterStatus;
176
+ }
177
+
178
+ async function waitForZeroMessageStartingLaunch(adapter: any): Promise<boolean> {
179
+ try {
180
+ if (!hasZeroMessageStartingLaunch(adapter)) return false;
181
+ } catch {
182
+ return false;
183
+ }
184
+ await new Promise(resolve => setTimeout(resolve, ZERO_MESSAGE_STARTING_SEND_WAIT_MS));
185
+ try {
186
+ return hasZeroMessageStartingLaunch(adapter);
187
+ } catch {
188
+ return false;
189
+ }
190
+ }
191
+
83
192
  export interface CliTransportFactoryParams {
84
193
  runtimeId: string;
85
194
  providerType: string;
@@ -138,18 +247,19 @@ type CliStartOptions = {
138
247
  extraEnv?: Record<string, string>;
139
248
  };
140
249
 
141
- const COORDINATOR_DELEGATED_ENV_UNSETS: Record<string, string> = {
142
- ADHDEV_INLINE_MESH: '',
143
- ADHDEV_MCP_TRANSPORT: '',
144
- ADHDEV_MESH_ID: '',
145
- HERMES_EPHEMERAL_SYSTEM_PROMPT: '',
146
- };
250
+ const DEFAULT_COORDINATOR_DELEGATED_ENV_UNSETS = [
251
+ 'ADHDEV_INLINE_MESH',
252
+ 'ADHDEV_MCP_TRANSPORT',
253
+ 'ADHDEV_MESH_ID',
254
+ 'HERMES_EPHEMERAL_SYSTEM_PROMPT',
255
+ ] as const;
147
256
 
148
257
  export interface CoordinatorDelegatedCliLaunchOptionsInput {
149
258
  cliType: string;
150
259
  workspace: string;
151
260
  cliArgs?: string[];
152
261
  env?: Record<string, string>;
262
+ isolation?: MeshCoordinatorDelegatedWorkerIsolation;
153
263
  }
154
264
 
155
265
  export interface CoordinatorDelegatedCliLaunchOptions {
@@ -161,6 +271,21 @@ function hasCliArg(args: string[], flag: string): boolean {
161
271
  return args.some((arg) => arg === flag || arg.startsWith(`${flag}=`));
162
272
  }
163
273
 
274
+ function hasConfigOverride(args: string[], key: string): boolean {
275
+ for (let index = 0; index < args.length; index += 1) {
276
+ const arg = args[index];
277
+ const next = args[index + 1];
278
+ if ((arg === '-c' || arg === '--config') && typeof next === 'string') {
279
+ if (next === key || next.startsWith(`${key}=`) || next.startsWith(`${key}.`)) return true;
280
+ }
281
+ if (arg.startsWith('--config=')) {
282
+ const value = arg.slice('--config='.length);
283
+ if (value === key || value.startsWith(`${key}=`) || value.startsWith(`${key}.`)) return true;
284
+ }
285
+ }
286
+ return false;
287
+ }
288
+
164
289
  function ensureEmptyDelegatedMcpConfig(workspace: string): string {
165
290
  const baseDir = path.join(os.tmpdir(), 'adhdev-delegated-agent-empty-mcp');
166
291
  mkdirSync(baseDir, { recursive: true });
@@ -173,12 +298,31 @@ function ensureEmptyDelegatedMcpConfig(workspace: string): string {
173
298
  export function buildCoordinatorDelegatedCliLaunchOptions(
174
299
  input: CoordinatorDelegatedCliLaunchOptionsInput,
175
300
  ): CoordinatorDelegatedCliLaunchOptions {
176
- const cliType = String(input.cliType || '').trim();
177
301
  const cliArgs = Array.isArray(input.cliArgs) ? [...input.cliArgs] : [];
178
- const env: Record<string, string> = { ...(input.env || {}), ...COORDINATOR_DELEGATED_ENV_UNSETS };
302
+ const env: Record<string, string> = { ...(input.env || {}) };
303
+ const envUnsets = new Set<string>(DEFAULT_COORDINATOR_DELEGATED_ENV_UNSETS);
304
+ for (const key of input.isolation?.env?.unset || []) {
305
+ if (typeof key === 'string' && key.trim()) envUnsets.add(key.trim());
306
+ }
307
+ for (const key of envUnsets) env[key] = '';
179
308
 
180
- if (cliType === 'claude-cli' && !hasCliArg(cliArgs, '--mcp-config')) {
181
- cliArgs.unshift('--mcp-config', ensureEmptyDelegatedMcpConfig(input.workspace));
309
+ for (const rule of input.isolation?.args || []) {
310
+ if (!rule || typeof rule !== 'object') continue;
311
+ if (rule.mode === 'empty_mcp_config') {
312
+ if (rule.flag && !hasCliArg(cliArgs, rule.flag)) {
313
+ cliArgs.unshift(rule.flag, ensureEmptyDelegatedMcpConfig(input.workspace));
314
+ }
315
+ if (rule.strictFlag && !hasCliArg(cliArgs, rule.strictFlag)) {
316
+ cliArgs.unshift(rule.strictFlag);
317
+ }
318
+ continue;
319
+ }
320
+ if (rule.mode === 'config_override') {
321
+ const key = String(rule.dedupeKey || rule.key || '').trim();
322
+ const flag = String(rule.flag || '').trim();
323
+ if (!key || !flag || hasConfigOverride(cliArgs, key)) continue;
324
+ cliArgs.unshift(flag, `${rule.key}=${rule.value}`);
325
+ }
182
326
  }
183
327
 
184
328
  return { cliArgs, env };
@@ -255,10 +399,14 @@ function detectExplicitProviderSessionId(
255
399
 
256
400
  const subcommands = resume?.sessionIdFromSubcommand;
257
401
  if (Array.isArray(subcommands) && subcommands.length > 0) {
402
+ const hasResumeSubcommand = args.some((arg) => subcommands.includes(arg));
258
403
  const subcommandSessionId = readSubcommandSessionId(args, subcommands);
259
404
  if (subcommandSessionId) {
260
405
  return { providerSessionId: subcommandSessionId, launchMode: 'resume' };
261
406
  }
407
+ if (hasResumeSubcommand) {
408
+ return { launchMode: 'resume' };
409
+ }
262
410
  }
263
411
 
264
412
  return { launchMode: 'manual' };
@@ -292,6 +440,12 @@ export function resolveCliSessionBinding(
292
440
  launchMode: explicit.launchMode,
293
441
  };
294
442
  }
443
+ if (explicit.launchMode === 'resume') {
444
+ return {
445
+ cliArgs: baseArgs,
446
+ launchMode: 'resume',
447
+ };
448
+ }
295
449
  if (explicit.launchMode === 'manual' && hasArg(baseArgs || [], ['--session-id'])) {
296
450
  return {
297
451
  cliArgs: baseArgs,
@@ -435,7 +589,9 @@ export class DaemonCliManager {
435
589
  providerSessionId,
436
590
  attachExisting,
437
591
  );
438
- return new ProviderCliAdapter(resolvedProvider as CliProviderModule, workingDir, cliArgs, extraEnv || {}, transportFactory);
592
+ const adapter = new ProviderCliAdapter(resolvedProvider as CliProviderModule, workingDir, cliArgs, extraEnv || {}, transportFactory);
593
+ if (providerSessionId) adapter.updateRuntimeMeta({ providerSessionId });
594
+ return adapter;
439
595
  }
440
596
 
441
597
  throw new Error(`No CLI provider found for '${cliType}'. Create a provider.js in providers/cli/${cliType}/`);
@@ -457,6 +613,7 @@ export class DaemonCliManager {
457
613
  this.deps.removeAgentTracking(key);
458
614
  sessionRegistry?.unregisterByInstanceKey(key);
459
615
  instanceManager?.removeInstance(key);
616
+ unregisterMeshCoordinator(key);
460
617
  LOG.info('CLI', `🧹 Auto-cleaned ${status.status} CLI: ${cliType}`);
461
618
  this.deps.onStatusChange();
462
619
  }
@@ -516,6 +673,18 @@ export class DaemonCliManager {
516
673
  transport: 'pty',
517
674
  adapterKey: key,
518
675
  instanceKey: key,
676
+ workspace: resolvedDir,
677
+ // attachExisting === true means we're restoring an already-spawned
678
+ // hosted runtime after a daemon restart, not starting a fresh PTY.
679
+ // The real spawn time is in the past and we don't have it on the
680
+ // restored descriptor; pinning spawnedAtMs to Date.now() in that
681
+ // case would push the native-history session-floor cutoff past
682
+ // every existing transcript file, so the agy/hermes/claude reader
683
+ // would return null even though the transcript on disk is fresh.
684
+ // 0 disables the floor for this session — recent_window_ms in the
685
+ // spec still bounds how far back we look. Fresh launches still
686
+ // get a proper floor so prior-session leak protection holds.
687
+ spawnedAtMs: attachExisting ? 0 : Date.now(),
519
688
  });
520
689
  } catch (spawnErr: any) {
521
690
  LOG.error('CLI', `[${cliType}] Spawn failed: ${spawnErr?.message}`);
@@ -589,6 +758,7 @@ export class DaemonCliManager {
589
758
  transport: 'acp',
590
759
  adapterKey: key,
591
760
  instanceKey: key,
761
+ workspace: resolvedDir,
592
762
  });
593
763
 
594
764
  // Register ACP entry in adapter map (getStatus queries from acpInstance in real-time)
@@ -783,6 +953,7 @@ export class DaemonCliManager {
783
953
  this.deps.removeAgentTracking(key);
784
954
  this.deps.getSessionRegistry?.()?.unregisterByInstanceKey(key);
785
955
  this.deps.getInstanceManager()?.removeInstance(key);
956
+ unregisterMeshCoordinator(key);
786
957
  LOG.info('CLI', `🛑 Agent stopped: ${adapter.cliType} in ${adapter.workingDir}`);
787
958
  this.deps.onStatusChange();
788
959
  } else {
@@ -792,6 +963,7 @@ export class DaemonCliManager {
792
963
  this.deps.getSessionRegistry?.()?.unregisterByInstanceKey(key);
793
964
  im.removeInstance(key);
794
965
  this.deps.removeAgentTracking(key);
966
+ unregisterMeshCoordinator(key);
795
967
  LOG.warn('CLI', `🧹 Force-removed orphan entry: ${key}`);
796
968
  this.deps.onStatusChange();
797
969
  }
@@ -955,6 +1127,8 @@ export class DaemonCliManager {
955
1127
  const launchSource = resolved.source;
956
1128
  if (!cliType) throw new Error('cliType required');
957
1129
 
1130
+ const providerType = this.providerLoader.resolveAlias(cliType);
1131
+ const provLookup = this.providerLoader.getMeta(providerType) as ProviderModule | undefined;
958
1132
  const settingsOverride = args?.settings && typeof args.settings === 'object' ? args.settings : undefined;
959
1133
  const delegatedLaunch = settingsOverride?.launchedByCoordinator === true
960
1134
  ? buildCoordinatorDelegatedCliLaunchOptions({
@@ -962,8 +1136,28 @@ export class DaemonCliManager {
962
1136
  workspace: dir,
963
1137
  cliArgs: args?.cliArgs,
964
1138
  env: args?.env,
1139
+ isolation: provLookup?.meshCoordinator?.delegatedWorkerIsolation,
965
1140
  })
966
1141
  : null;
1142
+ // Untrusted-provider gate: an external source that ships JS
1143
+ // hooks needs explicit user confirmation before its first
1144
+ // launch. Dashboards add `confirmExternalUntrusted: true` to
1145
+ // the launch args after showing the trust modal. Without
1146
+ // that ack we refuse to spawn and tell the caller why.
1147
+ const provMeta = provLookup as any;
1148
+ const provTrust = provMeta?._sourceTrust;
1149
+ if (provTrust === 'external-untrusted' && args?.confirmExternalUntrusted !== true) {
1150
+ return {
1151
+ success: false,
1152
+ error: 'untrusted_external_provider',
1153
+ provider: {
1154
+ type: provLookup?.type ?? cliType,
1155
+ sourceName: provMeta?._sourceName ?? null,
1156
+ trust: provTrust,
1157
+ },
1158
+ hint: 'Resend launch_cli with confirmExternalUntrusted=true after the user explicitly approves running JavaScript from this 3rd-party source.',
1159
+ };
1160
+ }
967
1161
  const started = await this.startSession(
968
1162
  cliType,
969
1163
  dir,
@@ -1030,6 +1224,45 @@ export class DaemonCliManager {
1030
1224
  this.deps.onStatusChange();
1031
1225
  return { success: true, id: found.key, mode };
1032
1226
  }
1227
+ case 'record_provider_pty': {
1228
+ const cliType = args?.type || args?.cliType;
1229
+ if (!cliType) {
1230
+ return { success: false, error: '`type` (provider type) is required', code: 'MISSING_TYPE' };
1231
+ }
1232
+ const targetSessionId = typeof args?.targetSessionId === 'string' ? args.targetSessionId : '';
1233
+ const dir = args?.dir || '';
1234
+ const found = (targetSessionId ? this.findAdapterBySessionId(targetSessionId) : null)
1235
+ || this.findAdapter(cliType, { instanceKey: targetSessionId, dir });
1236
+ if (!found) {
1237
+ return {
1238
+ success: false,
1239
+ error: `No running ${cliType} session. Launch one first (adhdev launch ${cliType}) or pass --target-session-id.`,
1240
+ code: 'NO_RUNNING_SESSION',
1241
+ };
1242
+ }
1243
+ const instance = this.deps.getInstanceManager()?.getInstance(found.key);
1244
+ if (!(instance instanceof CliProviderInstance)) {
1245
+ return { success: false, error: 'CLI instance not available', code: 'CLI_INSTANCE_NOT_FOUND' };
1246
+ }
1247
+ const adapter = instance.getAdapter();
1248
+ if (!adapter || typeof (adapter as any).getAccumulatedRawBuffer !== 'function') {
1249
+ return { success: false, error: 'Adapter does not expose PTY buffer', code: 'ADAPTER_NOT_RECORDABLE' };
1250
+ }
1251
+ const buffer = (adapter as any).getAccumulatedRawBuffer() as { text: string; droppedChars: number };
1252
+ const maxBytes = Number(args?.maxBytes) > 0 ? Number(args.maxBytes) : 262144;
1253
+ const truncated = buffer.text.length > maxBytes;
1254
+ const ptyBytes = truncated ? buffer.text.slice(-maxBytes) : buffer.text;
1255
+ return {
1256
+ success: true,
1257
+ cliType,
1258
+ sessionId: found.key,
1259
+ ptyBytes,
1260
+ bytes: ptyBytes.length,
1261
+ truncated,
1262
+ droppedChars: buffer.droppedChars,
1263
+ capturedAt: Date.now(),
1264
+ };
1265
+ }
1033
1266
  case 'restart_session': {
1034
1267
  const cliType = args?.cliType || args?.agentType || args?.ideType;
1035
1268
  const cfg = loadConfig();
@@ -1073,6 +1306,29 @@ export class DaemonCliManager {
1073
1306
  const { adapter, key } = found;
1074
1307
 
1075
1308
  if (action === 'send_chat') {
1309
+ let currentStatus = getEffectiveAgentSendStatus(adapter);
1310
+ if (currentStatus === 'starting' && await waitForZeroMessageStartingLaunch(adapter)) {
1311
+ currentStatus = 'idle';
1312
+ } else if (currentStatus === 'starting') {
1313
+ currentStatus = getEffectiveAgentSendStatus(adapter);
1314
+ }
1315
+ // Stamp mesh direct-dispatch assignment on the target
1316
+ // instance BEFORE sending the prompt so the completion
1317
+ // event has a routing marker by the time it fires.
1318
+ // mesh_send_task --direct ships meshContext for plain CLI
1319
+ // sessions that were never launched as mesh delegates.
1320
+ const meshContext = (args as any)?.meshContext;
1321
+ if (meshContext && typeof meshContext === 'object' && typeof meshContext.meshId === 'string' && meshContext.meshId) {
1322
+ const targetInstanceId = key;
1323
+ try {
1324
+ this.deps.getInstanceManager()?.attachMeshAssignmentToInstance(targetInstanceId, {
1325
+ meshId: meshContext.meshId,
1326
+ ...(typeof meshContext.nodeId === 'string' && meshContext.nodeId ? { nodeId: meshContext.nodeId } : {}),
1327
+ ...(typeof meshContext.taskId === 'string' && meshContext.taskId ? { taskId: meshContext.taskId } : {}),
1328
+ ...(typeof meshContext.coordinatorDaemonId === 'string' && meshContext.coordinatorDaemonId ? { coordinatorDaemonId: meshContext.coordinatorDaemonId } : {}),
1329
+ });
1330
+ } catch { /* best-effort */ }
1331
+ }
1076
1332
  const input = normalizeInputEnvelope(args?.input ? { input: args.input } : args);
1077
1333
  const provider = this.providerLoader.resolve(agentType) || this.providerLoader.getMeta(agentType);
1078
1334
  if (provider?.category === 'acp') {
@@ -1082,8 +1338,24 @@ export class DaemonCliManager {
1082
1338
  }
1083
1339
  const message = input.textFallback;
1084
1340
  if (!message) throw new Error('message required for send_chat');
1085
- await adapter.sendMessage(message);
1086
- return { success: true, status: 'generating' };
1341
+ const forceSend = args?.force === true || args?.forceSend === true;
1342
+ if (forceSend && typeof (adapter as any).forceSendMessage === 'function') {
1343
+ await (adapter as any).forceSendMessage(message);
1344
+ } else if (forceSend) {
1345
+ await adapter.sendMessage(message, { force: true });
1346
+ } else {
1347
+ await adapter.sendMessage(message);
1348
+ }
1349
+ const targetInstance = this.deps.getInstanceManager()?.getInstance(key) as
1350
+ | { recordAcknowledgedUserInput?: (input: unknown) => void }
1351
+ | undefined;
1352
+ targetInstance?.recordAcknowledgedUserInput?.(input);
1353
+ return {
1354
+ success: true,
1355
+ status: BUSY_AGENT_STATUSES.has(currentStatus) ? currentStatus : 'generating',
1356
+ ...(BUSY_AGENT_STATUSES.has(currentStatus) ? { queued: true, queuedReason: 'agent_runtime_busy' } : {}),
1357
+ ...(forceSend ? { forceSent: true, queued: false } : {}),
1358
+ };
1087
1359
  } else if (action === 'clear_history') {
1088
1360
  if (typeof adapter.clearHistory === 'function') adapter.clearHistory();
1089
1361
  return { success: true, cleared: true };