@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,208 @@
1
+ import contextMetrics = require('./context-metrics');
2
+ import contextPackCore = require('./context-pack-core');
3
+
4
+ import type {
5
+ ContextPackTruncationStage,
6
+ MutableContextPackDecision,
7
+ NormalizedContextPack,
8
+ RenderedVariant,
9
+ SelectedVariant,
10
+ } from './context-pack-types';
11
+
12
+ interface MaxCharsGuardParams {
13
+ packs: NormalizedContextPack[];
14
+ selected: Map<string, SelectedVariant>;
15
+ decisions: Map<string, MutableContextPackDecision>;
16
+ cache: Map<string, RenderedVariant>;
17
+ maxChars: number | undefined;
18
+ totalChars: number;
19
+ }
20
+
21
+ interface MaxCharsMutationParams {
22
+ selected: Map<string, SelectedVariant>;
23
+ decisions: Map<string, MutableContextPackDecision>;
24
+ cache: Map<string, RenderedVariant>;
25
+ maxChars: number;
26
+ }
27
+
28
+ interface RequiredTruncationParams {
29
+ packs: readonly NormalizedContextPack[];
30
+ selected: Map<string, SelectedVariant>;
31
+ decisions: Map<string, MutableContextPackDecision>;
32
+ currentChars: number;
33
+ maxChars: number;
34
+ }
35
+
36
+ const { estimateTokensFromChars } = contextMetrics;
37
+ const { renderVariant, sortByPriorityDescThenOrderDesc } = contextPackCore;
38
+
39
+ const TRUNCATION_SUFFIX = '\n\n[Context truncated to fit limit]\n';
40
+
41
+ function truncateText(text: string, targetChars: number): { text: string; truncated: boolean } {
42
+ if (text.length <= targetChars) {
43
+ return { text, truncated: false };
44
+ }
45
+
46
+ if (targetChars <= 0) {
47
+ return { text: '', truncated: true };
48
+ }
49
+
50
+ if (targetChars <= TRUNCATION_SUFFIX.length) {
51
+ return { text: text.slice(0, targetChars), truncated: true };
52
+ }
53
+
54
+ const sliceLength = targetChars - TRUNCATION_SUFFIX.length;
55
+ return {
56
+ text: text.slice(0, sliceLength) + TRUNCATION_SUFFIX,
57
+ truncated: true,
58
+ };
59
+ }
60
+
61
+ function compactOptionalPacks(
62
+ packs: readonly NormalizedContextPack[],
63
+ { selected, decisions, cache, maxChars }: MaxCharsMutationParams,
64
+ startingChars: number
65
+ ): number {
66
+ let currentChars = startingChars;
67
+ for (const pack of packs) {
68
+ if (currentChars <= maxChars) break;
69
+ const decision = decisions.get(pack.id);
70
+ if (!decision || decision.variant === 'compact' || !pack.compact) continue;
71
+
72
+ const compact = renderVariant(pack, 'compact', cache);
73
+ if (compact.chars === 0 || compact.chars >= decision.chars) continue;
74
+
75
+ const previousChars = decision.chars;
76
+ selected.set(pack.id, { ...compact, variant: 'compact' });
77
+ decision.variant = 'compact';
78
+ decision.chars = compact.chars;
79
+ decision.estimatedTokens = compact.estimatedTokens;
80
+ decision.reason = decision.reason || 'max_chars';
81
+
82
+ currentChars -= previousChars - compact.chars;
83
+ currentChars = Math.max(0, currentChars);
84
+ }
85
+ return currentChars;
86
+ }
87
+
88
+ function dropOptionalPacks(
89
+ packs: readonly NormalizedContextPack[],
90
+ { selected, decisions, maxChars }: MaxCharsMutationParams,
91
+ startingChars: number
92
+ ): number {
93
+ let currentChars = startingChars;
94
+ for (const pack of packs) {
95
+ if (currentChars <= maxChars) break;
96
+ if (!selected.has(pack.id)) continue;
97
+
98
+ const decision = decisions.get(pack.id);
99
+ currentChars -= decision?.chars || 0;
100
+ selected.delete(pack.id);
101
+ if (decision) {
102
+ decision.status = 'skipped';
103
+ decision.reason = decision.reason || 'max_chars';
104
+ decision.chars = 0;
105
+ decision.estimatedTokens = 0;
106
+ }
107
+ }
108
+ return currentChars;
109
+ }
110
+
111
+ function sortRequiredTruncationCandidates(
112
+ packs: readonly NormalizedContextPack[],
113
+ selected: ReadonlyMap<string, SelectedVariant>
114
+ ): NormalizedContextPack[] {
115
+ return packs
116
+ .filter((pack) => selected.has(pack.id) && pack.required)
117
+ .sort((a, b) => {
118
+ const preserveDelta = (a.preserve ? 1 : 0) - (b.preserve ? 1 : 0);
119
+ if (preserveDelta !== 0) return preserveDelta;
120
+ const sizeDelta = (selected.get(b.id)?.chars || 0) - (selected.get(a.id)?.chars || 0);
121
+ if (sizeDelta !== 0) return sizeDelta;
122
+ return b.order - a.order;
123
+ });
124
+ }
125
+
126
+ function truncateRequiredPacks({
127
+ packs,
128
+ selected,
129
+ decisions,
130
+ currentChars,
131
+ maxChars,
132
+ }: RequiredTruncationParams): void {
133
+ let overage = currentChars - maxChars;
134
+ const requiredCandidates = sortRequiredTruncationCandidates(packs, selected);
135
+
136
+ for (const pack of requiredCandidates) {
137
+ if (overage <= 0) break;
138
+ const decision = decisions.get(pack.id);
139
+ const selectedPack = selected.get(pack.id);
140
+ if (!decision || !selectedPack) continue;
141
+
142
+ const targetChars = Math.max(0, selectedPack.chars - overage);
143
+ const truncated = truncateText(selectedPack.text, targetChars);
144
+ if (truncated.text.length === selectedPack.chars) continue;
145
+
146
+ const newChars = truncated.text.length;
147
+ overage -= selectedPack.chars - newChars;
148
+ selected.set(pack.id, {
149
+ text: truncated.text,
150
+ chars: newChars,
151
+ estimatedTokens: estimateTokensFromChars(newChars),
152
+ variant: selectedPack.variant,
153
+ });
154
+
155
+ decision.chars = newChars;
156
+ decision.estimatedTokens = estimateTokensFromChars(newChars);
157
+ decision.truncated = true;
158
+ decision.reason = decision.reason || 'max_chars';
159
+ }
160
+ }
161
+
162
+ function selectedChars(selected: ReadonlyMap<string, SelectedVariant>): number {
163
+ return Array.from(selected.values()).reduce((sum, item) => sum + item.chars, 0);
164
+ }
165
+
166
+ function applyMaxCharsGuard({
167
+ packs,
168
+ selected,
169
+ decisions,
170
+ cache,
171
+ maxChars,
172
+ totalChars,
173
+ }: MaxCharsGuardParams): ContextPackTruncationStage {
174
+ if (typeof maxChars !== 'number' || !Number.isFinite(maxChars) || totalChars <= maxChars) {
175
+ return {
176
+ applied: false,
177
+ beforeChars: totalChars,
178
+ afterChars: totalChars,
179
+ };
180
+ }
181
+
182
+ const includedOptional = packs
183
+ .filter((pack) => selected.has(pack.id) && !pack.required)
184
+ .sort(sortByPriorityDescThenOrderDesc);
185
+ const mutationParams = { selected, decisions, cache, maxChars };
186
+ let currentChars = compactOptionalPacks(includedOptional, mutationParams, totalChars);
187
+ currentChars = dropOptionalPacks(includedOptional, mutationParams, currentChars);
188
+
189
+ if (currentChars > maxChars) {
190
+ truncateRequiredPacks({
191
+ packs,
192
+ selected,
193
+ decisions,
194
+ currentChars,
195
+ maxChars,
196
+ });
197
+ }
198
+
199
+ return {
200
+ applied: true,
201
+ beforeChars: totalChars,
202
+ afterChars: selectedChars(selected),
203
+ };
204
+ }
205
+
206
+ export = {
207
+ applyMaxCharsGuard,
208
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,98 @@
1
+ export type ContextPackPriority = 'required' | 'high' | 'medium' | 'low';
2
+ export type ContextPackVariant = 'full' | 'compact';
3
+ export type ContextPackStatus = 'included' | 'skipped';
4
+
5
+ export interface ContextPack {
6
+ id: string;
7
+ section?: string | null;
8
+ priority?: string;
9
+ required?: boolean;
10
+ order?: number;
11
+ preserve?: boolean;
12
+ render?: () => unknown;
13
+ compact?: () => unknown;
14
+ }
15
+
16
+ export interface NormalizedContextPack extends ContextPack {
17
+ priority: ContextPackPriority;
18
+ required: boolean;
19
+ order: number;
20
+ }
21
+
22
+ export interface RenderedVariant {
23
+ text: string;
24
+ chars: number;
25
+ estimatedTokens: number;
26
+ }
27
+
28
+ export interface SelectedVariant extends RenderedVariant {
29
+ variant: ContextPackVariant;
30
+ }
31
+
32
+ export interface IncludedSelection extends SelectedVariant {
33
+ status: 'included';
34
+ }
35
+
36
+ export interface SkippedSelection {
37
+ status: 'skipped';
38
+ variant: null;
39
+ reason: 'empty' | 'budget';
40
+ chars: 0;
41
+ estimatedTokens: 0;
42
+ }
43
+
44
+ export type PackSelection = IncludedSelection | SkippedSelection;
45
+
46
+ export interface ContextPackDecision {
47
+ id: string;
48
+ section: string | null;
49
+ priority: ContextPackPriority;
50
+ required: boolean;
51
+ status: ContextPackStatus;
52
+ variant: ContextPackVariant | null;
53
+ chars: number;
54
+ estimatedTokens: number;
55
+ order: number;
56
+ reason: string | null;
57
+ truncated: boolean;
58
+ }
59
+
60
+ export interface MutableContextPackDecision extends Omit<ContextPackDecision, 'truncated'> {
61
+ truncated?: boolean;
62
+ }
63
+
64
+ export interface PackSelectionState {
65
+ renderCache: Map<string, RenderedVariant>;
66
+ decisions: Map<string, MutableContextPackDecision>;
67
+ selected: Map<string, SelectedVariant>;
68
+ remainingTokens: number;
69
+ overBudgetTokens: number;
70
+ }
71
+
72
+ export interface ContextPackBudget {
73
+ maxTokens: number | undefined;
74
+ remainingTokens: number | null;
75
+ overBudgetTokens: number;
76
+ finalTokens: number;
77
+ }
78
+
79
+ export interface ContextPackTruncationStage {
80
+ applied: boolean;
81
+ beforeChars: number;
82
+ afterChars: number;
83
+ }
84
+
85
+ export interface ContextPackResult {
86
+ context: string;
87
+ packDecisions: ContextPackDecision[];
88
+ budget: ContextPackBudget;
89
+ truncation: {
90
+ maxContextChars: ContextPackTruncationStage;
91
+ };
92
+ }
93
+
94
+ export interface BuildContextPacksParams {
95
+ packs: ContextPack[];
96
+ maxTokens?: number | undefined;
97
+ maxChars?: number | undefined;
98
+ }
@@ -1,51 +1,42 @@
1
+ "use strict";
1
2
  const RAW_LOG_ONLY_REPLAY_POLICY = 'raw_log_only';
2
3
  const CONTEXT_REPLAY_POLICY = 'context';
3
-
4
4
  function buildRawLogOnlyMetadata(extra = {}) {
5
- return {
6
- ...extra,
7
- contextSafe: false,
8
- replayPolicy: RAW_LOG_ONLY_REPLAY_POLICY,
9
- };
5
+ return {
6
+ ...extra,
7
+ contextSafe: false,
8
+ replayPolicy: RAW_LOG_ONLY_REPLAY_POLICY,
9
+ };
10
10
  }
11
-
12
11
  function getReplayPolicy(message) {
13
- return message?.metadata?.replayPolicy ?? message?.content?.data?.replayPolicy;
12
+ return message?.metadata?.replayPolicy ?? message?.content?.data?.replayPolicy;
14
13
  }
15
-
16
14
  function getContextSafe(message) {
17
- if (typeof message?.metadata?.contextSafe === 'boolean') {
18
- return message.metadata.contextSafe;
19
- }
20
-
21
- if (typeof message?.content?.data?.contextSafe === 'boolean') {
22
- return message.content.data.contextSafe;
23
- }
24
-
25
- return null;
15
+ if (typeof message?.metadata?.contextSafe === 'boolean') {
16
+ return message.metadata.contextSafe;
17
+ }
18
+ if (typeof message?.content?.data?.contextSafe === 'boolean') {
19
+ return message.content.data.contextSafe;
20
+ }
21
+ return null;
26
22
  }
27
-
28
23
  function isReplayableMessage(message) {
29
- const contextSafe = getContextSafe(message);
30
- if (contextSafe !== null) {
31
- return contextSafe;
32
- }
33
-
34
- const replayPolicy = getReplayPolicy(message);
35
- if (replayPolicy === RAW_LOG_ONLY_REPLAY_POLICY) {
36
- return false;
37
- }
38
-
39
- if (replayPolicy === CONTEXT_REPLAY_POLICY) {
40
- return true;
41
- }
42
-
43
- return message?.topic !== 'AGENT_OUTPUT';
24
+ const contextSafe = getContextSafe(message);
25
+ if (contextSafe !== null) {
26
+ return contextSafe;
27
+ }
28
+ const replayPolicy = getReplayPolicy(message);
29
+ if (replayPolicy === RAW_LOG_ONLY_REPLAY_POLICY) {
30
+ return false;
31
+ }
32
+ if (replayPolicy === CONTEXT_REPLAY_POLICY) {
33
+ return true;
34
+ }
35
+ return message?.topic !== 'AGENT_OUTPUT';
44
36
  }
45
-
46
37
  module.exports = {
47
- RAW_LOG_ONLY_REPLAY_POLICY,
48
- CONTEXT_REPLAY_POLICY,
49
- buildRawLogOnlyMetadata,
50
- isReplayableMessage,
38
+ RAW_LOG_ONLY_REPLAY_POLICY,
39
+ CONTEXT_REPLAY_POLICY,
40
+ buildRawLogOnlyMetadata,
41
+ isReplayableMessage,
51
42
  };
@@ -0,0 +1,71 @@
1
+ const RAW_LOG_ONLY_REPLAY_POLICY = 'raw_log_only';
2
+ const CONTEXT_REPLAY_POLICY = 'context';
3
+
4
+ type ReplayMetadata = Record<string, unknown> & {
5
+ readonly contextSafe?: unknown;
6
+ readonly replayPolicy?: unknown;
7
+ };
8
+
9
+ interface ReplayMessage {
10
+ readonly topic?: unknown;
11
+ readonly metadata?: ReplayMetadata | null;
12
+ readonly content?: {
13
+ readonly data?: {
14
+ readonly contextSafe?: unknown;
15
+ readonly replayPolicy?: unknown;
16
+ } | null;
17
+ } | null;
18
+ }
19
+
20
+ function buildRawLogOnlyMetadata(extra: Record<string, unknown> = {}): {
21
+ contextSafe: false;
22
+ replayPolicy: typeof RAW_LOG_ONLY_REPLAY_POLICY;
23
+ [key: string]: unknown;
24
+ } {
25
+ return {
26
+ ...extra,
27
+ contextSafe: false,
28
+ replayPolicy: RAW_LOG_ONLY_REPLAY_POLICY,
29
+ };
30
+ }
31
+
32
+ function getReplayPolicy(message: ReplayMessage | null | undefined): unknown {
33
+ return message?.metadata?.replayPolicy ?? message?.content?.data?.replayPolicy;
34
+ }
35
+
36
+ function getContextSafe(message: ReplayMessage | null | undefined): boolean | null {
37
+ if (typeof message?.metadata?.contextSafe === 'boolean') {
38
+ return message.metadata.contextSafe;
39
+ }
40
+
41
+ if (typeof message?.content?.data?.contextSafe === 'boolean') {
42
+ return message.content.data.contextSafe;
43
+ }
44
+
45
+ return null;
46
+ }
47
+
48
+ function isReplayableMessage(message: ReplayMessage | null | undefined): boolean {
49
+ const contextSafe = getContextSafe(message);
50
+ if (contextSafe !== null) {
51
+ return contextSafe;
52
+ }
53
+
54
+ const replayPolicy = getReplayPolicy(message);
55
+ if (replayPolicy === RAW_LOG_ONLY_REPLAY_POLICY) {
56
+ return false;
57
+ }
58
+
59
+ if (replayPolicy === CONTEXT_REPLAY_POLICY) {
60
+ return true;
61
+ }
62
+
63
+ return message?.topic !== 'AGENT_OUTPUT';
64
+ }
65
+
66
+ export = {
67
+ RAW_LOG_ONLY_REPLAY_POLICY,
68
+ CONTEXT_REPLAY_POLICY,
69
+ buildRawLogOnlyMetadata,
70
+ isReplayableMessage,
71
+ };
@@ -1,17 +1,13 @@
1
- // @ts-nocheck
2
-
1
+ "use strict";
3
2
  // Validators publish a rejection when their task exhausts retries. Every other named role can
4
3
  // execute provider work, including user-defined and orchestrator roles, so exhaustion must
5
4
  // terminalize the cluster by default instead of requiring this policy to know each future role.
6
5
  const NON_TERMINAL_AGENT_ROLES = new Set(['validator']);
7
-
8
6
  function isCriticalAgent(agent) {
9
- if (agent?.id === 'consensus-coordinator') return true;
10
- return (
11
- typeof agent?.role === 'string' &&
12
- agent.role.length > 0 &&
13
- !NON_TERMINAL_AGENT_ROLES.has(agent.role)
14
- );
7
+ if (agent?.id === 'consensus-coordinator')
8
+ return true;
9
+ return (typeof agent?.role === 'string' &&
10
+ agent.role.length > 0 &&
11
+ !NON_TERMINAL_AGENT_ROLES.has(agent.role));
15
12
  }
16
-
17
13
  module.exports = { isCriticalAgent };
@@ -0,0 +1,20 @@
1
+ interface AgentIdentity {
2
+ readonly id?: unknown;
3
+ readonly role?: unknown;
4
+ }
5
+
6
+ // Validators publish a rejection when their task exhausts retries. Every other named role can
7
+ // execute provider work, including user-defined and orchestrator roles, so exhaustion must
8
+ // terminalize the cluster by default instead of requiring this policy to know each future role.
9
+ const NON_TERMINAL_AGENT_ROLES: ReadonlySet<string> = new Set(['validator']);
10
+
11
+ function isCriticalAgent(agent: AgentIdentity | null | undefined): boolean {
12
+ if (agent?.id === 'consensus-coordinator') return true;
13
+ return (
14
+ typeof agent?.role === 'string' &&
15
+ agent.role.length > 0 &&
16
+ !NON_TERMINAL_AGENT_ROLES.has(agent.role)
17
+ );
18
+ }
19
+
20
+ export = { isCriticalAgent };
@@ -1,99 +1,86 @@
1
+ "use strict";
2
+ const ledgerSequence = require("../ledger-sequence");
1
3
  const GUIDANCE_BLOCK_START = '<<GUIDANCE_QUEUE_START>>';
2
4
  const GUIDANCE_BLOCK_END = '<<GUIDANCE_QUEUE_END>>';
3
- const { compareMessageSequences } = require('../ledger-sequence');
4
-
5
+ const { compareMessageSequences } = ledgerSequence;
5
6
  function formatGuidanceMessage(message) {
6
- const timestamp = Number.isFinite(message.timestamp)
7
- ? new Date(message.timestamp).toISOString()
8
- : new Date().toISOString();
9
- const sender = message.sender || 'unknown';
10
- const topic = message.topic || 'GUIDANCE';
11
- const target = message.receiver || message.target_agent_id;
12
- const targetSuffix = target ? ` -> ${target}` : '';
13
-
14
- let formatted = `[${timestamp}] ${sender} (${topic}${targetSuffix})\n`;
15
- if (message.content?.text) {
16
- formatted += `${message.content.text}\n`;
17
- }
18
- if (message.content?.data) {
19
- formatted += `${JSON.stringify(message.content.data, null, 2)}\n`;
20
- }
21
-
22
- return formatted.trimEnd();
7
+ const timestamp = typeof message.timestamp === 'number' && Number.isFinite(message.timestamp)
8
+ ? new Date(message.timestamp).toISOString()
9
+ : new Date().toISOString();
10
+ const sender = message.sender || 'unknown';
11
+ const topic = message.topic || 'GUIDANCE';
12
+ const target = message.receiver || message.target_agent_id;
13
+ const targetSuffix = target ? ` -> ${target}` : '';
14
+ let formatted = `[${timestamp}] ${sender} (${topic}${targetSuffix})\n`;
15
+ if (message.content?.text) {
16
+ formatted += `${message.content.text}\n`;
17
+ }
18
+ if (message.content?.data) {
19
+ formatted += `${JSON.stringify(message.content.data, null, 2)}\n`;
20
+ }
21
+ return formatted.trimEnd();
23
22
  }
24
-
25
23
  function orderGuidanceMessages(messages, orderBySequence) {
26
- return messages.slice().sort((a, b) => {
27
- if (orderBySequence) {
28
- return compareMessageSequences(a.sequence || '0', b.sequence || '0');
29
- }
30
- return (a.timestamp || 0) - (b.timestamp || 0);
31
- });
24
+ return messages.slice().sort((left, right) => {
25
+ if (orderBySequence) {
26
+ return compareMessageSequences(left.sequence || '0', right.sequence || '0');
27
+ }
28
+ return (left.timestamp || 0) - (right.timestamp || 0);
29
+ });
32
30
  }
33
-
34
31
  function formatGuidanceBlock(messages, { orderBySequence = false } = {}) {
35
- if (!Array.isArray(messages) || messages.length === 0) return '';
36
-
37
- const ordered = orderGuidanceMessages(messages, orderBySequence);
38
-
39
- let block = '## Guidance (Queued)\n\n';
40
- block += `${GUIDANCE_BLOCK_START}\n`;
41
-
42
- ordered.forEach((message, index) => {
43
- block += `${formatGuidanceMessage(message)}\n`;
44
- if (index < ordered.length - 1) {
45
- block += '\n';
46
- }
47
- });
48
-
49
- block += `\n${GUIDANCE_BLOCK_END}\n\n`;
50
- return block;
32
+ if (!Array.isArray(messages) || messages.length === 0)
33
+ return '';
34
+ const ordered = orderGuidanceMessages(messages, orderBySequence);
35
+ let block = '## Guidance (Queued)\n\n';
36
+ block += `${GUIDANCE_BLOCK_START}\n`;
37
+ ordered.forEach((message, index) => {
38
+ block += `${formatGuidanceMessage(message)}\n`;
39
+ if (index < ordered.length - 1) {
40
+ block += '\n';
41
+ }
42
+ });
43
+ block += `\n${GUIDANCE_BLOCK_END}\n\n`;
44
+ return block;
51
45
  }
52
-
53
- function collectQueuedGuidance({
54
- messageBus,
55
- clusterId,
56
- agentId,
57
- afterId,
58
- throughId,
59
- lastDeliveredAt,
60
- limit,
61
- }) {
62
- if (!messageBus) {
63
- throw new Error('collectQueuedGuidance: messageBus is required');
64
- }
65
- if (!clusterId) {
66
- throw new Error('collectQueuedGuidance: clusterId is required');
67
- }
68
- if (!agentId) {
69
- throw new Error('collectQueuedGuidance: agentId is required');
70
- }
71
-
72
- const messages = messageBus.queryGuidanceMailbox({
73
- cluster_id: clusterId,
74
- target_agent_id: agentId,
75
- afterId,
76
- throughId,
77
- lastDeliveredAt,
78
- limit,
79
- });
80
-
81
- if (!messages.length) {
46
+ function emptyQueuedGuidance() {
82
47
  return { messages: [], latestSequence: null, latestTimestamp: null, guidanceBlock: '' };
83
- }
84
-
85
- const sequenceBounded = afterId !== undefined || throughId !== undefined;
86
- const ordered = orderGuidanceMessages(messages, sequenceBounded);
87
- const latestSequence = ordered[ordered.length - 1].sequence;
88
- const latestTimestamp = ordered[ordered.length - 1].timestamp;
89
- const guidanceBlock = formatGuidanceBlock(ordered, { orderBySequence: sequenceBounded });
90
-
91
- return { messages: ordered, latestSequence, latestTimestamp, guidanceBlock };
92
48
  }
93
-
49
+ function collectQueuedGuidance({ messageBus, clusterId, agentId, afterId, throughId, lastDeliveredAt, limit, }) {
50
+ if (!messageBus) {
51
+ throw new Error('collectQueuedGuidance: messageBus is required');
52
+ }
53
+ if (!clusterId) {
54
+ throw new Error('collectQueuedGuidance: clusterId is required');
55
+ }
56
+ if (!agentId) {
57
+ throw new Error('collectQueuedGuidance: agentId is required');
58
+ }
59
+ const messages = messageBus.queryGuidanceMailbox({
60
+ cluster_id: clusterId,
61
+ target_agent_id: agentId,
62
+ afterId,
63
+ throughId,
64
+ lastDeliveredAt,
65
+ limit,
66
+ });
67
+ if (!messages.length) {
68
+ return emptyQueuedGuidance();
69
+ }
70
+ const sequenceBounded = afterId !== undefined || throughId !== undefined;
71
+ const ordered = orderGuidanceMessages(messages, sequenceBounded);
72
+ const latestMessage = ordered.at(-1);
73
+ if (!latestMessage) {
74
+ return emptyQueuedGuidance();
75
+ }
76
+ const latestSequence = latestMessage.sequence;
77
+ const latestTimestamp = latestMessage.timestamp;
78
+ const guidanceBlock = formatGuidanceBlock(ordered, { orderBySequence: sequenceBounded });
79
+ return { messages: ordered, latestSequence, latestTimestamp, guidanceBlock };
80
+ }
94
81
  module.exports = {
95
- GUIDANCE_BLOCK_START,
96
- GUIDANCE_BLOCK_END,
97
- formatGuidanceBlock,
98
- collectQueuedGuidance,
82
+ GUIDANCE_BLOCK_START,
83
+ GUIDANCE_BLOCK_END,
84
+ formatGuidanceBlock,
85
+ collectQueuedGuidance,
99
86
  };