pi-harness-runtime 0.9.22 → 0.10.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 (393) hide show
  1. package/CHANGELOG.md +49 -7
  2. package/README.md +51 -51
  3. package/footer-status.ts +84 -44
  4. package/harness/auto-compact.ts +1 -1
  5. package/harness/auto-quota-resume.ts +15 -12
  6. package/harness/autonomous-review.ts +88 -0
  7. package/harness/context-compact-orchestrator.ts +23 -23
  8. package/harness/context-window-manager.ts +5 -5
  9. package/harness/continue-prompt.ts +3 -3
  10. package/harness/e2e/minimax-quota-scraper.ts +10 -10
  11. package/harness/e2e/openai-quota-scraper.ts +442 -0
  12. package/harness/forked-summarizer.ts +4 -4
  13. package/harness/herdr-agents.ts +91 -0
  14. package/harness/index.ts +5 -5
  15. package/harness/loop-code-agent.ts +284 -0
  16. package/harness/loop-controller.ts +201 -0
  17. package/harness/loop-review-agent.ts +295 -0
  18. package/harness/loop-runtime.ts +21 -17
  19. package/harness/loop-types.ts +118 -0
  20. package/harness/notification-events.ts +3 -3
  21. package/harness/output-limit-handler.ts +1 -1
  22. package/harness/partial-recovery.ts +3 -3
  23. package/harness/session-memory.ts +5 -5
  24. package/index.ts +211 -80
  25. package/package.json +2 -2
  26. package/packages/a2a-adapter/package.json +1 -1
  27. package/packages/a2a-adapter/src/types.ts +5 -5
  28. package/packages/auth/dist/minimax-browser-auth.d.ts +89 -0
  29. package/packages/auth/dist/minimax-browser-auth.d.ts.map +1 -0
  30. package/packages/auth/dist/minimax-browser-auth.js +890 -0
  31. package/packages/auth/dist/minimax-browser-auth.js.map +1 -0
  32. package/packages/auth/dist/run-minimax-auth.d.ts +19 -0
  33. package/packages/auth/dist/run-minimax-auth.d.ts.map +1 -0
  34. package/packages/auth/dist/run-minimax-auth.js +112 -0
  35. package/packages/auth/dist/run-minimax-auth.js.map +1 -0
  36. package/packages/auth/package.json +1 -1
  37. package/packages/auth/tsconfig.json +9 -0
  38. package/packages/autonomous-refactor/package.json +1 -1
  39. package/packages/autonomous-runtime/dist/inbox.d.ts +3 -3
  40. package/packages/autonomous-runtime/dist/inbox.js +12 -12
  41. package/packages/autonomous-runtime/dist/lease.js +14 -14
  42. package/packages/autonomous-runtime/dist/types.js +1 -1
  43. package/packages/autonomous-runtime/package.json +1 -1
  44. package/packages/autonomous-runtime/src/inbox.ts +12 -12
  45. package/packages/autonomous-runtime/src/lease.ts +15 -15
  46. package/packages/autonomous-runtime/src/types.ts +13 -13
  47. package/packages/autonomous-runtime/tsconfig.tsbuildinfo +1 -1
  48. package/packages/cache-strategy/package.json +1 -1
  49. package/packages/capability-registry/dist/types.js +1 -1
  50. package/packages/capability-registry/package.json +1 -1
  51. package/packages/capability-registry/src/types.ts +5 -5
  52. package/packages/checkpoint/README.md +6 -6
  53. package/packages/checkpoint/dist/differ.js +2 -2
  54. package/packages/checkpoint/dist/engine.js +3 -3
  55. package/packages/checkpoint/dist/index.js +5 -5
  56. package/packages/checkpoint/dist/storage.js +3 -3
  57. package/packages/checkpoint/dist/types.js +1 -1
  58. package/packages/checkpoint/package.json +1 -1
  59. package/packages/checkpoint/src/differ.ts +2 -2
  60. package/packages/checkpoint/src/engine.ts +3 -3
  61. package/packages/checkpoint/src/index.ts +5 -5
  62. package/packages/checkpoint/src/storage.ts +3 -3
  63. package/packages/checkpoint/src/types.ts +10 -10
  64. package/packages/checkpoint/tsconfig.tsbuildinfo +1 -1
  65. package/packages/cli-plugin-sdk/package.json +1 -1
  66. package/packages/clipboard/dist/src/clipboard.d.ts.map +1 -1
  67. package/packages/clipboard/dist/src/clipboard.js +15 -7
  68. package/packages/clipboard/dist/src/clipboard.js.map +1 -1
  69. package/packages/clipboard/package.json +1 -1
  70. package/packages/clipboard/src/clipboard.ts +16 -9
  71. package/packages/code-generation/README.md +13 -13
  72. package/packages/code-generation/dist/faker.js +4 -4
  73. package/packages/code-generation/dist/generator.js +3 -3
  74. package/packages/code-generation/dist/index.js +3 -3
  75. package/packages/code-generation/dist/templates/registry.js +1 -1
  76. package/packages/code-generation/dist/types.js +1 -1
  77. package/packages/code-generation/package.json +1 -1
  78. package/packages/code-generation/src/faker.ts +5 -5
  79. package/packages/code-generation/src/generator.ts +4 -4
  80. package/packages/code-generation/src/index.ts +3 -3
  81. package/packages/code-generation/src/templates/registry.ts +1 -1
  82. package/packages/code-generation/src/types.ts +10 -10
  83. package/packages/code-generation/tsconfig.tsbuildinfo +1 -1
  84. package/packages/code-review/README.md +13 -13
  85. package/packages/code-review/dist/engine.js +3 -3
  86. package/packages/code-review/dist/index.js +3 -3
  87. package/packages/code-review/dist/types.js +1 -1
  88. package/packages/code-review/package.json +1 -1
  89. package/packages/code-review/src/engine.ts +3 -3
  90. package/packages/code-review/src/index.ts +3 -3
  91. package/packages/code-review/src/types.ts +10 -10
  92. package/packages/code-review/tsconfig.tsbuildinfo +1 -1
  93. package/packages/codex-adapter/package.json +1 -1
  94. package/packages/context-compiler/dist/compiler.js +1 -1
  95. package/packages/context-compiler/package.json +1 -1
  96. package/packages/context-compiler/src/compiler.ts +1 -1
  97. package/packages/context-compiler/src/types.ts +11 -11
  98. package/packages/context-compiler/test/context-compiler.test.ts +11 -11
  99. package/packages/context-discovery/package.json +1 -1
  100. package/packages/context-manager/package.json +1 -1
  101. package/packages/cookie-sanitizer/README.md +27 -27
  102. package/packages/cookie-sanitizer/package.json +1 -1
  103. package/packages/cost-optimizer/package.json +1 -1
  104. package/packages/cost-optimizer/src/types.ts +5 -5
  105. package/packages/dependency-analyzer/package.json +1 -1
  106. package/packages/django-plugin/dist/analyzer.js +7 -7
  107. package/packages/django-plugin/package.json +1 -1
  108. package/packages/django-plugin/src/analyzer.ts +7 -7
  109. package/packages/doc-generator/package.json +1 -1
  110. package/packages/evaluation-engine/dist/engine.js +9 -9
  111. package/packages/evaluation-engine/package.json +1 -1
  112. package/packages/evaluation-engine/src/engine.ts +9 -9
  113. package/packages/evaluation-engine/src/types.ts +3 -3
  114. package/packages/evaluation-runner/package.json +1 -1
  115. package/packages/event-bus/dist/src/herdr-bus.d.ts +121 -0
  116. package/packages/event-bus/dist/src/herdr-bus.d.ts.map +1 -0
  117. package/packages/event-bus/dist/src/herdr-bus.js +322 -0
  118. package/packages/event-bus/dist/src/herdr-bus.js.map +1 -0
  119. package/packages/event-bus/dist/src/index.d.ts +2 -0
  120. package/packages/event-bus/dist/src/index.d.ts.map +1 -1
  121. package/packages/event-bus/dist/src/index.js +1 -0
  122. package/packages/event-bus/dist/src/index.js.map +1 -1
  123. package/packages/event-bus/package.json +1 -1
  124. package/packages/event-bus/src/herdr-bus.ts +525 -0
  125. package/packages/event-bus/src/index.ts +29 -0
  126. package/packages/event-store/package.json +1 -1
  127. package/packages/experience-replay/dist/replay.js +7 -7
  128. package/packages/experience-replay/package.json +1 -1
  129. package/packages/experience-replay/src/replay.ts +7 -7
  130. package/packages/experience-replay/src/types.ts +5 -5
  131. package/packages/feedback-collector/package.json +1 -1
  132. package/packages/framework-detector/README.md +18 -18
  133. package/packages/framework-detector/dist/detector.js +3 -3
  134. package/packages/framework-detector/dist/index.js +3 -3
  135. package/packages/framework-detector/dist/signatures/registry.js +24 -24
  136. package/packages/framework-detector/dist/types.js +1 -1
  137. package/packages/framework-detector/package.json +1 -1
  138. package/packages/framework-detector/src/detector.ts +3 -3
  139. package/packages/framework-detector/src/index.ts +3 -3
  140. package/packages/framework-detector/src/signatures/registry.ts +24 -24
  141. package/packages/framework-detector/src/types.ts +7 -7
  142. package/packages/framework-detector/tsconfig.tsbuildinfo +1 -1
  143. package/packages/framework-plugin-sdk/README.md +23 -23
  144. package/packages/framework-plugin-sdk/dist/index.js +2 -2
  145. package/packages/framework-plugin-sdk/dist/manager.js +3 -3
  146. package/packages/framework-plugin-sdk/dist/types.js +2 -2
  147. package/packages/framework-plugin-sdk/package.json +1 -1
  148. package/packages/framework-plugin-sdk/src/index.ts +2 -2
  149. package/packages/framework-plugin-sdk/src/manager.ts +3 -3
  150. package/packages/framework-plugin-sdk/src/types.ts +10 -10
  151. package/packages/framework-plugin-sdk/tsconfig.tsbuildinfo +1 -1
  152. package/packages/frappe-plugin/dist/analyzer.js +8 -8
  153. package/packages/frappe-plugin/dist/types.js +1 -1
  154. package/packages/frappe-plugin/package.json +1 -1
  155. package/packages/frappe-plugin/src/analyzer.ts +8 -8
  156. package/packages/frappe-plugin/src/types.ts +10 -10
  157. package/packages/generic-web-plugin/dist/analyzer.js +5 -5
  158. package/packages/generic-web-plugin/package.json +1 -1
  159. package/packages/generic-web-plugin/src/analyzer.ts +5 -5
  160. package/packages/health-monitor/package.json +1 -1
  161. package/packages/health-monitor/src/monitor.ts +1 -1
  162. package/packages/intent-analyzer/package.json +1 -1
  163. package/packages/laravel-plugin/dist/analyzer.js +11 -11
  164. package/packages/laravel-plugin/package.json +1 -1
  165. package/packages/laravel-plugin/src/analyzer.ts +11 -11
  166. package/packages/learning-engine/dist/engine.js +5 -5
  167. package/packages/learning-engine/dist/types.js +1 -1
  168. package/packages/learning-engine/package.json +1 -1
  169. package/packages/learning-engine/src/engine.ts +5 -5
  170. package/packages/learning-engine/src/types.ts +6 -6
  171. package/packages/mcp-adapter/package.json +1 -1
  172. package/packages/memory-engine/dist/engine.js +8 -8
  173. package/packages/memory-engine/dist/types.js +2 -2
  174. package/packages/memory-engine/package.json +1 -1
  175. package/packages/memory-engine/src/engine.ts +8 -8
  176. package/packages/memory-engine/src/types.ts +9 -9
  177. package/packages/model-registry/package.json +1 -1
  178. package/packages/model-registry/src/types.ts +4 -4
  179. package/packages/nextjs-plugin/dist/analyzer.js +9 -9
  180. package/packages/nextjs-plugin/package.json +1 -1
  181. package/packages/nextjs-plugin/src/analyzer.ts +9 -9
  182. package/packages/notification/dist/notification-center.js +1 -1
  183. package/packages/notification/package.json +1 -1
  184. package/packages/notification/src/notification-center.ts +1 -1
  185. package/packages/observability/dist/alerts.js +2 -2
  186. package/packages/observability/dist/health.js +4 -4
  187. package/packages/observability/dist/index.js +6 -6
  188. package/packages/observability/dist/logger.js +7 -7
  189. package/packages/observability/dist/metrics.js +11 -11
  190. package/packages/observability/dist/tracer.js +3 -3
  191. package/packages/observability/dist/types.js +1 -1
  192. package/packages/observability/package.json +1 -1
  193. package/packages/observability/src/alerts.ts +2 -2
  194. package/packages/observability/src/health.ts +4 -4
  195. package/packages/observability/src/index.ts +6 -6
  196. package/packages/observability/src/logger.ts +7 -7
  197. package/packages/observability/src/metrics.ts +11 -11
  198. package/packages/observability/src/tracer.ts +3 -3
  199. package/packages/observability/src/types.ts +7 -7
  200. package/packages/observability/test/observability.test.ts +4 -4
  201. package/packages/observability/tsconfig.tsbuildinfo +1 -1
  202. package/packages/performance-optimizer/dist/optimizer.js +1 -1
  203. package/packages/performance-optimizer/package.json +1 -1
  204. package/packages/performance-optimizer/src/optimizer.ts +1 -1
  205. package/packages/performance-optimizer/src/types.ts +4 -4
  206. package/packages/privilege-broker/package.json +1 -1
  207. package/packages/project-analyzer/dist/analyzer.js +4 -4
  208. package/packages/project-analyzer/dist/index.js +8 -8
  209. package/packages/project-analyzer/dist/signals.js +3 -3
  210. package/packages/project-analyzer/dist/types.js +1 -1
  211. package/packages/project-analyzer/package.json +1 -1
  212. package/packages/project-analyzer/src/analyzer.ts +4 -4
  213. package/packages/project-analyzer/src/index.ts +9 -9
  214. package/packages/project-analyzer/src/signals.ts +4 -4
  215. package/packages/project-analyzer/src/types.ts +15 -15
  216. package/packages/project-analyzer/test/index.test.ts +17 -17
  217. package/packages/project-analyzer/tsconfig.tsbuildinfo +1 -1
  218. package/packages/projection-engine/package.json +1 -1
  219. package/packages/prompt-compiler/dist/section-builder.js +1 -1
  220. package/packages/prompt-compiler/dist/types.js +3 -3
  221. package/packages/prompt-compiler/package.json +1 -1
  222. package/packages/prompt-compiler/src/section-builder.ts +1 -1
  223. package/packages/prompt-compiler/src/types.ts +12 -12
  224. package/packages/prompt-compiler/test/prompt-compiler.test.ts +12 -12
  225. package/packages/prompt-versioning/package.json +1 -1
  226. package/packages/provider-adapter-sdk/dist/builder.js +1 -1
  227. package/packages/provider-adapter-sdk/dist/index.js +5 -5
  228. package/packages/provider-adapter-sdk/dist/registry.js +1 -1
  229. package/packages/provider-adapter-sdk/dist/tester.js +1 -1
  230. package/packages/provider-adapter-sdk/dist/types.js +1 -1
  231. package/packages/provider-adapter-sdk/package.json +1 -1
  232. package/packages/provider-adapter-sdk/src/builder.ts +1 -1
  233. package/packages/provider-adapter-sdk/src/index.ts +6 -6
  234. package/packages/provider-adapter-sdk/src/registry.ts +1 -1
  235. package/packages/provider-adapter-sdk/src/tester.ts +1 -1
  236. package/packages/provider-adapter-sdk/src/types.ts +5 -5
  237. package/packages/provider-adapter-sdk/tsconfig.tsbuildinfo +1 -1
  238. package/packages/provider-router/package.json +1 -1
  239. package/packages/provider-router/src/types.ts +4 -4
  240. package/packages/provider-selector/package.json +1 -1
  241. package/packages/providers/dist/deepagents-adapter.js +1 -1
  242. package/packages/providers/dist/provider-id.d.ts +5 -0
  243. package/packages/providers/dist/provider-id.d.ts.map +1 -1
  244. package/packages/providers/dist/provider-id.js +6 -1
  245. package/packages/providers/dist/provider-id.js.map +1 -1
  246. package/packages/providers/package.json +1 -1
  247. package/packages/providers/src/deepagents-adapter.ts +1 -1
  248. package/packages/providers/src/provider-id.ts +6 -1
  249. package/packages/quota-manager/dist/tui-usage-monitor.d.ts.map +1 -1
  250. package/packages/quota-manager/dist/tui-usage-monitor.js +0 -6
  251. package/packages/quota-manager/dist/tui-usage-monitor.js.map +1 -1
  252. package/packages/quota-manager/package.json +1 -1
  253. package/packages/quota-manager/src/tui-usage-monitor.ts +0 -21
  254. package/packages/rate-limiter/package.json +1 -1
  255. package/packages/react-vite-plugin/dist/analyzer.js +7 -7
  256. package/packages/react-vite-plugin/package.json +1 -1
  257. package/packages/react-vite-plugin/src/analyzer.ts +7 -7
  258. package/packages/release-manager/package.json +1 -1
  259. package/packages/requirement-compiler/dist/compiler.js +17 -17
  260. package/packages/requirement-compiler/dist/types.js +2 -2
  261. package/packages/requirement-compiler/package.json +1 -1
  262. package/packages/requirement-compiler/src/compiler.ts +17 -17
  263. package/packages/requirement-compiler/src/types.ts +21 -21
  264. package/packages/requirement-compiler/test/requirement-compiler.test.ts +17 -17
  265. package/packages/runtime/dist/command-executor.js +1 -1
  266. package/packages/runtime/dist/local-runtime-agent.js +1 -1
  267. package/packages/runtime/dist/policy-engine.js +1 -1
  268. package/packages/runtime/dist/runtime-api.js +1 -1
  269. package/packages/runtime/dist/workspace-manager.js +1 -1
  270. package/packages/runtime/package.json +1 -1
  271. package/packages/runtime/src/command-executor.ts +1 -1
  272. package/packages/runtime/src/local-runtime-agent.ts +1 -1
  273. package/packages/runtime/src/policy-engine.ts +1 -1
  274. package/packages/runtime/src/runtime-api.ts +1 -1
  275. package/packages/runtime/src/workspace-manager.ts +1 -1
  276. package/packages/scheduler/package.json +1 -1
  277. package/packages/scheduler-adapter/package.json +1 -1
  278. package/packages/session/README.md +18 -18
  279. package/packages/session/dist/history.js +3 -3
  280. package/packages/session/dist/index.js +5 -5
  281. package/packages/session/dist/manager.js +3 -3
  282. package/packages/session/dist/policy.js +2 -2
  283. package/packages/session/dist/store.js +2 -2
  284. package/packages/session/dist/types.js +1 -1
  285. package/packages/session/package.json +1 -1
  286. package/packages/session/src/history.ts +3 -3
  287. package/packages/session/src/index.ts +5 -5
  288. package/packages/session/src/manager.ts +3 -3
  289. package/packages/session/src/policy.ts +4 -4
  290. package/packages/session/src/store.ts +3 -3
  291. package/packages/session/src/types.ts +10 -10
  292. package/packages/session/tsconfig.tsbuildinfo +1 -1
  293. package/packages/session-api/package.json +1 -1
  294. package/packages/session-export/package.json +1 -1
  295. package/packages/shared-context/package.json +1 -1
  296. package/packages/skill-registry/package.json +1 -1
  297. package/packages/skill-registry/src/types.ts +4 -4
  298. package/packages/sprint-planner/package.json +1 -1
  299. package/packages/subscription-engine/package.json +1 -1
  300. package/packages/task-compiler/dist/compiler.js +7 -7
  301. package/packages/task-compiler/dist/decompose.js +11 -11
  302. package/packages/task-compiler/dist/file-scope.js +6 -6
  303. package/packages/task-compiler/dist/graph.js +6 -6
  304. package/packages/task-compiler/dist/index.js +2 -2
  305. package/packages/task-compiler/dist/types.js +5 -5
  306. package/packages/task-compiler/dist/validate.js +2 -2
  307. package/packages/task-compiler/dist/verification.js +2 -2
  308. package/packages/task-compiler/package.json +1 -1
  309. package/packages/task-compiler/src/command-policy.ts +1 -1
  310. package/packages/task-compiler/src/compiler.ts +7 -7
  311. package/packages/task-compiler/src/decompose.ts +11 -11
  312. package/packages/task-compiler/src/file-scope.ts +6 -6
  313. package/packages/task-compiler/src/graph.ts +6 -6
  314. package/packages/task-compiler/src/index.ts +3 -3
  315. package/packages/task-compiler/src/types.ts +14 -14
  316. package/packages/task-compiler/src/validate.ts +2 -2
  317. package/packages/task-compiler/src/verification.ts +2 -2
  318. package/packages/task-compiler/test/task-compiler.test.ts +10 -10
  319. package/packages/test-data-generator/README.md +13 -13
  320. package/packages/test-data-generator/dist/faker-adapter.js +4 -4
  321. package/packages/test-data-generator/dist/generator.js +3 -3
  322. package/packages/test-data-generator/dist/index.js +3 -3
  323. package/packages/test-data-generator/dist/types.js +1 -1
  324. package/packages/test-data-generator/package.json +1 -1
  325. package/packages/test-data-generator/src/faker-adapter.ts +4 -4
  326. package/packages/test-data-generator/src/generator.ts +3 -3
  327. package/packages/test-data-generator/src/index.ts +3 -3
  328. package/packages/test-data-generator/src/types.ts +9 -9
  329. package/packages/test-data-generator/tsconfig.tsbuildinfo +1 -1
  330. package/packages/test-generator/package.json +1 -1
  331. package/packages/token-estimation/package.json +1 -1
  332. package/packages/token-optimizer/package.json +1 -1
  333. package/packages/tui/package.json +1 -1
  334. package/packages/types/package.json +1 -1
  335. package/packages/types/src/agent-worker-types.ts +5 -5
  336. package/packages/types/src/runtime-types.ts +12 -12
  337. package/packages/types/tsconfig.tsbuildinfo +1 -1
  338. package/packages/workflow-events/package.json +1 -1
  339. package/packages/workspace-scanner/package.json +1 -1
  340. package/packages/worktree/package.json +1 -1
  341. package/renderer.ts +7 -7
  342. package/skills/harness-runtime/SKILL.md +15 -15
  343. package/packages/dependency-analyzer/dist/analyzer.d.ts +0 -17
  344. package/packages/dependency-analyzer/dist/analyzer.d.ts.map +0 -1
  345. package/packages/dependency-analyzer/dist/analyzer.js +0 -106
  346. package/packages/dependency-analyzer/dist/analyzer.js.map +0 -1
  347. package/packages/dependency-analyzer/dist/imports.d.ts +0 -12
  348. package/packages/dependency-analyzer/dist/imports.d.ts.map +0 -1
  349. package/packages/dependency-analyzer/dist/imports.js +0 -73
  350. package/packages/dependency-analyzer/dist/imports.js.map +0 -1
  351. package/packages/dependency-analyzer/dist/index.d.ts +0 -4
  352. package/packages/dependency-analyzer/dist/index.d.ts.map +0 -1
  353. package/packages/dependency-analyzer/dist/index.js +0 -3
  354. package/packages/dependency-analyzer/dist/index.js.map +0 -1
  355. package/packages/dependency-analyzer/dist/test/analyzer.test.js +0 -37
  356. package/packages/dependency-analyzer/dist/types.d.ts +0 -28
  357. package/packages/dependency-analyzer/dist/types.d.ts.map +0 -1
  358. package/packages/dependency-analyzer/dist/types.js +0 -5
  359. package/packages/dependency-analyzer/dist/types.js.map +0 -1
  360. package/packages/intent-analyzer/dist/analyzer.d.ts +0 -13
  361. package/packages/intent-analyzer/dist/analyzer.d.ts.map +0 -1
  362. package/packages/intent-analyzer/dist/analyzer.js +0 -72
  363. package/packages/intent-analyzer/dist/analyzer.js.map +0 -1
  364. package/packages/intent-analyzer/dist/index.d.ts +0 -3
  365. package/packages/intent-analyzer/dist/index.d.ts.map +0 -1
  366. package/packages/intent-analyzer/dist/index.js +0 -2
  367. package/packages/intent-analyzer/dist/index.js.map +0 -1
  368. package/packages/intent-analyzer/dist/test/analyzer.test.js +0 -56
  369. package/packages/intent-analyzer/dist/types.d.ts +0 -26
  370. package/packages/intent-analyzer/dist/types.d.ts.map +0 -1
  371. package/packages/intent-analyzer/dist/types.js +0 -7
  372. package/packages/intent-analyzer/dist/types.js.map +0 -1
  373. package/packages/workspace-scanner/dist/detect.d.ts +0 -3
  374. package/packages/workspace-scanner/dist/detect.d.ts.map +0 -1
  375. package/packages/workspace-scanner/dist/detect.js +0 -58
  376. package/packages/workspace-scanner/dist/detect.js.map +0 -1
  377. package/packages/workspace-scanner/dist/git.d.ts +0 -7
  378. package/packages/workspace-scanner/dist/git.d.ts.map +0 -1
  379. package/packages/workspace-scanner/dist/git.js +0 -75
  380. package/packages/workspace-scanner/dist/git.js.map +0 -1
  381. package/packages/workspace-scanner/dist/index.d.ts +0 -5
  382. package/packages/workspace-scanner/dist/index.d.ts.map +0 -1
  383. package/packages/workspace-scanner/dist/index.js +0 -4
  384. package/packages/workspace-scanner/dist/index.js.map +0 -1
  385. package/packages/workspace-scanner/dist/scanner.d.ts +0 -11
  386. package/packages/workspace-scanner/dist/scanner.d.ts.map +0 -1
  387. package/packages/workspace-scanner/dist/scanner.js +0 -46
  388. package/packages/workspace-scanner/dist/scanner.js.map +0 -1
  389. package/packages/workspace-scanner/dist/test/scanner.test.js +0 -34
  390. package/packages/workspace-scanner/dist/types.d.ts +0 -35
  391. package/packages/workspace-scanner/dist/types.d.ts.map +0 -1
  392. package/packages/workspace-scanner/dist/types.js +0 -5
  393. package/packages/workspace-scanner/dist/types.js.map +0 -1
@@ -0,0 +1,525 @@
1
+ /**
2
+ * HerdrEventBus — File-based cross-process event bus for herdr tabs.
3
+ *
4
+ * Uses JSONL files in a shared workspace so separate pi processes
5
+ * (coding agent, review agent, etc.) can communicate.
6
+ *
7
+ * Architecture:
8
+ * Workspace (shared dir)
9
+ * ├── events.jsonl # Append-only event log
10
+ * ├── subscriptions/ # Per-agent subscription markers
11
+ * └── payloads/ # Event payload files
12
+ *
13
+ * Flow:
14
+ * 1. Agent publishes event → append to events.jsonl + write payload
15
+ * 2. Other agents poll events.jsonl → process matching events
16
+ * 3. Each agent tracks last-read offset in subscriptions/{agentId}.json
17
+ */
18
+
19
+ import { randomUUID } from "crypto";
20
+ import {
21
+ appendFileSync,
22
+ existsSync,
23
+ mkdirSync,
24
+ readFileSync,
25
+ writeFileSync,
26
+ } from "fs";
27
+ import { join } from "path";
28
+ import type { EventPayload } from "./types.js";
29
+
30
+ interface LogEvent {
31
+ eventId: string;
32
+ topic: string;
33
+ data?: unknown;
34
+ _byteOffset: number;
35
+ }
36
+
37
+ // ─── Config ──────────────────────────────────────────────────────────────
38
+
39
+ const DEFAULT_POLL_INTERVAL_MS = 2_000; // 2s poll
40
+ const MAX_EVENTS_PER_POLL = 50;
41
+ const PAYLOADS_DIR = "payloads";
42
+ const SUBSCRIPTIONS_DIR = "subscriptions";
43
+
44
+ export interface HerdrBusConfig {
45
+ workspace: string;
46
+ pollIntervalMs?: number;
47
+ agentId: string;
48
+ }
49
+
50
+ export interface HerdrSubscription {
51
+ id: string;
52
+ topic: string;
53
+ lastOffset: number; // bytes read from events.jsonl
54
+ filter?: (data: unknown) => boolean;
55
+ }
56
+
57
+ // ─── HerdrEventBus ────────────────────────────────────────────────────
58
+
59
+ export class HerdrEventBus {
60
+ private readonly workspace: string;
61
+ private readonly agentId: string;
62
+ private readonly pollIntervalMs: number;
63
+ private readonly subscriptions = new Map<string, HerdrSubscription>();
64
+ private polling = false;
65
+ private pollTimer?: ReturnType<typeof setInterval>;
66
+
67
+ constructor(config: HerdrBusConfig) {
68
+ this.workspace = config.workspace;
69
+ this.agentId = config.agentId;
70
+ this.pollIntervalMs = config.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
71
+ this.ensureDirs();
72
+ }
73
+
74
+ // ─── Setup ────────────────────────────────────────────────────────
75
+
76
+ private ensureDirs(): void {
77
+ const dirs = [
78
+ this.workspace,
79
+ join(this.workspace, PAYLOADS_DIR),
80
+ join(this.workspace, SUBSCRIPTIONS_DIR),
81
+ ];
82
+ for (const dir of dirs) {
83
+ if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
84
+ }
85
+ }
86
+
87
+ // ─── Subscribe ────────────────────────────────────────────────────
88
+
89
+ subscribe(topic: string, filter?: (data: unknown) => boolean): string {
90
+ const id = randomUUID();
91
+ this.subscriptions.set(id, {
92
+ id,
93
+ topic,
94
+ lastOffset: 0,
95
+ filter,
96
+ });
97
+ this.saveSubscriptions();
98
+ return id;
99
+ }
100
+
101
+ unsubscribe(id: string): void {
102
+ this.subscriptions.delete(id);
103
+ this.saveSubscriptions();
104
+ }
105
+
106
+ // ─── Publish ──────────────────────────────────────────────────────
107
+
108
+ publish<T>(topic: string, data: T): string {
109
+ const eventId = randomUUID();
110
+ const payload: EventPayload<T> = {
111
+ topic,
112
+ data,
113
+ timestamp: new Date().toISOString(),
114
+ eventId,
115
+ source: this.agentId,
116
+ };
117
+
118
+ // Write payload file
119
+ const payloadPath = join(this.workspace, PAYLOADS_DIR, `${eventId}.json`);
120
+ writeFileSync(payloadPath, JSON.stringify(payload, null, 2));
121
+
122
+ // Append event reference to log
123
+ const logLine =
124
+ JSON.stringify({ eventId, topic, ts: payload.timestamp }) + "\n";
125
+ appendFileSync(join(this.workspace, "events.jsonl"), logLine);
126
+
127
+ return eventId;
128
+ }
129
+
130
+ // ─── Poll ────────────────────────────────────────────────────────
131
+
132
+ startPolling(
133
+ handler: (payload: EventPayload<unknown>) => void | Promise<void>,
134
+ ): void {
135
+ if (this.polling) return;
136
+ this.polling = true;
137
+
138
+ // Load last offsets from disk
139
+ this.loadSubscriptions();
140
+
141
+ this.pollTimer = setInterval(() => {
142
+ this.pollEvents(handler).catch(console.error);
143
+ }, this.pollIntervalMs);
144
+ }
145
+
146
+ stopPolling(): void {
147
+ this.polling = false;
148
+ if (this.pollTimer) {
149
+ clearInterval(this.pollTimer);
150
+ this.pollTimer = undefined;
151
+ }
152
+ }
153
+
154
+ private async pollEvents(
155
+ handler: (payload: EventPayload<unknown>) => void | Promise<void>,
156
+ ): Promise<void> {
157
+ const logPath = join(this.workspace, "events.jsonl");
158
+ if (!existsSync(logPath)) return;
159
+
160
+ for (const [, sub] of this.subscriptions) {
161
+ const events = this.readNewEvents(sub.lastOffset);
162
+ let newOffset = sub.lastOffset;
163
+
164
+ for (const event of events) {
165
+ if (event.topic !== sub.topic) continue;
166
+ if (sub.filter && !sub.filter(event.data)) continue;
167
+
168
+ // Load full payload
169
+ const payloadPath = join(
170
+ this.workspace,
171
+ PAYLOADS_DIR,
172
+ `${event.eventId}.json`,
173
+ );
174
+ if (!existsSync(payloadPath)) continue;
175
+
176
+ try {
177
+ const payload = JSON.parse(
178
+ readFileSync(payloadPath, "utf-8"),
179
+ ) as EventPayload<unknown>;
180
+ // Skip own events
181
+ if (payload.source === this.agentId) continue;
182
+ await handler(payload);
183
+ newOffset = event._byteOffset;
184
+ } catch {
185
+ // skip malformed payload
186
+ }
187
+ }
188
+
189
+ // Update offset
190
+ if (newOffset > sub.lastOffset) {
191
+ sub.lastOffset = newOffset;
192
+ }
193
+ }
194
+
195
+ this.saveSubscriptions();
196
+ }
197
+
198
+ private readNewEvents(fromOffset: number): LogEvent[] {
199
+ const logPath = join(this.workspace, "events.jsonl");
200
+ if (!existsSync(logPath)) return [];
201
+
202
+ const content = readFileSync(logPath, "utf-8");
203
+ const lines = content
204
+ .split("\n")
205
+ .filter((line): line is string => line.trim() !== "");
206
+ const events: LogEvent[] = [];
207
+
208
+ let offset = 0;
209
+ for (const line of lines) {
210
+ offset += line.length + 1; // +1 for newline
211
+ if (offset <= fromOffset) continue;
212
+ if (events.length >= MAX_EVENTS_PER_POLL) break;
213
+
214
+ try {
215
+ const parsed = JSON.parse(line) as Record<string, unknown>;
216
+ events.push(parsed as unknown as LogEvent);
217
+ } catch {
218
+ // skip malformed lines
219
+ }
220
+ }
221
+
222
+ return events;
223
+ }
224
+
225
+ // ─── Persistence ─────────────────────────────────────────────────
226
+
227
+ private subscriptionsPath(): string {
228
+ return join(this.workspace, SUBSCRIPTIONS_DIR, `${this.agentId}.json`);
229
+ }
230
+
231
+ private saveSubscriptions(): void {
232
+ const path = this.subscriptionsPath();
233
+ const data = Object.fromEntries(this.subscriptions);
234
+ writeFileSync(path, JSON.stringify(data, null, 2));
235
+ }
236
+
237
+ private loadSubscriptions(): void {
238
+ const path = this.subscriptionsPath();
239
+ if (!existsSync(path)) return;
240
+
241
+ try {
242
+ const data = JSON.parse(readFileSync(path, "utf-8")) as Record<
243
+ string,
244
+ HerdrSubscription
245
+ >;
246
+ for (const [id, sub] of Object.entries(data)) {
247
+ this.subscriptions.set(id, sub);
248
+ }
249
+ } catch {
250
+ // ignore
251
+ }
252
+ }
253
+
254
+ // ─── Query ──────────────────────────────────────────────────────
255
+
256
+ getSubscribedTopics(): string[] {
257
+ return [...new Set([...this.subscriptions.values()].map((s) => s.topic))];
258
+ }
259
+
260
+ getWorkspace(): string {
261
+ return this.workspace;
262
+ }
263
+ }
264
+
265
+ // ─── Factory ────────────────────────────────────────────────────────────────
266
+
267
+ const HERDR_WORKSPACE = "/tmp/herdr-workspace";
268
+
269
+ export function getHerdrWorkspace(): string {
270
+ if (!existsSync(HERDR_WORKSPACE)) {
271
+ mkdirSync(HERDR_WORKSPACE, { recursive: true });
272
+ }
273
+ return HERDR_WORKSPACE;
274
+ }
275
+
276
+ export function createHerdrBus(agentId: string): HerdrEventBus {
277
+ return new HerdrEventBus({
278
+ workspace: getHerdrWorkspace(),
279
+ agentId,
280
+ pollIntervalMs: DEFAULT_POLL_INTERVAL_MS,
281
+ });
282
+ }
283
+
284
+ // ─── Workspace Management ────────────────────────────────────────────────────
285
+
286
+ export interface HerdrWorkspace {
287
+ root: string;
288
+ code: string;
289
+ reviews: string;
290
+ payloads: string;
291
+ subscriptions: string;
292
+ }
293
+
294
+ export function getHerdrWorkspacePaths(): HerdrWorkspace {
295
+ const root = getHerdrWorkspace();
296
+ return {
297
+ root,
298
+ code: join(root, "code"),
299
+ reviews: join(root, "reviews"),
300
+ payloads: join(root, "payloads"),
301
+ subscriptions: join(root, "subscriptions"),
302
+ };
303
+ }
304
+
305
+ export function ensureHerdrWorkspace(): HerdrWorkspace {
306
+ const paths = getHerdrWorkspacePaths();
307
+ const dirs = [
308
+ paths.root,
309
+ paths.code,
310
+ paths.reviews,
311
+ paths.payloads,
312
+ paths.subscriptions,
313
+ ];
314
+ for (const dir of dirs) {
315
+ if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
316
+ }
317
+ return paths;
318
+ }
319
+
320
+ export type LoopVerdict = "approved" | "changes_requested" | "blocked";
321
+
322
+ export interface LoopConfig {
323
+ loopId: string;
324
+ writeCount: number;
325
+ reviewCount: number;
326
+ prompt: string;
327
+ nextReviewAfter: number;
328
+ createdAt: string;
329
+ }
330
+
331
+ export interface CodeTickPayload {
332
+ loopId: string;
333
+ iteration: number;
334
+ prompt: string;
335
+ }
336
+
337
+ export interface CodeWrittenPayload {
338
+ loopId: string;
339
+ iteration: number;
340
+ files: string[];
341
+ summary?: string;
342
+ }
343
+
344
+ export interface ReviewTickPayload {
345
+ loopId: string;
346
+ iteration: number;
347
+ codeFiles: string[];
348
+ }
349
+
350
+ export interface ReviewCompletedPayload {
351
+ loopId: string;
352
+ iteration: number;
353
+ verdict: LoopVerdict;
354
+ message: string;
355
+ reportFile: string;
356
+ }
357
+
358
+ export interface LoopEarlyExitPayload {
359
+ loopId: string;
360
+ reason: LoopVerdict;
361
+ message: string;
362
+ }
363
+
364
+ export interface LoopFinishedPayload {
365
+ loopId: string;
366
+ summary: string;
367
+ iterations: {
368
+ writes: number;
369
+ reviews: number;
370
+ finalVerdict: LoopVerdict;
371
+ };
372
+ }
373
+
374
+ // ─── Loop Event Publishers ────────────────────────────────────────────────────
375
+
376
+ export function publishLoopStarted(
377
+ bus: HerdrEventBus,
378
+ config: LoopConfig,
379
+ ): string {
380
+ return bus.publish("loop.started", config);
381
+ }
382
+
383
+ export function publishCodeTick(
384
+ bus: HerdrEventBus,
385
+ loopId: string,
386
+ iteration: number,
387
+ prompt: string,
388
+ ): string {
389
+ return bus.publish("code.tick", {
390
+ loopId,
391
+ iteration,
392
+ prompt,
393
+ } satisfies CodeTickPayload);
394
+ }
395
+
396
+ export function publishCodeWritten(
397
+ bus: HerdrEventBus,
398
+ loopId: string,
399
+ iteration: number,
400
+ files: string[],
401
+ summary?: string,
402
+ ): string {
403
+ return bus.publish("code.written", {
404
+ loopId,
405
+ iteration,
406
+ files,
407
+ summary,
408
+ } satisfies CodeWrittenPayload);
409
+ }
410
+
411
+ export function publishReviewTick(
412
+ bus: HerdrEventBus,
413
+ loopId: string,
414
+ iteration: number,
415
+ codeFiles: string[],
416
+ ): string {
417
+ return bus.publish("review.tick", {
418
+ loopId,
419
+ iteration,
420
+ codeFiles,
421
+ } satisfies ReviewTickPayload);
422
+ }
423
+
424
+ export function publishReviewCompleted(
425
+ bus: HerdrEventBus,
426
+ loopId: string,
427
+ iteration: number,
428
+ verdict: LoopVerdict,
429
+ message: string,
430
+ reportFile: string,
431
+ ): string {
432
+ return bus.publish("review.completed", {
433
+ loopId,
434
+ iteration,
435
+ verdict,
436
+ message,
437
+ reportFile,
438
+ } satisfies ReviewCompletedPayload);
439
+ }
440
+
441
+ export function publishLoopEarlyExit(
442
+ bus: HerdrEventBus,
443
+ loopId: string,
444
+ reason: LoopVerdict,
445
+ message: string,
446
+ ): string {
447
+ return bus.publish("loop.early_exit", {
448
+ loopId,
449
+ reason,
450
+ message,
451
+ } satisfies LoopEarlyExitPayload);
452
+ }
453
+
454
+ export function publishLoopFinished(
455
+ bus: HerdrEventBus,
456
+ loopId: string,
457
+ summary: string,
458
+ writes: number,
459
+ reviews: number,
460
+ finalVerdict: LoopVerdict,
461
+ ): string {
462
+ return bus.publish("loop.finished", {
463
+ loopId,
464
+ summary,
465
+ iterations: { writes, reviews, finalVerdict },
466
+ } satisfies LoopFinishedPayload);
467
+ }
468
+
469
+ // ─── Verdict Parser ──────────────────────────────────────────────────────────
470
+
471
+ const VERDICT_PATTERNS: Array<{ pattern: RegExp; verdict: LoopVerdict }> = [
472
+ { pattern: /^##\s*Verdict:\s*APPROVED/im, verdict: "approved" },
473
+ {
474
+ pattern: /^##\s*Verdict:\s*CHANGES_REQUESTED/im,
475
+ verdict: "changes_requested",
476
+ },
477
+ { pattern: /^##\s*Verdict:\s*CHANGES/i, verdict: "changes_requested" },
478
+ { pattern: /^##\s*Verdict:\s*BLOCKED/im, verdict: "blocked" },
479
+ { pattern: /^##\s*Verdict:\s*FAIL/im, verdict: "blocked" },
480
+ ];
481
+
482
+ export function parseVerdict(content: string): LoopVerdict | null {
483
+ for (const { pattern, verdict } of VERDICT_PATTERNS) {
484
+ if (pattern.test(content)) return verdict;
485
+ }
486
+ return null;
487
+ }
488
+
489
+ export function parseVerdictMessage(content: string): string {
490
+ // Extract the paragraph after ## Verdict: X
491
+ const match = content.match(/^##\s*Verdict:\s*\w+\s*\n+(.+?)(?=^##|\n+$)/ms);
492
+ return match ? match[1].trim().slice(0, 500) : content.slice(0, 200);
493
+ }
494
+
495
+ // ─── Simple Convenience Publishers (non-loop) ──────────────────────────────
496
+
497
+ export function publishCodeWrittenSimple(
498
+ bus: HerdrEventBus,
499
+ taskId: string,
500
+ files: string[],
501
+ branch?: string,
502
+ ): string {
503
+ return bus.publish("code.written", {
504
+ taskId,
505
+ files,
506
+ branch,
507
+ });
508
+ }
509
+
510
+ export function publishReviewRequestedSimple(
511
+ bus: HerdrEventBus,
512
+ taskId: string,
513
+ codeTaskId: string,
514
+ ): string {
515
+ return bus.publish("review.requested", { taskId, codeTaskId });
516
+ }
517
+
518
+ export function publishReviewCompletedSimple(
519
+ bus: HerdrEventBus,
520
+ taskId: string,
521
+ reportFile: string,
522
+ status: "approved" | "changes_requested" | "failed",
523
+ ): string {
524
+ return bus.publish("review.completed", { taskId, reportFile, status });
525
+ }
@@ -7,3 +7,32 @@ export type {
7
7
  Subscription,
8
8
  BusOptions,
9
9
  } from "./types.js";
10
+ export type {
11
+ LoopVerdict,
12
+ LoopConfig,
13
+ CodeTickPayload,
14
+ CodeWrittenPayload,
15
+ ReviewTickPayload,
16
+ ReviewCompletedPayload,
17
+ LoopEarlyExitPayload,
18
+ LoopFinishedPayload,
19
+ } from "./herdr-bus.js";
20
+ export {
21
+ HerdrEventBus,
22
+ createHerdrBus,
23
+ getHerdrWorkspace,
24
+ getHerdrWorkspacePaths,
25
+ ensureHerdrWorkspace,
26
+ publishCodeWritten,
27
+ publishReviewRequestedSimple,
28
+ publishReviewCompletedSimple,
29
+ publishLoopStarted,
30
+ publishCodeTick,
31
+ publishReviewTick,
32
+ publishReviewCompleted,
33
+ publishLoopEarlyExit,
34
+ publishLoopFinished,
35
+ parseVerdict,
36
+ parseVerdictMessage,
37
+ publishCodeWrittenSimple,
38
+ } from "./herdr-bus.js";
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/event-store",
3
- "version": "0.1.0",
3
+ "version": "0.9.25",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Reconstructs prior runtime execution from persisted events and checkpoints.
5
5
  */
6
- // ─── Event Timeline Reconstruction ───────────────────────────────────────────
6
+ // --- Event Timeline Reconstruction -------------------------------------------
7
7
  function reconstructTimeline(events, startSequence = 0) {
8
8
  return events.map((event, index) => ({
9
9
  sequence: startSequence + index,
@@ -12,7 +12,7 @@ function reconstructTimeline(events, startSequence = 0) {
12
12
  data: event.data || {},
13
13
  }));
14
14
  }
15
- // ─── State Reconstruction ─────────────────────────────────────────────────────
15
+ // --- State Reconstruction -----------------------------------------------------
16
16
  function reconstructState(jobId, checkpoint, events, taskGraph) {
17
17
  // Apply events to checkpoint to get final state
18
18
  let currentTaskId = checkpoint?.currentTaskId;
@@ -43,8 +43,8 @@ function reconstructState(jobId, checkpoint, events, taskGraph) {
43
43
  timestamp: new Date().toISOString(),
44
44
  };
45
45
  }
46
- // ─── Divergence Detection ────────────────────────────────────────────────────
47
- // ─── Source Validation ────────────────────────────────────────────────────────
46
+ // --- Divergence Detection ----------------------------------------------------
47
+ // --- Source Validation --------------------------------------------------------
48
48
  function validateSources(sources) {
49
49
  const missing = [];
50
50
  if (!sources.checkpoint && !sources.events) {
@@ -52,7 +52,7 @@ function validateSources(sources) {
52
52
  }
53
53
  return { valid: missing.length === 0, missing };
54
54
  }
55
- // ─── Mode Handlers ────────────────────────────────────────────────────────────
55
+ // --- Mode Handlers ------------------------------------------------------------
56
56
  async function handleInspect(sources, jobId, fromSequence, toSequence) {
57
57
  const events = sources.events || [];
58
58
  const filteredEvents = fromSequence !== undefined || toSequence !== undefined
@@ -102,7 +102,7 @@ async function handleReexecute(sources, jobId, allowExternalCalls) {
102
102
  });
103
103
  return result;
104
104
  }
105
- // ─── Main Engine ───────────────────────────────────────────────────────────────
105
+ // --- Main Engine ---------------------------------------------------------------
106
106
  export class ExperienceReplay {
107
107
  eventListeners = [];
108
108
  /**
@@ -222,7 +222,7 @@ export class ExperienceReplay {
222
222
  }
223
223
  }
224
224
  }
225
- // ─── Factory ─────────────────────────────────────────────────────────────────
225
+ // --- Factory -----------------------------------------------------------------
226
226
  export function createExperienceReplay() {
227
227
  return new ExperienceReplay();
228
228
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/experience-replay",
3
- "version": "0.9.15",
3
+ "version": "0.9.25",
4
4
  "description": "Experience replay for debugging and reproducibility (RFC-0059)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -18,7 +18,7 @@ import type {
18
18
  TaskGraph,
19
19
  } from "./types.js";
20
20
 
21
- // ─── Event Timeline Reconstruction ───────────────────────────────────────────
21
+ // --- Event Timeline Reconstruction -------------------------------------------
22
22
 
23
23
  function reconstructTimeline(
24
24
  events: RuntimeEvent[],
@@ -32,7 +32,7 @@ function reconstructTimeline(
32
32
  }));
33
33
  }
34
34
 
35
- // ─── State Reconstruction ─────────────────────────────────────────────────────
35
+ // --- State Reconstruction -----------------------------------------------------
36
36
 
37
37
  function reconstructState(
38
38
  jobId: string,
@@ -72,9 +72,9 @@ function reconstructState(
72
72
  };
73
73
  }
74
74
 
75
- // ─── Divergence Detection ────────────────────────────────────────────────────
75
+ // --- Divergence Detection ----------------------------------------------------
76
76
 
77
- // ─── Source Validation ────────────────────────────────────────────────────────
77
+ // --- Source Validation --------------------------------------------------------
78
78
 
79
79
  function validateSources(sources: ReplaySources): {
80
80
  valid: boolean;
@@ -89,7 +89,7 @@ function validateSources(sources: ReplaySources): {
89
89
  return { valid: missing.length === 0, missing };
90
90
  }
91
91
 
92
- // ─── Mode Handlers ────────────────────────────────────────────────────────────
92
+ // --- Mode Handlers ------------------------------------------------------------
93
93
 
94
94
  async function handleInspect(
95
95
  sources: ReplaySources,
@@ -190,7 +190,7 @@ async function handleReexecute(
190
190
  return result;
191
191
  }
192
192
 
193
- // ─── Main Engine ───────────────────────────────────────────────────────────────
193
+ // --- Main Engine ---------------------------------------------------------------
194
194
 
195
195
  export class ExperienceReplay {
196
196
  private eventListeners: Array<(event: ReplayRuntimeEvent) => void> = [];
@@ -341,7 +341,7 @@ export class ExperienceReplay {
341
341
  }
342
342
  }
343
343
 
344
- // ─── Factory ─────────────────────────────────────────────────────────────────
344
+ // --- Factory -----------------------------------------------------------------
345
345
 
346
346
  export function createExperienceReplay(): ExperienceReplay {
347
347
  return new ExperienceReplay();