@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,224 @@
1
+ "use strict";
2
+ const LIMITS = {
3
+ errors: 5,
4
+ criteriaResults: 10,
5
+ acceptanceCriteria: 10,
6
+ filesAffected: 20,
7
+ blockers: 5,
8
+ nextSteps: 10,
9
+ rootCauses: 5,
10
+ };
11
+ const TEXT_LIMITS = {
12
+ task: 2000,
13
+ plan: 2500, // Slightly increased for actionable plans with embedded patterns (was 2000)
14
+ fixPlan: 1200,
15
+ summary: 300,
16
+ listItem: 200,
17
+ };
18
+ function isRecord(value) {
19
+ return typeof value === 'object' && value !== null;
20
+ }
21
+ function asRecord(value) {
22
+ return isRecord(value) ? value : null;
23
+ }
24
+ function isPresentString(value) {
25
+ return Boolean(value);
26
+ }
27
+ function toTimestamp(message) {
28
+ const timestamp = asRecord(message)?.timestamp;
29
+ if (typeof timestamp === 'number' && Number.isFinite(timestamp)) {
30
+ return timestamp;
31
+ }
32
+ return Date.now();
33
+ }
34
+ function normalizeText(value, maxLength, singleLine = false) {
35
+ if (value === undefined || value === null)
36
+ return undefined;
37
+ let text = String(value);
38
+ if (singleLine) {
39
+ text = text.replace(/\s+/g, ' ').trim();
40
+ }
41
+ else {
42
+ text = text.trim();
43
+ }
44
+ if (!text)
45
+ return undefined;
46
+ if (maxLength && text.length > maxLength) {
47
+ return `${text.slice(0, maxLength - 3)}...`;
48
+ }
49
+ return text;
50
+ }
51
+ function normalizeStringList(list, maxItems) {
52
+ if (!Array.isArray(list))
53
+ return undefined;
54
+ const normalized = list
55
+ .map((item) => normalizeText(item, TEXT_LIMITS.listItem, true))
56
+ .filter(isPresentString);
57
+ if (normalized.length === 0)
58
+ return undefined;
59
+ if (maxItems && normalized.length > maxItems) {
60
+ return normalized.slice(-maxItems);
61
+ }
62
+ return normalized;
63
+ }
64
+ function normalizeAcceptanceCriteria(criteria) {
65
+ if (!Array.isArray(criteria))
66
+ return undefined;
67
+ const normalized = criteria
68
+ .map((item) => {
69
+ if (typeof item === 'string') {
70
+ return normalizeText(item, TEXT_LIMITS.listItem, true);
71
+ }
72
+ const itemRecord = asRecord(item);
73
+ if (!itemRecord)
74
+ return undefined;
75
+ const id = itemRecord.id ? String(itemRecord.id) : '';
76
+ const priority = itemRecord.priority ? ` (${String(itemRecord.priority)})` : '';
77
+ const criterion = itemRecord.criterion || itemRecord.text || itemRecord.summary || '';
78
+ const label = id ? `${id}${priority}: ` : '';
79
+ const merged = `${label}${String(criterion)}`.trim();
80
+ if (!merged)
81
+ return undefined;
82
+ return normalizeText(merged, TEXT_LIMITS.listItem, true);
83
+ })
84
+ .filter(isPresentString);
85
+ if (normalized.length === 0)
86
+ return undefined;
87
+ if (normalized.length > LIMITS.acceptanceCriteria) {
88
+ return normalized.slice(-LIMITS.acceptanceCriteria);
89
+ }
90
+ return normalized;
91
+ }
92
+ function normalizeCriteriaEvidence(evidence) {
93
+ const evidenceRecord = asRecord(evidence);
94
+ if (!evidenceRecord)
95
+ return undefined;
96
+ const normalized = {};
97
+ if (evidenceRecord.command) {
98
+ const command = normalizeText(evidenceRecord.command, TEXT_LIMITS.listItem, true);
99
+ if (command)
100
+ normalized.command = command;
101
+ }
102
+ if (typeof evidenceRecord.exitCode === 'number' && Number.isFinite(evidenceRecord.exitCode)) {
103
+ normalized.exitCode = evidenceRecord.exitCode;
104
+ }
105
+ return Object.keys(normalized).length > 0 ? normalized : undefined;
106
+ }
107
+ function normalizeCriteriaResult(item) {
108
+ const itemRecord = asRecord(item);
109
+ if (!itemRecord)
110
+ return undefined;
111
+ const entry = {};
112
+ if (itemRecord.id)
113
+ entry.id = String(itemRecord.id);
114
+ if (itemRecord.status)
115
+ entry.status = String(itemRecord.status);
116
+ if (itemRecord.reason) {
117
+ const reason = normalizeText(itemRecord.reason, TEXT_LIMITS.listItem, true);
118
+ if (reason)
119
+ entry.reason = reason;
120
+ }
121
+ const evidence = normalizeCriteriaEvidence(itemRecord.evidence);
122
+ if (evidence)
123
+ entry.evidence = evidence;
124
+ return Object.keys(entry).length > 0 ? entry : undefined;
125
+ }
126
+ function isPresentRecord(value) {
127
+ return value !== undefined;
128
+ }
129
+ function normalizeCriteriaResults(results) {
130
+ if (!Array.isArray(results))
131
+ return undefined;
132
+ const normalized = results.map(normalizeCriteriaResult).filter(isPresentRecord);
133
+ if (normalized.length === 0)
134
+ return undefined;
135
+ if (normalized.length > LIMITS.criteriaResults) {
136
+ return normalized.slice(-LIMITS.criteriaResults);
137
+ }
138
+ return normalized;
139
+ }
140
+ function normalizeErrors(data) {
141
+ const dataRecord = asRecord(data);
142
+ if (!dataRecord)
143
+ return undefined;
144
+ if (Array.isArray(dataRecord.errors)) {
145
+ return normalizeStringList(dataRecord.errors, LIMITS.errors);
146
+ }
147
+ if (Array.isArray(dataRecord.issues)) {
148
+ const mapped = dataRecord.issues.map((issue) => {
149
+ if (typeof issue === 'string')
150
+ return issue;
151
+ const issueRecord = asRecord(issue);
152
+ if (!issueRecord)
153
+ return undefined;
154
+ return (issueRecord.bug ||
155
+ issueRecord.message ||
156
+ issueRecord.error ||
157
+ issueRecord.summary ||
158
+ undefined);
159
+ });
160
+ return normalizeStringList(mapped, LIMITS.errors);
161
+ }
162
+ return undefined;
163
+ }
164
+ function normalizeRootCauses(rootCauses) {
165
+ if (!Array.isArray(rootCauses))
166
+ return undefined;
167
+ const normalized = rootCauses
168
+ .map((cause) => {
169
+ if (typeof cause === 'string') {
170
+ return normalizeText(cause, TEXT_LIMITS.listItem, true);
171
+ }
172
+ const causeRecord = asRecord(cause);
173
+ if (!causeRecord)
174
+ return undefined;
175
+ return normalizeText(causeRecord.cause || causeRecord.summary || causeRecord.description, TEXT_LIMITS.listItem, true);
176
+ })
177
+ .filter(isPresentString);
178
+ if (normalized.length === 0)
179
+ return undefined;
180
+ if (normalized.length > LIMITS.rootCauses) {
181
+ return normalized.slice(-LIMITS.rootCauses);
182
+ }
183
+ return normalized;
184
+ }
185
+ function normalizeFilesAffected(filesAffected) {
186
+ return normalizeStringList(filesAffected, LIMITS.filesAffected);
187
+ }
188
+ function normalizeBoolean(value) {
189
+ if (typeof value === 'boolean')
190
+ return value;
191
+ if (value === 'true')
192
+ return true;
193
+ if (value === 'false')
194
+ return false;
195
+ return undefined;
196
+ }
197
+ function normalizeProgressStatus(data) {
198
+ const dataRecord = asRecord(data);
199
+ if (!dataRecord)
200
+ return undefined;
201
+ const completionStatus = asRecord(dataRecord.completionStatus);
202
+ if (completionStatus) {
203
+ return completionStatus;
204
+ }
205
+ const hasProgressFields = Object.prototype.hasOwnProperty.call(dataRecord, 'canValidate') ||
206
+ Object.prototype.hasOwnProperty.call(dataRecord, 'percentComplete');
207
+ return hasProgressFields ? dataRecord : undefined;
208
+ }
209
+ module.exports = {
210
+ LIMITS,
211
+ TEXT_LIMITS,
212
+ asRecord,
213
+ isPresentString,
214
+ toTimestamp,
215
+ normalizeText,
216
+ normalizeStringList,
217
+ normalizeAcceptanceCriteria,
218
+ normalizeCriteriaResults,
219
+ normalizeErrors,
220
+ normalizeRootCauses,
221
+ normalizeFilesAffected,
222
+ normalizeBoolean,
223
+ normalizeProgressStatus,
224
+ };
@@ -0,0 +1,222 @@
1
+ type UnknownRecord = Record<string, unknown>;
2
+
3
+ const LIMITS = {
4
+ errors: 5,
5
+ criteriaResults: 10,
6
+ acceptanceCriteria: 10,
7
+ filesAffected: 20,
8
+ blockers: 5,
9
+ nextSteps: 10,
10
+ rootCauses: 5,
11
+ };
12
+
13
+ const TEXT_LIMITS = {
14
+ task: 2000,
15
+ plan: 2500, // Slightly increased for actionable plans with embedded patterns (was 2000)
16
+ fixPlan: 1200,
17
+ summary: 300,
18
+ listItem: 200,
19
+ };
20
+
21
+ function isRecord(value: unknown): value is UnknownRecord {
22
+ return typeof value === 'object' && value !== null;
23
+ }
24
+
25
+ function asRecord(value: unknown): UnknownRecord | null {
26
+ return isRecord(value) ? value : null;
27
+ }
28
+
29
+ function isPresentString(value: string | undefined): value is string {
30
+ return Boolean(value);
31
+ }
32
+
33
+ function toTimestamp(message: unknown): number {
34
+ const timestamp = asRecord(message)?.timestamp;
35
+ if (typeof timestamp === 'number' && Number.isFinite(timestamp)) {
36
+ return timestamp;
37
+ }
38
+ return Date.now();
39
+ }
40
+
41
+ function normalizeText(value: unknown, maxLength: number, singleLine = false): string | undefined {
42
+ if (value === undefined || value === null) return undefined;
43
+ let text = String(value);
44
+ if (singleLine) {
45
+ text = text.replace(/\s+/g, ' ').trim();
46
+ } else {
47
+ text = text.trim();
48
+ }
49
+ if (!text) return undefined;
50
+ if (maxLength && text.length > maxLength) {
51
+ return `${text.slice(0, maxLength - 3)}...`;
52
+ }
53
+ return text;
54
+ }
55
+
56
+ function normalizeStringList(list: unknown, maxItems: number): string[] | undefined {
57
+ if (!Array.isArray(list)) return undefined;
58
+ const normalized = list
59
+ .map((item: unknown) => normalizeText(item, TEXT_LIMITS.listItem, true))
60
+ .filter(isPresentString);
61
+ if (normalized.length === 0) return undefined;
62
+ if (maxItems && normalized.length > maxItems) {
63
+ return normalized.slice(-maxItems);
64
+ }
65
+ return normalized;
66
+ }
67
+
68
+ function normalizeAcceptanceCriteria(criteria: unknown): string[] | undefined {
69
+ if (!Array.isArray(criteria)) return undefined;
70
+ const normalized = criteria
71
+ .map((item: unknown) => {
72
+ if (typeof item === 'string') {
73
+ return normalizeText(item, TEXT_LIMITS.listItem, true);
74
+ }
75
+ const itemRecord = asRecord(item);
76
+ if (!itemRecord) return undefined;
77
+ const id = itemRecord.id ? String(itemRecord.id) : '';
78
+ const priority = itemRecord.priority ? ` (${String(itemRecord.priority)})` : '';
79
+ const criterion = itemRecord.criterion || itemRecord.text || itemRecord.summary || '';
80
+ const label = id ? `${id}${priority}: ` : '';
81
+ const merged = `${label}${String(criterion)}`.trim();
82
+ if (!merged) return undefined;
83
+ return normalizeText(merged, TEXT_LIMITS.listItem, true);
84
+ })
85
+ .filter(isPresentString);
86
+ if (normalized.length === 0) return undefined;
87
+ if (normalized.length > LIMITS.acceptanceCriteria) {
88
+ return normalized.slice(-LIMITS.acceptanceCriteria);
89
+ }
90
+ return normalized;
91
+ }
92
+
93
+ function normalizeCriteriaEvidence(evidence: unknown): UnknownRecord | undefined {
94
+ const evidenceRecord = asRecord(evidence);
95
+ if (!evidenceRecord) return undefined;
96
+ const normalized: UnknownRecord = {};
97
+ if (evidenceRecord.command) {
98
+ const command = normalizeText(evidenceRecord.command, TEXT_LIMITS.listItem, true);
99
+ if (command) normalized.command = command;
100
+ }
101
+ if (typeof evidenceRecord.exitCode === 'number' && Number.isFinite(evidenceRecord.exitCode)) {
102
+ normalized.exitCode = evidenceRecord.exitCode;
103
+ }
104
+ return Object.keys(normalized).length > 0 ? normalized : undefined;
105
+ }
106
+
107
+ function normalizeCriteriaResult(item: unknown): UnknownRecord | undefined {
108
+ const itemRecord = asRecord(item);
109
+ if (!itemRecord) return undefined;
110
+ const entry: UnknownRecord = {};
111
+ if (itemRecord.id) entry.id = String(itemRecord.id);
112
+ if (itemRecord.status) entry.status = String(itemRecord.status);
113
+ if (itemRecord.reason) {
114
+ const reason = normalizeText(itemRecord.reason, TEXT_LIMITS.listItem, true);
115
+ if (reason) entry.reason = reason;
116
+ }
117
+ const evidence = normalizeCriteriaEvidence(itemRecord.evidence);
118
+ if (evidence) entry.evidence = evidence;
119
+ return Object.keys(entry).length > 0 ? entry : undefined;
120
+ }
121
+
122
+ function isPresentRecord(value: UnknownRecord | undefined): value is UnknownRecord {
123
+ return value !== undefined;
124
+ }
125
+
126
+ function normalizeCriteriaResults(results: unknown): UnknownRecord[] | undefined {
127
+ if (!Array.isArray(results)) return undefined;
128
+ const normalized = results.map(normalizeCriteriaResult).filter(isPresentRecord);
129
+ if (normalized.length === 0) return undefined;
130
+ if (normalized.length > LIMITS.criteriaResults) {
131
+ return normalized.slice(-LIMITS.criteriaResults);
132
+ }
133
+ return normalized;
134
+ }
135
+
136
+ function normalizeErrors(data: unknown): string[] | undefined {
137
+ const dataRecord = asRecord(data);
138
+ if (!dataRecord) return undefined;
139
+ if (Array.isArray(dataRecord.errors)) {
140
+ return normalizeStringList(dataRecord.errors, LIMITS.errors);
141
+ }
142
+ if (Array.isArray(dataRecord.issues)) {
143
+ const mapped = dataRecord.issues.map((issue: unknown) => {
144
+ if (typeof issue === 'string') return issue;
145
+ const issueRecord = asRecord(issue);
146
+ if (!issueRecord) return undefined;
147
+ return (
148
+ issueRecord.bug ||
149
+ issueRecord.message ||
150
+ issueRecord.error ||
151
+ issueRecord.summary ||
152
+ undefined
153
+ );
154
+ });
155
+ return normalizeStringList(mapped, LIMITS.errors);
156
+ }
157
+ return undefined;
158
+ }
159
+
160
+ function normalizeRootCauses(rootCauses: unknown): string[] | undefined {
161
+ if (!Array.isArray(rootCauses)) return undefined;
162
+ const normalized = rootCauses
163
+ .map((cause: unknown) => {
164
+ if (typeof cause === 'string') {
165
+ return normalizeText(cause, TEXT_LIMITS.listItem, true);
166
+ }
167
+ const causeRecord = asRecord(cause);
168
+ if (!causeRecord) return undefined;
169
+ return normalizeText(
170
+ causeRecord.cause || causeRecord.summary || causeRecord.description,
171
+ TEXT_LIMITS.listItem,
172
+ true
173
+ );
174
+ })
175
+ .filter(isPresentString);
176
+ if (normalized.length === 0) return undefined;
177
+ if (normalized.length > LIMITS.rootCauses) {
178
+ return normalized.slice(-LIMITS.rootCauses);
179
+ }
180
+ return normalized;
181
+ }
182
+
183
+ function normalizeFilesAffected(filesAffected: unknown): string[] | undefined {
184
+ return normalizeStringList(filesAffected, LIMITS.filesAffected);
185
+ }
186
+
187
+ function normalizeBoolean(value: unknown): boolean | undefined {
188
+ if (typeof value === 'boolean') return value;
189
+ if (value === 'true') return true;
190
+ if (value === 'false') return false;
191
+ return undefined;
192
+ }
193
+
194
+ function normalizeProgressStatus(data: unknown): UnknownRecord | undefined {
195
+ const dataRecord = asRecord(data);
196
+ if (!dataRecord) return undefined;
197
+ const completionStatus = asRecord(dataRecord.completionStatus);
198
+ if (completionStatus) {
199
+ return completionStatus;
200
+ }
201
+ const hasProgressFields =
202
+ Object.prototype.hasOwnProperty.call(dataRecord, 'canValidate') ||
203
+ Object.prototype.hasOwnProperty.call(dataRecord, 'percentComplete');
204
+ return hasProgressFields ? dataRecord : undefined;
205
+ }
206
+
207
+ export = {
208
+ LIMITS,
209
+ TEXT_LIMITS,
210
+ asRecord,
211
+ isPresentString,
212
+ toTimestamp,
213
+ normalizeText,
214
+ normalizeStringList,
215
+ normalizeAcceptanceCriteria,
216
+ normalizeCriteriaResults,
217
+ normalizeErrors,
218
+ normalizeRootCauses,
219
+ normalizeFilesAffected,
220
+ normalizeBoolean,
221
+ normalizeProgressStatus,
222
+ };