@the-open-engine/zeroshot 6.38.1 → 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 (377) 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/cluster/generated/protocol-schema.cjs +1 -1
  13. package/lib/cluster/generated/protocol-schema.mjs +1 -1
  14. package/lib/cluster/generated/protocol.d.cts +8 -0
  15. package/lib/cluster/generated/protocol.d.mts +8 -0
  16. package/lib/cluster/generated/protocol.d.ts +8 -0
  17. package/lib/clusters-registry.d.ts +23 -0
  18. package/lib/clusters-registry.js +17 -29
  19. package/lib/completion.d.ts +12 -0
  20. package/lib/completion.js +84 -94
  21. package/lib/compose-utils.d.ts +32 -0
  22. package/lib/compose-utils.js +57 -72
  23. package/lib/detached-startup.d.ts +83 -0
  24. package/lib/detached-startup.js +231 -302
  25. package/lib/docker-config.d.ts +43 -0
  26. package/lib/docker-config.js +150 -325
  27. package/lib/docker-env-auth.d.ts +17 -0
  28. package/lib/docker-env-auth.js +75 -0
  29. package/lib/git-remote-utils.d.ts +48 -0
  30. package/lib/git-remote-utils.js +147 -213
  31. package/lib/id-detector.d.ts +15 -0
  32. package/lib/id-detector.js +37 -41
  33. package/lib/path-check.d.ts +30 -0
  34. package/lib/path-check.js +42 -45
  35. package/lib/process-liveness.d.ts +16 -0
  36. package/lib/process-liveness.js +19 -12
  37. package/lib/provider-credential-path.d.ts +16 -0
  38. package/lib/provider-credential-path.js +31 -29
  39. package/lib/provider-defaults.d.ts +30 -0
  40. package/lib/provider-defaults.js +47 -42
  41. package/lib/provider-detection.d.ts +11 -0
  42. package/lib/provider-detection.js +91 -54
  43. package/lib/provider-names.d.ts +38 -0
  44. package/lib/provider-names.js +56 -64
  45. package/lib/repo-settings.d.ts +28 -0
  46. package/lib/repo-settings.js +83 -59
  47. package/lib/run-mode.d.ts +21 -0
  48. package/lib/run-mode.js +21 -20
  49. package/lib/run-plan.d.ts +28 -0
  50. package/lib/run-plan.js +17 -16
  51. package/lib/settings/claude-auth.d.ts +35 -0
  52. package/lib/settings/claude-auth.js +30 -47
  53. package/lib/settings-defaults.d.ts +20 -0
  54. package/lib/settings-defaults.js +149 -0
  55. package/lib/settings-error.d.ts +7 -0
  56. package/lib/settings-error.js +8 -0
  57. package/lib/settings-issue-providers.d.ts +10 -0
  58. package/lib/settings-issue-providers.js +12 -0
  59. package/lib/settings-models.d.ts +22 -0
  60. package/lib/settings-models.js +93 -0
  61. package/lib/settings-storage.d.ts +23 -0
  62. package/lib/settings-storage.js +205 -0
  63. package/lib/settings-validation.d.ts +7 -0
  64. package/lib/settings-validation.js +182 -0
  65. package/lib/settings.d.ts +29 -0
  66. package/lib/settings.js +41 -736
  67. package/lib/setup-apply-types.d.ts +66 -0
  68. package/lib/setup-apply-types.js +2 -0
  69. package/lib/setup-apply.d.ts +39 -0
  70. package/lib/setup-apply.js +267 -264
  71. package/lib/setup-journal.d.ts +41 -0
  72. package/lib/setup-journal.js +119 -76
  73. package/lib/setup-plan-types.d.ts +102 -0
  74. package/lib/setup-plan-types.js +2 -0
  75. package/lib/setup-plan.d.ts +30 -0
  76. package/lib/setup-plan.js +300 -324
  77. package/lib/setup-undo.d.ts +44 -0
  78. package/lib/setup-undo.js +61 -74
  79. package/lib/start-cluster-config.d.ts +26 -0
  80. package/lib/start-cluster-config.js +56 -0
  81. package/lib/start-cluster-environment.d.ts +40 -0
  82. package/lib/start-cluster-environment.js +134 -0
  83. package/lib/start-cluster-run-options.d.ts +53 -0
  84. package/lib/start-cluster-run-options.js +147 -0
  85. package/lib/start-cluster.d.ts +64 -0
  86. package/lib/start-cluster.js +98 -454
  87. package/lib/stream-json-parser.d.ts +17 -0
  88. package/lib/stream-json-parser.js +51 -52
  89. package/npm-shrinkwrap.json +2 -2
  90. package/package.json +12 -6
  91. package/scripts/postinstall.js +27 -0
  92. package/scripts/rust-distribution.js +23 -14
  93. package/src/agent/agent-command-proofs-context.js +35 -45
  94. package/src/agent/agent-command-proofs-context.ts +87 -0
  95. package/src/agent/agent-config-settings.js +19 -0
  96. package/src/agent/agent-config-settings.ts +41 -0
  97. package/src/agent/agent-config.js +122 -231
  98. package/src/agent/agent-config.ts +285 -0
  99. package/src/agent/agent-context-builder.js +38 -273
  100. package/src/agent/agent-context-builder.ts +51 -0
  101. package/src/agent/agent-context-environment-sections.js +105 -0
  102. package/src/agent/agent-context-environment-sections.ts +134 -0
  103. package/src/agent/agent-context-packs.js +165 -0
  104. package/src/agent/agent-context-packs.ts +296 -0
  105. package/src/agent/agent-context-prompt-sections.js +100 -0
  106. package/src/agent/agent-context-prompt-sections.ts +148 -0
  107. package/src/agent/agent-context-sections.js +25 -334
  108. package/src/agent/agent-context-sections.ts +36 -0
  109. package/src/agent/agent-context-sources.js +96 -149
  110. package/src/agent/agent-context-sources.ts +253 -0
  111. package/src/agent/agent-context-types.js +2 -0
  112. package/src/agent/agent-context-types.ts +132 -0
  113. package/src/agent/agent-context-validation-sections.js +73 -0
  114. package/src/agent/agent-context-validation-sections.ts +129 -0
  115. package/src/agent/agent-input-injector.js +99 -118
  116. package/src/agent/agent-input-injector.ts +195 -0
  117. package/src/agent/agent-liveness-poll.js +74 -78
  118. package/src/agent/agent-liveness-poll.ts +163 -0
  119. package/src/agent/agent-quality-gate-schema.js +77 -86
  120. package/src/agent/agent-quality-gate-schema.ts +135 -0
  121. package/src/agent/agent-quality-gates-context.js +44 -50
  122. package/src/agent/agent-quality-gates-context.ts +91 -0
  123. package/src/agent/agent-stuck-detector.js +171 -239
  124. package/src/agent/agent-stuck-detector.ts +288 -0
  125. package/src/agent/agent-trigger-evaluator.js +29 -46
  126. package/src/agent/agent-trigger-evaluator.ts +98 -0
  127. package/src/agent/context-metrics.js +110 -141
  128. package/src/agent/context-metrics.ts +261 -0
  129. package/src/agent/context-pack-builder.js +72 -358
  130. package/src/agent/context-pack-builder.ts +105 -0
  131. package/src/agent/context-pack-core.js +70 -0
  132. package/src/agent/context-pack-core.ts +96 -0
  133. package/src/agent/context-pack-selection.js +119 -0
  134. package/src/agent/context-pack-selection.ts +187 -0
  135. package/src/agent/context-pack-truncation.js +139 -0
  136. package/src/agent/context-pack-truncation.ts +208 -0
  137. package/src/agent/context-pack-types.js +2 -0
  138. package/src/agent/context-pack-types.ts +98 -0
  139. package/src/agent/context-replay-policy.js +30 -39
  140. package/src/agent/context-replay-policy.ts +71 -0
  141. package/src/agent/critical-agent-policy.js +6 -10
  142. package/src/agent/critical-agent-policy.ts +20 -0
  143. package/src/agent/guidance-queue.js +74 -87
  144. package/src/agent/guidance-queue.ts +166 -0
  145. package/src/agent/output-extraction-error-detail.js +45 -0
  146. package/src/agent/output-extraction-error-detail.ts +49 -0
  147. package/src/agent/output-extraction-failures.js +125 -0
  148. package/src/agent/output-extraction-failures.ts +149 -0
  149. package/src/agent/output-extraction-json.js +234 -0
  150. package/src/agent/output-extraction-json.ts +235 -0
  151. package/src/agent/output-extraction-pi.js +124 -0
  152. package/src/agent/output-extraction-pi.ts +137 -0
  153. package/src/agent/output-extraction-types.js +2 -0
  154. package/src/agent/output-extraction-types.ts +49 -0
  155. package/src/agent/output-extraction.js +17 -617
  156. package/src/agent/output-extraction.ts +30 -0
  157. package/src/agent/output-reformatter-errors.js +83 -0
  158. package/src/agent/output-reformatter-errors.ts +106 -0
  159. package/src/agent/output-reformatter-types.js +2 -0
  160. package/src/agent/output-reformatter-types.ts +86 -0
  161. package/src/agent/output-reformatter.js +140 -185
  162. package/src/agent/output-reformatter.ts +238 -0
  163. package/src/agent/pi-terminal-lifecycle-types.js +2 -0
  164. package/src/agent/pi-terminal-lifecycle-types.ts +41 -0
  165. package/src/agent/pi-terminal-lifecycle.js +186 -206
  166. package/src/agent/pi-terminal-lifecycle.ts +297 -0
  167. package/src/agent/provider-control-plane.js +22 -21
  168. package/src/agent/provider-control-plane.ts +52 -0
  169. package/src/agent/provider-terminal-failure-types.js +2 -0
  170. package/src/agent/provider-terminal-failure-types.ts +60 -0
  171. package/src/agent/provider-terminal-failure.js +194 -191
  172. package/src/agent/provider-terminal-failure.ts +262 -0
  173. package/src/agent/rate-limit-backoff.js +31 -74
  174. package/src/agent/rate-limit-backoff.ts +71 -0
  175. package/src/agent/schema-utils.js +85 -125
  176. package/src/agent/schema-utils.ts +148 -0
  177. package/src/agent/structured-output-error.js +34 -33
  178. package/src/agent/structured-output-error.ts +105 -0
  179. package/src/agent/validation-platform.js +27 -27
  180. package/src/agent/validation-platform.ts +49 -0
  181. package/src/attach/attach-client.js +232 -405
  182. package/src/attach/attach-client.ts +300 -0
  183. package/src/attach/attach-server-cleanup.js +43 -0
  184. package/src/attach/attach-server-cleanup.ts +39 -0
  185. package/src/attach/attach-server-clients.js +117 -0
  186. package/src/attach/attach-server-clients.ts +122 -0
  187. package/src/attach/attach-server-events.js +38 -0
  188. package/src/attach/attach-server-events.ts +36 -0
  189. package/src/attach/attach-server-pty.js +45 -0
  190. package/src/attach/attach-server-pty.ts +64 -0
  191. package/src/attach/attach-server-runtime.js +73 -0
  192. package/src/attach/attach-server-runtime.ts +62 -0
  193. package/src/attach/attach-server-socket.js +28 -0
  194. package/src/attach/attach-server-socket.ts +23 -0
  195. package/src/attach/attach-server-types.js +2 -0
  196. package/src/attach/attach-server-types.ts +82 -0
  197. package/src/attach/attach-server.js +106 -523
  198. package/src/attach/attach-server.ts +158 -0
  199. package/src/attach/index.js +18 -35
  200. package/src/attach/index.ts +18 -0
  201. package/src/attach/protocol.js +95 -184
  202. package/src/attach/protocol.ts +181 -0
  203. package/src/attach/ring-buffer.js +76 -102
  204. package/src/attach/ring-buffer.ts +109 -0
  205. package/src/attach/send-input.js +64 -75
  206. package/src/attach/send-input.ts +94 -0
  207. package/src/attach/socket-discovery.js +164 -218
  208. package/src/attach/socket-discovery.ts +230 -0
  209. package/src/attach/socket-paths.js +42 -61
  210. package/src/attach/socket-paths.ts +81 -0
  211. package/src/claude-credentials.js +51 -54
  212. package/src/claude-credentials.ts +89 -0
  213. package/src/cluster/generated/protocol-schema.ts +1 -1
  214. package/src/cluster/generated/protocol.ts +2 -1
  215. package/src/command-proofs.js +110 -141
  216. package/src/command-proofs.ts +216 -0
  217. package/src/config-router.js +81 -73
  218. package/src/config-router.ts +131 -0
  219. package/src/copy-worker.js +53 -29
  220. package/src/copy-worker.ts +75 -0
  221. package/src/darwin-keychain-boundary.js +80 -111
  222. package/src/darwin-keychain-boundary.ts +148 -0
  223. package/src/guidance-topics.js +4 -5
  224. package/src/guidance-topics.ts +10 -0
  225. package/src/input-helpers.js +33 -54
  226. package/src/input-helpers.ts +58 -0
  227. package/src/ledger-sequence.js +45 -48
  228. package/src/ledger-sequence.ts +63 -0
  229. package/src/legacy-lib/clusters-registry.ts +40 -0
  230. package/src/legacy-lib/completion.ts +148 -0
  231. package/src/legacy-lib/compose-utils.ts +102 -0
  232. package/src/legacy-lib/detached-startup.ts +449 -0
  233. package/src/legacy-lib/docker-config.ts +282 -0
  234. package/src/legacy-lib/docker-env-auth.ts +116 -0
  235. package/src/legacy-lib/git-remote-utils.ts +244 -0
  236. package/src/legacy-lib/id-detector.ts +57 -0
  237. package/src/legacy-lib/js-yaml.d.ts +3 -0
  238. package/src/legacy-lib/omelette.d.ts +15 -0
  239. package/src/legacy-lib/path-check.ts +89 -0
  240. package/src/legacy-lib/process-liveness.ts +36 -0
  241. package/src/legacy-lib/provider-credential-path.ts +57 -0
  242. package/src/legacy-lib/provider-defaults.ts +114 -0
  243. package/src/legacy-lib/provider-detection.ts +67 -0
  244. package/src/legacy-lib/provider-names.ts +126 -0
  245. package/src/legacy-lib/repo-settings.ts +88 -0
  246. package/src/legacy-lib/run-mode.ts +58 -0
  247. package/src/legacy-lib/run-plan.ts +49 -0
  248. package/src/legacy-lib/settings/claude-auth.ts +80 -0
  249. package/src/legacy-lib/settings-defaults.ts +212 -0
  250. package/src/legacy-lib/settings-error.ts +8 -0
  251. package/src/legacy-lib/settings-issue-providers.ts +18 -0
  252. package/src/legacy-lib/settings-models.ts +124 -0
  253. package/src/legacy-lib/settings-storage.ts +277 -0
  254. package/src/legacy-lib/settings-validation.ts +220 -0
  255. package/src/legacy-lib/settings.ts +87 -0
  256. package/src/legacy-lib/setup-apply-types.ts +70 -0
  257. package/src/legacy-lib/setup-apply.ts +456 -0
  258. package/src/legacy-lib/setup-journal.ts +185 -0
  259. package/src/legacy-lib/setup-plan-types.ts +96 -0
  260. package/src/legacy-lib/setup-plan.ts +500 -0
  261. package/src/legacy-lib/setup-undo.ts +142 -0
  262. package/src/legacy-lib/start-cluster-config.ts +124 -0
  263. package/src/legacy-lib/start-cluster-environment.ts +165 -0
  264. package/src/legacy-lib/start-cluster-run-options.ts +279 -0
  265. package/src/legacy-lib/start-cluster.ts +237 -0
  266. package/src/legacy-lib/stream-json-parser.ts +88 -0
  267. package/src/message-buffer.js +55 -71
  268. package/src/message-buffer.ts +107 -0
  269. package/src/message-bus-bridge.js +92 -133
  270. package/src/message-bus-bridge.ts +149 -0
  271. package/src/name-generator-shared.js +220 -0
  272. package/src/name-generator-shared.ts +231 -0
  273. package/src/name-generator.js +8 -217
  274. package/src/name-generator.ts +27 -0
  275. package/src/omp-blob-root.js +83 -64
  276. package/src/omp-blob-root.ts +116 -0
  277. package/src/omp-config-overlay.js +65 -38
  278. package/src/omp-config-overlay.ts +110 -0
  279. package/src/omp-execution-fingerprint.js +38 -43
  280. package/src/omp-execution-fingerprint.ts +92 -0
  281. package/src/omp-session-limits.js +10 -15
  282. package/src/omp-session-limits.ts +53 -0
  283. package/src/omp-session-partition.js +2 -2
  284. package/src/omp-session-verifier.js +1 -1
  285. package/src/orchestrator.js +19 -4
  286. package/src/providers/anthropic/index.js +3 -1
  287. package/src/providers/anthropic/index.ts +13 -0
  288. package/src/providers/capabilities.js +19 -27
  289. package/src/providers/capabilities.ts +44 -0
  290. package/src/providers/google/index.js +3 -1
  291. package/src/providers/google/index.ts +13 -0
  292. package/src/providers/openai/index.js +3 -1
  293. package/src/providers/openai/index.ts +13 -0
  294. package/src/providers/opencode/index.js +3 -1
  295. package/src/providers/opencode/index.ts +13 -0
  296. package/src/quality-gates.js +67 -127
  297. package/src/quality-gates.ts +149 -0
  298. package/src/repo-settings-access.js +40 -0
  299. package/src/repo-settings-access.ts +64 -0
  300. package/src/schemas/sub-cluster.js +127 -183
  301. package/src/schemas/sub-cluster.ts +238 -0
  302. package/src/state-snapshot-normalization.js +224 -0
  303. package/src/state-snapshot-normalization.ts +222 -0
  304. package/src/state-snapshot.js +192 -359
  305. package/src/state-snapshot.ts +291 -0
  306. package/src/state-snapshotter.js +118 -130
  307. package/src/state-snapshotter.ts +167 -0
  308. package/src/sub-cluster-wrapper.js +4 -13
  309. package/src/task-run-model-args.js +87 -124
  310. package/src/task-run-model-args.ts +204 -0
  311. package/src/task-runner.js +5 -25
  312. package/src/task-runner.ts +28 -0
  313. package/src/task-startup-error.js +73 -58
  314. package/src/task-startup-error.ts +126 -0
  315. package/src/template-validation/consensus-gate-contracts.js +2 -0
  316. package/src/template-validation/consensus-gate-contracts.ts +70 -0
  317. package/src/template-validation/consensus-gate-scenarios.js +76 -0
  318. package/src/template-validation/consensus-gate-scenarios.ts +130 -0
  319. package/src/template-validation/consensus-gate-stage.js +34 -0
  320. package/src/template-validation/consensus-gate-stage.ts +56 -0
  321. package/src/template-validation/random-topology-contracts.js +2 -0
  322. package/src/template-validation/random-topology-contracts.ts +54 -0
  323. package/src/template-validation/random-topology-dispatch.js +25 -0
  324. package/src/template-validation/random-topology-dispatch.ts +33 -0
  325. package/src/template-validation/random-topology-message-loop.js +53 -0
  326. package/src/template-validation/random-topology-message-loop.ts +73 -0
  327. package/src/template-validation/random-topology-operations.js +79 -0
  328. package/src/template-validation/random-topology-operations.ts +101 -0
  329. package/src/template-validation/random-topology-runtime.js +25 -0
  330. package/src/template-validation/random-topology-runtime.ts +43 -0
  331. package/src/template-validation/random-topology-scenario.js +52 -0
  332. package/src/template-validation/random-topology-scenario.ts +57 -0
  333. package/src/template-validation/random-topology-schema.js +159 -0
  334. package/src/template-validation/random-topology-schema.ts +190 -0
  335. package/src/template-validation/random-topology-state.js +28 -0
  336. package/src/template-validation/random-topology-state.ts +30 -0
  337. package/src/template-validation/random-topology-trigger-evaluation.js +45 -0
  338. package/src/template-validation/random-topology-trigger-evaluation.ts +65 -0
  339. package/src/template-validation/random-topology-trigger.js +75 -0
  340. package/src/template-validation/random-topology-trigger.ts +88 -0
  341. package/src/template-validation/report-formatter.js +40 -46
  342. package/src/template-validation/report-formatter.ts +101 -0
  343. package/src/template-validation/simulate-consensus-gates.js +111 -302
  344. package/src/template-validation/simulate-consensus-gates.ts +196 -0
  345. package/src/template-validation/simulate-random-topology.js +26 -519
  346. package/src/template-validation/simulate-random-topology.ts +57 -0
  347. package/src/template-validation/simulate-two-stage-validation.js +41 -265
  348. package/src/template-validation/simulate-two-stage-validation.ts +55 -0
  349. package/src/template-validation/simulation-agent-runtime.js +25 -0
  350. package/src/template-validation/simulation-agent-runtime.ts +40 -0
  351. package/src/template-validation/simulation-agent.js +29 -0
  352. package/src/template-validation/simulation-agent.ts +73 -0
  353. package/src/template-validation/simulation-runtime.js +34 -0
  354. package/src/template-validation/simulation-runtime.ts +72 -0
  355. package/src/template-validation/two-stage-contracts.js +2 -0
  356. package/src/template-validation/two-stage-contracts.ts +41 -0
  357. package/src/template-validation/two-stage-inputs.js +21 -0
  358. package/src/template-validation/two-stage-inputs.ts +29 -0
  359. package/src/template-validation/two-stage-results.js +30 -0
  360. package/src/template-validation/two-stage-results.ts +40 -0
  361. package/src/template-validation/two-stage-scenario.js +86 -0
  362. package/src/template-validation/two-stage-scenario.ts +120 -0
  363. package/src/worktree-claude-config.js +182 -220
  364. package/src/worktree-claude-config.ts +272 -0
  365. package/src/worktree-tooling-env.js +103 -125
  366. package/src/worktree-tooling-env.ts +142 -0
  367. package/task-lib/completion.js +2 -3
  368. package/task-lib/completion.ts +9 -0
  369. package/task-lib/config.js +1 -4
  370. package/task-lib/config.ts +11 -0
  371. package/task-lib/name-generator.js +4 -226
  372. package/task-lib/name-generator.ts +11 -0
  373. package/task-lib/omp-session-cleanup.js +1 -1
  374. package/task-lib/omp-storage-root.js +8 -12
  375. package/task-lib/omp-storage-root.ts +62 -0
  376. package/task-lib/process-termination.js +143 -166
  377. 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
  };