peaks-loop 4.1.3 → 4.1.4

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 (402) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/CHANGELOG.md +56 -0
  3. package/README-en.md +1 -1
  4. package/README.md +1 -1
  5. package/dist/cli/commands/asset-command-shared.d.ts +12 -0
  6. package/dist/cli/commands/asset-command-shared.js +45 -0
  7. package/dist/cli/commands/asset-commands.d.ts +6 -1
  8. package/dist/cli/commands/asset-commands.js +11 -372
  9. package/dist/cli/commands/asset-crystallize-command.d.ts +3 -0
  10. package/dist/cli/commands/asset-crystallize-command.js +60 -0
  11. package/dist/cli/commands/asset-crystallize-payload.d.ts +47 -0
  12. package/dist/cli/commands/asset-crystallize-payload.js +85 -0
  13. package/dist/cli/commands/asset-crystallize-runner.d.ts +3 -0
  14. package/dist/cli/commands/asset-crystallize-runner.js +133 -0
  15. package/dist/cli/commands/asset-dispose-command.d.ts +3 -0
  16. package/dist/cli/commands/asset-dispose-command.js +99 -0
  17. package/dist/cli/commands/asset-status-command.d.ts +3 -0
  18. package/dist/cli/commands/asset-status-command.js +100 -0
  19. package/dist/cli/commands/baseline-audit-command.d.ts +3 -0
  20. package/dist/cli/commands/baseline-audit-command.js +64 -0
  21. package/dist/cli/commands/baseline-command-shared.d.ts +23 -0
  22. package/dist/cli/commands/baseline-command-shared.js +39 -0
  23. package/dist/cli/commands/baseline-commands.js +33 -313
  24. package/dist/cli/commands/baseline-freeze-commands.d.ts +4 -0
  25. package/dist/cli/commands/baseline-freeze-commands.js +81 -0
  26. package/dist/cli/commands/baseline-guard-command.d.ts +3 -0
  27. package/dist/cli/commands/baseline-guard-command.js +52 -0
  28. package/dist/cli/commands/baseline-read-commands.d.ts +5 -0
  29. package/dist/cli/commands/baseline-read-commands.js +72 -0
  30. package/dist/cli/commands/baseline-rollback-commands.d.ts +4 -0
  31. package/dist/cli/commands/baseline-rollback-commands.js +88 -0
  32. package/dist/cli/commands/classify-downgrade-command.d.ts +9 -0
  33. package/dist/cli/commands/classify-downgrade-command.js +21 -0
  34. package/dist/cli/commands/classify-run-command.d.ts +9 -0
  35. package/dist/cli/commands/classify-run-command.js +73 -0
  36. package/dist/cli/commands/classify-signals.d.ts +5 -0
  37. package/dist/cli/commands/classify-signals.js +104 -0
  38. package/dist/cli/commands/code-emit-handoff-command.js +40 -3
  39. package/dist/cli/commands/code-gate-step-08-command.js +25 -9
  40. package/dist/cli/commands/codegraph-command-options.d.ts +22 -0
  41. package/dist/cli/commands/codegraph-command-options.js +22 -0
  42. package/dist/cli/commands/codegraph-commands.d.ts +2 -2
  43. package/dist/cli/commands/codegraph-commands.js +14 -397
  44. package/dist/cli/commands/codegraph-config-restore-command.d.ts +3 -0
  45. package/dist/cli/commands/codegraph-config-restore-command.js +200 -0
  46. package/dist/cli/commands/codegraph-proxy-commands.d.ts +10 -0
  47. package/dist/cli/commands/codegraph-proxy-commands.js +159 -0
  48. package/dist/cli/commands/codegraph-repair-commands.d.ts +3 -0
  49. package/dist/cli/commands/codegraph-repair-commands.js +94 -0
  50. package/dist/cli/commands/codegraph-status-command.d.ts +1 -1
  51. package/dist/cli/commands/codegraph-status-command.js +27 -214
  52. package/dist/cli/commands/codegraph-status-integrity.d.ts +44 -0
  53. package/dist/cli/commands/codegraph-status-integrity.js +121 -0
  54. package/dist/cli/commands/codegraph-status-json.d.ts +5 -0
  55. package/dist/cli/commands/codegraph-status-json.js +127 -0
  56. package/dist/cli/commands/container-command-shared.d.ts +60 -0
  57. package/dist/cli/commands/container-command-shared.js +52 -0
  58. package/dist/cli/commands/container-commands.d.ts +1 -1
  59. package/dist/cli/commands/container-commands.js +4 -216
  60. package/dist/cli/commands/container-release-command.d.ts +3 -0
  61. package/dist/cli/commands/container-release-command.js +105 -0
  62. package/dist/cli/commands/container-spawn-command.d.ts +3 -0
  63. package/dist/cli/commands/container-spawn-command.js +148 -0
  64. package/dist/cli/commands/context-check-command.d.ts +3 -0
  65. package/dist/cli/commands/context-check-command.js +81 -0
  66. package/dist/cli/commands/context-commands.d.ts +2 -7
  67. package/dist/cli/commands/context-commands.js +6 -276
  68. package/dist/cli/commands/context-layer-command.d.ts +3 -0
  69. package/dist/cli/commands/context-layer-command.js +34 -0
  70. package/dist/cli/commands/context-layer-fetchers.d.ts +15 -0
  71. package/dist/cli/commands/context-layer-fetchers.js +162 -0
  72. package/dist/cli/commands/context-status-command.d.ts +17 -0
  73. package/dist/cli/commands/context-status-command.js +41 -0
  74. package/dist/cli/commands/contract-write-command.d.ts +3 -0
  75. package/dist/cli/commands/contract-write-command.js +144 -0
  76. package/dist/cli/commands/core/doctor-bindings.d.ts +17 -0
  77. package/dist/cli/commands/core/doctor-bindings.js +30 -0
  78. package/dist/cli/commands/core/doctor-command.d.ts +4 -18
  79. package/dist/cli/commands/core/doctor-command.js +2 -323
  80. package/dist/cli/commands/core/doctor-logs.d.ts +8 -0
  81. package/dist/cli/commands/core/doctor-logs.js +32 -0
  82. package/dist/cli/commands/core/doctor-probes.d.ts +3 -0
  83. package/dist/cli/commands/core/doctor-probes.js +55 -0
  84. package/dist/cli/commands/core/doctor-run-command.d.ts +12 -0
  85. package/dist/cli/commands/core/doctor-run-command.js +172 -0
  86. package/dist/cli/commands/core/doctor-summary.d.ts +7 -0
  87. package/dist/cli/commands/core/doctor-summary.js +39 -0
  88. package/dist/cli/commands/core/memory-command-shared.d.ts +25 -0
  89. package/dist/cli/commands/core/memory-command-shared.js +20 -0
  90. package/dist/cli/commands/core/memory-command.d.ts +1 -1
  91. package/dist/cli/commands/core/memory-command.js +6 -227
  92. package/dist/cli/commands/core/memory-delegated-verbs.d.ts +4 -0
  93. package/dist/cli/commands/core/memory-delegated-verbs.js +178 -0
  94. package/dist/cli/commands/core/memory-extract-command.d.ts +3 -0
  95. package/dist/cli/commands/core/memory-extract-command.js +90 -0
  96. package/dist/cli/commands/core/memory-sync-command.d.ts +3 -0
  97. package/dist/cli/commands/core/memory-sync-command.js +38 -0
  98. package/dist/cli/commands/core/session-command.d.ts +1 -1
  99. package/dist/cli/commands/core/session-command.js +12 -206
  100. package/dist/cli/commands/core/session-info-command.d.ts +3 -0
  101. package/dist/cli/commands/core/session-info-command.js +142 -0
  102. package/dist/cli/commands/core/session-verb-commands.d.ts +5 -0
  103. package/dist/cli/commands/core/session-verb-commands.js +58 -0
  104. package/dist/cli/commands/core/standards-command.d.ts +1 -24
  105. package/dist/cli/commands/core/standards-command.js +33 -201
  106. package/dist/cli/commands/core/standards-init-command.d.ts +3 -0
  107. package/dist/cli/commands/core/standards-init-command.js +87 -0
  108. package/dist/cli/commands/core/standards-lint.d.ts +24 -0
  109. package/dist/cli/commands/core/standards-lint.js +57 -0
  110. package/dist/cli/commands/core/standards-migrate-command.d.ts +3 -0
  111. package/dist/cli/commands/core/standards-migrate-command.js +57 -0
  112. package/dist/cli/commands/cron-scheduler-commands.d.ts +5 -1
  113. package/dist/cli/commands/cron-scheduler-commands.js +36 -206
  114. package/dist/cli/commands/cron-scheduler-run-once-command.d.ts +7 -0
  115. package/dist/cli/commands/cron-scheduler-run-once-command.js +35 -0
  116. package/dist/cli/commands/cron-scheduler-shared.d.ts +6 -0
  117. package/dist/cli/commands/cron-scheduler-shared.js +48 -0
  118. package/dist/cli/commands/cron-scheduler-start-command.d.ts +7 -0
  119. package/dist/cli/commands/cron-scheduler-start-command.js +65 -0
  120. package/dist/cli/commands/cron-scheduler-status-command.d.ts +7 -0
  121. package/dist/cli/commands/cron-scheduler-status-command.js +46 -0
  122. package/dist/cli/commands/cron-scheduler-stop-command.d.ts +7 -0
  123. package/dist/cli/commands/cron-scheduler-stop-command.js +61 -0
  124. package/dist/cli/commands/dispatch-dag-envelope.d.ts +41 -0
  125. package/dist/cli/commands/dispatch-dag-envelope.js +49 -0
  126. package/dist/cli/commands/dispatch-dag-failure.d.ts +18 -0
  127. package/dist/cli/commands/dispatch-dag-failure.js +16 -0
  128. package/dist/cli/commands/dispatch-dag-preflight.d.ts +51 -0
  129. package/dist/cli/commands/dispatch-dag-preflight.js +105 -0
  130. package/dist/cli/commands/dispatch-dag-runners.d.ts +48 -0
  131. package/dist/cli/commands/dispatch-dag-runners.js +73 -0
  132. package/dist/cli/commands/dispatch-from-dag.d.ts +27 -0
  133. package/dist/cli/commands/dispatch-from-dag.js +87 -257
  134. package/dist/cli/commands/final-review-command-envelopes.d.ts +44 -0
  135. package/dist/cli/commands/final-review-command-envelopes.js +100 -0
  136. package/dist/cli/commands/final-review-command-shared.d.ts +52 -0
  137. package/dist/cli/commands/final-review-command-shared.js +35 -0
  138. package/dist/cli/commands/final-review-commands.d.ts +7 -27
  139. package/dist/cli/commands/final-review-commands.js +13 -240
  140. package/dist/cli/commands/final-review-prepare-command.d.ts +3 -0
  141. package/dist/cli/commands/final-review-prepare-command.js +200 -0
  142. package/dist/cli/commands/governance-classify-contract-commands.d.ts +23 -9
  143. package/dist/cli/commands/governance-classify-contract-commands.js +26 -269
  144. package/dist/cli/commands/hooks-command-shared.d.ts +42 -0
  145. package/dist/cli/commands/hooks-command-shared.js +32 -0
  146. package/dist/cli/commands/hooks-commands.d.ts +20 -0
  147. package/dist/cli/commands/hooks-commands.js +75 -309
  148. package/dist/cli/commands/hooks-install-envelopes.d.ts +6 -0
  149. package/dist/cli/commands/hooks-install-envelopes.js +144 -0
  150. package/dist/cli/commands/hooks-status-command.d.ts +3 -0
  151. package/dist/cli/commands/hooks-status-command.js +93 -0
  152. package/dist/cli/commands/hooks-uninstall-command.d.ts +3 -0
  153. package/dist/cli/commands/hooks-uninstall-command.js +43 -0
  154. package/dist/cli/commands/loop-command-shared.d.ts +31 -0
  155. package/dist/cli/commands/loop-command-shared.js +15 -0
  156. package/dist/cli/commands/loop-commands.d.ts +12 -17
  157. package/dist/cli/commands/loop-commands.js +56 -238
  158. package/dist/cli/commands/loop-export-command.d.ts +3 -0
  159. package/dist/cli/commands/loop-export-command.js +73 -0
  160. package/dist/cli/commands/loop-goal-compose-command.d.ts +3 -0
  161. package/dist/cli/commands/loop-goal-compose-command.js +36 -0
  162. package/dist/cli/commands/loop-import-command.d.ts +3 -0
  163. package/dist/cli/commands/loop-import-command.js +86 -0
  164. package/dist/cli/commands/loop-placeholder-commands.d.ts +3 -0
  165. package/dist/cli/commands/loop-placeholder-commands.js +52 -0
  166. package/dist/cli/commands/memory-command-shared.d.ts +59 -0
  167. package/dist/cli/commands/memory-command-shared.js +39 -0
  168. package/dist/cli/commands/memory-commands.d.ts +6 -79
  169. package/dist/cli/commands/memory-commands.js +19 -309
  170. package/dist/cli/commands/memory-ingest-command.d.ts +3 -0
  171. package/dist/cli/commands/memory-ingest-command.js +50 -0
  172. package/dist/cli/commands/memory-list-command.d.ts +16 -0
  173. package/dist/cli/commands/memory-list-command.js +129 -0
  174. package/dist/cli/commands/memory-reindex-command.d.ts +9 -0
  175. package/dist/cli/commands/memory-reindex-command.js +78 -0
  176. package/dist/cli/commands/memory-rotate-command.d.ts +3 -0
  177. package/dist/cli/commands/memory-rotate-command.js +55 -0
  178. package/dist/cli/commands/memory-search-command.d.ts +7 -0
  179. package/dist/cli/commands/memory-search-command.js +46 -0
  180. package/dist/cli/commands/openspec-archive-command.d.ts +3 -0
  181. package/dist/cli/commands/openspec-archive-command.js +55 -0
  182. package/dist/cli/commands/openspec-command-shared.d.ts +62 -0
  183. package/dist/cli/commands/openspec-command-shared.js +135 -0
  184. package/dist/cli/commands/openspec-commands.d.ts +1 -1
  185. package/dist/cli/commands/openspec-commands.js +33 -306
  186. package/dist/cli/commands/openspec-from-doctor-command.d.ts +3 -0
  187. package/dist/cli/commands/openspec-from-doctor-command.js +66 -0
  188. package/dist/cli/commands/openspec-init-command.d.ts +3 -0
  189. package/dist/cli/commands/openspec-init-command.js +49 -0
  190. package/dist/cli/commands/openspec-list-command.d.ts +3 -0
  191. package/dist/cli/commands/openspec-list-command.js +27 -0
  192. package/dist/cli/commands/openspec-render-command.d.ts +3 -0
  193. package/dist/cli/commands/openspec-render-command.js +33 -0
  194. package/dist/cli/commands/openspec-show-command.d.ts +3 -0
  195. package/dist/cli/commands/openspec-show-command.js +33 -0
  196. package/dist/cli/commands/openspec-to-rd-command.d.ts +3 -0
  197. package/dist/cli/commands/openspec-to-rd-command.js +33 -0
  198. package/dist/cli/commands/openspec-validate-command.d.ts +3 -0
  199. package/dist/cli/commands/openspec-validate-command.js +45 -0
  200. package/dist/cli/commands/playwright-browser-command.d.ts +8 -0
  201. package/dist/cli/commands/playwright-browser-command.js +61 -0
  202. package/dist/cli/commands/playwright-commands.d.ts +10 -62
  203. package/dist/cli/commands/playwright-commands.js +77 -400
  204. package/dist/cli/commands/playwright-envelope.d.ts +8 -0
  205. package/dist/cli/commands/playwright-envelope.js +29 -0
  206. package/dist/cli/commands/playwright-ls-stop-commands.d.ts +4 -0
  207. package/dist/cli/commands/playwright-ls-stop-commands.js +74 -0
  208. package/dist/cli/commands/playwright-session-store.d.ts +65 -0
  209. package/dist/cli/commands/playwright-session-store.js +189 -0
  210. package/dist/cli/commands/project-commands.d.ts +19 -0
  211. package/dist/cli/commands/project-commands.js +98 -259
  212. package/dist/cli/commands/project-context-command.d.ts +3 -0
  213. package/dist/cli/commands/project-context-command.js +44 -0
  214. package/dist/cli/commands/project-dashboard-command.d.ts +3 -0
  215. package/dist/cli/commands/project-dashboard-command.js +74 -0
  216. package/dist/cli/commands/project-knowledge-command.d.ts +3 -0
  217. package/dist/cli/commands/project-knowledge-command.js +48 -0
  218. package/dist/cli/commands/project-memories-show-command.d.ts +3 -0
  219. package/dist/cli/commands/project-memories-show-command.js +87 -0
  220. package/dist/cli/commands/project-memory-index-command.d.ts +3 -0
  221. package/dist/cli/commands/project-memory-index-command.js +31 -0
  222. package/dist/cli/commands/qa-archive-screenshots-command.d.ts +3 -0
  223. package/dist/cli/commands/qa-archive-screenshots-command.js +53 -0
  224. package/dist/cli/commands/qa-commands.d.ts +14 -87
  225. package/dist/cli/commands/qa-commands.js +17 -315
  226. package/dist/cli/commands/qa-context-prestep.d.ts +1 -0
  227. package/dist/cli/commands/qa-context-prestep.js +34 -0
  228. package/dist/cli/commands/qa-run-command.d.ts +3 -0
  229. package/dist/cli/commands/qa-run-command.js +105 -0
  230. package/dist/cli/commands/qa-run-options.d.ts +23 -0
  231. package/dist/cli/commands/qa-run-options.js +31 -0
  232. package/dist/cli/commands/qa-run-slice.d.ts +41 -0
  233. package/dist/cli/commands/qa-run-slice.js +145 -0
  234. package/dist/cli/commands/release-canary-command.d.ts +28 -0
  235. package/dist/cli/commands/release-canary-command.js +129 -0
  236. package/dist/cli/commands/release-command-shared.d.ts +13 -0
  237. package/dist/cli/commands/release-command-shared.js +18 -0
  238. package/dist/cli/commands/release-commands.d.ts +10 -18
  239. package/dist/cli/commands/release-commands.js +25 -298
  240. package/dist/cli/commands/release-done-command.d.ts +3 -0
  241. package/dist/cli/commands/release-done-command.js +64 -0
  242. package/dist/cli/commands/release-hotfix-command.d.ts +3 -0
  243. package/dist/cli/commands/release-hotfix-command.js +50 -0
  244. package/dist/cli/commands/release-plan-command.d.ts +3 -0
  245. package/dist/cli/commands/release-plan-command.js +33 -0
  246. package/dist/cli/commands/release-precheck-command.d.ts +3 -0
  247. package/dist/cli/commands/release-precheck-command.js +28 -0
  248. package/dist/cli/commands/release-promote-command.d.ts +3 -0
  249. package/dist/cli/commands/release-promote-command.js +34 -0
  250. package/dist/cli/commands/release-rollback-command.d.ts +3 -0
  251. package/dist/cli/commands/release-rollback-command.js +33 -0
  252. package/dist/cli/commands/release-watch-command.d.ts +3 -0
  253. package/dist/cli/commands/release-watch-command.js +44 -0
  254. package/dist/cli/commands/sediment-argv-flags.d.ts +54 -0
  255. package/dist/cli/commands/sediment-argv-flags.js +116 -0
  256. package/dist/cli/commands/sediment-command-shared.d.ts +15 -0
  257. package/dist/cli/commands/sediment-command-shared.js +5 -0
  258. package/dist/cli/commands/sediment-commands.d.ts +35 -59
  259. package/dist/cli/commands/sediment-commands.js +36 -590
  260. package/dist/cli/commands/sediment-pool-commands.d.ts +9 -0
  261. package/dist/cli/commands/sediment-pool-commands.js +185 -0
  262. package/dist/cli/commands/sediment-query-commands.d.ts +4 -0
  263. package/dist/cli/commands/sediment-query-commands.js +94 -0
  264. package/dist/cli/commands/sediment-release-commands.d.ts +8 -0
  265. package/dist/cli/commands/sediment-release-commands.js +232 -0
  266. package/dist/cli/commands/sop-advance-command.d.ts +3 -0
  267. package/dist/cli/commands/sop-advance-command.js +160 -0
  268. package/dist/cli/commands/sop-check-command.d.ts +3 -0
  269. package/dist/cli/commands/sop-check-command.js +44 -0
  270. package/dist/cli/commands/sop-command-shared.d.ts +23 -0
  271. package/dist/cli/commands/sop-command-shared.js +18 -0
  272. package/dist/cli/commands/sop-commands.d.ts +15 -1
  273. package/dist/cli/commands/sop-commands.js +26 -240
  274. package/dist/cli/commands/sop-init-command.d.ts +3 -0
  275. package/dist/cli/commands/sop-init-command.js +51 -0
  276. package/dist/cli/commands/sop-lint-command.d.ts +3 -0
  277. package/dist/cli/commands/sop-lint-command.js +64 -0
  278. package/dist/cli/commands/sop-register-command.d.ts +3 -0
  279. package/dist/cli/commands/sop-register-command.js +48 -0
  280. package/dist/cli/commands/sop-registry-command.d.ts +3 -0
  281. package/dist/cli/commands/sop-registry-command.js +30 -0
  282. package/dist/cli/commands/statusline-command-shared.d.ts +73 -0
  283. package/dist/cli/commands/statusline-command-shared.js +90 -0
  284. package/dist/cli/commands/statusline-commands.d.ts +1 -19
  285. package/dist/cli/commands/statusline-commands.js +48 -287
  286. package/dist/cli/commands/statusline-compact-command.d.ts +4 -0
  287. package/dist/cli/commands/statusline-compact-command.js +54 -0
  288. package/dist/cli/commands/statusline-install-command.d.ts +3 -0
  289. package/dist/cli/commands/statusline-install-command.js +48 -0
  290. package/dist/cli/commands/statusline-render-command.d.ts +9 -0
  291. package/dist/cli/commands/statusline-render-command.js +55 -0
  292. package/dist/cli/commands/statusline-status-command.d.ts +3 -0
  293. package/dist/cli/commands/statusline-status-command.js +23 -0
  294. package/dist/cli/commands/statusline-uninstall-command.d.ts +3 -0
  295. package/dist/cli/commands/statusline-uninstall-command.js +23 -0
  296. package/dist/cli/commands/test-command-run-helpers.d.ts +27 -0
  297. package/dist/cli/commands/test-command-run-helpers.js +73 -0
  298. package/dist/cli/commands/test-command-runner-resolution.d.ts +57 -0
  299. package/dist/cli/commands/test-command-runner-resolution.js +183 -0
  300. package/dist/cli/commands/test-commands.d.ts +8 -56
  301. package/dist/cli/commands/test-commands.js +26 -249
  302. package/dist/cli/commands/vm-command-shared.d.ts +23 -0
  303. package/dist/cli/commands/vm-command-shared.js +23 -0
  304. package/dist/cli/commands/vm-commands.d.ts +1 -28
  305. package/dist/cli/commands/vm-commands.js +36 -270
  306. package/dist/cli/commands/vm-hypervisor-runtime.d.ts +15 -0
  307. package/dist/cli/commands/vm-hypervisor-runtime.js +64 -0
  308. package/dist/cli/commands/vm-release-command.d.ts +5 -0
  309. package/dist/cli/commands/vm-release-command.js +101 -0
  310. package/dist/cli/commands/vm-spawn-command.d.ts +5 -0
  311. package/dist/cli/commands/vm-spawn-command.js +177 -0
  312. package/dist/cli/commands/web-command-shared.d.ts +12 -0
  313. package/dist/cli/commands/web-command-shared.js +30 -0
  314. package/dist/cli/commands/web-commands.d.ts +7 -14
  315. package/dist/cli/commands/web-commands.js +6 -314
  316. package/dist/cli/commands/web-install-command.d.ts +10 -0
  317. package/dist/cli/commands/web-install-command.js +116 -0
  318. package/dist/cli/commands/web-lifecycle-commands.d.ts +9 -30
  319. package/dist/cli/commands/web-lifecycle-commands.js +14 -322
  320. package/dist/cli/commands/web-login-command.d.ts +14 -0
  321. package/dist/cli/commands/web-login-command.js +189 -0
  322. package/dist/cli/commands/web-op-payload.d.ts +22 -0
  323. package/dist/cli/commands/web-op-payload.js +89 -0
  324. package/dist/cli/commands/web-op-refusals.d.ts +37 -0
  325. package/dist/cli/commands/web-op-refusals.js +73 -0
  326. package/dist/cli/commands/web-op-runner.d.ts +14 -0
  327. package/dist/cli/commands/web-op-runner.js +166 -0
  328. package/dist/cli/commands/web-status-command.d.ts +4 -0
  329. package/dist/cli/commands/web-status-command.js +32 -0
  330. package/dist/cli/commands/web-stop-command.d.ts +10 -0
  331. package/dist/cli/commands/web-stop-command.js +59 -0
  332. package/dist/cli/commands/web-verb-specs.d.ts +18 -0
  333. package/dist/cli/commands/web-verb-specs.js +66 -0
  334. package/dist/cli/commands/workflow-command-shared.d.ts +102 -0
  335. package/dist/cli/commands/workflow-command-shared.js +74 -0
  336. package/dist/cli/commands/workflow-graph-commands.d.ts +3 -0
  337. package/dist/cli/commands/workflow-graph-commands.js +73 -0
  338. package/dist/cli/commands/workflow-init-command.d.ts +3 -0
  339. package/dist/cli/commands/workflow-init-command.js +68 -0
  340. package/dist/cli/commands/workflow-lifecycle-commands.d.ts +9 -59
  341. package/dist/cli/commands/workflow-lifecycle-commands.js +14 -348
  342. package/dist/cli/commands/workflow-node-commands.d.ts +3 -0
  343. package/dist/cli/commands/workflow-node-commands.js +154 -0
  344. package/dist/cli/commands/workflow-terminalize-command.d.ts +3 -0
  345. package/dist/cli/commands/workflow-terminalize-command.js +56 -0
  346. package/dist/services/code/auto-compact-artifacts.d.ts +54 -0
  347. package/dist/services/code/auto-compact-artifacts.js +135 -0
  348. package/dist/services/code/auto-compact-attempt.d.ts +46 -0
  349. package/dist/services/code/auto-compact-attempt.js +88 -0
  350. package/dist/services/code/auto-compact-decision.d.ts +74 -0
  351. package/dist/services/code/auto-compact-decision.js +149 -0
  352. package/dist/services/code/auto-compact-dispatch-gate.d.ts +36 -0
  353. package/dist/services/code/auto-compact-dispatch-gate.js +86 -0
  354. package/dist/services/code/auto-compact-envelopes.d.ts +33 -0
  355. package/dist/services/code/auto-compact-envelopes.js +134 -0
  356. package/dist/services/code/auto-compact-history.d.ts +46 -0
  357. package/dist/services/code/auto-compact-history.js +17 -0
  358. package/dist/services/code/auto-compact-orchestrator.d.ts +11 -240
  359. package/dist/services/code/auto-compact-orchestrator.js +165 -686
  360. package/dist/services/code/auto-compact-run-types.d.ts +123 -0
  361. package/dist/services/code/auto-compact-run-types.js +1 -0
  362. package/dist/services/code/emit-handoff.d.ts +35 -1
  363. package/dist/services/code/emit-handoff.js +128 -7
  364. package/dist/services/code/step-08-gate.d.ts +28 -19
  365. package/dist/services/code/step-08-gate.js +92 -35
  366. package/dist/services/config/config-coercion.d.ts +7 -0
  367. package/dist/services/config/config-coercion.js +156 -0
  368. package/dist/services/config/config-file-io.d.ts +11 -0
  369. package/dist/services/config/config-file-io.js +61 -0
  370. package/dist/services/config/config-get.d.ts +2 -0
  371. package/dist/services/config/config-get.js +36 -0
  372. package/dist/services/config/config-global-loader.d.ts +15 -0
  373. package/dist/services/config/config-global-loader.js +111 -0
  374. package/dist/services/config/config-nested-path.d.ts +3 -0
  375. package/dist/services/config/config-nested-path.js +53 -0
  376. package/dist/services/config/config-primitives.d.ts +16 -0
  377. package/dist/services/config/config-primitives.js +24 -0
  378. package/dist/services/config/config-service.d.ts +9 -33
  379. package/dist/services/config/config-service.js +16 -665
  380. package/dist/services/config/config-validation.d.ts +19 -0
  381. package/dist/services/config/config-validation.js +152 -0
  382. package/dist/services/config/config-workspace.d.ts +10 -0
  383. package/dist/services/config/config-workspace.js +158 -0
  384. package/dist/services/skills/hooks-settings-deny-list.d.ts +61 -0
  385. package/dist/services/skills/hooks-settings-deny-list.js +173 -0
  386. package/dist/services/skills/hooks-settings-envelopes.d.ts +20 -0
  387. package/dist/services/skills/hooks-settings-envelopes.js +79 -0
  388. package/dist/services/skills/hooks-settings-file-shape.d.ts +43 -0
  389. package/dist/services/skills/hooks-settings-file-shape.js +207 -0
  390. package/dist/services/skills/hooks-settings-paths.d.ts +34 -0
  391. package/dist/services/skills/hooks-settings-paths.js +75 -0
  392. package/dist/services/skills/hooks-settings-read-installed.d.ts +39 -0
  393. package/dist/services/skills/hooks-settings-read-installed.js +60 -0
  394. package/dist/services/skills/hooks-settings-service.d.ts +12 -212
  395. package/dist/services/skills/hooks-settings-service.js +71 -657
  396. package/dist/services/skills/hooks-settings-types.d.ts +139 -0
  397. package/dist/services/skills/hooks-settings-types.js +1 -0
  398. package/dist/services/workspace/claude-settings-template-merge.d.ts +89 -0
  399. package/dist/services/workspace/claude-settings-template-merge.js +243 -0
  400. package/dist/services/workspace/claude-settings-template.d.ts +29 -87
  401. package/dist/services/workspace/claude-settings-template.js +81 -236
  402. package/package.json +5 -5
@@ -0,0 +1,135 @@
1
+ /**
2
+ * The files one auto-compact run writes: checkpoint, intent and decision log.
3
+ *
4
+ * Split out of `auto-compact-orchestrator.ts` (file-size cap campaign). The
5
+ * orchestrator re-exports every name declared here, so existing importers keep
6
+ * using `./auto-compact-orchestrator.js` unchanged.
7
+ */
8
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
9
+ import { join } from 'node:path';
10
+ import { getSessionDir } from '../session/getSessionDir.js';
11
+ import { describeHarnessWindowSync } from '../context/harness-window-config.js';
12
+ /**
13
+ * What the caller is told to do next. The harness-window notice rides along because
14
+ * the run also rewrites the harness's own settings, so it says so too: the user
15
+ * accepted that write on the condition 要告知, and a write only one of the two
16
+ * syncing commands reports is not a notice.
17
+ */
18
+ export function compactNextActions(isRedLine, harnessWindow) {
19
+ if (isRedLine) {
20
+ return [
21
+ 'RED-LINE: harness compact requested — sub-agent dispatch is NOT blocked; keep working',
22
+ 'Post-compact resume picks up the convergence plan from auto-decisions.md',
23
+ 'Next `peaks code context-now` probe will confirm the ratio dropped; if it keeps climbing and the harness has not compacted, report that to the user and hand control back',
24
+ describeHarnessWindowSync(harnessWindow)
25
+ ];
26
+ }
27
+ return [
28
+ 'Pre-compact dispatched — IDE compact in progress (async)',
29
+ 'Post-compact resume picks up the convergence plan from auto-decisions.md',
30
+ 'Next `peaks code auto-compact` probe will confirm ratio dropped below 0.85',
31
+ describeHarnessWindowSync(harnessWindow)
32
+ ];
33
+ }
34
+ const PRE_COMPACT_REASON = 'pre-compact-auto';
35
+ /**
36
+ * Append a one-row convergence decision to the LLM-readable log.
37
+ * The LLM reads this on the post-compact turn to pick up exactly
38
+ * where it left off (vs. blindly trusting the IDE's compressed
39
+ * transcript).
40
+ */
41
+ export function appendAutoDecisionLog(input) {
42
+ // Repair R6: same hand-rolled join as `writePreCompactCheckpoint`. All four
43
+ // session-scoped paths in this file now go through the axis builder; none
44
+ // composes the join itself, so none can resolve outside the project root.
45
+ const dir = join(getSessionDir(input.projectRoot, input.sessionId), 'txt');
46
+ if (!existsSync(dir))
47
+ mkdirSync(dir, { recursive: true });
48
+ const logPath = join(dir, 'auto-decisions.md');
49
+ const row = [
50
+ '',
51
+ `## Auto-compact decision — ${input.plan.createdAt}`,
52
+ `- ratio: ${(input.plan.ratio * 100).toFixed(1)}%`,
53
+ `- checkpoint: ${input.plan.checkpointPath}`,
54
+ `- next-actions: ${input.plan.nextActions.join(' | ')}`,
55
+ `- resume-hint: ${input.plan.resumeHint}`,
56
+ ''
57
+ ].join('\n');
58
+ if (!existsSync(logPath)) {
59
+ writeFileSync(logPath, `# peaks-code auto-decisions log\n${row}`, 'utf8');
60
+ return;
61
+ }
62
+ const existing = readFileSync(logPath, 'utf8');
63
+ writeFileSync(logPath, `${existing}${row}`, 'utf8');
64
+ }
65
+ /**
66
+ * main-session compact intent so the main-session LLM picks it up on
67
+ * its next turn and fires `/compact` in-band. Without this file the
68
+ * orchestrator's "main-session compact" request is invisible to the
69
+ * main Claude Code window (defeats the whole point of auto-compact
70
+ * for the main context).
71
+ *
72
+ * The file is gitignored under `.peaks/_runtime/<sessionId>/txt/` and
73
+ * is one-shot: the LLM should `mv` it to `.consumed` after firing
74
+ * `/compact`. A re-run will overwrite.
75
+ *
76
+ * write survives, but nothing consumes the file, and its `nextAction` asks
77
+ * for a `/compact` the model cannot invoke (the Skill tool exposes only
78
+ * `/init` and `/security-review`; hooks can observe or veto, never initiate).
79
+ * Retained deliberately for the sibling A2 slice, which owns harness-side
80
+ * state re-injection. Not a capability peaks-loop has today.
81
+ */
82
+ export function writeMainSessionCompactIntent(input) {
83
+ const dir = join(getSessionDir(input.projectRoot, input.sessionId), 'txt');
84
+ if (!existsSync(dir))
85
+ mkdirSync(dir, { recursive: true });
86
+ const path = join(dir, 'auto-compact-pending.json');
87
+ const payload = {
88
+ schemaVersion: 1,
89
+ pending: true,
90
+ target: 'main',
91
+ requestedAt: input.now.toISOString(),
92
+ ratio: input.ratio,
93
+ redLine: input.redLine,
94
+ nextAction: 'next LLM turn MUST fire `/compact` then `mv .peaks/_runtime/<sid>/txt/auto-compact-pending.json .peaks/_runtime/<sid>/txt/auto-compact-pending.consumed.json`'
95
+ };
96
+ writeFileSync(path, JSON.stringify(payload, null, 2), 'utf8');
97
+ }
98
+ /**
99
+ * Write a pre-compact checkpoint. The shape mirrors `peaks session
100
+ * checkpoint` so D7's post-compact-detect picks it up unchanged.
101
+ */
102
+ export function writePreCompactCheckpoint(input) {
103
+ // Repair R6: this used to hand-roll the session join, which is the one shape
104
+ // `getSessionDir`'s own header records as NOT covered by the guard — an
105
+ // unsafe id resolved outside the project root and the checkpoint was written
106
+ // there. The gate above now refuses an unresolvable id before this point, but
107
+ // `--force` outranks that gate, so this join has to hold on its own.
108
+ const dir = join(getSessionDir(input.projectRoot, input.sessionId), 'checkpoints');
109
+ if (!existsSync(dir))
110
+ mkdirSync(dir, { recursive: true });
111
+ const prefix = input.redLine === true ? 'red-line-' : 'pre-compact-';
112
+ const filename = `${prefix}${input.now.toISOString().replace(/[:.]/g, '-')}.json`;
113
+ const path = join(dir, filename);
114
+ const content = {
115
+ schemaVersion: 1,
116
+ reason: input.redLine === true ? 'pre-compact-red-line' : PRE_COMPACT_REASON,
117
+ sessionId: input.sessionId,
118
+ createdAt: input.now.toISOString(),
119
+ // D7 reads `mode`, `currentPlan`, `openQuestions`, `recentDecisions`
120
+ // out of this JSON. We seed empty arrays; the post-compact LLM
121
+ // rehydrates from the auto-decisions log + open question list.
122
+ mode: 'full-auto',
123
+ currentPlan: input.redLine === true
124
+ ? 'RED-LINE compact REQUESTED from the harness (not executed by peaks-loop); work continues'
125
+ : 'auto-compact in progress; resume from auto-decisions.md',
126
+ openQuestions: [],
127
+ recentDecisions: [],
128
+ recentArtifactPaths: [],
129
+ gitStatus: '',
130
+ skillsActive: ['peaks-code'],
131
+ todoState: []
132
+ };
133
+ writeFileSync(path, JSON.stringify(content, null, 2), 'utf8');
134
+ return path;
135
+ }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * The two side-effecting phases of a run: prepare the artifacts, then dispatch.
3
+ *
4
+ * Split out of `auto-compact-orchestrator.ts` (file-size cap campaign). The
5
+ * orchestrator re-exports every name declared here, so existing importers keep
6
+ * using `./auto-compact-orchestrator.js` unchanged.
7
+ */
8
+ import { type AutoCompactResult, type CompactDispatchResult, type ConvergencePlan } from '../context/auto-compact-types.js';
9
+ import type { CompactTarget } from '../context/auto-compact-dispatcher.js';
10
+ import { CompactLifecyclePublisher } from './auto-compact-lifecycle.js';
11
+ import type { CompactRun } from './auto-compact-run-types.js';
12
+ export type PrepareOutcome = {
13
+ readonly ok: true;
14
+ readonly lifecycle: CompactLifecyclePublisher;
15
+ readonly checkpointPath: string;
16
+ readonly plan: ConvergencePlan;
17
+ } | {
18
+ readonly ok: false;
19
+ readonly envelope: AutoCompactResult;
20
+ };
21
+ /**
22
+ * One runId per attempt, committed to compacting: the publisher is created at
23
+ * `queued` and every later transition carries the same id forward. `preparing`
24
+ * covers the checkpoint, the convergence plan and the decision-log write; a throw
25
+ * in any of them rests the record at `failedAt: 'preparing'`.
26
+ */
27
+ export declare function prepareCompactAttempt(ctx: CompactRun): PrepareOutcome;
28
+ export type DispatchOutcome = {
29
+ readonly ok: true;
30
+ readonly target: CompactTarget;
31
+ readonly dispatch: CompactDispatchResult;
32
+ } | {
33
+ readonly ok: false;
34
+ readonly envelope: AutoCompactResult;
35
+ };
36
+ /**
37
+ * The IDE-dispatch phase. The intent record is written only for `main`: without it
38
+ * the main-session LLM has no signal that the orchestrator asked for compact, and
39
+ * the dispatcher alone would have been a no-op against the main Claude Code window.
40
+ */
41
+ export declare function dispatchAttempt(args: {
42
+ readonly ctx: CompactRun;
43
+ readonly lifecycle: CompactLifecyclePublisher;
44
+ readonly checkpointPath: string;
45
+ readonly plan: ConvergencePlan;
46
+ }): Promise<DispatchOutcome>;
@@ -0,0 +1,88 @@
1
+ import { CompactLifecyclePublisher, newCompactRunId } from './auto-compact-lifecycle.js';
2
+ import { appendAutoDecisionLog, compactNextActions, writeMainSessionCompactIntent, writePreCompactCheckpoint } from './auto-compact-artifacts.js';
3
+ import { buildConvergencePlan } from './auto-compact-decision.js';
4
+ import { dispatchFailureResult, prepareFailureResult } from './auto-compact-envelopes.js';
5
+ /**
6
+ * One runId per attempt, committed to compacting: the publisher is created at
7
+ * `queued` and every later transition carries the same id forward. `preparing`
8
+ * covers the checkpoint, the convergence plan and the decision-log write; a throw
9
+ * in any of them rests the record at `failedAt: 'preparing'`.
10
+ */
11
+ export function prepareCompactAttempt(ctx) {
12
+ const { input, sessionId, probe, harnessWindow, isRedLine, now } = ctx;
13
+ const lifecycle = new CompactLifecyclePublisher({
14
+ projectRoot: input.projectRoot,
15
+ sessionId,
16
+ runId: newCompactRunId(now),
17
+ triggerRatio: probe.ratio,
18
+ redLine: isRedLine,
19
+ onLifecycleStage: input.onLifecycleStage,
20
+ failLifecycleWrite: input.testHooks?.failLifecycleWrite
21
+ });
22
+ lifecycle.advance('queued');
23
+ try {
24
+ lifecycle.advance('preparing');
25
+ if (input.testHooks?.failPreparing)
26
+ throw new Error('disk full while writing checkpoint');
27
+ const checkpointPath = writePreCompactCheckpoint({
28
+ projectRoot: input.projectRoot,
29
+ sessionId,
30
+ now,
31
+ redLine: isRedLine
32
+ });
33
+ const plan = buildConvergencePlan({
34
+ sessionId,
35
+ projectRoot: input.projectRoot,
36
+ ratio: probe.ratio,
37
+ checkpointPath,
38
+ nextActions: compactNextActions(isRedLine, harnessWindow),
39
+ redLine: isRedLine
40
+ });
41
+ appendAutoDecisionLog({ projectRoot: input.projectRoot, sessionId, plan });
42
+ return { ok: true, lifecycle, checkpointPath, plan };
43
+ }
44
+ catch (error) {
45
+ lifecycle.fail(error);
46
+ return { ok: false, envelope: prepareFailureResult(ctx, error) };
47
+ }
48
+ }
49
+ /**
50
+ * The IDE-dispatch phase. The intent record is written only for `main`: without it
51
+ * the main-session LLM has no signal that the orchestrator asked for compact, and
52
+ * the dispatcher alone would have been a no-op against the main Claude Code window.
53
+ */
54
+ export async function dispatchAttempt(args) {
55
+ const { ctx, lifecycle, checkpointPath, plan } = args;
56
+ const { input, sessionId, probe, isRedLine, now } = ctx;
57
+ const { dispatchIdeCompact } = await import('../context/auto-compact-dispatcher.js');
58
+ const target = input.target ?? 'main';
59
+ try {
60
+ if (input.testHooks?.failCompacting)
61
+ throw new Error('IDE dispatch exploded');
62
+ if (target === 'main') {
63
+ writeMainSessionCompactIntent({
64
+ projectRoot: input.projectRoot,
65
+ sessionId,
66
+ ratio: probe.ratio,
67
+ redLine: isRedLine,
68
+ now
69
+ });
70
+ }
71
+ const dispatch = await dispatchIdeCompact({
72
+ projectRoot: input.projectRoot,
73
+ sessionId,
74
+ env: input.env,
75
+ target
76
+ });
77
+ return { ok: true, target, dispatch };
78
+ }
79
+ catch (error) {
80
+ // `compacting` is the phase this failure died in — a phase label,
81
+ // not a claim that a compaction was in flight.
82
+ lifecycle.fail(error, 'compacting');
83
+ return {
84
+ ok: false,
85
+ envelope: dispatchFailureResult(ctx, { checkpointPath, plan, target }, error)
86
+ };
87
+ }
88
+ }
@@ -0,0 +1,74 @@
1
+ /**
2
+ * The pure auto-compact decision surface: trigger, decision and plan.
3
+ *
4
+ * Split out of `auto-compact-orchestrator.ts` (file-size cap campaign). The
5
+ * orchestrator re-exports every name declared here, so existing importers keep
6
+ * using `./auto-compact-orchestrator.js` unchanged.
7
+ */
8
+ import { type CompactTrigger, type ConvergencePlan, type InFlightBatchProbe } from '../context/auto-compact-types.js';
9
+ import { type AutoCompactMode } from './auto-compact-modes.js';
10
+ export declare function evaluateCompactTrigger(ratio: number, mode?: AutoCompactMode): CompactTrigger;
11
+ /**
12
+ * Decide whether to run the auto-compact flow. Pure function for the
13
+ * decision; side effects (checkpoint + IDE dispatch) live in
14
+ * `runAutoCompact` below. Zero human / zero LLM intervention:
15
+ *
16
+ * - ratio < 0.85 → skip (LLM keeps working; no action)
17
+ * - 0.85 ≤ ratio < 0.95 → pre-compact; if in-flight batch
18
+ * present, defer (D6.e); else dispatch
19
+ * IDE compact asynchronously.
20
+ * - ratio ≥ 0.95 → red-line; ask the harness to compact
21
+ * regardless of in-flight batch. Nothing is
22
+ * gated — dispatch is NOT blocked (slice
23
+ * peaks-loop cannot compact a running session,
24
+ * so a "block" gated nothing and deadlocked the
25
+ * runner).
26
+ */
27
+ export declare function evaluateAutoCompactDecision(input: {
28
+ ratio: number;
29
+ /**
30
+ * Caller-provided in-flight batch signal. Accepts either a plain
31
+ * boolean (convenience / repro seam) or the full `InFlightBatchProbe`
32
+ * shape (production callers — graph-probe-backed). When the boolean
33
+ * form is `true`, the normalized probe carries
34
+ * `hasInFlightBatch: true`. Slice 4.0.8 hotfix.
35
+ */
36
+ inFlightBatch?: boolean | InFlightBatchProbe | undefined;
37
+ /**
38
+ * Legacy camelCase alias for `inFlightBatch`. Production repro
39
+ * inputs use `inflightBatch: true|false`; the orchestrator
40
+ * normalizes it to the same internal shape. Slice 4.0.8 hotfix.
41
+ */
42
+ inflightBatch?: boolean | InFlightBatchProbe | undefined;
43
+ force?: boolean | undefined;
44
+ /** Accepted and ignored — see `AutoCompactInput.bypassRedLine`. */
45
+ bypassRedLine?: boolean | undefined;
46
+ mode?: AutoCompactMode | undefined;
47
+ /**
48
+ * Source tag from `readContextPercent.source`. Optional — when absent, the
49
+ * function behaves exactly as pre-rid (ratio-only). Slice 2026-07-31-rid-
50
+ * mac-transcript-estimate-trigger uses this to carry forward an explicit
51
+ * carve-out for the Mac-only `transcript-estimate` signal.
52
+ */
53
+ source?: string | undefined;
54
+ }): {
55
+ shouldCompact: boolean;
56
+ reason: 'below-threshold' | 'in-flight-batch' | 'pre-compact' | 'red-line';
57
+ trigger: CompactTrigger;
58
+ /** Typed verdict enum (RD §4 24h-mode contract). Slice 4.0.8 hotfix. */
59
+ action: 'ok' | 'soft-warn' | 'auto-compact-now' | 'red-line' | 'defer';
60
+ };
61
+ /**
62
+ * Build the convergence plan that D7's post-compact-detect will read
63
+ * back. Includes the current plan, open questions, recent decisions,
64
+ * todo state, and recent artifact paths — strictly more than what a
65
+ * raw `/compact` would preserve.
66
+ */
67
+ export declare function buildConvergencePlan(input: {
68
+ readonly sessionId: string;
69
+ readonly projectRoot: string;
70
+ readonly ratio: number;
71
+ readonly checkpointPath: string;
72
+ readonly nextActions: readonly string[];
73
+ readonly redLine?: boolean;
74
+ }): ConvergencePlan;
@@ -0,0 +1,149 @@
1
+ /**
2
+ * The pure auto-compact decision surface: trigger, decision and plan.
3
+ *
4
+ * Split out of `auto-compact-orchestrator.ts` (file-size cap campaign). The
5
+ * orchestrator re-exports every name declared here, so existing importers keep
6
+ * using `./auto-compact-orchestrator.js` unchanged.
7
+ */
8
+ import { AUTO_COMPACT_PRE_COMPACT_RATIO } from '../context/auto-compact-types.js';
9
+ import { thresholdFor } from './auto-compact-modes.js';
10
+ /**
11
+ * Map a context ratio to a `CompactTrigger` action. Pure; the side
12
+ * effects (checkpoint + IDE dispatch) live in `runAutoCompact`. Two
13
+ * tiers (standard mode; partial mode shifts both thresholds):
14
+ *
15
+ * - ratio < preCompact → 'none' or 'soft-warn'
16
+ * - ratio ≥ preCompact → 'pre-compact' (async-friendly path)
17
+ * - ratio ≥ redLine → 'red-line' (ask the harness; dispatch continues)
18
+ *
19
+ * Default `'standard'` (0.85/0.95). `'partial'` (0.70/0.85) is used
20
+ * when 24h long-run mode is active or `--mode partial` is passed.
21
+ */
22
+ /** Below this ratio the probe is not even worth a soft warning. */
23
+ const SOFT_WARN_RATIO_FLOOR = 0.5;
24
+ export function evaluateCompactTrigger(ratio, mode = 'standard') {
25
+ const autoFire = thresholdFor(mode, 'autoFire');
26
+ const preCompact = thresholdFor(mode, 'preCompact');
27
+ const redLine = thresholdFor(mode, 'redLine');
28
+ if (ratio < autoFire) {
29
+ return ratio < SOFT_WARN_RATIO_FLOOR
30
+ ? { kind: 'none' }
31
+ : {
32
+ kind: 'soft-warn',
33
+ ratio,
34
+ message: `Context at ${(ratio * 100).toFixed(1)}%; below the ${(autoFire * 100).toFixed(0)}% auto-fire threshold (mode=${mode}).`
35
+ };
36
+ }
37
+ if (ratio >= redLine) {
38
+ // longer claims it blocks anything. It cannot: peaks-loop has no
39
+ // executor for a running session (no `/compact` the model may invoke, no
40
+ // hook-initiated compact, no `--compact` flag), so "refuse dispatch until
41
+ // ratio < 0.85" was a gate with no key — a constructive deadlock at the
42
+ // exact moment the runner most needed to keep working. What peaks-loop
43
+ // CAN do is ask the harness (whose own trigger is armed) and say so.
44
+ return {
45
+ kind: 'red-line',
46
+ ratio,
47
+ message: `Context at ${(ratio * 100).toFixed(1)}% ≥ ${(redLine * 100).toFixed(0)}% red line (mode=${mode}). peaks-loop has asked the harness to compact and is WAITING for it — sub-agent dispatch is NOT blocked; carry on and re-probe with \`peaks code context-now\`.`
48
+ };
49
+ }
50
+ if (ratio < preCompact) {
51
+ // Part 22: auto-fire zone (0.80 ≤ ratio < 0.85). peaks-loop
52
+ // preempts and runs `peaks code auto-compact` itself
53
+ // without LLM involvement. The LLM is not asked to "decide";
54
+ // the toolkit is applied synchronously. Closes the
55
+ // LLM-misjudges-context window that previously let the
56
+ // ratio drift to 0.95 before the auto-fire kicked in.
57
+ return {
58
+ kind: 'auto-fire',
59
+ ratio,
60
+ message: `Context at ${(ratio * 100).toFixed(1)}% in auto-fire zone (≥${(autoFire * 100).toFixed(0)}% / <${(preCompact * 100).toFixed(0)}%, mode=${mode}). peaks-loop will fire compact without LLM confirmation.`
61
+ };
62
+ }
63
+ // pre-compact zone (0.85 ≤ ratio < 0.95): kept for backward
64
+ // compat with operators who configured the higher threshold.
65
+ // In practice peaks-loop already auto-fired at the lower
66
+ // threshold; the pre-compact zone today is the "already fired"
67
+ // zone.
68
+ return {
69
+ kind: 'pre-compact',
70
+ ratio,
71
+ toolkitReady: true,
72
+ message: `Context at ${(ratio * 100).toFixed(1)}% in pre-compact zone (≥${(preCompact * 100).toFixed(0)}% / <${(redLine * 100).toFixed(0)}%, mode=${mode}). peaks-loop already fired the auto-compact pathway at the auto-fire threshold; the LLM does not need to act.`
73
+ };
74
+ }
75
+ /**
76
+ * Decide whether to run the auto-compact flow. Pure function for the
77
+ * decision; side effects (checkpoint + IDE dispatch) live in
78
+ * `runAutoCompact` below. Zero human / zero LLM intervention:
79
+ *
80
+ * - ratio < 0.85 → skip (LLM keeps working; no action)
81
+ * - 0.85 ≤ ratio < 0.95 → pre-compact; if in-flight batch
82
+ * present, defer (D6.e); else dispatch
83
+ * IDE compact asynchronously.
84
+ * - ratio ≥ 0.95 → red-line; ask the harness to compact
85
+ * regardless of in-flight batch. Nothing is
86
+ * gated — dispatch is NOT blocked (slice
87
+ * peaks-loop cannot compact a running session,
88
+ * so a "block" gated nothing and deadlocked the
89
+ * runner).
90
+ */
91
+ export function evaluateAutoCompactDecision(input) {
92
+ const trigger = evaluateCompactTrigger(input.ratio, input.mode ?? 'standard');
93
+ // Normalize both `inFlightBatch` and `inflightBatch` (boolean | probe)
94
+ // into a single `InFlightBatchProbe` shape. The probe reads
95
+ // `hasInFlightBatch`; the boolean reads truthiness.
96
+ const rawProbe = input.inFlightBatch ?? input.inflightBatch;
97
+ const probe = typeof rawProbe === 'boolean' ? { hasInFlightBatch: rawProbe } : rawProbe;
98
+ if (trigger.kind === 'none') {
99
+ return { shouldCompact: false, reason: 'below-threshold', trigger, action: 'ok' };
100
+ }
101
+ if (trigger.kind === 'soft-warn') {
102
+ return { shouldCompact: false, reason: 'below-threshold', trigger, action: 'soft-warn' };
103
+ }
104
+ if (trigger.kind === 'red-line') {
105
+ // Red line: ignore in-flight batch — the harness is asked NOW rather than
106
+ // waiting for the batch to drain. Not "synchronous dispatch": peaks-loop
107
+ // has no synchronous compact to run, it can only request one and report
108
+ // that it is waiting.
109
+ return { shouldCompact: true, reason: 'red-line', trigger, action: 'red-line' };
110
+ }
111
+ // pre-compact zone (0.85 ≤ ratio < 0.95): honor D6.e in-flight deferral.
112
+ if (probe?.hasInFlightBatch === true) {
113
+ return { shouldCompact: false, reason: 'in-flight-batch', trigger, action: 'defer' };
114
+ }
115
+ if (input.force) {
116
+ return { shouldCompact: true, reason: 'pre-compact', trigger, action: 'auto-compact-now' };
117
+ }
118
+ // is the ONLY signal available on Mac Claude Code (no env-var, no statusline
119
+ // poll). The gate above already returns shouldCompact: true at ratio ≥ 0.85,
120
+ // but this forward-compat carve-out makes the source-aware rule explicit so
121
+ // any future source-aware downgrading cannot silently re-introduce the
122
+ // Mac auto-compact silent-failure mode without an audit. No higher-priority
123
+ // source is present (`claude-code-env` would have been P1, `statusline-poll`
124
+ // P2, `user-overridden` P4) — Mac's only signal is `transcript-estimate`.
125
+ if (input.source === 'transcript-estimate' && input.ratio >= AUTO_COMPACT_PRE_COMPACT_RATIO)
126
+ return { shouldCompact: true, reason: 'pre-compact', trigger, action: 'auto-compact-now' };
127
+ // Default: peaks-loop drives pre-compact autonomously.
128
+ return { shouldCompact: true, reason: 'pre-compact', trigger, action: 'auto-compact-now' };
129
+ }
130
+ /**
131
+ * Build the convergence plan that D7's post-compact-detect will read
132
+ * back. Includes the current plan, open questions, recent decisions,
133
+ * todo state, and recent artifact paths — strictly more than what a
134
+ * raw `/compact` would preserve.
135
+ */
136
+ export function buildConvergencePlan(input) {
137
+ return {
138
+ schemaVersion: 1,
139
+ sessionId: input.sessionId,
140
+ projectRoot: input.projectRoot,
141
+ createdAt: new Date().toISOString(),
142
+ ratio: input.ratio,
143
+ checkpointPath: input.checkpointPath,
144
+ nextActions: [...input.nextActions],
145
+ resumeHint: input.redLine === true
146
+ ? 'RED-LINE compact requested from the harness; work CONTINUES (nothing is blocked). Re-probe with `peaks code context-now`; if the ratio is still ≥ 0.95 and the harness has not compacted, report it and hand control back to the user.'
147
+ : 'post-compact-detect shouldAutoResume → resume pre-compact plan from checkpoint'
148
+ };
149
+ }
@@ -0,0 +1,36 @@
1
+ import type { AutoCompactResult } from '../context/auto-compact-types.js';
2
+ import type { CompactRun } from './auto-compact-run-types.js';
3
+ /**
4
+ * The decision fires whenever the ratio is at or over the auto-fire threshold, and
5
+ * the ratio does not come back down on its own — nothing in peaks-loop can compact a
6
+ * running session, and the harness fires only at its own red line. So "shouldCompact"
7
+ * was true on every probe, forever: one real session's `compact-history.jsonl` holds
8
+ * 1075 dispatch rows, 444 checkpoints and ZERO compactions over 15.5 h. Re-dispatching
9
+ * bought nothing, because the `ide-native` dispatch only installs a PreToolUse hook
10
+ * and installing it again is a documented no-op: 1074 of those 1075 rows say `already
11
+ * installed` in their own `dispatchMessage`. It produced rows, not compactions.
12
+ *
13
+ * The lifecycle store already knows whether an attempt is outstanding (`readOpenDispatchRun`
14
+ * — `armed`/`compacting` = dispatched, `completed`/`failed` = over), so the gate needs no
15
+ * new state and no threshold: it is keyed on the STAGE of the open run, never on a ratio,
16
+ * which is why it survives any future realignment of the 0.65/0.70/0.85/0.95 table.
17
+ *
18
+ * What is NOT suppressed: the probe still measures and still reports. The envelope carries
19
+ * the LIVE ratio plus the ratio the open ask was made at, so "it crossed and it is still
20
+ * high, unanswered" stays legible on every turn — the difference between a quiet signal
21
+ * and a silenced one.
22
+ *
23
+ * `force` (the `--force` test seam, "force compact at any ratio") outranks the inference:
24
+ * an explicit instruction must not be silently reduced to a no-op, which would make the
25
+ * published flag a lie.
26
+ *
27
+ * `readOpenDispatchRun` answers in THREE states, not two. `none` admits the dispatch;
28
+ * `unresolvable` means the backoff's question could not be asked — the session id names
29
+ * no session directory, so no lifecycle record can answer it. Measured on ONE directory
30
+ * before this: a legal sid found the open `armed` run and suppressed the dispatch, while
31
+ * `./<legal sid>`, which joins to the identical path, returned `null` and dispatched. A
32
+ * gate that reads a string instead of the artifact the string names is the defect the
33
+ * whole id axis exists to close, so an unanswerable question is NOT an admit: the
34
+ * conservative direction is to leave the dispatch undone and say why.
35
+ */
36
+ export declare function readOpenRunGate(ctx: CompactRun): AutoCompactResult | null;
@@ -0,0 +1,86 @@
1
+ /**
2
+ * The dispatch back-off: whether a compact was already asked for this crossing.
3
+ *
4
+ * Split out of `auto-compact-orchestrator.ts` (file-size cap campaign). The
5
+ * orchestrator re-exports every name declared here, so existing importers keep
6
+ * using `./auto-compact-orchestrator.js` unchanged.
7
+ */
8
+ import { readOpenDispatchRun } from './auto-compact-lifecycle.js';
9
+ import { thresholdFor } from './auto-compact-modes.js';
10
+ /**
11
+ * The decision fires whenever the ratio is at or over the auto-fire threshold, and
12
+ * the ratio does not come back down on its own — nothing in peaks-loop can compact a
13
+ * running session, and the harness fires only at its own red line. So "shouldCompact"
14
+ * was true on every probe, forever: one real session's `compact-history.jsonl` holds
15
+ * 1075 dispatch rows, 444 checkpoints and ZERO compactions over 15.5 h. Re-dispatching
16
+ * bought nothing, because the `ide-native` dispatch only installs a PreToolUse hook
17
+ * and installing it again is a documented no-op: 1074 of those 1075 rows say `already
18
+ * installed` in their own `dispatchMessage`. It produced rows, not compactions.
19
+ *
20
+ * The lifecycle store already knows whether an attempt is outstanding (`readOpenDispatchRun`
21
+ * — `armed`/`compacting` = dispatched, `completed`/`failed` = over), so the gate needs no
22
+ * new state and no threshold: it is keyed on the STAGE of the open run, never on a ratio,
23
+ * which is why it survives any future realignment of the 0.65/0.70/0.85/0.95 table.
24
+ *
25
+ * What is NOT suppressed: the probe still measures and still reports. The envelope carries
26
+ * the LIVE ratio plus the ratio the open ask was made at, so "it crossed and it is still
27
+ * high, unanswered" stays legible on every turn — the difference between a quiet signal
28
+ * and a silenced one.
29
+ *
30
+ * `force` (the `--force` test seam, "force compact at any ratio") outranks the inference:
31
+ * an explicit instruction must not be silently reduced to a no-op, which would make the
32
+ * published flag a lie.
33
+ *
34
+ * `readOpenDispatchRun` answers in THREE states, not two. `none` admits the dispatch;
35
+ * `unresolvable` means the backoff's question could not be asked — the session id names
36
+ * no session directory, so no lifecycle record can answer it. Measured on ONE directory
37
+ * before this: a legal sid found the open `armed` run and suppressed the dispatch, while
38
+ * `./<legal sid>`, which joins to the identical path, returned `null` and dispatched. A
39
+ * gate that reads a string instead of the artifact the string names is the defect the
40
+ * whole id axis exists to close, so an unanswerable question is NOT an admit: the
41
+ * conservative direction is to leave the dispatch undone and say why.
42
+ */
43
+ export function readOpenRunGate(ctx) {
44
+ const { input, sessionId, probe, mode, harnessWindow } = ctx;
45
+ const openRun = readOpenDispatchRun({ projectRoot: input.projectRoot, sessionId });
46
+ if (openRun.kind === 'unresolvable' && input.force !== true) {
47
+ return {
48
+ ok: true,
49
+ code: 'AUTO_COMPACT_UNRESOLVED_SESSION',
50
+ message: `Context at ${(probe.ratio * 100).toFixed(1)}%; a compact may be warranted, but this session's ` +
51
+ `directory could not be resolved (${openRun.reason}), so whether a compact was already dispatched ` +
52
+ `for this crossing cannot be answered. Not dispatching: an unanswered question is not a 'no'. ` +
53
+ `The session id comes from the active binding or from the caller.`,
54
+ data: {
55
+ sessionId,
56
+ ratio: probe.ratio,
57
+ source: probe.source,
58
+ decision: 'unresolved-session',
59
+ harnessWindow
60
+ }
61
+ };
62
+ }
63
+ if (openRun.kind === 'open' && input.force !== true) {
64
+ return {
65
+ ok: true,
66
+ code: 'AUTO_COMPACT_ALREADY_ARMED',
67
+ message: `Context at ${(probe.ratio * 100).toFixed(1)}% — still above the ` +
68
+ `${(thresholdFor(mode, 'autoFire') * 100).toFixed(0)}% auto-fire threshold (mode=${mode}); ` +
69
+ `a compact was already dispatched for this crossing at ${(openRun.triggerRatio * 100).toFixed(1)}% ` +
70
+ `(run ${openRun.runId}, resting at '${openRun.stage}') and nothing has compacted since. ` +
71
+ `Not dispatching again: the trigger is already registered, so a second dispatch would install the ` +
72
+ `same hook and add a checkpoint and a history row without adding a capability. ` +
73
+ `Re-probe with \`peaks code context-now\`.`,
74
+ data: {
75
+ sessionId,
76
+ ratio: probe.ratio,
77
+ source: probe.source,
78
+ decision: 'already-armed',
79
+ armedAtRatio: openRun.triggerRatio,
80
+ armedRunId: openRun.runId,
81
+ harnessWindow
82
+ }
83
+ };
84
+ }
85
+ return null;
86
+ }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * The result envelopes `runAutoCompact` can return.
3
+ *
4
+ * Split out of `auto-compact-orchestrator.ts` (file-size cap campaign). The
5
+ * orchestrator re-exports every name declared here, so existing importers keep
6
+ * using `./auto-compact-orchestrator.js` unchanged.
7
+ */
8
+ import { type AutoCompactResult, type CompactDispatchResult, type ConvergencePlan } from '../context/auto-compact-types.js';
9
+ import type { CompactTarget } from '../context/auto-compact-dispatcher.js';
10
+ import type { CompactRun } from './auto-compact-run-types.js';
11
+ /** No session is bound, so there is nothing to probe. */
12
+ export declare function noSessionResult(): AutoCompactResult;
13
+ /** The envelope for a probe that did not cross the auto-fire threshold. */
14
+ export declare function skipResult(ctx: CompactRun): AutoCompactResult;
15
+ /**
16
+ * The envelope for a throw during preparation. It preserves the original error
17
+ * contract: the caller gets the `AUTO_COMPACT_DISPATCH_FAILED` shape it already
18
+ * handles, not a thrown exception and not a widened type.
19
+ */
20
+ export declare function prepareFailureResult(ctx: CompactRun, error: unknown): AutoCompactResult;
21
+ /** The envelope for a throw or a refusal during the IDE dispatch. */
22
+ export declare function dispatchFailureResult(ctx: CompactRun, attempt: {
23
+ readonly checkpointPath: string;
24
+ readonly plan: ConvergencePlan;
25
+ readonly target: CompactTarget;
26
+ }, error: unknown): AutoCompactResult;
27
+ /** The envelope for a run that reached the dispatch phase. */
28
+ export declare function compactResult(ctx: CompactRun, attempt: {
29
+ readonly checkpointPath: string;
30
+ readonly plan: ConvergencePlan;
31
+ readonly target: CompactTarget;
32
+ readonly dispatch: CompactDispatchResult;
33
+ }): AutoCompactResult;