@the-open-engine/zeroshot 6.38.1 → 6.39.1

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 (383) hide show
  1. package/README.md +6 -0
  2. package/cli/event-copy.js +8 -7
  3. package/cli/event-copy.ts +12 -0
  4. package/cli/index.js +67 -48
  5. package/cli/json-export.js +61 -64
  6. package/cli/json-export.ts +112 -0
  7. package/cli/message-formatter-utils.js +68 -56
  8. package/cli/message-formatter-utils.ts +121 -0
  9. package/cli/message-formatters-normal.js +124 -259
  10. package/cli/message-formatters-normal.ts +250 -0
  11. package/cli/message-formatters-watch.js +81 -84
  12. package/cli/message-formatters-watch.ts +189 -0
  13. package/lib/cluster/generated/protocol-schema.cjs +1 -1
  14. package/lib/cluster/generated/protocol-schema.mjs +1 -1
  15. package/lib/cluster/generated/protocol.d.cts +8 -0
  16. package/lib/cluster/generated/protocol.d.mts +8 -0
  17. package/lib/cluster/generated/protocol.d.ts +8 -0
  18. package/lib/clusters-registry.d.ts +23 -0
  19. package/lib/clusters-registry.js +17 -29
  20. package/lib/completion.d.ts +12 -0
  21. package/lib/completion.js +84 -94
  22. package/lib/compose-utils.d.ts +32 -0
  23. package/lib/compose-utils.js +57 -72
  24. package/lib/detached-startup.d.ts +84 -0
  25. package/lib/detached-startup.js +232 -302
  26. package/lib/docker-config.d.ts +43 -0
  27. package/lib/docker-config.js +150 -325
  28. package/lib/docker-env-auth.d.ts +17 -0
  29. package/lib/docker-env-auth.js +75 -0
  30. package/lib/git-remote-utils.d.ts +48 -0
  31. package/lib/git-remote-utils.js +147 -213
  32. package/lib/id-detector.d.ts +15 -0
  33. package/lib/id-detector.js +37 -41
  34. package/lib/path-check.d.ts +30 -0
  35. package/lib/path-check.js +42 -45
  36. package/lib/process-liveness.d.ts +16 -0
  37. package/lib/process-liveness.js +19 -12
  38. package/lib/provider-credential-path.d.ts +16 -0
  39. package/lib/provider-credential-path.js +31 -29
  40. package/lib/provider-defaults.d.ts +30 -0
  41. package/lib/provider-defaults.js +47 -42
  42. package/lib/provider-detection.d.ts +11 -0
  43. package/lib/provider-detection.js +91 -54
  44. package/lib/provider-names.d.ts +38 -0
  45. package/lib/provider-names.js +56 -64
  46. package/lib/repo-settings.d.ts +28 -0
  47. package/lib/repo-settings.js +83 -59
  48. package/lib/run-mode.d.ts +21 -0
  49. package/lib/run-mode.js +21 -20
  50. package/lib/run-plan.d.ts +28 -0
  51. package/lib/run-plan.js +17 -16
  52. package/lib/settings/claude-auth.d.ts +35 -0
  53. package/lib/settings/claude-auth.js +30 -47
  54. package/lib/settings-defaults.d.ts +20 -0
  55. package/lib/settings-defaults.js +149 -0
  56. package/lib/settings-error.d.ts +7 -0
  57. package/lib/settings-error.js +8 -0
  58. package/lib/settings-issue-providers.d.ts +10 -0
  59. package/lib/settings-issue-providers.js +12 -0
  60. package/lib/settings-models.d.ts +22 -0
  61. package/lib/settings-models.js +93 -0
  62. package/lib/settings-storage.d.ts +23 -0
  63. package/lib/settings-storage.js +205 -0
  64. package/lib/settings-validation.d.ts +7 -0
  65. package/lib/settings-validation.js +182 -0
  66. package/lib/settings.d.ts +29 -0
  67. package/lib/settings.js +41 -736
  68. package/lib/setup-apply-types.d.ts +66 -0
  69. package/lib/setup-apply-types.js +2 -0
  70. package/lib/setup-apply.d.ts +39 -0
  71. package/lib/setup-apply.js +267 -264
  72. package/lib/setup-journal.d.ts +41 -0
  73. package/lib/setup-journal.js +119 -76
  74. package/lib/setup-plan-types.d.ts +102 -0
  75. package/lib/setup-plan-types.js +2 -0
  76. package/lib/setup-plan.d.ts +30 -0
  77. package/lib/setup-plan.js +300 -324
  78. package/lib/setup-undo.d.ts +44 -0
  79. package/lib/setup-undo.js +61 -74
  80. package/lib/start-cluster-config.d.ts +26 -0
  81. package/lib/start-cluster-config.js +56 -0
  82. package/lib/start-cluster-environment.d.ts +41 -0
  83. package/lib/start-cluster-environment.js +134 -0
  84. package/lib/start-cluster-run-options.d.ts +54 -0
  85. package/lib/start-cluster-run-options.js +148 -0
  86. package/lib/start-cluster.d.ts +64 -0
  87. package/lib/start-cluster.js +98 -454
  88. package/lib/stream-json-parser.d.ts +17 -0
  89. package/lib/stream-json-parser.js +51 -52
  90. package/npm-shrinkwrap.json +6 -8
  91. package/package.json +14 -8
  92. package/scripts/postinstall.js +27 -0
  93. package/scripts/rust-distribution.js +36 -45
  94. package/src/agent/agent-command-proofs-context.js +35 -45
  95. package/src/agent/agent-command-proofs-context.ts +87 -0
  96. package/src/agent/agent-config-settings.js +19 -0
  97. package/src/agent/agent-config-settings.ts +41 -0
  98. package/src/agent/agent-config.js +122 -231
  99. package/src/agent/agent-config.ts +285 -0
  100. package/src/agent/agent-context-builder.js +38 -273
  101. package/src/agent/agent-context-builder.ts +51 -0
  102. package/src/agent/agent-context-environment-sections.js +105 -0
  103. package/src/agent/agent-context-environment-sections.ts +134 -0
  104. package/src/agent/agent-context-packs.js +165 -0
  105. package/src/agent/agent-context-packs.ts +296 -0
  106. package/src/agent/agent-context-prompt-sections.js +100 -0
  107. package/src/agent/agent-context-prompt-sections.ts +148 -0
  108. package/src/agent/agent-context-sections.js +25 -334
  109. package/src/agent/agent-context-sections.ts +36 -0
  110. package/src/agent/agent-context-sources.js +96 -149
  111. package/src/agent/agent-context-sources.ts +253 -0
  112. package/src/agent/agent-context-types.js +2 -0
  113. package/src/agent/agent-context-types.ts +132 -0
  114. package/src/agent/agent-context-validation-sections.js +73 -0
  115. package/src/agent/agent-context-validation-sections.ts +129 -0
  116. package/src/agent/agent-input-injector.js +99 -118
  117. package/src/agent/agent-input-injector.ts +195 -0
  118. package/src/agent/agent-liveness-poll.js +74 -78
  119. package/src/agent/agent-liveness-poll.ts +163 -0
  120. package/src/agent/agent-quality-gate-schema.js +77 -86
  121. package/src/agent/agent-quality-gate-schema.ts +135 -0
  122. package/src/agent/agent-quality-gates-context.js +44 -50
  123. package/src/agent/agent-quality-gates-context.ts +91 -0
  124. package/src/agent/agent-stuck-detector.js +171 -239
  125. package/src/agent/agent-stuck-detector.ts +288 -0
  126. package/src/agent/agent-trigger-evaluator.js +29 -46
  127. package/src/agent/agent-trigger-evaluator.ts +98 -0
  128. package/src/agent/context-metrics.js +110 -141
  129. package/src/agent/context-metrics.ts +261 -0
  130. package/src/agent/context-pack-builder.js +72 -358
  131. package/src/agent/context-pack-builder.ts +105 -0
  132. package/src/agent/context-pack-core.js +70 -0
  133. package/src/agent/context-pack-core.ts +96 -0
  134. package/src/agent/context-pack-selection.js +119 -0
  135. package/src/agent/context-pack-selection.ts +187 -0
  136. package/src/agent/context-pack-truncation.js +139 -0
  137. package/src/agent/context-pack-truncation.ts +208 -0
  138. package/src/agent/context-pack-types.js +2 -0
  139. package/src/agent/context-pack-types.ts +98 -0
  140. package/src/agent/context-replay-policy.js +30 -39
  141. package/src/agent/context-replay-policy.ts +71 -0
  142. package/src/agent/critical-agent-policy.js +6 -10
  143. package/src/agent/critical-agent-policy.ts +20 -0
  144. package/src/agent/guidance-queue.js +74 -87
  145. package/src/agent/guidance-queue.ts +166 -0
  146. package/src/agent/output-extraction-error-detail.js +45 -0
  147. package/src/agent/output-extraction-error-detail.ts +49 -0
  148. package/src/agent/output-extraction-failures.js +125 -0
  149. package/src/agent/output-extraction-failures.ts +149 -0
  150. package/src/agent/output-extraction-json.js +234 -0
  151. package/src/agent/output-extraction-json.ts +235 -0
  152. package/src/agent/output-extraction-pi.js +124 -0
  153. package/src/agent/output-extraction-pi.ts +137 -0
  154. package/src/agent/output-extraction-types.js +2 -0
  155. package/src/agent/output-extraction-types.ts +49 -0
  156. package/src/agent/output-extraction.js +17 -617
  157. package/src/agent/output-extraction.ts +30 -0
  158. package/src/agent/output-reformatter-errors.js +83 -0
  159. package/src/agent/output-reformatter-errors.ts +106 -0
  160. package/src/agent/output-reformatter-types.js +2 -0
  161. package/src/agent/output-reformatter-types.ts +86 -0
  162. package/src/agent/output-reformatter.js +140 -185
  163. package/src/agent/output-reformatter.ts +238 -0
  164. package/src/agent/pi-terminal-lifecycle-types.js +2 -0
  165. package/src/agent/pi-terminal-lifecycle-types.ts +41 -0
  166. package/src/agent/pi-terminal-lifecycle.js +186 -206
  167. package/src/agent/pi-terminal-lifecycle.ts +297 -0
  168. package/src/agent/provider-control-plane.js +22 -21
  169. package/src/agent/provider-control-plane.ts +52 -0
  170. package/src/agent/provider-terminal-failure-types.js +2 -0
  171. package/src/agent/provider-terminal-failure-types.ts +60 -0
  172. package/src/agent/provider-terminal-failure.js +194 -191
  173. package/src/agent/provider-terminal-failure.ts +262 -0
  174. package/src/agent/rate-limit-backoff.js +31 -74
  175. package/src/agent/rate-limit-backoff.ts +71 -0
  176. package/src/agent/schema-utils.js +85 -125
  177. package/src/agent/schema-utils.ts +148 -0
  178. package/src/agent/structured-output-error.js +34 -33
  179. package/src/agent/structured-output-error.ts +105 -0
  180. package/src/agent/validation-platform.js +27 -27
  181. package/src/agent/validation-platform.ts +49 -0
  182. package/src/agents/git-pusher-template.js +17 -34
  183. package/src/attach/attach-client.js +232 -405
  184. package/src/attach/attach-client.ts +300 -0
  185. package/src/attach/attach-server-cleanup.js +43 -0
  186. package/src/attach/attach-server-cleanup.ts +39 -0
  187. package/src/attach/attach-server-clients.js +117 -0
  188. package/src/attach/attach-server-clients.ts +122 -0
  189. package/src/attach/attach-server-events.js +38 -0
  190. package/src/attach/attach-server-events.ts +36 -0
  191. package/src/attach/attach-server-pty.js +45 -0
  192. package/src/attach/attach-server-pty.ts +64 -0
  193. package/src/attach/attach-server-runtime.js +73 -0
  194. package/src/attach/attach-server-runtime.ts +62 -0
  195. package/src/attach/attach-server-socket.js +28 -0
  196. package/src/attach/attach-server-socket.ts +23 -0
  197. package/src/attach/attach-server-types.js +2 -0
  198. package/src/attach/attach-server-types.ts +82 -0
  199. package/src/attach/attach-server.js +106 -523
  200. package/src/attach/attach-server.ts +158 -0
  201. package/src/attach/index.js +18 -35
  202. package/src/attach/index.ts +18 -0
  203. package/src/attach/protocol.js +95 -184
  204. package/src/attach/protocol.ts +181 -0
  205. package/src/attach/ring-buffer.js +76 -102
  206. package/src/attach/ring-buffer.ts +109 -0
  207. package/src/attach/send-input.js +64 -75
  208. package/src/attach/send-input.ts +94 -0
  209. package/src/attach/socket-discovery.js +164 -218
  210. package/src/attach/socket-discovery.ts +230 -0
  211. package/src/attach/socket-paths.js +42 -61
  212. package/src/attach/socket-paths.ts +81 -0
  213. package/src/claude-credentials.js +51 -54
  214. package/src/claude-credentials.ts +89 -0
  215. package/src/cluster/generated/protocol-schema.ts +1 -1
  216. package/src/cluster/generated/protocol.ts +2 -1
  217. package/src/command-proofs.js +110 -141
  218. package/src/command-proofs.ts +216 -0
  219. package/src/config-router.js +81 -73
  220. package/src/config-router.ts +131 -0
  221. package/src/copy-containment.js +191 -0
  222. package/src/copy-containment.ts +259 -0
  223. package/src/copy-worker.js +53 -30
  224. package/src/copy-worker.ts +88 -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/isolation-manager.js +59 -20
  232. package/src/ledger-sequence.js +45 -48
  233. package/src/ledger-sequence.ts +63 -0
  234. package/src/legacy-lib/clusters-registry.ts +40 -0
  235. package/src/legacy-lib/completion.ts +148 -0
  236. package/src/legacy-lib/compose-utils.ts +102 -0
  237. package/src/legacy-lib/detached-startup.ts +451 -0
  238. package/src/legacy-lib/docker-config.ts +282 -0
  239. package/src/legacy-lib/docker-env-auth.ts +116 -0
  240. package/src/legacy-lib/git-remote-utils.ts +244 -0
  241. package/src/legacy-lib/id-detector.ts +57 -0
  242. package/src/legacy-lib/js-yaml.d.ts +3 -0
  243. package/src/legacy-lib/omelette.d.ts +15 -0
  244. package/src/legacy-lib/path-check.ts +89 -0
  245. package/src/legacy-lib/process-liveness.ts +36 -0
  246. package/src/legacy-lib/provider-credential-path.ts +57 -0
  247. package/src/legacy-lib/provider-defaults.ts +114 -0
  248. package/src/legacy-lib/provider-detection.ts +67 -0
  249. package/src/legacy-lib/provider-names.ts +126 -0
  250. package/src/legacy-lib/repo-settings.ts +88 -0
  251. package/src/legacy-lib/run-mode.ts +58 -0
  252. package/src/legacy-lib/run-plan.ts +49 -0
  253. package/src/legacy-lib/settings/claude-auth.ts +80 -0
  254. package/src/legacy-lib/settings-defaults.ts +212 -0
  255. package/src/legacy-lib/settings-error.ts +8 -0
  256. package/src/legacy-lib/settings-issue-providers.ts +18 -0
  257. package/src/legacy-lib/settings-models.ts +124 -0
  258. package/src/legacy-lib/settings-storage.ts +277 -0
  259. package/src/legacy-lib/settings-validation.ts +220 -0
  260. package/src/legacy-lib/settings.ts +87 -0
  261. package/src/legacy-lib/setup-apply-types.ts +70 -0
  262. package/src/legacy-lib/setup-apply.ts +456 -0
  263. package/src/legacy-lib/setup-journal.ts +185 -0
  264. package/src/legacy-lib/setup-plan-types.ts +96 -0
  265. package/src/legacy-lib/setup-plan.ts +500 -0
  266. package/src/legacy-lib/setup-undo.ts +142 -0
  267. package/src/legacy-lib/start-cluster-config.ts +124 -0
  268. package/src/legacy-lib/start-cluster-environment.ts +166 -0
  269. package/src/legacy-lib/start-cluster-run-options.ts +281 -0
  270. package/src/legacy-lib/start-cluster.ts +237 -0
  271. package/src/legacy-lib/stream-json-parser.ts +88 -0
  272. package/src/message-buffer.js +55 -71
  273. package/src/message-buffer.ts +107 -0
  274. package/src/message-bus-bridge.js +92 -133
  275. package/src/message-bus-bridge.ts +149 -0
  276. package/src/name-generator-shared.js +220 -0
  277. package/src/name-generator-shared.ts +231 -0
  278. package/src/name-generator.js +8 -217
  279. package/src/name-generator.ts +27 -0
  280. package/src/omp-blob-root.js +83 -64
  281. package/src/omp-blob-root.ts +116 -0
  282. package/src/omp-config-overlay.js +65 -38
  283. package/src/omp-config-overlay.ts +110 -0
  284. package/src/omp-execution-fingerprint.js +38 -43
  285. package/src/omp-execution-fingerprint.ts +92 -0
  286. package/src/omp-session-limits.js +10 -15
  287. package/src/omp-session-limits.ts +53 -0
  288. package/src/omp-session-partition.js +2 -2
  289. package/src/omp-session-verifier.js +1 -1
  290. package/src/orchestrator.js +32 -7
  291. package/src/pr-body-template.js +71 -0
  292. package/src/providers/anthropic/index.js +3 -1
  293. package/src/providers/anthropic/index.ts +13 -0
  294. package/src/providers/capabilities.js +19 -27
  295. package/src/providers/capabilities.ts +44 -0
  296. package/src/providers/google/index.js +3 -1
  297. package/src/providers/google/index.ts +13 -0
  298. package/src/providers/openai/index.js +3 -1
  299. package/src/providers/openai/index.ts +13 -0
  300. package/src/providers/opencode/index.js +3 -1
  301. package/src/providers/opencode/index.ts +13 -0
  302. package/src/quality-gates.js +67 -127
  303. package/src/quality-gates.ts +149 -0
  304. package/src/repo-settings-access.js +40 -0
  305. package/src/repo-settings-access.ts +64 -0
  306. package/src/schemas/sub-cluster.js +127 -183
  307. package/src/schemas/sub-cluster.ts +238 -0
  308. package/src/state-snapshot-normalization.js +224 -0
  309. package/src/state-snapshot-normalization.ts +222 -0
  310. package/src/state-snapshot.js +192 -359
  311. package/src/state-snapshot.ts +291 -0
  312. package/src/state-snapshotter.js +118 -130
  313. package/src/state-snapshotter.ts +167 -0
  314. package/src/sub-cluster-wrapper.js +4 -13
  315. package/src/task-run-model-args.js +87 -124
  316. package/src/task-run-model-args.ts +204 -0
  317. package/src/task-runner.js +5 -25
  318. package/src/task-runner.ts +28 -0
  319. package/src/task-startup-error.js +73 -58
  320. package/src/task-startup-error.ts +126 -0
  321. package/src/template-validation/consensus-gate-contracts.js +2 -0
  322. package/src/template-validation/consensus-gate-contracts.ts +70 -0
  323. package/src/template-validation/consensus-gate-scenarios.js +76 -0
  324. package/src/template-validation/consensus-gate-scenarios.ts +130 -0
  325. package/src/template-validation/consensus-gate-stage.js +34 -0
  326. package/src/template-validation/consensus-gate-stage.ts +56 -0
  327. package/src/template-validation/random-topology-contracts.js +2 -0
  328. package/src/template-validation/random-topology-contracts.ts +54 -0
  329. package/src/template-validation/random-topology-dispatch.js +25 -0
  330. package/src/template-validation/random-topology-dispatch.ts +33 -0
  331. package/src/template-validation/random-topology-message-loop.js +53 -0
  332. package/src/template-validation/random-topology-message-loop.ts +73 -0
  333. package/src/template-validation/random-topology-operations.js +79 -0
  334. package/src/template-validation/random-topology-operations.ts +101 -0
  335. package/src/template-validation/random-topology-runtime.js +25 -0
  336. package/src/template-validation/random-topology-runtime.ts +43 -0
  337. package/src/template-validation/random-topology-scenario.js +52 -0
  338. package/src/template-validation/random-topology-scenario.ts +57 -0
  339. package/src/template-validation/random-topology-schema.js +159 -0
  340. package/src/template-validation/random-topology-schema.ts +190 -0
  341. package/src/template-validation/random-topology-state.js +28 -0
  342. package/src/template-validation/random-topology-state.ts +30 -0
  343. package/src/template-validation/random-topology-trigger-evaluation.js +45 -0
  344. package/src/template-validation/random-topology-trigger-evaluation.ts +65 -0
  345. package/src/template-validation/random-topology-trigger.js +75 -0
  346. package/src/template-validation/random-topology-trigger.ts +88 -0
  347. package/src/template-validation/report-formatter.js +40 -46
  348. package/src/template-validation/report-formatter.ts +101 -0
  349. package/src/template-validation/simulate-consensus-gates.js +111 -302
  350. package/src/template-validation/simulate-consensus-gates.ts +196 -0
  351. package/src/template-validation/simulate-random-topology.js +26 -519
  352. package/src/template-validation/simulate-random-topology.ts +57 -0
  353. package/src/template-validation/simulate-two-stage-validation.js +41 -265
  354. package/src/template-validation/simulate-two-stage-validation.ts +55 -0
  355. package/src/template-validation/simulation-agent-runtime.js +25 -0
  356. package/src/template-validation/simulation-agent-runtime.ts +40 -0
  357. package/src/template-validation/simulation-agent.js +29 -0
  358. package/src/template-validation/simulation-agent.ts +73 -0
  359. package/src/template-validation/simulation-runtime.js +34 -0
  360. package/src/template-validation/simulation-runtime.ts +72 -0
  361. package/src/template-validation/two-stage-contracts.js +2 -0
  362. package/src/template-validation/two-stage-contracts.ts +41 -0
  363. package/src/template-validation/two-stage-inputs.js +21 -0
  364. package/src/template-validation/two-stage-inputs.ts +29 -0
  365. package/src/template-validation/two-stage-results.js +30 -0
  366. package/src/template-validation/two-stage-results.ts +40 -0
  367. package/src/template-validation/two-stage-scenario.js +86 -0
  368. package/src/template-validation/two-stage-scenario.ts +120 -0
  369. package/src/worktree-claude-config.js +182 -220
  370. package/src/worktree-claude-config.ts +272 -0
  371. package/src/worktree-tooling-env.js +103 -125
  372. package/src/worktree-tooling-env.ts +142 -0
  373. package/task-lib/completion.js +2 -3
  374. package/task-lib/completion.ts +9 -0
  375. package/task-lib/config.js +1 -4
  376. package/task-lib/config.ts +11 -0
  377. package/task-lib/name-generator.js +4 -226
  378. package/task-lib/name-generator.ts +11 -0
  379. package/task-lib/omp-session-cleanup.js +1 -1
  380. package/task-lib/omp-storage-root.js +8 -12
  381. package/task-lib/omp-storage-root.ts +62 -0
  382. package/task-lib/process-termination.js +143 -166
  383. package/task-lib/process-termination.ts +268 -0
@@ -0,0 +1,288 @@
1
+ import fs = require('fs');
2
+
3
+ interface SafeExecModule {
4
+ execSync(command: string, options: { encoding: 'utf8'; timeout: number }): string;
5
+ }
6
+
7
+ interface MissingProcessState {
8
+ exists: false;
9
+ error?: unknown;
10
+ }
11
+
12
+ interface PresentProcessState {
13
+ exists: true;
14
+ state: string | undefined;
15
+ wchan: string;
16
+ cpuTicks: number;
17
+ threads: number;
18
+ volCtxSwitches: number;
19
+ }
20
+
21
+ type ProcessState = MissingProcessState | PresentProcessState;
22
+
23
+ interface ConnectionState {
24
+ state: string;
25
+ recvQ: number;
26
+ sendQ: number;
27
+ local: string;
28
+ peer: string;
29
+ }
30
+
31
+ interface NetworkState {
32
+ hasNetwork: boolean;
33
+ connections?: ConnectionState[];
34
+ establishedCount?: number;
35
+ hasDataInFlight?: boolean;
36
+ hasSynSent?: boolean;
37
+ error?: unknown;
38
+ }
39
+
40
+ interface HealthIndicators {
41
+ isSleeping: boolean;
42
+ isBlockedOnPoll: boolean;
43
+ lowCpuUsage: boolean;
44
+ lowCtxSwitches: boolean;
45
+ noDataInFlight: boolean;
46
+ hasSynSent: boolean | undefined;
47
+ }
48
+
49
+ interface AvailableProcessHealth {
50
+ pid: number;
51
+ state: string | undefined;
52
+ wchan: string;
53
+ cpuPercent: number;
54
+ ctxSwitchesDelta: number;
55
+ threads: number;
56
+ network: {
57
+ hasConnections: boolean;
58
+ establishedCount: number;
59
+ hasDataInFlight: boolean;
60
+ hasSynSent: boolean;
61
+ };
62
+ indicators: HealthIndicators;
63
+ stuckScore: number;
64
+ isLikelyStuck: boolean;
65
+ confidence: 'low' | 'medium' | 'high';
66
+ analysis: string;
67
+ }
68
+
69
+ interface UnavailableProcessHealth {
70
+ isLikelyStuck: null;
71
+ reason: string;
72
+ pid: number;
73
+ }
74
+
75
+ type ProcessHealth = AvailableProcessHealth | UnavailableProcessHealth;
76
+
77
+ type SocketFields = [string, string, string, string, string];
78
+
79
+ function isSafeExecModule(value: unknown): value is SafeExecModule {
80
+ return (
81
+ typeof value === 'object' &&
82
+ value !== null &&
83
+ 'execSync' in value &&
84
+ typeof value.execSync === 'function'
85
+ );
86
+ }
87
+
88
+ function errorMessage(error: unknown): unknown {
89
+ if (typeof error === 'object' && error !== null && 'message' in error) {
90
+ return error.message;
91
+ }
92
+ return undefined;
93
+ }
94
+
95
+ function parseProcInteger(value: string | undefined): number {
96
+ return value === undefined ? Number.NaN : parseInt(value, 10);
97
+ }
98
+
99
+ function hasSocketFields(fields: string[] | undefined): fields is SocketFields {
100
+ return fields?.length === 5;
101
+ }
102
+
103
+ const STUCK_THRESHOLD = 3.5;
104
+ const HIGH_CONFIDENCE_THRESHOLD = 4.5;
105
+ const CPU_LOW_THRESHOLD = 1;
106
+ const CTX_SWITCHES_LOW_THRESHOLD = 10;
107
+
108
+ function stuckScoreFor(indicators: HealthIndicators, hasDataInFlight: boolean | undefined): number {
109
+ const score =
110
+ Number(indicators.isSleeping) +
111
+ Number(indicators.isBlockedOnPoll) +
112
+ Number(indicators.lowCpuUsage) +
113
+ Number(indicators.lowCtxSwitches) +
114
+ Number(indicators.noDataInFlight) * 0.5 +
115
+ Number(Boolean(indicators.hasSynSent));
116
+ return hasDataInFlight ? Math.max(0, score - 2) : score;
117
+ }
118
+
119
+ function confidenceFor(stuckScore: number): AvailableProcessHealth['confidence'] {
120
+ if (stuckScore >= HIGH_CONFIDENCE_THRESHOLD) return 'high';
121
+ if (stuckScore >= STUCK_THRESHOLD) return 'medium';
122
+ return 'low';
123
+ }
124
+
125
+ const rawSafeExec: unknown = require('../lib/safe-exec');
126
+ if (!isSafeExecModule(rawSafeExec)) {
127
+ throw new TypeError('safe-exec must export execSync');
128
+ }
129
+ const { execSync } = rawSafeExec;
130
+
131
+ function getProcessState(pid: number): ProcessState {
132
+ try {
133
+ const statPath = `/proc/${pid}/stat`;
134
+ if (!fs.existsSync(statPath)) {
135
+ return { exists: false };
136
+ }
137
+
138
+ const stat = fs.readFileSync(statPath, 'utf8');
139
+ const parts = stat.split(' ');
140
+ const state = parts[2];
141
+
142
+ let wchan = '';
143
+ try {
144
+ wchan = fs.readFileSync(`/proc/${pid}/wchan`, 'utf8').trim();
145
+ } catch {
146
+ // wchan may not be readable.
147
+ }
148
+
149
+ const utime = parseProcInteger(parts[13]);
150
+ const stime = parseProcInteger(parts[14]);
151
+ const status = fs.readFileSync(`/proc/${pid}/status`, 'utf8');
152
+ const threads = /Threads:\s+(\d+)/.exec(status)?.[1] || '1';
153
+ const volCtxSwitches = /voluntary_ctxt_switches:\s+(\d+)/.exec(status)?.[1] || '0';
154
+
155
+ return {
156
+ exists: true,
157
+ state,
158
+ wchan,
159
+ cpuTicks: utime + stime,
160
+ threads: parseInt(threads, 10),
161
+ volCtxSwitches: parseInt(volCtxSwitches, 10),
162
+ };
163
+ } catch (error: unknown) {
164
+ return { exists: false, error: errorMessage(error) };
165
+ }
166
+ }
167
+
168
+ function getNetworkState(pid: number): NetworkState {
169
+ try {
170
+ const fdPath = `/proc/${pid}/fd`;
171
+ if (!fs.existsSync(fdPath)) {
172
+ return { hasNetwork: false };
173
+ }
174
+
175
+ let ssOutput = '';
176
+ try {
177
+ ssOutput = execSync(`ss -tunp 2>/dev/null | grep ",pid=${pid}," || true`, {
178
+ encoding: 'utf8',
179
+ timeout: 5000,
180
+ });
181
+ } catch {
182
+ return { hasNetwork: false };
183
+ }
184
+
185
+ if (!ssOutput.trim()) {
186
+ return { hasNetwork: false, connections: [] };
187
+ }
188
+
189
+ const connections: ConnectionState[] = [];
190
+ for (const line of ssOutput.trim().split('\n')) {
191
+ const match = /^(\S+)\s+(\d+)\s+(\d+)\s+(\S+)\s+(\S+)/.exec(line);
192
+ const fields = match?.slice(1, 6);
193
+ if (!hasSocketFields(fields)) continue;
194
+ const [state, recvQ, sendQ, local, peer] = fields;
195
+ connections.push({
196
+ state,
197
+ recvQ: parseInt(recvQ, 10),
198
+ sendQ: parseInt(sendQ, 10),
199
+ local,
200
+ peer,
201
+ });
202
+ }
203
+
204
+ return {
205
+ hasNetwork: connections.length > 0,
206
+ connections,
207
+ establishedCount: connections.filter((connection) => connection.state === 'ESTAB').length,
208
+ hasDataInFlight: connections.some(
209
+ (connection) => connection.recvQ > 0 || connection.sendQ > 0
210
+ ),
211
+ hasSynSent: connections.some((connection) => connection.state === 'SYN-SENT'),
212
+ };
213
+ } catch (error: unknown) {
214
+ return { hasNetwork: false, error: errorMessage(error) };
215
+ }
216
+ }
217
+
218
+ async function analyzeProcessHealth(pid: number, samplePeriodMs = 5000): Promise<ProcessHealth> {
219
+ const t0 = getProcessState(pid);
220
+ if (!t0.exists) {
221
+ return { isLikelyStuck: null, reason: 'Process does not exist', pid };
222
+ }
223
+
224
+ await new Promise<void>((resolve) => setTimeout(resolve, samplePeriodMs));
225
+
226
+ const t1 = getProcessState(pid);
227
+ if (!t1.exists) {
228
+ return { isLikelyStuck: null, reason: 'Process died during analysis', pid };
229
+ }
230
+
231
+ const cpuTicksDelta = t1.cpuTicks - t0.cpuTicks;
232
+ const ctxSwitchesDelta = t1.volCtxSwitches - t0.volCtxSwitches;
233
+ const cpuSeconds = cpuTicksDelta / 100;
234
+ const sampleSeconds = samplePeriodMs / 1000;
235
+ const cpuPercent = (cpuSeconds / sampleSeconds) * 100;
236
+ const network = getNetworkState(pid);
237
+
238
+ const indicators = {
239
+ isSleeping: t1.state === 'S',
240
+ isBlockedOnPoll: t1.wchan.includes('poll') || t1.wchan.includes('wait'),
241
+ lowCpuUsage: cpuPercent < CPU_LOW_THRESHOLD,
242
+ lowCtxSwitches: ctxSwitchesDelta < CTX_SWITCHES_LOW_THRESHOLD,
243
+ noDataInFlight: network.hasNetwork && !network.hasDataInFlight,
244
+ hasSynSent: network.hasSynSent,
245
+ };
246
+
247
+ const stuckScore = stuckScoreFor(indicators, network.hasDataInFlight);
248
+ const isLikelyStuck = stuckScore >= STUCK_THRESHOLD;
249
+ const confidence = confidenceFor(stuckScore);
250
+
251
+ return {
252
+ pid,
253
+ state: t1.state,
254
+ wchan: t1.wchan,
255
+ cpuPercent: parseFloat(cpuPercent.toFixed(2)),
256
+ ctxSwitchesDelta,
257
+ threads: t1.threads,
258
+ network: {
259
+ hasConnections: network.hasNetwork,
260
+ establishedCount: network.establishedCount || 0,
261
+ hasDataInFlight: network.hasDataInFlight || false,
262
+ hasSynSent: network.hasSynSent || false,
263
+ },
264
+ indicators,
265
+ stuckScore: parseFloat(stuckScore.toFixed(1)),
266
+ isLikelyStuck,
267
+ confidence,
268
+ analysis: isLikelyStuck
269
+ ? `Process appears STUCK: sleeping on ${t1.wchan}, ${cpuPercent.toFixed(1)}% CPU, ` +
270
+ `${ctxSwitchesDelta} ctx switches`
271
+ : `Process appears WORKING: ${cpuPercent.toFixed(1)}% CPU, ${ctxSwitchesDelta} ctx switches, state=${t1.state}`,
272
+ };
273
+ }
274
+
275
+ function isPlatformSupported(): boolean {
276
+ return process.platform === 'linux' && fs.existsSync('/proc');
277
+ }
278
+
279
+ export = {
280
+ analyzeProcessHealth,
281
+ getProcessState,
282
+ getNetworkState,
283
+ isPlatformSupported,
284
+ STUCK_THRESHOLD,
285
+ HIGH_CONFIDENCE_THRESHOLD,
286
+ CPU_LOW_THRESHOLD,
287
+ CTX_SWITCHES_LOW_THRESHOLD,
288
+ };
@@ -1,3 +1,4 @@
1
+ "use strict";
1
2
  /**
2
3
  * AgentTriggerEvaluator - Trigger matching and logic evaluation
3
4
  *
@@ -6,62 +7,44 @@
6
7
  * - Logic evaluation via LogicEngine
7
8
  * - Trigger action determination
8
9
  */
9
-
10
10
  /**
11
- * Find trigger matching the message topic
12
- * @param {Object} params - Evaluation parameters
13
- * @param {Array} params.triggers - Agent triggers configuration
14
- * @param {Object} params.message - Message to match against
15
- * @returns {Object|null} Matching trigger or null
11
+ * Find trigger matching the message topic.
16
12
  */
17
- function findMatchingTrigger({ triggers, message }) {
18
- if (!triggers) {
19
- return null;
20
- }
21
-
22
- return triggers.find((trigger) => {
23
- // Match exact topic or wildcard
24
- if (trigger.topic === '*' || trigger.topic === message.topic) {
25
- return true;
13
+ function findMatchingTrigger({ triggers, message, }) {
14
+ if (!triggers) {
15
+ return null;
26
16
  }
27
- // Match topic prefix (e.g., "VALIDATION_*")
28
- if (trigger.topic.endsWith('*')) {
29
- const prefix = trigger.topic.slice(0, -1);
30
- return message.topic.startsWith(prefix);
31
- }
32
- return false;
33
- });
17
+ return triggers.find((trigger) => {
18
+ // Match exact topic or wildcard
19
+ if (trigger.topic === '*' || trigger.topic === message.topic) {
20
+ return true;
21
+ }
22
+ // Match topic prefix (e.g., "VALIDATION_*")
23
+ if (trigger.topic.endsWith('*')) {
24
+ const prefix = trigger.topic.slice(0, -1);
25
+ return message.topic.startsWith(prefix);
26
+ }
27
+ return false;
28
+ });
34
29
  }
35
-
36
30
  /**
37
- * Evaluate trigger logic
38
- * @param {Object} params - Evaluation parameters
39
- * @param {Object} params.trigger - Trigger to evaluate
40
- * @param {Object} params.message - Triggering message
41
- * @param {Object} params.agent - Agent context (id, role, iteration, cluster_id)
42
- * @param {Object} params.logicEngine - LogicEngine instance
43
- * @returns {boolean} Whether trigger logic passed
31
+ * Evaluate trigger logic.
44
32
  */
45
- function evaluateTrigger({ trigger, message, agent, logicEngine }) {
46
- if (!trigger.logic || !trigger.logic.script) {
47
- return true; // No logic = always true
48
- }
49
-
50
- // NO TRY/CATCH - let errors propagate and crash
51
- return logicEngine.evaluate(trigger.logic.script, agent, message);
33
+ function evaluateTrigger({ trigger, message, agent, logicEngine, }) {
34
+ if (!trigger.logic || !trigger.logic.script) {
35
+ return true; // No logic = always true
36
+ }
37
+ // NO TRY/CATCH - let errors propagate and crash
38
+ return logicEngine.evaluate(trigger.logic.script, agent, message);
52
39
  }
53
-
54
40
  /**
55
- * Get trigger action type
56
- * @param {Object} trigger - Trigger object
57
- * @returns {string} Action type ('execute_task' or 'stop_cluster')
41
+ * Get trigger action type.
58
42
  */
59
43
  function getTriggerAction(trigger) {
60
- return trigger.action || 'execute_task';
44
+ return trigger.action || 'execute_task';
61
45
  }
62
-
63
46
  module.exports = {
64
- findMatchingTrigger,
65
- evaluateTrigger,
66
- getTriggerAction,
47
+ findMatchingTrigger,
48
+ evaluateTrigger,
49
+ getTriggerAction,
67
50
  };
@@ -0,0 +1,98 @@
1
+ /**
2
+ * AgentTriggerEvaluator - Trigger matching and logic evaluation
3
+ *
4
+ * Provides:
5
+ * - Trigger matching based on message topics
6
+ * - Logic evaluation via LogicEngine
7
+ * - Trigger action determination
8
+ */
9
+
10
+ interface TriggerLogic {
11
+ script?: string;
12
+ }
13
+
14
+ interface AgentTrigger {
15
+ topic: string;
16
+ logic?: TriggerLogic;
17
+ action?: string;
18
+ }
19
+
20
+ interface TriggerMessage {
21
+ topic: string;
22
+ [key: string]: unknown;
23
+ }
24
+
25
+ interface AgentContext {
26
+ [key: string]: unknown;
27
+ }
28
+
29
+ interface LogicEngine {
30
+ evaluate(script: string, agent: AgentContext, message: TriggerMessage): boolean;
31
+ }
32
+
33
+ interface MatchingTriggerOptions {
34
+ triggers?: readonly AgentTrigger[] | null;
35
+ message: TriggerMessage;
36
+ }
37
+
38
+ interface EvaluateTriggerOptions {
39
+ trigger: AgentTrigger;
40
+ message: TriggerMessage;
41
+ agent: AgentContext;
42
+ logicEngine: LogicEngine;
43
+ }
44
+
45
+ /**
46
+ * Find trigger matching the message topic.
47
+ */
48
+ function findMatchingTrigger({
49
+ triggers,
50
+ message,
51
+ }: MatchingTriggerOptions): AgentTrigger | null | undefined {
52
+ if (!triggers) {
53
+ return null;
54
+ }
55
+
56
+ return triggers.find((trigger) => {
57
+ // Match exact topic or wildcard
58
+ if (trigger.topic === '*' || trigger.topic === message.topic) {
59
+ return true;
60
+ }
61
+ // Match topic prefix (e.g., "VALIDATION_*")
62
+ if (trigger.topic.endsWith('*')) {
63
+ const prefix = trigger.topic.slice(0, -1);
64
+ return message.topic.startsWith(prefix);
65
+ }
66
+ return false;
67
+ });
68
+ }
69
+
70
+ /**
71
+ * Evaluate trigger logic.
72
+ */
73
+ function evaluateTrigger({
74
+ trigger,
75
+ message,
76
+ agent,
77
+ logicEngine,
78
+ }: EvaluateTriggerOptions): boolean {
79
+ if (!trigger.logic || !trigger.logic.script) {
80
+ return true; // No logic = always true
81
+ }
82
+
83
+ // NO TRY/CATCH - let errors propagate and crash
84
+ return logicEngine.evaluate(trigger.logic.script, agent, message);
85
+ }
86
+
87
+ /**
88
+ * Get trigger action type.
89
+ */
90
+ function getTriggerAction(trigger: AgentTrigger): string {
91
+ return trigger.action || 'execute_task';
92
+ }
93
+
94
+ export = {
95
+ findMatchingTrigger,
96
+ evaluateTrigger,
97
+ getTriggerAction,
98
+ };