@the-open-engine/zeroshot 6.38.0 → 6.39.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 (381) hide show
  1. package/cli/event-copy.js +8 -7
  2. package/cli/event-copy.ts +12 -0
  3. package/cli/index.js +7 -31
  4. package/cli/json-export.js +61 -64
  5. package/cli/json-export.ts +112 -0
  6. package/cli/message-formatter-utils.js +68 -56
  7. package/cli/message-formatter-utils.ts +121 -0
  8. package/cli/message-formatters-normal.js +124 -259
  9. package/cli/message-formatters-normal.ts +250 -0
  10. package/cli/message-formatters-watch.js +81 -84
  11. package/cli/message-formatters-watch.ts +189 -0
  12. package/lib/agent-cli-provider/adapters/codex.d.ts.map +1 -1
  13. package/lib/agent-cli-provider/adapters/codex.js +3 -1
  14. package/lib/agent-cli-provider/adapters/codex.js.map +1 -1
  15. package/lib/cluster/generated/protocol-schema.cjs +1 -1
  16. package/lib/cluster/generated/protocol-schema.mjs +1 -1
  17. package/lib/cluster/generated/protocol.d.cts +8 -0
  18. package/lib/cluster/generated/protocol.d.mts +8 -0
  19. package/lib/cluster/generated/protocol.d.ts +8 -0
  20. package/lib/clusters-registry.d.ts +23 -0
  21. package/lib/clusters-registry.js +17 -29
  22. package/lib/completion.d.ts +12 -0
  23. package/lib/completion.js +84 -94
  24. package/lib/compose-utils.d.ts +32 -0
  25. package/lib/compose-utils.js +57 -72
  26. package/lib/detached-startup.d.ts +83 -0
  27. package/lib/detached-startup.js +231 -302
  28. package/lib/docker-config.d.ts +43 -0
  29. package/lib/docker-config.js +150 -325
  30. package/lib/docker-env-auth.d.ts +17 -0
  31. package/lib/docker-env-auth.js +75 -0
  32. package/lib/git-remote-utils.d.ts +48 -0
  33. package/lib/git-remote-utils.js +147 -213
  34. package/lib/id-detector.d.ts +15 -0
  35. package/lib/id-detector.js +37 -41
  36. package/lib/path-check.d.ts +30 -0
  37. package/lib/path-check.js +42 -45
  38. package/lib/process-liveness.d.ts +16 -0
  39. package/lib/process-liveness.js +19 -12
  40. package/lib/provider-credential-path.d.ts +16 -0
  41. package/lib/provider-credential-path.js +31 -29
  42. package/lib/provider-defaults.d.ts +30 -0
  43. package/lib/provider-defaults.js +47 -42
  44. package/lib/provider-detection.d.ts +11 -0
  45. package/lib/provider-detection.js +91 -54
  46. package/lib/provider-names.d.ts +38 -0
  47. package/lib/provider-names.js +56 -64
  48. package/lib/repo-settings.d.ts +28 -0
  49. package/lib/repo-settings.js +83 -59
  50. package/lib/run-mode.d.ts +21 -0
  51. package/lib/run-mode.js +21 -20
  52. package/lib/run-plan.d.ts +28 -0
  53. package/lib/run-plan.js +17 -16
  54. package/lib/settings/claude-auth.d.ts +35 -0
  55. package/lib/settings/claude-auth.js +30 -47
  56. package/lib/settings-defaults.d.ts +20 -0
  57. package/lib/settings-defaults.js +149 -0
  58. package/lib/settings-error.d.ts +7 -0
  59. package/lib/settings-error.js +8 -0
  60. package/lib/settings-issue-providers.d.ts +10 -0
  61. package/lib/settings-issue-providers.js +12 -0
  62. package/lib/settings-models.d.ts +22 -0
  63. package/lib/settings-models.js +93 -0
  64. package/lib/settings-storage.d.ts +23 -0
  65. package/lib/settings-storage.js +205 -0
  66. package/lib/settings-validation.d.ts +7 -0
  67. package/lib/settings-validation.js +182 -0
  68. package/lib/settings.d.ts +29 -0
  69. package/lib/settings.js +41 -736
  70. package/lib/setup-apply-types.d.ts +66 -0
  71. package/lib/setup-apply-types.js +2 -0
  72. package/lib/setup-apply.d.ts +39 -0
  73. package/lib/setup-apply.js +267 -264
  74. package/lib/setup-journal.d.ts +41 -0
  75. package/lib/setup-journal.js +119 -76
  76. package/lib/setup-plan-types.d.ts +102 -0
  77. package/lib/setup-plan-types.js +2 -0
  78. package/lib/setup-plan.d.ts +30 -0
  79. package/lib/setup-plan.js +300 -324
  80. package/lib/setup-undo.d.ts +44 -0
  81. package/lib/setup-undo.js +61 -74
  82. package/lib/start-cluster-config.d.ts +26 -0
  83. package/lib/start-cluster-config.js +56 -0
  84. package/lib/start-cluster-environment.d.ts +40 -0
  85. package/lib/start-cluster-environment.js +134 -0
  86. package/lib/start-cluster-run-options.d.ts +53 -0
  87. package/lib/start-cluster-run-options.js +147 -0
  88. package/lib/start-cluster.d.ts +64 -0
  89. package/lib/start-cluster.js +98 -454
  90. package/lib/stream-json-parser.d.ts +17 -0
  91. package/lib/stream-json-parser.js +51 -52
  92. package/npm-shrinkwrap.json +2 -2
  93. package/package.json +12 -6
  94. package/scripts/postinstall.js +27 -0
  95. package/scripts/rust-distribution.js +23 -14
  96. package/src/agent/agent-command-proofs-context.js +35 -45
  97. package/src/agent/agent-command-proofs-context.ts +87 -0
  98. package/src/agent/agent-config-settings.js +19 -0
  99. package/src/agent/agent-config-settings.ts +41 -0
  100. package/src/agent/agent-config.js +122 -231
  101. package/src/agent/agent-config.ts +285 -0
  102. package/src/agent/agent-context-builder.js +38 -273
  103. package/src/agent/agent-context-builder.ts +51 -0
  104. package/src/agent/agent-context-environment-sections.js +105 -0
  105. package/src/agent/agent-context-environment-sections.ts +134 -0
  106. package/src/agent/agent-context-packs.js +165 -0
  107. package/src/agent/agent-context-packs.ts +296 -0
  108. package/src/agent/agent-context-prompt-sections.js +100 -0
  109. package/src/agent/agent-context-prompt-sections.ts +148 -0
  110. package/src/agent/agent-context-sections.js +25 -334
  111. package/src/agent/agent-context-sections.ts +36 -0
  112. package/src/agent/agent-context-sources.js +96 -149
  113. package/src/agent/agent-context-sources.ts +253 -0
  114. package/src/agent/agent-context-types.js +2 -0
  115. package/src/agent/agent-context-types.ts +132 -0
  116. package/src/agent/agent-context-validation-sections.js +73 -0
  117. package/src/agent/agent-context-validation-sections.ts +129 -0
  118. package/src/agent/agent-input-injector.js +99 -118
  119. package/src/agent/agent-input-injector.ts +195 -0
  120. package/src/agent/agent-liveness-poll.js +74 -78
  121. package/src/agent/agent-liveness-poll.ts +163 -0
  122. package/src/agent/agent-quality-gate-schema.js +77 -86
  123. package/src/agent/agent-quality-gate-schema.ts +135 -0
  124. package/src/agent/agent-quality-gates-context.js +44 -50
  125. package/src/agent/agent-quality-gates-context.ts +91 -0
  126. package/src/agent/agent-stuck-detector.js +171 -239
  127. package/src/agent/agent-stuck-detector.ts +288 -0
  128. package/src/agent/agent-trigger-evaluator.js +29 -46
  129. package/src/agent/agent-trigger-evaluator.ts +98 -0
  130. package/src/agent/context-metrics.js +110 -141
  131. package/src/agent/context-metrics.ts +261 -0
  132. package/src/agent/context-pack-builder.js +72 -358
  133. package/src/agent/context-pack-builder.ts +105 -0
  134. package/src/agent/context-pack-core.js +70 -0
  135. package/src/agent/context-pack-core.ts +96 -0
  136. package/src/agent/context-pack-selection.js +119 -0
  137. package/src/agent/context-pack-selection.ts +187 -0
  138. package/src/agent/context-pack-truncation.js +139 -0
  139. package/src/agent/context-pack-truncation.ts +208 -0
  140. package/src/agent/context-pack-types.js +2 -0
  141. package/src/agent/context-pack-types.ts +98 -0
  142. package/src/agent/context-replay-policy.js +30 -39
  143. package/src/agent/context-replay-policy.ts +71 -0
  144. package/src/agent/critical-agent-policy.js +6 -10
  145. package/src/agent/critical-agent-policy.ts +20 -0
  146. package/src/agent/guidance-queue.js +74 -87
  147. package/src/agent/guidance-queue.ts +166 -0
  148. package/src/agent/output-extraction-error-detail.js +45 -0
  149. package/src/agent/output-extraction-error-detail.ts +49 -0
  150. package/src/agent/output-extraction-failures.js +125 -0
  151. package/src/agent/output-extraction-failures.ts +149 -0
  152. package/src/agent/output-extraction-json.js +234 -0
  153. package/src/agent/output-extraction-json.ts +235 -0
  154. package/src/agent/output-extraction-pi.js +124 -0
  155. package/src/agent/output-extraction-pi.ts +137 -0
  156. package/src/agent/output-extraction-types.js +2 -0
  157. package/src/agent/output-extraction-types.ts +49 -0
  158. package/src/agent/output-extraction.js +17 -617
  159. package/src/agent/output-extraction.ts +30 -0
  160. package/src/agent/output-reformatter-errors.js +83 -0
  161. package/src/agent/output-reformatter-errors.ts +106 -0
  162. package/src/agent/output-reformatter-types.js +2 -0
  163. package/src/agent/output-reformatter-types.ts +86 -0
  164. package/src/agent/output-reformatter.js +140 -185
  165. package/src/agent/output-reformatter.ts +238 -0
  166. package/src/agent/pi-terminal-lifecycle-types.js +2 -0
  167. package/src/agent/pi-terminal-lifecycle-types.ts +41 -0
  168. package/src/agent/pi-terminal-lifecycle.js +186 -206
  169. package/src/agent/pi-terminal-lifecycle.ts +297 -0
  170. package/src/agent/provider-control-plane.js +22 -21
  171. package/src/agent/provider-control-plane.ts +52 -0
  172. package/src/agent/provider-terminal-failure-types.js +2 -0
  173. package/src/agent/provider-terminal-failure-types.ts +60 -0
  174. package/src/agent/provider-terminal-failure.js +194 -191
  175. package/src/agent/provider-terminal-failure.ts +262 -0
  176. package/src/agent/rate-limit-backoff.js +31 -74
  177. package/src/agent/rate-limit-backoff.ts +71 -0
  178. package/src/agent/schema-utils.js +85 -125
  179. package/src/agent/schema-utils.ts +148 -0
  180. package/src/agent/structured-output-error.js +34 -33
  181. package/src/agent/structured-output-error.ts +105 -0
  182. package/src/agent/validation-platform.js +27 -27
  183. package/src/agent/validation-platform.ts +49 -0
  184. package/src/agent-cli-provider/adapters/codex.ts +3 -1
  185. package/src/attach/attach-client.js +232 -405
  186. package/src/attach/attach-client.ts +300 -0
  187. package/src/attach/attach-server-cleanup.js +43 -0
  188. package/src/attach/attach-server-cleanup.ts +39 -0
  189. package/src/attach/attach-server-clients.js +117 -0
  190. package/src/attach/attach-server-clients.ts +122 -0
  191. package/src/attach/attach-server-events.js +38 -0
  192. package/src/attach/attach-server-events.ts +36 -0
  193. package/src/attach/attach-server-pty.js +45 -0
  194. package/src/attach/attach-server-pty.ts +64 -0
  195. package/src/attach/attach-server-runtime.js +73 -0
  196. package/src/attach/attach-server-runtime.ts +62 -0
  197. package/src/attach/attach-server-socket.js +28 -0
  198. package/src/attach/attach-server-socket.ts +23 -0
  199. package/src/attach/attach-server-types.js +2 -0
  200. package/src/attach/attach-server-types.ts +82 -0
  201. package/src/attach/attach-server.js +106 -523
  202. package/src/attach/attach-server.ts +158 -0
  203. package/src/attach/index.js +18 -35
  204. package/src/attach/index.ts +18 -0
  205. package/src/attach/protocol.js +95 -184
  206. package/src/attach/protocol.ts +181 -0
  207. package/src/attach/ring-buffer.js +76 -102
  208. package/src/attach/ring-buffer.ts +109 -0
  209. package/src/attach/send-input.js +64 -75
  210. package/src/attach/send-input.ts +94 -0
  211. package/src/attach/socket-discovery.js +164 -218
  212. package/src/attach/socket-discovery.ts +230 -0
  213. package/src/attach/socket-paths.js +42 -61
  214. package/src/attach/socket-paths.ts +81 -0
  215. package/src/claude-credentials.js +51 -54
  216. package/src/claude-credentials.ts +89 -0
  217. package/src/cluster/generated/protocol-schema.ts +1 -1
  218. package/src/cluster/generated/protocol.ts +2 -1
  219. package/src/command-proofs.js +110 -141
  220. package/src/command-proofs.ts +216 -0
  221. package/src/config-router.js +81 -73
  222. package/src/config-router.ts +131 -0
  223. package/src/copy-worker.js +53 -29
  224. package/src/copy-worker.ts +75 -0
  225. package/src/darwin-keychain-boundary.js +80 -111
  226. package/src/darwin-keychain-boundary.ts +148 -0
  227. package/src/guidance-topics.js +4 -5
  228. package/src/guidance-topics.ts +10 -0
  229. package/src/input-helpers.js +33 -54
  230. package/src/input-helpers.ts +58 -0
  231. package/src/ledger-sequence.js +45 -48
  232. package/src/ledger-sequence.ts +63 -0
  233. package/src/legacy-lib/clusters-registry.ts +40 -0
  234. package/src/legacy-lib/completion.ts +148 -0
  235. package/src/legacy-lib/compose-utils.ts +102 -0
  236. package/src/legacy-lib/detached-startup.ts +449 -0
  237. package/src/legacy-lib/docker-config.ts +282 -0
  238. package/src/legacy-lib/docker-env-auth.ts +116 -0
  239. package/src/legacy-lib/git-remote-utils.ts +244 -0
  240. package/src/legacy-lib/id-detector.ts +57 -0
  241. package/src/legacy-lib/js-yaml.d.ts +3 -0
  242. package/src/legacy-lib/omelette.d.ts +15 -0
  243. package/src/legacy-lib/path-check.ts +89 -0
  244. package/src/legacy-lib/process-liveness.ts +36 -0
  245. package/src/legacy-lib/provider-credential-path.ts +57 -0
  246. package/src/legacy-lib/provider-defaults.ts +114 -0
  247. package/src/legacy-lib/provider-detection.ts +67 -0
  248. package/src/legacy-lib/provider-names.ts +126 -0
  249. package/src/legacy-lib/repo-settings.ts +88 -0
  250. package/src/legacy-lib/run-mode.ts +58 -0
  251. package/src/legacy-lib/run-plan.ts +49 -0
  252. package/src/legacy-lib/settings/claude-auth.ts +80 -0
  253. package/src/legacy-lib/settings-defaults.ts +212 -0
  254. package/src/legacy-lib/settings-error.ts +8 -0
  255. package/src/legacy-lib/settings-issue-providers.ts +18 -0
  256. package/src/legacy-lib/settings-models.ts +124 -0
  257. package/src/legacy-lib/settings-storage.ts +277 -0
  258. package/src/legacy-lib/settings-validation.ts +220 -0
  259. package/src/legacy-lib/settings.ts +87 -0
  260. package/src/legacy-lib/setup-apply-types.ts +70 -0
  261. package/src/legacy-lib/setup-apply.ts +456 -0
  262. package/src/legacy-lib/setup-journal.ts +185 -0
  263. package/src/legacy-lib/setup-plan-types.ts +96 -0
  264. package/src/legacy-lib/setup-plan.ts +500 -0
  265. package/src/legacy-lib/setup-undo.ts +142 -0
  266. package/src/legacy-lib/start-cluster-config.ts +124 -0
  267. package/src/legacy-lib/start-cluster-environment.ts +165 -0
  268. package/src/legacy-lib/start-cluster-run-options.ts +279 -0
  269. package/src/legacy-lib/start-cluster.ts +237 -0
  270. package/src/legacy-lib/stream-json-parser.ts +88 -0
  271. package/src/message-buffer.js +55 -71
  272. package/src/message-buffer.ts +107 -0
  273. package/src/message-bus-bridge.js +92 -133
  274. package/src/message-bus-bridge.ts +149 -0
  275. package/src/name-generator-shared.js +220 -0
  276. package/src/name-generator-shared.ts +231 -0
  277. package/src/name-generator.js +8 -217
  278. package/src/name-generator.ts +27 -0
  279. package/src/omp-blob-root.js +83 -64
  280. package/src/omp-blob-root.ts +116 -0
  281. package/src/omp-config-overlay.js +65 -38
  282. package/src/omp-config-overlay.ts +110 -0
  283. package/src/omp-execution-fingerprint.js +38 -43
  284. package/src/omp-execution-fingerprint.ts +92 -0
  285. package/src/omp-session-limits.js +10 -15
  286. package/src/omp-session-limits.ts +53 -0
  287. package/src/omp-session-partition.js +2 -2
  288. package/src/omp-session-verifier.js +1 -1
  289. package/src/orchestrator.js +19 -4
  290. package/src/providers/anthropic/index.js +3 -1
  291. package/src/providers/anthropic/index.ts +13 -0
  292. package/src/providers/capabilities.js +19 -27
  293. package/src/providers/capabilities.ts +44 -0
  294. package/src/providers/google/index.js +3 -1
  295. package/src/providers/google/index.ts +13 -0
  296. package/src/providers/openai/index.js +3 -1
  297. package/src/providers/openai/index.ts +13 -0
  298. package/src/providers/opencode/index.js +3 -1
  299. package/src/providers/opencode/index.ts +13 -0
  300. package/src/quality-gates.js +67 -127
  301. package/src/quality-gates.ts +149 -0
  302. package/src/repo-settings-access.js +40 -0
  303. package/src/repo-settings-access.ts +64 -0
  304. package/src/schemas/sub-cluster.js +127 -183
  305. package/src/schemas/sub-cluster.ts +238 -0
  306. package/src/state-snapshot-normalization.js +224 -0
  307. package/src/state-snapshot-normalization.ts +222 -0
  308. package/src/state-snapshot.js +192 -359
  309. package/src/state-snapshot.ts +291 -0
  310. package/src/state-snapshotter.js +118 -130
  311. package/src/state-snapshotter.ts +167 -0
  312. package/src/sub-cluster-wrapper.js +4 -13
  313. package/src/task-run-model-args.js +87 -124
  314. package/src/task-run-model-args.ts +204 -0
  315. package/src/task-runner.js +5 -25
  316. package/src/task-runner.ts +28 -0
  317. package/src/task-startup-error.js +73 -58
  318. package/src/task-startup-error.ts +126 -0
  319. package/src/template-validation/consensus-gate-contracts.js +2 -0
  320. package/src/template-validation/consensus-gate-contracts.ts +70 -0
  321. package/src/template-validation/consensus-gate-scenarios.js +76 -0
  322. package/src/template-validation/consensus-gate-scenarios.ts +130 -0
  323. package/src/template-validation/consensus-gate-stage.js +34 -0
  324. package/src/template-validation/consensus-gate-stage.ts +56 -0
  325. package/src/template-validation/random-topology-contracts.js +2 -0
  326. package/src/template-validation/random-topology-contracts.ts +54 -0
  327. package/src/template-validation/random-topology-dispatch.js +25 -0
  328. package/src/template-validation/random-topology-dispatch.ts +33 -0
  329. package/src/template-validation/random-topology-message-loop.js +53 -0
  330. package/src/template-validation/random-topology-message-loop.ts +73 -0
  331. package/src/template-validation/random-topology-operations.js +79 -0
  332. package/src/template-validation/random-topology-operations.ts +101 -0
  333. package/src/template-validation/random-topology-runtime.js +25 -0
  334. package/src/template-validation/random-topology-runtime.ts +43 -0
  335. package/src/template-validation/random-topology-scenario.js +52 -0
  336. package/src/template-validation/random-topology-scenario.ts +57 -0
  337. package/src/template-validation/random-topology-schema.js +159 -0
  338. package/src/template-validation/random-topology-schema.ts +190 -0
  339. package/src/template-validation/random-topology-state.js +28 -0
  340. package/src/template-validation/random-topology-state.ts +30 -0
  341. package/src/template-validation/random-topology-trigger-evaluation.js +45 -0
  342. package/src/template-validation/random-topology-trigger-evaluation.ts +65 -0
  343. package/src/template-validation/random-topology-trigger.js +75 -0
  344. package/src/template-validation/random-topology-trigger.ts +88 -0
  345. package/src/template-validation/report-formatter.js +40 -46
  346. package/src/template-validation/report-formatter.ts +101 -0
  347. package/src/template-validation/simulate-consensus-gates.js +111 -302
  348. package/src/template-validation/simulate-consensus-gates.ts +196 -0
  349. package/src/template-validation/simulate-random-topology.js +26 -519
  350. package/src/template-validation/simulate-random-topology.ts +57 -0
  351. package/src/template-validation/simulate-two-stage-validation.js +41 -265
  352. package/src/template-validation/simulate-two-stage-validation.ts +55 -0
  353. package/src/template-validation/simulation-agent-runtime.js +25 -0
  354. package/src/template-validation/simulation-agent-runtime.ts +40 -0
  355. package/src/template-validation/simulation-agent.js +29 -0
  356. package/src/template-validation/simulation-agent.ts +73 -0
  357. package/src/template-validation/simulation-runtime.js +34 -0
  358. package/src/template-validation/simulation-runtime.ts +72 -0
  359. package/src/template-validation/two-stage-contracts.js +2 -0
  360. package/src/template-validation/two-stage-contracts.ts +41 -0
  361. package/src/template-validation/two-stage-inputs.js +21 -0
  362. package/src/template-validation/two-stage-inputs.ts +29 -0
  363. package/src/template-validation/two-stage-results.js +30 -0
  364. package/src/template-validation/two-stage-results.ts +40 -0
  365. package/src/template-validation/two-stage-scenario.js +86 -0
  366. package/src/template-validation/two-stage-scenario.ts +120 -0
  367. package/src/worktree-claude-config.js +182 -220
  368. package/src/worktree-claude-config.ts +272 -0
  369. package/src/worktree-tooling-env.js +103 -125
  370. package/src/worktree-tooling-env.ts +142 -0
  371. package/task-lib/completion.js +2 -3
  372. package/task-lib/completion.ts +9 -0
  373. package/task-lib/config.js +1 -4
  374. package/task-lib/config.ts +11 -0
  375. package/task-lib/name-generator.js +4 -226
  376. package/task-lib/name-generator.ts +11 -0
  377. package/task-lib/omp-session-cleanup.js +1 -1
  378. package/task-lib/omp-storage-root.js +8 -12
  379. package/task-lib/omp-storage-root.ts +62 -0
  380. package/task-lib/process-termination.js +143 -166
  381. package/task-lib/process-termination.ts +268 -0
@@ -0,0 +1,158 @@
1
+ import { EventEmitter } from 'node:events';
2
+ import fs from 'node:fs';
3
+ import type net from 'node:net';
4
+ import path from 'node:path';
5
+
6
+ import RingBuffer from './ring-buffer';
7
+ import socketDiscovery from './socket-discovery';
8
+ import {
9
+ handleClientConnection,
10
+ handleClientMessage,
11
+ removeClient,
12
+ sendClientError,
13
+ } from './attach-server-clients';
14
+ import { cleanupAttachServer } from './attach-server-cleanup';
15
+ import { handleProcessExit, handlePtyOutput } from './attach-server-events';
16
+ import { spawnPty } from './attach-server-pty';
17
+ import { resizePty, sendPtySignal, stopPty, writePty } from './attach-server-runtime';
18
+ import { startSocketServer } from './attach-server-socket';
19
+ import type {
20
+ AttachClientConnection,
21
+ AttachServerHost,
22
+ AttachServerOptions,
23
+ AttachServerState,
24
+ ExitSignal,
25
+ PtyProcess,
26
+ } from './attach-server-types';
27
+
28
+ const DEFAULT_BUFFER_SIZE = 1024 * 1024;
29
+ const { cleanupStaleSocket } = socketDiscovery;
30
+
31
+ class AttachServer extends EventEmitter implements AttachServerHost {
32
+ id: string;
33
+ socketPath: string;
34
+ command: string;
35
+ args: string[];
36
+ cwd: string;
37
+ env: NodeJS.ProcessEnv;
38
+ cols: number;
39
+ rows: number;
40
+ outputBuffer: RingBuffer;
41
+ clients = new Map<unknown, AttachClientConnection>();
42
+ pty: PtyProcess | null = null;
43
+ server: net.Server | null = null;
44
+ state: AttachServerState = 'stopped';
45
+ exitCode: number | null = null;
46
+ exitSignal: ExitSignal = null;
47
+ pid: number | null = null;
48
+
49
+ constructor(options: AttachServerOptions) {
50
+ super();
51
+ if (!options.id) throw new Error('AttachServer: id is required');
52
+ if (!options.socketPath) throw new Error('AttachServer: socketPath is required');
53
+ if (!options.command) throw new Error('AttachServer: command is required');
54
+ this.id = options.id;
55
+ this.socketPath = options.socketPath;
56
+ this.command = options.command;
57
+ this.args = options.args || [];
58
+ this.cwd = options.cwd || process.cwd();
59
+ this.env = options.env || process.env;
60
+ this.cols = options.cols || 120;
61
+ this.rows = options.rows || 30;
62
+ this.outputBuffer = new RingBuffer(options.bufferSize || DEFAULT_BUFFER_SIZE);
63
+
64
+ this._onProcessExit = this._onProcessExit.bind(this);
65
+ this._onServerError = this._onServerError.bind(this);
66
+ }
67
+
68
+ async start(): Promise<void> {
69
+ if (this.state !== 'stopped') {
70
+ throw new Error(`AttachServer: Cannot start from state '${this.state}'`);
71
+ }
72
+ this.state = 'starting';
73
+ const socketDir = path.dirname(this.socketPath);
74
+ if (!fs.existsSync(socketDir)) fs.mkdirSync(socketDir, { recursive: true });
75
+ await cleanupStaleSocket(this.socketPath);
76
+ if (fs.existsSync(this.socketPath)) {
77
+ throw new Error(`AttachServer: Socket already in use: ${this.socketPath}`);
78
+ }
79
+ await this._startServer();
80
+ await this._spawnPty();
81
+ this.state = 'running';
82
+ this.emit('start', { id: this.id, pid: this.pid });
83
+ }
84
+
85
+ async stop(signal = 'SIGTERM'): Promise<void> {
86
+ await stopPty(this, signal);
87
+ }
88
+
89
+ sendSignal(signal: string): boolean {
90
+ return sendPtySignal(this, signal);
91
+ }
92
+
93
+ resize(cols: number, rows: number): void {
94
+ resizePty(this, cols, rows);
95
+ }
96
+
97
+ write(data: Buffer | string): boolean {
98
+ return writePty(this, data);
99
+ }
100
+
101
+ getState(): Record<string, unknown> {
102
+ return {
103
+ id: this.id,
104
+ state: this.state,
105
+ pid: this.pid,
106
+ exitCode: this.exitCode,
107
+ exitSignal: this.exitSignal,
108
+ clientCount: this.clients.size,
109
+ bufferSize: this.outputBuffer.getSize(),
110
+ };
111
+ }
112
+
113
+ _startServer(): Promise<void> {
114
+ return startSocketServer(this);
115
+ }
116
+
117
+ _spawnPty(): void {
118
+ spawnPty(this);
119
+ }
120
+
121
+ _handlePtyOutput(data: Buffer | string): void {
122
+ handlePtyOutput(this, data);
123
+ }
124
+
125
+ _handleClientConnection(socket: net.Socket): void {
126
+ handleClientConnection(this, socket);
127
+ }
128
+
129
+ _handleClientMessage(
130
+ socket: net.Socket,
131
+ message: unknown,
132
+ setClientId: (id: unknown) => void
133
+ ): void {
134
+ handleClientMessage(this, socket, message, setClientId);
135
+ }
136
+
137
+ _removeClient(clientId: unknown): void {
138
+ removeClient(this, clientId);
139
+ }
140
+
141
+ _sendError(socket: net.Socket, message: string): void {
142
+ sendClientError(socket, message);
143
+ }
144
+
145
+ _onProcessExit(exitCode: number, signal: ExitSignal): void {
146
+ handleProcessExit(this, exitCode, signal);
147
+ }
148
+
149
+ _onServerError(error: Error): void {
150
+ this.emit('error', error);
151
+ }
152
+
153
+ async _cleanup(): Promise<void> {
154
+ await cleanupAttachServer(this);
155
+ }
156
+ }
157
+
158
+ export = AttachServer;
@@ -1,37 +1,20 @@
1
- /**
2
- * Attach/Detach System - tmux-style session management for zeroshot tasks and clusters
3
- *
4
- * Usage:
5
- * const { AttachServer, AttachClient, socketDiscovery } = require('./attach');
6
- *
7
- * // Server side (in watcher.js or agent-wrapper.js)
8
- * const server = new AttachServer({
9
- * id: 'task-xxx',
10
- * socketPath: socketDiscovery.getTaskSocketPath('task-xxx'),
11
- * command: 'claude',
12
- * args: ['--print', '--output-format', 'stream-json', prompt],
13
- * });
14
- * await server.start();
15
- *
16
- * // Client side (in CLI attach command)
17
- * const client = new AttachClient({
18
- * socketPath: socketDiscovery.getTaskSocketPath('task-xxx'),
19
- * });
20
- * await client.connect();
21
- */
22
-
23
- const AttachServer = require('./attach-server');
24
- const AttachClient = require('./attach-client');
25
- const RingBuffer = require('./ring-buffer');
26
- const protocol = require('./protocol');
27
- const socketDiscovery = require('./socket-discovery');
28
- const { sendInput } = require('./send-input');
29
-
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ /** tmux-style attach/detach session management for tasks and clusters. */
6
+ const attach_client_1 = __importDefault(require("./attach-client"));
7
+ const attach_server_1 = __importDefault(require("./attach-server"));
8
+ const protocol_1 = __importDefault(require("./protocol"));
9
+ const ring_buffer_1 = __importDefault(require("./ring-buffer"));
10
+ const send_input_1 = __importDefault(require("./send-input"));
11
+ const socket_discovery_1 = __importDefault(require("./socket-discovery"));
12
+ const { sendInput } = send_input_1.default;
30
13
  module.exports = {
31
- AttachServer,
32
- AttachClient,
33
- RingBuffer,
34
- protocol,
35
- socketDiscovery,
36
- sendInput,
14
+ AttachServer: attach_server_1.default,
15
+ AttachClient: attach_client_1.default,
16
+ RingBuffer: ring_buffer_1.default,
17
+ protocol: protocol_1.default,
18
+ socketDiscovery: socket_discovery_1.default,
19
+ sendInput,
37
20
  };
@@ -0,0 +1,18 @@
1
+ /** tmux-style attach/detach session management for tasks and clusters. */
2
+ import AttachClient from './attach-client';
3
+ import AttachServer from './attach-server';
4
+ import protocol from './protocol';
5
+ import RingBuffer from './ring-buffer';
6
+ import sendInputModule from './send-input';
7
+ import socketDiscovery from './socket-discovery';
8
+
9
+ const { sendInput } = sendInputModule;
10
+
11
+ export = {
12
+ AttachServer,
13
+ AttachClient,
14
+ RingBuffer,
15
+ protocol,
16
+ socketDiscovery,
17
+ sendInput,
18
+ };
@@ -1,220 +1,131 @@
1
+ "use strict";
1
2
  /**
2
3
  * Protocol - Message framing for attach/detach IPC
3
4
  *
4
5
  * Uses length-prefixed JSON messages over Unix sockets.
5
6
  * Format: [4-byte length (BE)] [JSON payload]
6
- *
7
- * Message Types:
8
- *
9
- * Client → Server:
10
- * ATTACH { type: 'attach', clientId, cols, rows }
11
- * DETACH { type: 'detach', clientId }
12
- * RESIZE { type: 'resize', cols, rows }
13
- * SIGNAL { type: 'signal', signal: 'SIGINT' | 'SIGTERM' }
14
- * STDIN { type: 'stdin', data: base64 } (future interactive mode)
15
- *
16
- * Server → Client:
17
- * OUTPUT { type: 'output', data: base64, timestamp }
18
- * HISTORY { type: 'history', data: base64 }
19
- * STATE { type: 'state', status, pid, ... }
20
- * EXIT { type: 'exit', code, signal }
21
- * ERROR { type: 'error', message }
22
7
  */
23
-
24
8
  const MAX_MESSAGE_SIZE = 10 * 1024 * 1024; // 10MB max message
25
-
26
- /**
27
- * Encode a message for transmission
28
- * @param {object} message - Message object to encode
29
- * @returns {Buffer} - Length-prefixed encoded message
30
- */
9
+ const MessageType = {
10
+ // Client → Server
11
+ ATTACH: 'attach',
12
+ DETACH: 'detach',
13
+ RESIZE: 'resize',
14
+ SIGNAL: 'signal',
15
+ STDIN: 'stdin',
16
+ // Server → Client
17
+ OUTPUT: 'output',
18
+ HISTORY: 'history',
19
+ STATE: 'state',
20
+ EXIT: 'exit',
21
+ ERROR: 'error',
22
+ };
23
+ /** Encode a message for transmission. */
31
24
  function encode(message) {
32
- const json = JSON.stringify(message);
33
- const payload = Buffer.from(json, 'utf8');
34
-
35
- if (payload.length > MAX_MESSAGE_SIZE) {
36
- throw new Error(`Message too large: ${payload.length} bytes (max ${MAX_MESSAGE_SIZE})`);
37
- }
38
-
39
- const frame = Buffer.alloc(4 + payload.length);
40
- frame.writeUInt32BE(payload.length, 0);
41
- payload.copy(frame, 4);
42
-
43
- return frame;
25
+ const json = JSON.stringify(message);
26
+ const payload = Buffer.from(json, 'utf8');
27
+ if (payload.length > MAX_MESSAGE_SIZE) {
28
+ throw new Error(`Message too large: ${payload.length} bytes (max ${MAX_MESSAGE_SIZE})`);
29
+ }
30
+ const frame = Buffer.alloc(4 + payload.length);
31
+ frame.writeUInt32BE(payload.length, 0);
32
+ payload.copy(frame, 4);
33
+ return frame;
44
34
  }
45
-
46
- /**
47
- * MessageDecoder - Streaming decoder for framed messages
48
- *
49
- * Handles partial reads and message reassembly.
50
- */
35
+ /** Streaming decoder for framed messages. */
51
36
  class MessageDecoder {
52
- constructor() {
53
- this.buffer = Buffer.alloc(0);
54
- }
55
-
56
- /**
57
- * Feed data into the decoder
58
- * @param {Buffer} data - Received data chunk
59
- * @returns {object[]} - Array of decoded messages (may be empty)
60
- */
61
- feed(data) {
62
- this.buffer = Buffer.concat([this.buffer, data]);
63
- const messages = [];
64
-
65
- while (this.buffer.length >= 4) {
66
- const length = this.buffer.readUInt32BE(0);
67
-
68
- if (length > MAX_MESSAGE_SIZE) {
69
- throw new Error(`Message too large: ${length} bytes (max ${MAX_MESSAGE_SIZE})`);
70
- }
71
-
72
- if (this.buffer.length < 4 + length) {
73
- // Incomplete message, wait for more data
74
- break;
75
- }
76
-
77
- const payload = this.buffer.slice(4, 4 + length);
78
- this.buffer = this.buffer.slice(4 + length);
79
-
80
- try {
81
- const message = JSON.parse(payload.toString('utf8'));
82
- messages.push(message);
83
- } catch (e) {
84
- throw new Error(`Invalid JSON in message: ${e.message}`);
85
- }
37
+ buffer;
38
+ constructor() {
39
+ this.buffer = Buffer.alloc(0);
40
+ }
41
+ /** Feed a received data chunk into the decoder. */
42
+ feed(data) {
43
+ this.buffer = Buffer.concat([this.buffer, data]);
44
+ const messages = [];
45
+ while (this.buffer.length >= 4) {
46
+ const length = this.buffer.readUInt32BE(0);
47
+ if (length > MAX_MESSAGE_SIZE) {
48
+ throw new Error(`Message too large: ${length} bytes (max ${MAX_MESSAGE_SIZE})`);
49
+ }
50
+ if (this.buffer.length < 4 + length) {
51
+ // Incomplete message, wait for more data
52
+ break;
53
+ }
54
+ const payload = this.buffer.slice(4, 4 + length);
55
+ this.buffer = this.buffer.slice(4 + length);
56
+ try {
57
+ const message = JSON.parse(payload.toString('utf8'));
58
+ messages.push(message);
59
+ }
60
+ catch (error) {
61
+ const reason = error instanceof Error ? error.message : String(error);
62
+ throw new Error(`Invalid JSON in message: ${reason}`);
63
+ }
64
+ }
65
+ return messages;
66
+ }
67
+ /** Reset decoder state. */
68
+ reset() {
69
+ this.buffer = Buffer.alloc(0);
86
70
  }
87
-
88
- return messages;
89
- }
90
-
91
- /**
92
- * Reset decoder state
93
- */
94
- reset() {
95
- this.buffer = Buffer.alloc(0);
96
- }
97
71
  }
98
-
99
- // Message type constants
100
- const MessageType = {
101
- // Client → Server
102
- ATTACH: 'attach',
103
- DETACH: 'detach',
104
- RESIZE: 'resize',
105
- SIGNAL: 'signal',
106
- STDIN: 'stdin',
107
-
108
- // Server → Client
109
- OUTPUT: 'output',
110
- HISTORY: 'history',
111
- STATE: 'state',
112
- EXIT: 'exit',
113
- ERROR: 'error',
114
- };
115
-
116
- // Helper functions to create messages
117
-
118
- /**
119
- * Create an ATTACH message
120
- */
121
72
  function createAttachMessage(clientId, cols, rows) {
122
- return { type: MessageType.ATTACH, clientId, cols, rows };
73
+ return { type: MessageType.ATTACH, clientId, cols, rows };
123
74
  }
124
-
125
- /**
126
- * Create a DETACH message
127
- */
128
75
  function createDetachMessage(clientId) {
129
- return { type: MessageType.DETACH, clientId };
76
+ return { type: MessageType.DETACH, clientId };
130
77
  }
131
-
132
- /**
133
- * Create a RESIZE message
134
- */
135
78
  function createResizeMessage(cols, rows) {
136
- return { type: MessageType.RESIZE, cols, rows };
79
+ return { type: MessageType.RESIZE, cols, rows };
137
80
  }
138
-
139
- /**
140
- * Create a SIGNAL message
141
- */
142
81
  function createSignalMessage(signal) {
143
- if (!['SIGINT', 'SIGTERM', 'SIGKILL', 'SIGTSTP'].includes(signal)) {
144
- throw new Error(`Invalid signal: ${signal}`);
145
- }
146
- return { type: MessageType.SIGNAL, signal };
82
+ if (!['SIGINT', 'SIGTERM', 'SIGKILL', 'SIGTSTP'].includes(signal)) {
83
+ throw new Error(`Invalid signal: ${signal}`);
84
+ }
85
+ return { type: MessageType.SIGNAL, signal };
147
86
  }
148
-
149
- /**
150
- * Create a STDIN message (for future interactive mode)
151
- */
152
87
  function createStdinMessage(data) {
153
- const buf = Buffer.isBuffer(data) ? data : Buffer.from(data);
154
- return { type: MessageType.STDIN, data: buf.toString('base64') };
88
+ const buf = Buffer.isBuffer(data) ? data : Buffer.from(data);
89
+ return { type: MessageType.STDIN, data: buf.toString('base64') };
155
90
  }
156
-
157
- /**
158
- * Create an OUTPUT message
159
- */
160
91
  function createOutputMessage(data, timestamp = Date.now()) {
161
- const buf = Buffer.isBuffer(data) ? data : Buffer.from(data);
162
- return { type: MessageType.OUTPUT, data: buf.toString('base64'), timestamp };
92
+ const buf = Buffer.isBuffer(data) ? data : Buffer.from(data);
93
+ return { type: MessageType.OUTPUT, data: buf.toString('base64'), timestamp };
163
94
  }
164
-
165
- /**
166
- * Create a HISTORY message
167
- */
168
95
  function createHistoryMessage(data) {
169
- const buf = Buffer.isBuffer(data) ? data : Buffer.from(data);
170
- return { type: MessageType.HISTORY, data: buf.toString('base64') };
96
+ const buf = Buffer.isBuffer(data) ? data : Buffer.from(data);
97
+ return { type: MessageType.HISTORY, data: buf.toString('base64') };
171
98
  }
172
-
173
- /**
174
- * Create a STATE message
175
- */
176
99
  function createStateMessage(state) {
177
- return { type: MessageType.STATE, ...state };
100
+ return { type: MessageType.STATE, ...state };
178
101
  }
179
-
180
- /**
181
- * Create an EXIT message
182
- */
183
102
  function createExitMessage(code, signal) {
184
- return { type: MessageType.EXIT, code, signal };
103
+ return { type: MessageType.EXIT, code, signal };
185
104
  }
186
-
187
- /**
188
- * Create an ERROR message
189
- */
190
105
  function createErrorMessage(message) {
191
- return { type: MessageType.ERROR, message };
106
+ return { type: MessageType.ERROR, message };
192
107
  }
193
-
194
- /**
195
- * Decode base64 data field from OUTPUT/HISTORY/STDIN messages
196
- */
108
+ /** Decode the base64 data field from OUTPUT/HISTORY/STDIN messages. */
197
109
  function decodeData(message) {
198
- if (message.data) {
199
- return Buffer.from(message.data, 'base64');
200
- }
201
- return null;
110
+ if (message.data) {
111
+ return Buffer.from(message.data, 'base64');
112
+ }
113
+ return null;
202
114
  }
203
-
204
115
  module.exports = {
205
- encode,
206
- MessageDecoder,
207
- MessageType,
208
- createAttachMessage,
209
- createDetachMessage,
210
- createResizeMessage,
211
- createSignalMessage,
212
- createStdinMessage,
213
- createOutputMessage,
214
- createHistoryMessage,
215
- createStateMessage,
216
- createExitMessage,
217
- createErrorMessage,
218
- decodeData,
219
- MAX_MESSAGE_SIZE,
116
+ encode,
117
+ MessageDecoder,
118
+ MessageType,
119
+ createAttachMessage,
120
+ createDetachMessage,
121
+ createResizeMessage,
122
+ createSignalMessage,
123
+ createStdinMessage,
124
+ createOutputMessage,
125
+ createHistoryMessage,
126
+ createStateMessage,
127
+ createExitMessage,
128
+ createErrorMessage,
129
+ decodeData,
130
+ MAX_MESSAGE_SIZE,
220
131
  };