@pentoshi/clai 4.8.4 → 4.10.0

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/README.md +91 -4
  2. package/dist/agent/compaction-executor.d.ts +3 -5
  3. package/dist/agent/compaction-executor.js +165 -28
  4. package/dist/agent/compaction-executor.js.map +1 -1
  5. package/dist/agent/finalize-gate.js +0 -9
  6. package/dist/agent/finalize-gate.js.map +1 -1
  7. package/dist/agent/plan-mode-reminders.js +5 -5
  8. package/dist/agent/plan-mode-reminders.js.map +1 -1
  9. package/dist/agent/plan-tool.d.ts +1 -0
  10. package/dist/agent/plan-tool.js +50 -21
  11. package/dist/agent/plan-tool.js.map +1 -1
  12. package/dist/agent/reliability-policy.d.ts +9 -0
  13. package/dist/agent/reliability-policy.js +36 -1
  14. package/dist/agent/reliability-policy.js.map +1 -1
  15. package/dist/agent/runner.d.ts +4 -0
  16. package/dist/agent/runner.js +193 -116
  17. package/dist/agent/runner.js.map +1 -1
  18. package/dist/agent/task-analyzer.d.ts +8 -18
  19. package/dist/agent/task-analyzer.js +75 -182
  20. package/dist/agent/task-analyzer.js.map +1 -1
  21. package/dist/agent/task-evidence.js +10 -0
  22. package/dist/agent/task-evidence.js.map +1 -1
  23. package/dist/agent/tool-call-parser.js +14 -13
  24. package/dist/agent/tool-call-parser.js.map +1 -1
  25. package/dist/app/adapters/current-agent-adapter.d.ts +5 -1
  26. package/dist/app/adapters/current-agent-adapter.js +2 -1
  27. package/dist/app/adapters/current-agent-adapter.js.map +1 -1
  28. package/dist/app/commands/catalog.js +10 -0
  29. package/dist/app/commands/catalog.js.map +1 -1
  30. package/dist/app/commands/registry.js +1 -0
  31. package/dist/app/commands/registry.js.map +1 -1
  32. package/dist/app/controllers/session-compact-helper.js +3 -6
  33. package/dist/app/controllers/session-compact-helper.js.map +1 -1
  34. package/dist/app/ports/transcript-item.d.ts +4 -0
  35. package/dist/classic/app/ClassicApp.js +1 -1
  36. package/dist/classic/app/ClassicApp.js.map +1 -1
  37. package/dist/classic/app/action-handlers.js +4 -0
  38. package/dist/classic/app/action-handlers.js.map +1 -1
  39. package/dist/classic/app/app-wiring.js +1 -0
  40. package/dist/classic/app/app-wiring.js.map +1 -1
  41. package/dist/classic/app/wiring-lifecycle.js +1 -0
  42. package/dist/classic/app/wiring-lifecycle.js.map +1 -1
  43. package/dist/classic/blocks/compacted-lines.js +3 -0
  44. package/dist/classic/blocks/compacted-lines.js.map +1 -1
  45. package/dist/classic/blocks/thinking-lines.js +11 -2
  46. package/dist/classic/blocks/thinking-lines.js.map +1 -1
  47. package/dist/classic/bootstrap/start-classic.d.ts +1 -0
  48. package/dist/classic/bootstrap/start-classic.js +16 -0
  49. package/dist/classic/bootstrap/start-classic.js.map +1 -1
  50. package/dist/classic/chrome/Composer.d.ts +6 -0
  51. package/dist/classic/chrome/Composer.js +2 -3
  52. package/dist/classic/chrome/Composer.js.map +1 -1
  53. package/dist/classic/chrome/composer-controller.d.ts +6 -1
  54. package/dist/classic/chrome/composer-controller.js +18 -8
  55. package/dist/classic/chrome/composer-controller.js.map +1 -1
  56. package/dist/classic/chrome/editor-view.d.ts +2 -1
  57. package/dist/classic/chrome/editor-view.js +1 -1
  58. package/dist/classic/chrome/editor-view.js.map +1 -1
  59. package/dist/classic/chrome/status-rows.js +3 -2
  60. package/dist/classic/chrome/status-rows.js.map +1 -1
  61. package/dist/classic/panels/TextEditorPanel.d.ts +3 -0
  62. package/dist/classic/panels/TextEditorPanel.js +7 -0
  63. package/dist/classic/panels/TextEditorPanel.js.map +1 -0
  64. package/dist/classic/panels/panel-controller.js +28 -1
  65. package/dist/classic/panels/panel-controller.js.map +1 -1
  66. package/dist/classic/panels/panel-effect.d.ts +3 -0
  67. package/dist/classic/panels/panel-effect.js.map +1 -1
  68. package/dist/classic/panels/panel-effects.js +3 -0
  69. package/dist/classic/panels/panel-effects.js.map +1 -1
  70. package/dist/classic/panels/panel-host.js +3 -0
  71. package/dist/classic/panels/panel-host.js.map +1 -1
  72. package/dist/classic/panels/panel-types.d.ts +2 -0
  73. package/dist/classic/panels/secret-panel.d.ts +1 -1
  74. package/dist/classic/panels/secret-panel.js +4 -2
  75. package/dist/classic/panels/secret-panel.js.map +1 -1
  76. package/dist/classic/panels/text-editor-panel.d.ts +33 -0
  77. package/dist/classic/panels/text-editor-panel.js +101 -0
  78. package/dist/classic/panels/text-editor-panel.js.map +1 -0
  79. package/dist/index.js +60 -7
  80. package/dist/index.js.map +1 -1
  81. package/dist/interactive-session/transport-node-pty.d.ts +10 -1
  82. package/dist/interactive-session/transport-node-pty.js +36 -12
  83. package/dist/interactive-session/transport-node-pty.js.map +1 -1
  84. package/dist/llm/adapters/anthropic-tools.d.ts +2 -1
  85. package/dist/llm/adapters/anthropic-tools.js +55 -4
  86. package/dist/llm/adapters/anthropic-tools.js.map +1 -1
  87. package/dist/llm/anthropic.js +1 -1
  88. package/dist/llm/anthropic.js.map +1 -1
  89. package/dist/llm/aws-mantle.js +2 -0
  90. package/dist/llm/aws-mantle.js.map +1 -1
  91. package/dist/llm/meta.js +62 -68
  92. package/dist/llm/meta.js.map +1 -1
  93. package/dist/llm/operation-ledger.js +6 -2
  94. package/dist/llm/operation-ledger.js.map +1 -1
  95. package/dist/llm/provider.js +7 -7
  96. package/dist/llm/request-plan.js +7 -2
  97. package/dist/llm/request-plan.js.map +1 -1
  98. package/dist/llm/tool-protocol.d.ts +1 -0
  99. package/dist/llm/tool-protocol.js +7 -0
  100. package/dist/llm/tool-protocol.js.map +1 -1
  101. package/dist/mcp/client.d.ts +27 -0
  102. package/dist/mcp/client.js +119 -0
  103. package/dist/mcp/client.js.map +1 -0
  104. package/dist/mcp/config-file.d.ts +35 -0
  105. package/dist/mcp/config-file.js +217 -0
  106. package/dist/mcp/config-file.js.map +1 -0
  107. package/dist/mcp/discovery.d.ts +4 -0
  108. package/dist/mcp/discovery.js +409 -0
  109. package/dist/mcp/discovery.js.map +1 -0
  110. package/dist/mcp/format.d.ts +17 -0
  111. package/dist/mcp/format.js +122 -0
  112. package/dist/mcp/format.js.map +1 -0
  113. package/dist/mcp/index.d.ts +15 -0
  114. package/dist/mcp/index.js +16 -0
  115. package/dist/mcp/index.js.map +1 -0
  116. package/dist/mcp/jsonrpc.d.ts +40 -0
  117. package/dist/mcp/jsonrpc.js +175 -0
  118. package/dist/mcp/jsonrpc.js.map +1 -0
  119. package/dist/mcp/manager.d.ts +36 -0
  120. package/dist/mcp/manager.js +300 -0
  121. package/dist/mcp/manager.js.map +1 -0
  122. package/dist/mcp/mentions.d.ts +9 -0
  123. package/dist/mcp/mentions.js +44 -0
  124. package/dist/mcp/mentions.js.map +1 -0
  125. package/dist/mcp/names.d.ts +15 -0
  126. package/dist/mcp/names.js +59 -0
  127. package/dist/mcp/names.js.map +1 -0
  128. package/dist/mcp/results.d.ts +6 -0
  129. package/dist/mcp/results.js +182 -0
  130. package/dist/mcp/results.js.map +1 -0
  131. package/dist/mcp/runtime.d.ts +107 -0
  132. package/dist/mcp/runtime.js +505 -0
  133. package/dist/mcp/runtime.js.map +1 -0
  134. package/dist/mcp/substitution.d.ts +13 -0
  135. package/dist/mcp/substitution.js +74 -0
  136. package/dist/mcp/substitution.js.map +1 -0
  137. package/dist/mcp/transport-http.d.ts +53 -0
  138. package/dist/mcp/transport-http.js +433 -0
  139. package/dist/mcp/transport-http.js.map +1 -0
  140. package/dist/mcp/transport-stdio.d.ts +39 -0
  141. package/dist/mcp/transport-stdio.js +268 -0
  142. package/dist/mcp/transport-stdio.js.map +1 -0
  143. package/dist/mcp/transport.d.ts +20 -0
  144. package/dist/mcp/transport.js +44 -0
  145. package/dist/mcp/transport.js.map +1 -0
  146. package/dist/mcp/types.d.ts +179 -0
  147. package/dist/mcp/types.js +30 -0
  148. package/dist/mcp/types.js.map +1 -0
  149. package/dist/mcp/validation.d.ts +16 -0
  150. package/dist/mcp/validation.js +222 -0
  151. package/dist/mcp/validation.js.map +1 -0
  152. package/dist/modes/agent.d.ts +2 -0
  153. package/dist/modes/agent.js.map +1 -1
  154. package/dist/noninteractive/start-noninteractive.js +4 -0
  155. package/dist/noninteractive/start-noninteractive.js.map +1 -1
  156. package/dist/prompts/embedded.js +2 -2
  157. package/dist/prompts/embedded.js.map +1 -1
  158. package/dist/prompts/index.d.ts +3 -0
  159. package/dist/prompts/index.js +70 -55
  160. package/dist/prompts/index.js.map +1 -1
  161. package/dist/prompts/system.agent.md +34 -10
  162. package/dist/prompts/system.ask.md +8 -0
  163. package/dist/safety/classifier.js +4 -0
  164. package/dist/safety/classifier.js.map +1 -1
  165. package/dist/session-runtime/binding.d.ts +5 -0
  166. package/dist/session-runtime/binding.js +28 -0
  167. package/dist/session-runtime/binding.js.map +1 -0
  168. package/dist/session-runtime/child-bridge.d.ts +31 -0
  169. package/dist/session-runtime/child-bridge.js +169 -0
  170. package/dist/session-runtime/child-bridge.js.map +1 -0
  171. package/dist/session-runtime/client.d.ts +8 -0
  172. package/dist/session-runtime/client.js +448 -0
  173. package/dist/session-runtime/client.js.map +1 -0
  174. package/dist/session-runtime/discovery.d.ts +6 -0
  175. package/dist/session-runtime/discovery.js +100 -0
  176. package/dist/session-runtime/discovery.js.map +1 -0
  177. package/dist/session-runtime/host.d.ts +77 -0
  178. package/dist/session-runtime/host.js +758 -0
  179. package/dist/session-runtime/host.js.map +1 -0
  180. package/dist/session-runtime/launch.d.ts +11 -0
  181. package/dist/session-runtime/launch.js +68 -0
  182. package/dist/session-runtime/launch.js.map +1 -0
  183. package/dist/session-runtime/paths.d.ts +8 -0
  184. package/dist/session-runtime/paths.js +92 -0
  185. package/dist/session-runtime/paths.js.map +1 -0
  186. package/dist/session-runtime/protocol.d.ts +22 -0
  187. package/dist/session-runtime/protocol.js +149 -0
  188. package/dist/session-runtime/protocol.js.map +1 -0
  189. package/dist/session-runtime/replay-buffer.d.ts +12 -0
  190. package/dist/session-runtime/replay-buffer.js +50 -0
  191. package/dist/session-runtime/replay-buffer.js.map +1 -0
  192. package/dist/session-runtime/store.d.ts +14 -0
  193. package/dist/session-runtime/store.js +143 -0
  194. package/dist/session-runtime/store.js.map +1 -0
  195. package/dist/session-runtime/types.d.ts +102 -0
  196. package/dist/session-runtime/types.js +2 -0
  197. package/dist/session-runtime/types.js.map +1 -0
  198. package/dist/store/logs.js +17 -6
  199. package/dist/store/logs.js.map +1 -1
  200. package/dist/store/plan.d.ts +2 -0
  201. package/dist/store/plan.js.map +1 -1
  202. package/dist/store/session-workspace.js +2 -1
  203. package/dist/store/session-workspace.js.map +1 -1
  204. package/dist/tools/definitions.js +18 -0
  205. package/dist/tools/definitions.js.map +1 -1
  206. package/dist/tools/external-tools.d.ts +30 -0
  207. package/dist/tools/external-tools.js +52 -0
  208. package/dist/tools/external-tools.js.map +1 -0
  209. package/dist/tools/registry.js +36 -5
  210. package/dist/tools/registry.js.map +1 -1
  211. package/dist/tui-v2/bootstrap/start-tui-v2.d.ts +1 -0
  212. package/dist/tui-v2/bootstrap/start-tui-v2.js +16 -0
  213. package/dist/tui-v2/bootstrap/start-tui-v2.js.map +1 -1
  214. package/dist/tui-v2/components/completion/completion-menu.d.ts +4 -6
  215. package/dist/tui-v2/components/completion/completion-menu.js +34 -16
  216. package/dist/tui-v2/components/completion/completion-menu.js.map +1 -1
  217. package/dist/tui-v2/components/composer/composer-input-box.js +3 -1
  218. package/dist/tui-v2/components/composer/composer-input-box.js.map +1 -1
  219. package/dist/tui-v2/components/modal/secret-modal.js +6 -4
  220. package/dist/tui-v2/components/modal/secret-modal.js.map +1 -1
  221. package/dist/tui-v2/components/modal/text-editor-modal.d.ts +19 -0
  222. package/dist/tui-v2/components/modal/text-editor-modal.js +85 -0
  223. package/dist/tui-v2/components/modal/text-editor-modal.js.map +1 -0
  224. package/dist/tui-v2/components/overlay/overlay-host.js +2 -1
  225. package/dist/tui-v2/components/overlay/overlay-host.js.map +1 -1
  226. package/dist/tui-v2/components/transcript/compacted-row.js +12 -3
  227. package/dist/tui-v2/components/transcript/compacted-row.js.map +1 -1
  228. package/dist/tui-v2/components/transcript/thinking-block.d.ts +9 -1
  229. package/dist/tui-v2/components/transcript/thinking-block.js +253 -49
  230. package/dist/tui-v2/components/transcript/thinking-block.js.map +1 -1
  231. package/dist/tui-v2/components/transcript/thinking-presentation.d.ts +46 -0
  232. package/dist/tui-v2/components/transcript/thinking-presentation.js +84 -0
  233. package/dist/tui-v2/components/transcript/thinking-presentation.js.map +1 -0
  234. package/dist/tui-v2/components/transcript/transcript-row.d.ts +2 -0
  235. package/dist/tui-v2/components/transcript/transcript-row.js +7 -2
  236. package/dist/tui-v2/components/transcript/transcript-row.js.map +1 -1
  237. package/dist/tui-v2/components/transcript/transcript-view.js +195 -83
  238. package/dist/tui-v2/components/transcript/transcript-view.js.map +1 -1
  239. package/dist/tui-v2/composer/composer-editor.js +54 -39
  240. package/dist/tui-v2/composer/composer-editor.js.map +1 -1
  241. package/dist/tui-v2/composer/composer-highlight.d.ts +20 -0
  242. package/dist/tui-v2/composer/composer-highlight.js +97 -0
  243. package/dist/tui-v2/composer/composer-highlight.js.map +1 -0
  244. package/dist/tui-v2/composer/textarea-keybindings.d.ts +5 -0
  245. package/dist/tui-v2/composer/textarea-keybindings.js +12 -0
  246. package/dist/tui-v2/composer/textarea-keybindings.js.map +1 -1
  247. package/dist/ui/mentions.js +4 -1
  248. package/dist/ui/mentions.js.map +1 -1
  249. package/dist/ui-core/actions/action-id.d.ts +1 -1
  250. package/dist/ui-core/actions/action-id.js +1 -0
  251. package/dist/ui-core/actions/action-id.js.map +1 -1
  252. package/dist/ui-core/actions/format-shortcuts.js +5 -0
  253. package/dist/ui-core/actions/format-shortcuts.js.map +1 -1
  254. package/dist/ui-core/actions/keymap.js +3 -0
  255. package/dist/ui-core/actions/keymap.js.map +1 -1
  256. package/dist/ui-core/bootstrap/composition-root.d.ts +7 -0
  257. package/dist/ui-core/bootstrap/composition-root.js +7 -1
  258. package/dist/ui-core/bootstrap/composition-root.js.map +1 -1
  259. package/dist/ui-core/commands/command-handlers.js +5 -2
  260. package/dist/ui-core/commands/command-handlers.js.map +1 -1
  261. package/dist/ui-core/commands/config-commands.d.ts +1 -0
  262. package/dist/ui-core/commands/config-commands.js +6 -0
  263. package/dist/ui-core/commands/config-commands.js.map +1 -1
  264. package/dist/ui-core/commands/mcp-commands.d.ts +3 -0
  265. package/dist/ui-core/commands/mcp-commands.js +310 -0
  266. package/dist/ui-core/commands/mcp-commands.js.map +1 -0
  267. package/dist/ui-core/commands/picker-commands.d.ts +1 -1
  268. package/dist/ui-core/commands/picker-commands.js +70 -27
  269. package/dist/ui-core/commands/picker-commands.js.map +1 -1
  270. package/dist/ui-core/commands/session-commands.js +1 -0
  271. package/dist/ui-core/commands/session-commands.js.map +1 -1
  272. package/dist/ui-core/composer/completion-viewport.d.ts +40 -0
  273. package/dist/ui-core/composer/completion-viewport.js +105 -0
  274. package/dist/ui-core/composer/completion-viewport.js.map +1 -0
  275. package/dist/ui-core/controllers/overlay-controller.d.ts +24 -3
  276. package/dist/ui-core/controllers/overlay-controller.js +35 -4
  277. package/dist/ui-core/controllers/overlay-controller.js.map +1 -1
  278. package/dist/ui-core/rendering/artifact-pager-source.d.ts +1 -0
  279. package/dist/ui-core/rendering/artifact-pager-source.js +67 -1
  280. package/dist/ui-core/rendering/artifact-pager-source.js.map +1 -1
  281. package/dist/ui-core/rendering/duration.d.ts +3 -1
  282. package/dist/ui-core/rendering/duration.js +14 -0
  283. package/dist/ui-core/rendering/duration.js.map +1 -1
  284. package/dist/ui-core/rendering/exit-summary.js +4 -4
  285. package/dist/ui-core/rendering/format-help.js +4 -0
  286. package/dist/ui-core/rendering/format-help.js.map +1 -1
  287. package/dist/ui-core/rendering/intro-header.js +4 -4
  288. package/dist/ui-core/rendering/open-tool-output.js +90 -32
  289. package/dist/ui-core/rendering/open-tool-output.js.map +1 -1
  290. package/dist/ui-core/rendering/theme.d.ts +5 -3
  291. package/dist/ui-core/rendering/theme.js +8 -4
  292. package/dist/ui-core/rendering/theme.js.map +1 -1
  293. package/dist/ui-core/rendering/wordmark.d.ts +2 -2
  294. package/dist/ui-core/rendering/wordmark.js +62 -62
  295. package/dist/ui-core/rendering/wordmark.js.map +1 -1
  296. package/dist/ui-core/state/thinking-copy.d.ts +13 -0
  297. package/dist/ui-core/state/thinking-copy.js +33 -0
  298. package/dist/ui-core/state/thinking-copy.js.map +1 -0
  299. package/dist/ui-core/state/transcript-hydrate.js +20 -0
  300. package/dist/ui-core/state/transcript-hydrate.js.map +1 -1
  301. package/dist/ui-core/state/transcript-reducer.js +140 -62
  302. package/dist/ui-core/state/transcript-reducer.js.map +1 -1
  303. package/dist/ui-core/state/transcript-store.d.ts +10 -0
  304. package/dist/ui-core/state/transcript-store.js +235 -31
  305. package/dist/ui-core/state/transcript-store.js.map +1 -1
  306. package/dist/ui-core/state/transcript-types.d.ts +10 -0
  307. package/dist/ui-core/state/transcript-types.js +1 -0
  308. package/dist/ui-core/state/transcript-types.js.map +1 -1
  309. package/dist/ui-core/state/transcript-window.d.ts +32 -0
  310. package/dist/ui-core/state/transcript-window.js +63 -0
  311. package/dist/ui-core/state/transcript-window.js.map +1 -0
  312. package/dist/version.generated.d.ts +2 -2
  313. package/dist/version.generated.js +2 -2
  314. package/dist/version.generated.js.map +1 -1
  315. package/package.json +1 -1
  316. package/dist/tui-v2/composer/skill-highlight.d.ts +0 -3
  317. package/dist/tui-v2/composer/skill-highlight.js +0 -63
  318. package/dist/tui-v2/composer/skill-highlight.js.map +0 -1
@@ -0,0 +1,448 @@
1
+ import { spawn } from "node:child_process";
2
+ import { randomUUID } from "node:crypto";
3
+ import { resolveResumeTarget } from "../ui-core/bootstrap/session-resume.js";
4
+ import { mintSessionId } from "../app/controllers/session-persistence.js";
5
+ import { probePtyCapability } from "../interactive-session/transport-node-pty.js";
6
+ import { safeCwd } from "../os/cwd.js";
7
+ import { findBunExecutable, isBunRuntime } from "../os/bun-runtime.js";
8
+ import { getConfig } from "../store/config.js";
9
+ import { findLiveRuntime, latestLiveRuntime, probeRuntime, } from "./discovery.js";
10
+ import { RUNTIME_CHILD_ENV, RUNTIME_DISABLE_ENV, RUNTIME_HOST_ENV, RUNTIME_SESSION_ENV, RUNTIME_SOCKET_ENV, RUNTIME_TOKEN_ENV, encodeRuntimeHostPayload, selfLaunchSpec, } from "./launch.js";
11
+ import { JsonFrameChannel, connectRuntimeSocket, readFirstFrame, sendFrame, } from "./protocol.js";
12
+ import { readRuntimeMetadata } from "./store.js";
13
+ import { RUNTIME_PROTOCOL_VERSION, } from "./types.js";
14
+ const START_TIMEOUT_MS = 10_000;
15
+ const DEFAULT_IDLE_TIMEOUT_MS = 30 * 60 * 1_000;
16
+ const MIN_IDLE_TIMEOUT_MS = 60_000;
17
+ const MAX_IDLE_TIMEOUT_MS = 24 * 60 * 60 * 1_000;
18
+ const TERMINAL_RESTORE = "\u001b[?1000l\u001b[?1002l\u001b[?1003l\u001b[?1006l\u001b[?1015l\u001b[?2004l\u001b[?25h\u001b[0m\u001b[?1049l";
19
+ function delay(ms) {
20
+ return new Promise((resolve) => setTimeout(resolve, ms));
21
+ }
22
+ function terminalColumns() {
23
+ return Math.max(20, Math.min(1_000, process.stdout.columns ?? 100));
24
+ }
25
+ function terminalRows() {
26
+ return Math.max(5, Math.min(500, process.stdout.rows ?? 30));
27
+ }
28
+ function idleTimeoutMs() {
29
+ const configured = Number(process.env.CLAI_SESSION_RUNTIME_IDLE_MS);
30
+ if (!Number.isFinite(configured))
31
+ return DEFAULT_IDLE_TIMEOUT_MS;
32
+ return Math.max(MIN_IDLE_TIMEOUT_MS, Math.min(MAX_IDLE_TIMEOUT_MS, Math.floor(configured)));
33
+ }
34
+ function hostFrame(value) {
35
+ if (!value || typeof value !== "object")
36
+ return undefined;
37
+ const frame = value;
38
+ if (frame.type === "switch" && typeof frame.sessionId === "string") {
39
+ return frame;
40
+ }
41
+ if (frame.type === "detached" &&
42
+ typeof frame.sessionId === "string" &&
43
+ ["minimise", "requested", "taken-over", "connection-lost"].includes(String(frame.reason))) {
44
+ return frame;
45
+ }
46
+ if (frame.type === "exit" && typeof frame.exitCode === "number") {
47
+ return frame;
48
+ }
49
+ if (frame.type === "pong")
50
+ return frame;
51
+ return undefined;
52
+ }
53
+ function isAck(value) {
54
+ if (!value || typeof value !== "object")
55
+ return false;
56
+ const frame = value;
57
+ return (frame.version === RUNTIME_PROTOCOL_VERSION &&
58
+ frame.type === "ack" &&
59
+ typeof frame.sessionId === "string");
60
+ }
61
+ async function openChannel(metadata, role, clientId) {
62
+ const socket = await connectRuntimeSocket(metadata.socketPath);
63
+ sendFrame(socket, {
64
+ version: RUNTIME_PROTOCOL_VERSION,
65
+ type: "auth",
66
+ role,
67
+ token: metadata.token,
68
+ clientId,
69
+ });
70
+ const first = await readFirstFrame(socket);
71
+ if (!isAck(first.value)) {
72
+ socket.destroy();
73
+ throw new Error("session runtime rejected the client connection");
74
+ }
75
+ return { socket, first };
76
+ }
77
+ function childEnvironment(payload) {
78
+ const env = { ...process.env };
79
+ delete env[RUNTIME_CHILD_ENV];
80
+ delete env[RUNTIME_SOCKET_ENV];
81
+ delete env[RUNTIME_TOKEN_ENV];
82
+ delete env[RUNTIME_SESSION_ENV];
83
+ env[RUNTIME_HOST_ENV] = payload;
84
+ return env;
85
+ }
86
+ function brokerLaunch(entryPath) {
87
+ if (!isBunRuntime() && process.platform !== "win32") {
88
+ const bun = findBunExecutable();
89
+ if (bun)
90
+ return { file: bun, args: [entryPath] };
91
+ }
92
+ return selfLaunchSpec(entryPath, []);
93
+ }
94
+ async function startRuntimeHost(options, target) {
95
+ const childArgs = [
96
+ ...options.childArgs,
97
+ ...(target.resumeId ? ["--resume", target.resumeId] : []),
98
+ ...(target.resumeLatest ? ["--continue"] : []),
99
+ ];
100
+ const childLaunch = selfLaunchSpec(options.entryPath, childArgs);
101
+ const payload = {
102
+ version: RUNTIME_PROTOCOL_VERSION,
103
+ sessionId: target.sessionId,
104
+ cwd: safeCwd(),
105
+ launch: childLaunch,
106
+ columns: terminalColumns(),
107
+ rows: terminalRows(),
108
+ idleTimeoutMs: idleTimeoutMs(),
109
+ };
110
+ const hostLaunch = brokerLaunch(options.entryPath);
111
+ const child = spawn(hostLaunch.file, [...hostLaunch.args], {
112
+ cwd: payload.cwd,
113
+ env: childEnvironment(encodeRuntimeHostPayload(payload)),
114
+ detached: true,
115
+ stdio: "ignore",
116
+ windowsHide: true,
117
+ });
118
+ let launchError;
119
+ child.once("error", (error) => {
120
+ launchError = error;
121
+ });
122
+ child.unref();
123
+ let ready = false;
124
+ try {
125
+ const deadline = Date.now() + START_TIMEOUT_MS;
126
+ while (Date.now() < deadline) {
127
+ if (launchError)
128
+ throw launchError;
129
+ const metadata = await readRuntimeMetadata(target.sessionId);
130
+ if (metadata?.phase === "failed") {
131
+ throw new Error(metadata.error ?? "session runtime failed to start");
132
+ }
133
+ if (metadata?.phase === "running" &&
134
+ (await probeRuntime(metadata))) {
135
+ ready = true;
136
+ return metadata;
137
+ }
138
+ const winner = await findLiveRuntime(target.sessionId).catch(() => undefined);
139
+ if (winner?.phase === "running") {
140
+ ready = true;
141
+ return winner;
142
+ }
143
+ await delay(50);
144
+ }
145
+ throw new Error("session runtime did not become ready within 10 seconds");
146
+ }
147
+ finally {
148
+ if (!ready && child.pid && child.exitCode === null && !child.killed) {
149
+ child.kill("SIGTERM");
150
+ }
151
+ }
152
+ }
153
+ async function ensureRuntime(options, target) {
154
+ const existing = await findLiveRuntime(target.sessionId);
155
+ if (existing?.phase === "failed") {
156
+ throw new Error(existing.error ?? "session runtime failed");
157
+ }
158
+ return existing ?? (await startRuntimeHost(options, target));
159
+ }
160
+ async function initialTarget(resume) {
161
+ if (!resume)
162
+ return { sessionId: mintSessionId() };
163
+ if (resume.kind === "latest") {
164
+ const live = await latestLiveRuntime(safeCwd());
165
+ if (live)
166
+ return { sessionId: live.sessionId };
167
+ const resolved = await resolveResumeTarget(resume);
168
+ if (resolved.record) {
169
+ return { sessionId: resolved.record.id, resumeId: resolved.record.id };
170
+ }
171
+ return { sessionId: mintSessionId(), resumeLatest: true };
172
+ }
173
+ const live = await findLiveRuntime(resume.id);
174
+ if (live)
175
+ return { sessionId: live.sessionId };
176
+ const resolved = await resolveResumeTarget(resume);
177
+ if (resolved.record) {
178
+ return { sessionId: resolved.record.id, resumeId: resolved.record.id };
179
+ }
180
+ return { sessionId: mintSessionId(), resumeId: resume.id };
181
+ }
182
+ async function switchTarget(sessionId) {
183
+ const live = await findLiveRuntime(sessionId);
184
+ if (live)
185
+ return { sessionId: live.sessionId };
186
+ const resolved = await resolveResumeTarget({ kind: "id", id: sessionId });
187
+ if (!resolved.record) {
188
+ throw new Error(resolved.error ?? `session ${sessionId} is unavailable`);
189
+ }
190
+ return { sessionId: resolved.record.id, resumeId: resolved.record.id };
191
+ }
192
+ function writeOutput(bytes) {
193
+ process.stdout.write(bytes);
194
+ }
195
+ function waitForTerminalEnd(socket, timeoutMs = 3_000) {
196
+ if (socket.destroyed || socket.readableEnded)
197
+ return Promise.resolve();
198
+ return new Promise((resolve) => {
199
+ let settled = false;
200
+ const finish = () => {
201
+ if (settled)
202
+ return;
203
+ settled = true;
204
+ clearTimeout(timer);
205
+ socket.off("end", finish);
206
+ socket.off("close", finish);
207
+ resolve();
208
+ };
209
+ const timer = setTimeout(finish, timeoutMs);
210
+ timer.unref?.();
211
+ socket.once("end", finish);
212
+ socket.once("close", finish);
213
+ });
214
+ }
215
+ function waitForStdoutDrain(timeoutMs = 1_000) {
216
+ if (!process.stdout.writableNeedDrain)
217
+ return Promise.resolve();
218
+ return new Promise((resolve) => {
219
+ let settled = false;
220
+ const finish = () => {
221
+ if (settled)
222
+ return;
223
+ settled = true;
224
+ clearTimeout(timer);
225
+ process.stdout.off("drain", finish);
226
+ resolve();
227
+ };
228
+ const timer = setTimeout(finish, timeoutMs);
229
+ timer.unref?.();
230
+ process.stdout.once("drain", finish);
231
+ });
232
+ }
233
+ function restoreTerminal(previousRaw) {
234
+ const stdin = process.stdin;
235
+ stdin.setRawMode?.(previousRaw ?? false);
236
+ process.stdout.write(TERMINAL_RESTORE);
237
+ }
238
+ async function attachRuntime(metadata) {
239
+ const clientId = `${process.pid}-${randomUUID()}`;
240
+ const controlConnection = await openChannel(metadata, "client-control", clientId);
241
+ let terminalConnection;
242
+ try {
243
+ terminalConnection = await openChannel(metadata, "client-terminal", clientId);
244
+ }
245
+ catch (error) {
246
+ controlConnection.socket.destroy();
247
+ throw error;
248
+ }
249
+ const control = controlConnection.socket;
250
+ const terminal = terminalConnection.socket;
251
+ let settled = false;
252
+ let exitPending = false;
253
+ let previousRaw;
254
+ let channel;
255
+ let resolveOutcome;
256
+ const outcome = new Promise((resolve) => {
257
+ resolveOutcome = resolve;
258
+ });
259
+ const settle = (value) => {
260
+ if (settled)
261
+ return;
262
+ settled = true;
263
+ resolveOutcome?.(value);
264
+ };
265
+ const receive = (value) => {
266
+ const frame = hostFrame(value);
267
+ if (!frame || frame.type === "pong")
268
+ return;
269
+ if (frame.type === "switch") {
270
+ settle({ kind: "switch", sessionId: frame.sessionId });
271
+ return;
272
+ }
273
+ if (frame.type === "detached") {
274
+ settle({
275
+ kind: "detach",
276
+ reason: frame.reason,
277
+ sessionId: frame.sessionId,
278
+ });
279
+ return;
280
+ }
281
+ if (frame.type === "exit" && !exitPending) {
282
+ exitPending = true;
283
+ void (async () => {
284
+ await waitForTerminalEnd(terminal);
285
+ await waitForStdoutDrain();
286
+ settle({ kind: "exit", exitCode: frame.exitCode });
287
+ })();
288
+ }
289
+ };
290
+ channel = new JsonFrameChannel(control, receive, () => {
291
+ if (exitPending)
292
+ return;
293
+ settle({
294
+ kind: "detach",
295
+ reason: "connection-lost",
296
+ sessionId: metadata.sessionId,
297
+ });
298
+ }, controlConnection.first.rest);
299
+ control.once("close", () => {
300
+ setTimeout(() => {
301
+ if (!settled && !exitPending) {
302
+ settle({
303
+ kind: "detach",
304
+ reason: "connection-lost",
305
+ sessionId: metadata.sessionId,
306
+ });
307
+ }
308
+ }, 30).unref?.();
309
+ });
310
+ const stdin = process.stdin;
311
+ previousRaw = stdin.isRaw;
312
+ stdin.setRawMode?.(true);
313
+ stdin.resume();
314
+ const onInput = (bytes) => {
315
+ if (!terminal.write(bytes))
316
+ stdin.pause();
317
+ };
318
+ const onTerminalDrain = () => {
319
+ stdin.resume();
320
+ };
321
+ const onTerminalError = () => {
322
+ if (exitPending)
323
+ return;
324
+ settle({
325
+ kind: "detach",
326
+ reason: "connection-lost",
327
+ sessionId: metadata.sessionId,
328
+ });
329
+ };
330
+ const onOutput = (bytes) => {
331
+ if (!process.stdout.write(bytes))
332
+ terminal.pause();
333
+ };
334
+ const onStdoutDrain = () => {
335
+ terminal.resume();
336
+ };
337
+ const onInputEnd = () => {
338
+ settle({
339
+ kind: "detach",
340
+ reason: "connection-lost",
341
+ sessionId: metadata.sessionId,
342
+ });
343
+ };
344
+ const sendResize = () => {
345
+ channel?.send({
346
+ type: "resize",
347
+ columns: terminalColumns(),
348
+ rows: terminalRows(),
349
+ });
350
+ };
351
+ const onTerminate = () => onInputEnd();
352
+ stdin.on("data", onInput);
353
+ stdin.once("end", onInputEnd);
354
+ terminal.on("drain", onTerminalDrain);
355
+ terminal.on("error", onTerminalError);
356
+ terminal.on("data", onOutput);
357
+ process.stdout.on("drain", onStdoutDrain);
358
+ process.on("SIGWINCH", sendResize);
359
+ process.on("SIGHUP", onTerminate);
360
+ process.on("SIGTERM", onTerminate);
361
+ if (terminalConnection.first.rest.length > 0) {
362
+ writeOutput(terminalConnection.first.rest);
363
+ }
364
+ terminal.resume();
365
+ sendResize();
366
+ try {
367
+ return await outcome;
368
+ }
369
+ finally {
370
+ channel.dispose();
371
+ stdin.off("data", onInput);
372
+ stdin.off("end", onInputEnd);
373
+ terminal.off("drain", onTerminalDrain);
374
+ terminal.off("error", onTerminalError);
375
+ terminal.off("data", onOutput);
376
+ process.stdout.off("drain", onStdoutDrain);
377
+ process.off("SIGWINCH", sendResize);
378
+ process.off("SIGHUP", onTerminate);
379
+ process.off("SIGTERM", onTerminate);
380
+ control.destroy();
381
+ terminal.destroy();
382
+ stdin.pause();
383
+ restoreTerminal(previousRaw);
384
+ }
385
+ }
386
+ function reportDetach(outcome) {
387
+ const resume = `clai --resume ${outcome.sessionId}`;
388
+ if (outcome.reason === "minimise" || outcome.reason === "requested") {
389
+ process.stdout.write(`\nSession ${outcome.sessionId} is running in the background.\nReattach with: ${resume}\n`);
390
+ return;
391
+ }
392
+ if (outcome.reason === "taken-over") {
393
+ process.stdout.write(`\nSession ${outcome.sessionId} was attached from another terminal.\n`);
394
+ return;
395
+ }
396
+ process.stdout.write(`\nConnection to session ${outcome.sessionId} closed. Reattach with: ${resume}\n`);
397
+ }
398
+ function runtimeEligible(options) {
399
+ return (process.env[RUNTIME_CHILD_ENV] !== "1" &&
400
+ process.env[RUNTIME_HOST_ENV] === undefined &&
401
+ process.env[RUNTIME_DISABLE_ENV] !== "1" &&
402
+ options.noHistory !== true &&
403
+ !getConfig().privateMode &&
404
+ Boolean(process.stdin.isTTY && process.stdout.isTTY));
405
+ }
406
+ function runtimeFallbackMessage(error) {
407
+ const detail = error instanceof Error ? error.message : String(error);
408
+ const compact = detail.replace(/\s+/g, " ").trim().slice(0, 300);
409
+ return compact || "unknown runtime error";
410
+ }
411
+ export async function tryRunDurableInteractive(options) {
412
+ if (!runtimeEligible(options))
413
+ return false;
414
+ try {
415
+ const capability = await probePtyCapability();
416
+ if (!capability.available)
417
+ return false;
418
+ let target = await initialTarget(options.resume);
419
+ for (;;) {
420
+ const metadata = await ensureRuntime(options, target);
421
+ const outcome = await attachRuntime(metadata);
422
+ if (outcome.kind === "switch") {
423
+ try {
424
+ target = await switchTarget(outcome.sessionId);
425
+ }
426
+ catch (error) {
427
+ const current = await findLiveRuntime(metadata.sessionId).catch(() => undefined);
428
+ if (!current)
429
+ throw error;
430
+ process.stderr.write(`Unable to switch sessions (${runtimeFallbackMessage(error)}); reattaching the current session.\n`);
431
+ target = { sessionId: current.sessionId };
432
+ }
433
+ continue;
434
+ }
435
+ if (outcome.kind === "exit") {
436
+ process.exitCode = outcome.exitCode;
437
+ return true;
438
+ }
439
+ reportDetach(outcome);
440
+ return true;
441
+ }
442
+ }
443
+ catch (error) {
444
+ process.stderr.write(`Durable session runtime unavailable (${runtimeFallbackMessage(error)}); using foreground mode.\n`);
445
+ return false;
446
+ }
447
+ }
448
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/session-runtime/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,8CAA8C,CAAC;AAClF,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,YAAY,GACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,wBAAwB,EACxB,cAAc,GACf,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,SAAS,GACV,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EACL,wBAAwB,GAKzB,MAAM,YAAY,CAAC;AAEpB,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAChC,MAAM,uBAAuB,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;AAChD,MAAM,mBAAmB,GAAG,MAAM,CAAC;AACnC,MAAM,mBAAmB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;AACjD,MAAM,gBAAgB,GACpB,iHAAiH,CAAC;AAwBpH,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,eAAe;IACtB,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,YAAY;IACnB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,aAAa;IACpB,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IACpE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,uBAAuB,CAAC;IACjE,OAAO,IAAI,CAAC,GAAG,CACb,mBAAmB,EACnB,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CACtD,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC1D,MAAM,KAAK,GAAG,KAAkC,CAAC;IACjD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QACnE,OAAO,KAAyB,CAAC;IACnC,CAAC;IACD,IACE,KAAK,CAAC,IAAI,KAAK,UAAU;QACzB,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;QACnC,CAAC,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,iBAAiB,CAAC,CAAC,QAAQ,CACjE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CACrB,EACD,CAAC;QACD,OAAO,KAAyB,CAAC;IACnC,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAChE,OAAO,KAAyB,CAAC;IACnC,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,KAAyB,CAAC;IAC5D,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,KAAK,CAAC,KAAc;IAC3B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,KAAK,GAAG,KAAiC,CAAC;IAChD,OAAO,CACL,KAAK,CAAC,OAAO,KAAK,wBAAwB;QAC1C,KAAK,CAAC,IAAI,KAAK,KAAK;QACpB,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,CACpC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,QAAyB,EACzB,IAA0C,EAC1C,QAAgB;IAEhB,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC/D,SAAS,CAAC,MAAM,EAAE;QAChB,OAAO,EAAE,wBAAwB;QACjC,IAAI,EAAE,MAAM;QACZ,IAAI;QACJ,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,QAAQ;KACT,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAC3B,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe;IACvC,MAAM,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/B,OAAO,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC9B,OAAO,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAC/B,OAAO,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC9B,OAAO,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAChC,GAAG,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC;IAChC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,YAAY,CAAC,SAAiB;IACrC,IAAI,CAAC,YAAY,EAAE,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACpD,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;QAChC,IAAI,GAAG;YAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC;IACnD,CAAC;IACD,OAAO,cAAc,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,OAAkC,EAClC,MAAqB;IAErB,MAAM,SAAS,GAAG;QAChB,GAAG,OAAO,CAAC,SAAS;QACpB,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/C,CAAC;IACF,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACjE,MAAM,OAAO,GAAuB;QAClC,OAAO,EAAE,wBAAwB;QACjC,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,GAAG,EAAE,OAAO,EAAE;QACd,MAAM,EAAE,WAAW;QACnB,OAAO,EAAE,eAAe,EAAE;QAC1B,IAAI,EAAE,YAAY,EAAE;QACpB,aAAa,EAAE,aAAa,EAAE;KAC/B,CAAC;IACF,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE;QACzD,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,GAAG,EAAE,gBAAgB,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;QACxD,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,IAAI;KAClB,CAAC,CAAC;IACH,IAAI,WAA8B,CAAC;IACnC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QAC5B,WAAW,GAAG,KAAK,CAAC;IACtB,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,KAAK,EAAE,CAAC;IAEd,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,gBAAgB,CAAC;QAC/C,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;YAC7B,IAAI,WAAW;gBAAE,MAAM,WAAW,CAAC;YACnC,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC7D,IAAI,QAAQ,EAAE,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACjC,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,iCAAiC,CAAC,CAAC;YACvE,CAAC;YACD,IACE,QAAQ,EAAE,KAAK,KAAK,SAAS;gBAC7B,CAAC,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC,EAC9B,CAAC;gBACD,KAAK,GAAG,IAAI,CAAC;gBACb,OAAO,QAAQ,CAAC;YAClB,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAC9E,IAAI,MAAM,EAAE,KAAK,KAAK,SAAS,EAAE,CAAC;gBAChC,KAAK,GAAG,IAAI,CAAC;gBACb,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;YAAS,CAAC;QACT,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACpE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,OAAkC,EAClC,MAAqB;IAErB,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACzD,IAAI,QAAQ,EAAE,KAAK,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,wBAAwB,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,QAAQ,IAAI,CAAC,MAAM,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,MAAgC;IAEhC,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,EAAE,CAAC;IACnD,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,OAAO,EAAE,CAAC,CAAC;QAChD,IAAI,IAAI;YAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACnD,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACpB,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACzE,CAAC;QACD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;IAC5D,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC9C,IAAI,IAAI;QAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;IAC/C,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACnD,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;QACpB,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;IACzE,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;AAC7D,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,SAAiB;IAC3C,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC;IAC9C,IAAI,IAAI;QAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;IAC/C,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IAC1E,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,WAAW,SAAS,iBAAiB,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;AACzE,CAAC;AAED,SAAS,WAAW,CAAC,KAAiB;IACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAc,EAAE,SAAS,GAAG,KAAK;IAC3D,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,aAAa;QAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IACvE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,MAAM,GAAG,GAAS,EAAE;YACxB,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAC1B,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC5B,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QACF,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC5C,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CAAC,SAAS,GAAG,KAAK;IAC3C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,iBAAiB;QAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAChE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,MAAM,GAAG,GAAS,EAAE;YACxB,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACpC,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QACF,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC5C,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;QAChB,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CAAC,WAAgC;IACvD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5B,KAAK,CAAC,UAAU,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,CAAC;IACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;AACzC,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,QAAyB;IACpD,MAAM,QAAQ,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,UAAU,EAAE,EAAE,CAAC;IAClD,MAAM,iBAAiB,GAAG,MAAM,WAAW,CACzC,QAAQ,EACR,gBAAgB,EAChB,QAAQ,CACT,CAAC;IACF,IAAI,kBAA2D,CAAC;IAChE,IAAI,CAAC;QACH,kBAAkB,GAAG,MAAM,WAAW,CACpC,QAAQ,EACR,iBAAiB,EACjB,QAAQ,CACT,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,iBAAiB,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACnC,MAAM,KAAK,CAAC;IACd,CAAC;IACD,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC;IACzC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC;IAC3C,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,WAAgC,CAAC;IACrC,IAAI,OAAqC,CAAC;IAC1C,IAAI,cAA4D,CAAC;IACjE,MAAM,OAAO,GAAG,IAAI,OAAO,CAAgB,CAAC,OAAO,EAAE,EAAE;QACrD,cAAc,GAAG,OAAO,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,CAAC,KAAoB,EAAQ,EAAE;QAC5C,IAAI,OAAO;YAAE,OAAO;QACpB,OAAO,GAAG,IAAI,CAAC;QACf,cAAc,EAAE,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,CAAC,KAAc,EAAQ,EAAE;QACvC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO;QAC5C,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;YACvD,OAAO;QACT,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC9B,MAAM,CAAC;gBACL,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,SAAS,EAAE,KAAK,CAAC,SAAS;aAC3B,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;YAC1C,WAAW,GAAG,IAAI,CAAC;YACnB,KAAK,CAAC,KAAK,IAAI,EAAE;gBACf,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;gBACnC,MAAM,kBAAkB,EAAE,CAAC;gBAC3B,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;YACrD,CAAC,CAAC,EAAE,CAAC;QACP,CAAC;IACH,CAAC,CAAC;IACF,OAAO,GAAG,IAAI,gBAAgB,CAC5B,OAAO,EACP,OAAO,EACP,GAAG,EAAE;QACH,IAAI,WAAW;YAAE,OAAO;QACxB,MAAM,CAAC;YACL,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,iBAAiB;YACzB,SAAS,EAAE,QAAQ,CAAC,SAAS;SAC9B,CAAC,CAAC;IACL,CAAC,EACD,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAC7B,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;QACzB,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,CAAC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;gBAC7B,MAAM,CAAC;oBACL,IAAI,EAAE,QAAQ;oBACd,MAAM,EAAE,iBAAiB;oBACzB,SAAS,EAAE,QAAQ,CAAC,SAAS;iBAC9B,CAAC,CAAC;YACL,CAAC;QACH,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5B,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,KAAK,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC;IACzB,KAAK,CAAC,MAAM,EAAE,CAAC;IACf,MAAM,OAAO,GAAG,CAAC,KAAa,EAAQ,EAAE;QACtC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;YAAE,KAAK,CAAC,KAAK,EAAE,CAAC;IAC5C,CAAC,CAAC;IACF,MAAM,eAAe,GAAG,GAAS,EAAE;QACjC,KAAK,CAAC,MAAM,EAAE,CAAC;IACjB,CAAC,CAAC;IACF,MAAM,eAAe,GAAG,GAAS,EAAE;QACjC,IAAI,WAAW;YAAE,OAAO;QACxB,MAAM,CAAC;YACL,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,iBAAiB;YACzB,SAAS,EAAE,QAAQ,CAAC,SAAS;SAC9B,CAAC,CAAC;IACL,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAQ,EAAE;QACvC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;YAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;IACrD,CAAC,CAAC;IACF,MAAM,aAAa,GAAG,GAAS,EAAE;QAC/B,QAAQ,CAAC,MAAM,EAAE,CAAC;IACpB,CAAC,CAAC;IACF,MAAM,UAAU,GAAG,GAAS,EAAE;QAC5B,MAAM,CAAC;YACL,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,iBAAiB;YACzB,SAAS,EAAE,QAAQ,CAAC,SAAS;SAC9B,CAAC,CAAC;IACL,CAAC,CAAC;IACF,MAAM,UAAU,GAAG,GAAS,EAAE;QAC5B,OAAO,EAAE,IAAI,CAAC;YACZ,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,eAAe,EAAE;YAC1B,IAAI,EAAE,YAAY,EAAE;SACrB,CAAC,CAAC;IACL,CAAC,CAAC;IACF,MAAM,WAAW,GAAG,GAAS,EAAE,CAAC,UAAU,EAAE,CAAC;IAE7C,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1B,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAC9B,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IACtC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IACtC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC9B,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAC1C,OAAO,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACnC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAClC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACnC,IAAI,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7C,WAAW,CAAC,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;IACD,QAAQ,CAAC,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,CAAC;IAEb,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC;IACvB,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,OAAO,EAAE,CAAC;QAClB,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC3B,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAC7B,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QACvC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QACvC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC/B,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QACpC,OAAO,CAAC,OAAO,EAAE,CAAC;QAClB,QAAQ,CAAC,OAAO,EAAE,CAAC;QACnB,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,eAAe,CAAC,WAAW,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,OAAmD;IACvE,MAAM,MAAM,GAAG,iBAAiB,OAAO,CAAC,SAAS,EAAE,CAAC;IACpD,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACpE,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,aAAa,OAAO,CAAC,SAAS,kDAAkD,MAAM,IAAI,CAC3F,CAAC;QACF,OAAO;IACT,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;QACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,aAAa,OAAO,CAAC,SAAS,wCAAwC,CACvE,CAAC;QACF,OAAO;IACT,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,2BAA2B,OAAO,CAAC,SAAS,2BAA2B,MAAM,IAAI,CAClF,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,OAAkC;IACzD,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,KAAK,GAAG;QACtC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,SAAS;QAC3C,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,KAAK,GAAG;QACxC,OAAO,CAAC,SAAS,KAAK,IAAI;QAC1B,CAAC,SAAS,EAAE,CAAC,WAAW;QACxB,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CACrD,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAc;IAC5C,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACjE,OAAO,OAAO,IAAI,uBAAuB,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,OAAkC;IAElC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,kBAAkB,EAAE,CAAC;QAC9C,IAAI,CAAC,UAAU,CAAC,SAAS;YAAE,OAAO,KAAK,CAAC;QAExC,IAAI,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACjD,SAAS,CAAC;YACR,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACtD,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;YAC9C,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC9B,IAAI,CAAC;oBACH,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBACjD,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,KAAK,CAC7D,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;oBACF,IAAI,CAAC,OAAO;wBAAE,MAAM,KAAK,CAAC;oBAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,8BAA8B,sBAAsB,CAAC,KAAK,CAAC,uCAAuC,CACnG,CAAC;oBACF,MAAM,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;gBAC5C,CAAC;gBACD,SAAS;YACX,CAAC;YACD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC5B,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;gBACpC,OAAO,IAAI,CAAC;YACd,CAAC;YACD,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,wCAAwC,sBAAsB,CAAC,KAAK,CAAC,6BAA6B,CACnG,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { type RuntimeMetadata, type RuntimeView } from "./types.js";
2
+ export declare function probeRuntime(metadata: RuntimeMetadata, timeoutMs?: number): Promise<boolean>;
3
+ export declare function listLiveRuntimeMetadata(): Promise<RuntimeMetadata[]>;
4
+ export declare function findLiveRuntime(sessionIdOrPrefix: string): Promise<RuntimeMetadata | undefined>;
5
+ export declare function latestLiveRuntime(cwd: string): Promise<RuntimeMetadata | undefined>;
6
+ export declare function listLiveSessionRuntimes(): Promise<RuntimeView[]>;
@@ -0,0 +1,100 @@
1
+ import { rm } from "node:fs/promises";
2
+ import { processIdentityTracker } from "../os/process-identity.js";
3
+ import { processAlive } from "../os/process-tree.js";
4
+ import { connectRuntimeSocket, readFirstFrame, sendFrame } from "./protocol.js";
5
+ import { isRuntimeSocketPath } from "./paths.js";
6
+ import { deleteRuntimeLock, deleteRuntimeMetadata, listRuntimeMetadata, } from "./store.js";
7
+ import { RUNTIME_PROTOCOL_VERSION, } from "./types.js";
8
+ function isAck(value, sessionId) {
9
+ if (!value || typeof value !== "object")
10
+ return false;
11
+ const frame = value;
12
+ return (frame.version === RUNTIME_PROTOCOL_VERSION &&
13
+ frame.type === "ack" &&
14
+ frame.sessionId === sessionId);
15
+ }
16
+ export async function probeRuntime(metadata, timeoutMs = 500) {
17
+ let socket;
18
+ try {
19
+ socket = await connectRuntimeSocket(metadata.socketPath, timeoutMs);
20
+ sendFrame(socket, {
21
+ version: RUNTIME_PROTOCOL_VERSION,
22
+ type: "auth",
23
+ role: "probe",
24
+ token: metadata.token,
25
+ });
26
+ const first = await readFirstFrame(socket, timeoutMs);
27
+ return isAck(first.value, metadata.sessionId);
28
+ }
29
+ catch {
30
+ return false;
31
+ }
32
+ finally {
33
+ socket?.destroy();
34
+ }
35
+ }
36
+ async function reapIfStale(metadata) {
37
+ const comparison = processIdentityTracker.compare(metadata.hostPid, metadata.hostIdentity);
38
+ const stale = comparison === "gone" ||
39
+ comparison === "mismatch" ||
40
+ (comparison === "unknown" && !processAlive(metadata.hostPid));
41
+ if (!stale)
42
+ return;
43
+ await Promise.all([
44
+ deleteRuntimeMetadata(metadata.sessionId),
45
+ deleteRuntimeLock(metadata.sessionId),
46
+ isRuntimeSocketPath(metadata.socketPath)
47
+ ? rm(metadata.socketPath, { force: true }).catch(() => undefined)
48
+ : Promise.resolve(),
49
+ ]);
50
+ }
51
+ export async function listLiveRuntimeMetadata() {
52
+ const candidates = await listRuntimeMetadata();
53
+ const checked = await Promise.all(candidates.map(async (metadata) => {
54
+ if (await probeRuntime(metadata))
55
+ return metadata;
56
+ await reapIfStale(metadata);
57
+ return undefined;
58
+ }));
59
+ const bySession = new Map();
60
+ for (const metadata of checked) {
61
+ if (!metadata)
62
+ continue;
63
+ const previous = bySession.get(metadata.sessionId);
64
+ if (!previous || previous.updatedAt < metadata.updatedAt) {
65
+ bySession.set(metadata.sessionId, metadata);
66
+ }
67
+ }
68
+ return [...bySession.values()].sort((left, right) => right.updatedAt.localeCompare(left.updatedAt));
69
+ }
70
+ export async function findLiveRuntime(sessionIdOrPrefix) {
71
+ const needle = sessionIdOrPrefix.trim().toLowerCase();
72
+ if (!needle)
73
+ return undefined;
74
+ const records = await listLiveRuntimeMetadata();
75
+ const exact = records.find((record) => record.sessionId.toLowerCase() === needle);
76
+ if (exact)
77
+ return exact;
78
+ const matches = records.filter((record) => record.sessionId.toLowerCase().startsWith(needle));
79
+ if (matches.length > 1) {
80
+ throw new Error(`"${sessionIdOrPrefix}" matches ${matches.length} live sessions — pass a longer id`);
81
+ }
82
+ return matches[0];
83
+ }
84
+ export async function latestLiveRuntime(cwd) {
85
+ const normalized = cwd.replace(/[\\/]+$/, "");
86
+ return (await listLiveRuntimeMetadata()).find((record) => record.cwd.replace(/[\\/]+$/, "") === normalized);
87
+ }
88
+ export async function listLiveSessionRuntimes() {
89
+ return (await listLiveRuntimeMetadata()).map((record) => ({
90
+ sessionId: record.sessionId,
91
+ cwd: record.cwd,
92
+ ...(record.title ? { title: record.title } : {}),
93
+ startedAt: record.startedAt,
94
+ updatedAt: record.updatedAt,
95
+ phase: record.phase,
96
+ busy: record.busy,
97
+ attached: record.attached,
98
+ }));
99
+ }
100
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/session-runtime/discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import { type RuntimeHostPayload } from "./types.js";
2
+ export declare class SessionRuntimeHost {
3
+ private readonly payload;
4
+ private readonly token;
5
+ private readonly replay;
6
+ private readonly startedAt;
7
+ private sessionId;
8
+ private cwd;
9
+ private socketPath;
10
+ private title;
11
+ private busy;
12
+ private attached;
13
+ private phase;
14
+ private error;
15
+ private lease;
16
+ private server;
17
+ private readonly connections;
18
+ private transport;
19
+ private client;
20
+ private childSocket;
21
+ private childChannel;
22
+ private idleTimer;
23
+ private forceTimer;
24
+ private livenessTimer;
25
+ private livenessMisses;
26
+ private expectedExitCode;
27
+ private metadataTimer;
28
+ private metadataDirty;
29
+ private outputPausedFor;
30
+ private outputDrainHandler;
31
+ private metadataWrites;
32
+ private inputWrites;
33
+ private statusWrites;
34
+ private closing;
35
+ private cleaning;
36
+ private exitOutcome;
37
+ private resolveExit;
38
+ private readonly exitPromise;
39
+ private readonly signalHandlers;
40
+ constructor(payload: RuntimeHostPayload);
41
+ run(): Promise<void>;
42
+ private startServer;
43
+ private startChild;
44
+ private armChildLiveness;
45
+ private accept;
46
+ private acknowledge;
47
+ private acceptClientControl;
48
+ private acceptClientTerminal;
49
+ private acceptChild;
50
+ private handleClientFrame;
51
+ private handleChildFrame;
52
+ private applyStatus;
53
+ private rebind;
54
+ private publishOutput;
55
+ private writeToTerminal;
56
+ private applyOutputBackpressure;
57
+ private releaseOutputBackpressure;
58
+ private flushTerminalOutput;
59
+ private queueInput;
60
+ private resize;
61
+ private clientClosed;
62
+ private sendToClient;
63
+ private disconnectClient;
64
+ private closeClientSockets;
65
+ private scheduleIdleTimer;
66
+ private cancelIdleTimer;
67
+ private requestGracefulStop;
68
+ private metadataSnapshot;
69
+ private queueMetadata;
70
+ private flushQueuedMetadata;
71
+ private writeMetadataNow;
72
+ private installSignals;
73
+ private removeSignals;
74
+ private cleanup;
75
+ }
76
+ export declare function runRuntimeHostFromEnvironment(): Promise<boolean>;
77
+ export declare function runtimeHostClientId(): string;