@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,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
+ };