@ashx-j/lunr 0.2.11 → 0.2.13

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 (342) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +211 -236
  3. package/dist/builtin-extensions/ashxj-tui.d.ts +3 -0
  4. package/dist/builtin-extensions/ashxj-tui.d.ts.map +1 -1
  5. package/dist/builtin-extensions/ashxj-tui.js +28 -11
  6. package/dist/builtin-extensions/ashxj-tui.js.map +1 -1
  7. package/dist/builtin-extensions/index.d.ts.map +1 -1
  8. package/dist/builtin-extensions/index.js +0 -2
  9. package/dist/builtin-extensions/index.js.map +1 -1
  10. package/dist/builtin-extensions/lunr-cron.d.ts +1 -1
  11. package/dist/builtin-extensions/lunr-cron.d.ts.map +1 -1
  12. package/dist/builtin-extensions/lunr-cron.js +1 -1
  13. package/dist/builtin-extensions/lunr-cron.js.map +1 -1
  14. package/dist/builtin-extensions/pi-subagents/src/extension/chain-validation.d.ts.map +1 -1
  15. package/dist/builtin-extensions/pi-subagents/src/extension/chain-validation.js +3 -3
  16. package/dist/builtin-extensions/pi-subagents/src/extension/chain-validation.js.map +1 -1
  17. package/dist/builtin-extensions/pi-subagents/src/extension/doctor.d.ts +0 -2
  18. package/dist/builtin-extensions/pi-subagents/src/extension/doctor.d.ts.map +1 -1
  19. package/dist/builtin-extensions/pi-subagents/src/extension/doctor.js +1 -23
  20. package/dist/builtin-extensions/pi-subagents/src/extension/doctor.js.map +1 -1
  21. package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.d.ts.map +1 -1
  22. package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.js +6 -7
  23. package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.js.map +1 -1
  24. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts +1 -1
  25. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
  26. package/dist/builtin-extensions/pi-subagents/src/extension/index.js +7 -14
  27. package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
  28. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.d.ts +12 -9
  29. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.d.ts.map +1 -1
  30. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js +38 -34
  31. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js.map +1 -1
  32. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts +3 -3
  33. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts.map +1 -1
  34. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js +32 -47
  35. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js.map +1 -1
  36. package/dist/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.d.ts +2 -2
  37. package/dist/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.d.ts.map +1 -1
  38. package/dist/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.js.map +1 -1
  39. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts +7 -10
  40. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts.map +1 -1
  41. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js +90 -109
  42. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js.map +1 -1
  43. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.d.ts +3 -2
  44. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.d.ts.map +1 -1
  45. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.js +37 -50
  46. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.js.map +1 -1
  47. package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.d.ts.map +1 -1
  48. package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.js +1 -1
  49. package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.js.map +1 -1
  50. package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.d.ts +4 -0
  51. package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.d.ts.map +1 -1
  52. package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.js +5 -5
  53. package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.js.map +1 -1
  54. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts.map +1 -1
  55. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js +31 -13
  56. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
  57. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.d.ts +2 -2
  58. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.d.ts.map +1 -1
  59. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.js.map +1 -1
  60. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts +4 -3
  61. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts.map +1 -1
  62. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js +48 -20
  63. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js.map +1 -1
  64. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts +2 -2
  65. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
  66. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js +90 -64
  67. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
  68. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts +6 -8
  69. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
  70. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +262 -161
  71. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
  72. package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.d.ts +2 -1
  73. package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.d.ts.map +1 -1
  74. package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.js +24 -33
  75. package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.js.map +1 -1
  76. package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.d.ts +25 -0
  77. package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.d.ts.map +1 -0
  78. package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.js +51 -0
  79. package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.js.map +1 -0
  80. package/dist/builtin-extensions/pi-subagents/src/runs/shared/dynamic-fanout.d.ts.map +1 -1
  81. package/dist/builtin-extensions/pi-subagents/src/runs/shared/dynamic-fanout.js +20 -3
  82. package/dist/builtin-extensions/pi-subagents/src/runs/shared/dynamic-fanout.js.map +1 -1
  83. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts +4 -1
  84. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts.map +1 -1
  85. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js.map +1 -1
  86. package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.d.ts +5 -0
  87. package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.d.ts.map +1 -1
  88. package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.js +9 -3
  89. package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.js.map +1 -1
  90. package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.d.ts.map +1 -1
  91. package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.js +2 -2
  92. package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.js.map +1 -1
  93. package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.d.ts +2 -2
  94. package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.d.ts.map +1 -1
  95. package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.js +20 -17
  96. package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.js.map +1 -1
  97. package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.d.ts +70 -0
  98. package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.d.ts.map +1 -0
  99. package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.js +153 -0
  100. package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.js.map +1 -0
  101. package/dist/builtin-extensions/pi-subagents/src/shared/settings.d.ts +13 -8
  102. package/dist/builtin-extensions/pi-subagents/src/shared/settings.d.ts.map +1 -1
  103. package/dist/builtin-extensions/pi-subagents/src/shared/settings.js +20 -51
  104. package/dist/builtin-extensions/pi-subagents/src/shared/settings.js.map +1 -1
  105. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts +80 -20
  106. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts.map +1 -1
  107. package/dist/builtin-extensions/pi-subagents/src/shared/types.js +10 -2
  108. package/dist/builtin-extensions/pi-subagents/src/shared/types.js.map +1 -1
  109. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts +2 -2
  110. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts.map +1 -1
  111. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js +20 -32
  112. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js.map +1 -1
  113. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts +2 -1
  114. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts.map +1 -1
  115. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js +23 -449
  116. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js.map +1 -1
  117. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +2 -1
  118. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
  119. package/dist/builtin-extensions/pi-subagents/src/tui/render.js +13 -11
  120. package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
  121. package/dist/builtin-extensions/pi-subagents/src/watchdog/runtime.d.ts +2 -1
  122. package/dist/builtin-extensions/pi-subagents/src/watchdog/runtime.d.ts.map +1 -1
  123. package/dist/builtin-extensions/pi-subagents/src/watchdog/runtime.js +18 -17
  124. package/dist/builtin-extensions/pi-subagents/src/watchdog/runtime.js.map +1 -1
  125. package/dist/builtin-extensions/simple-pi-memory.d.ts +2 -2
  126. package/dist/builtin-extensions/simple-pi-memory.d.ts.map +1 -1
  127. package/dist/builtin-extensions/simple-pi-memory.js +41 -17
  128. package/dist/builtin-extensions/simple-pi-memory.js.map +1 -1
  129. package/dist/catalog/models.json +1 -1
  130. package/dist/catalog/providers/amazon-bedrock.json +1 -1
  131. package/dist/catalog/providers/azure-openai-responses.json +1 -1
  132. package/dist/catalog/providers/cloudflare-ai-gateway.json +1 -1
  133. package/dist/catalog/providers/cloudflare-workers-ai.json +1 -1
  134. package/dist/catalog/providers/fireworks.json +1 -1
  135. package/dist/catalog/providers/github-copilot.json +1 -1
  136. package/dist/catalog/providers/huggingface.json +1 -1
  137. package/dist/catalog/providers/minimax-cn.json +1 -1
  138. package/dist/catalog/providers/minimax.json +1 -1
  139. package/dist/catalog/providers/mistral.json +1 -1
  140. package/dist/catalog/providers/nvidia.json +1 -1
  141. package/dist/catalog/providers/openai.json +1 -1
  142. package/dist/catalog/providers/opencode-go.json +1 -1
  143. package/dist/catalog/providers/opencode.json +1 -1
  144. package/dist/catalog/providers/openrouter.json +1 -1
  145. package/dist/catalog/providers/qwen-cloud-cn.json +1 -1
  146. package/dist/catalog/providers/qwen-cloud.json +1 -1
  147. package/dist/catalog/providers/qwen-token-plan-cn.json +1 -1
  148. package/dist/catalog/providers/qwen-token-plan.json +1 -1
  149. package/dist/catalog/providers/together.json +1 -1
  150. package/dist/catalog/providers/vercel-ai-gateway.json +1 -1
  151. package/dist/catalog/providers/zai-coding-cn.json +1 -1
  152. package/dist/catalog/providers/zai.json +1 -1
  153. package/dist/catalog/publication.json +3 -3
  154. package/dist/core/agent-session.d.ts +7 -1
  155. package/dist/core/agent-session.d.ts.map +1 -1
  156. package/dist/core/agent-session.js +34 -4
  157. package/dist/core/agent-session.js.map +1 -1
  158. package/dist/core/context-breakdown.d.ts +3 -1
  159. package/dist/core/context-breakdown.d.ts.map +1 -1
  160. package/dist/core/context-breakdown.js +5 -2
  161. package/dist/core/context-breakdown.js.map +1 -1
  162. package/dist/core/customize.d.ts +2 -0
  163. package/dist/core/customize.d.ts.map +1 -1
  164. package/dist/core/customize.js +6 -0
  165. package/dist/core/customize.js.map +1 -1
  166. package/dist/core/memory-cap.d.ts +4 -8
  167. package/dist/core/memory-cap.d.ts.map +1 -1
  168. package/dist/core/memory-cap.js +8 -8
  169. package/dist/core/memory-cap.js.map +1 -1
  170. package/dist/core/permissions.d.ts +2 -0
  171. package/dist/core/permissions.d.ts.map +1 -1
  172. package/dist/core/permissions.js +30 -14
  173. package/dist/core/permissions.js.map +1 -1
  174. package/dist/core/plan-mode.d.ts.map +1 -1
  175. package/dist/core/plan-mode.js +1 -9
  176. package/dist/core/plan-mode.js.map +1 -1
  177. package/dist/core/rollback.d.ts.map +1 -1
  178. package/dist/core/rollback.js +1 -1
  179. package/dist/core/rollback.js.map +1 -1
  180. package/dist/core/settings-manager.d.ts +16 -5
  181. package/dist/core/settings-manager.d.ts.map +1 -1
  182. package/dist/core/settings-manager.js +37 -10
  183. package/dist/core/settings-manager.js.map +1 -1
  184. package/dist/core/slash-commands.d.ts.map +1 -1
  185. package/dist/core/slash-commands.js +1 -5
  186. package/dist/core/slash-commands.js.map +1 -1
  187. package/dist/core/subagent-permission-inherit.d.ts +34 -22
  188. package/dist/core/subagent-permission-inherit.d.ts.map +1 -1
  189. package/dist/core/subagent-permission-inherit.js +37 -80
  190. package/dist/core/subagent-permission-inherit.js.map +1 -1
  191. package/dist/core/swarm.d.ts.map +1 -1
  192. package/dist/core/swarm.js +13 -7
  193. package/dist/core/swarm.js.map +1 -1
  194. package/dist/core/system-prompt.d.ts +6 -4
  195. package/dist/core/system-prompt.d.ts.map +1 -1
  196. package/dist/core/system-prompt.js +38 -48
  197. package/dist/core/system-prompt.js.map +1 -1
  198. package/dist/core/usage-adapters/openai-codex.d.ts +1 -1
  199. package/dist/core/usage-adapters/openai-codex.d.ts.map +1 -1
  200. package/dist/core/usage-adapters/openai-codex.js +22 -17
  201. package/dist/core/usage-adapters/openai-codex.js.map +1 -1
  202. package/dist/core/usage-service.d.ts +10 -1
  203. package/dist/core/usage-service.d.ts.map +1 -1
  204. package/dist/core/usage-service.js +17 -6
  205. package/dist/core/usage-service.js.map +1 -1
  206. package/dist/gateway/agent-bridge.d.ts.map +1 -1
  207. package/dist/gateway/agent-bridge.js +1 -4
  208. package/dist/gateway/agent-bridge.js.map +1 -1
  209. package/dist/gateway/cron.d.ts.map +1 -1
  210. package/dist/gateway/cron.js +1 -4
  211. package/dist/gateway/cron.js.map +1 -1
  212. package/dist/index.d.ts +1 -1
  213. package/dist/index.d.ts.map +1 -1
  214. package/dist/index.js.map +1 -1
  215. package/dist/main.d.ts.map +1 -1
  216. package/dist/main.js +0 -5
  217. package/dist/main.js.map +1 -1
  218. package/dist/migrations.d.ts +2 -0
  219. package/dist/migrations.d.ts.map +1 -1
  220. package/dist/migrations.js +21 -0
  221. package/dist/migrations.js.map +1 -1
  222. package/dist/modes/interactive/components/settings-selector.d.ts +7 -4
  223. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  224. package/dist/modes/interactive/components/settings-selector.js +122 -162
  225. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  226. package/dist/modes/interactive/components/usage-view.d.ts +1 -1
  227. package/dist/modes/interactive/components/usage-view.d.ts.map +1 -1
  228. package/dist/modes/interactive/components/usage-view.js +7 -4
  229. package/dist/modes/interactive/components/usage-view.js.map +1 -1
  230. package/dist/modes/interactive/interactive-mode.d.ts +1 -2
  231. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  232. package/dist/modes/interactive/interactive-mode.js +55 -96
  233. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  234. package/dist/modes/interactive/skill-tag-autocomplete.d.ts +13 -0
  235. package/dist/modes/interactive/skill-tag-autocomplete.d.ts.map +1 -0
  236. package/dist/modes/interactive/skill-tag-autocomplete.js +72 -0
  237. package/dist/modes/interactive/skill-tag-autocomplete.js.map +1 -0
  238. package/docs/compaction.md +23 -23
  239. package/docs/containerization.md +24 -24
  240. package/docs/custom-provider.md +18 -18
  241. package/docs/development.md +16 -15
  242. package/docs/docs.json +6 -2
  243. package/docs/extensions.md +82 -80
  244. package/docs/features.md +102 -0
  245. package/docs/index.md +25 -19
  246. package/docs/json.md +7 -7
  247. package/docs/keybindings.md +4 -4
  248. package/docs/models.md +2 -2
  249. package/docs/packages.md +38 -42
  250. package/docs/prompt-templates.md +4 -4
  251. package/docs/providers.md +22 -10
  252. package/docs/quickstart.md +81 -46
  253. package/docs/rpc.md +7 -13
  254. package/docs/sdk.md +43 -41
  255. package/docs/security.md +18 -18
  256. package/docs/session-format.md +9 -9
  257. package/docs/sessions.md +13 -12
  258. package/docs/settings.md +63 -24
  259. package/docs/shell-aliases.md +2 -2
  260. package/docs/skills.md +21 -11
  261. package/docs/terminal-setup.md +5 -5
  262. package/docs/termux.md +7 -7
  263. package/docs/themes.md +12 -14
  264. package/docs/tmux.md +4 -4
  265. package/docs/tui.md +23 -23
  266. package/docs/usage.md +112 -87
  267. package/docs/windows.md +10 -2
  268. package/examples/README.md +3 -1
  269. package/examples/extensions/README.md +6 -6
  270. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  271. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  272. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  273. package/examples/extensions/doom-overlay/README.md +2 -2
  274. package/examples/extensions/gondolin/package-lock.json +2 -2
  275. package/examples/extensions/gondolin/package.json +1 -1
  276. package/examples/extensions/plan-mode/README.md +3 -1
  277. package/examples/extensions/sandbox/package-lock.json +2 -2
  278. package/examples/extensions/sandbox/package.json +1 -1
  279. package/examples/extensions/subagent/README.md +13 -11
  280. package/examples/extensions/todo.ts +2 -1
  281. package/examples/extensions/with-deps/package-lock.json +2 -2
  282. package/examples/extensions/with-deps/package.json +1 -1
  283. package/examples/sdk/README.md +9 -5
  284. package/package.json +6 -7
  285. package/dist/builtin-extensions/lunr-behavior.d.ts +0 -44
  286. package/dist/builtin-extensions/lunr-behavior.d.ts.map +0 -1
  287. package/dist/builtin-extensions/lunr-behavior.js +0 -213
  288. package/dist/builtin-extensions/lunr-behavior.js.map +0 -1
  289. package/dist/builtin-extensions/pi-subagents/agents/context-builder.md +0 -46
  290. package/dist/builtin-extensions/pi-subagents/agents/deep-researcher.md +0 -36
  291. package/dist/builtin-extensions/pi-subagents/agents/delegate.md +0 -12
  292. package/dist/builtin-extensions/pi-subagents/agents/oracle.md +0 -73
  293. package/dist/builtin-extensions/pi-subagents/agents/planner.md +0 -55
  294. package/dist/builtin-extensions/pi-subagents/agents/research-writer.md +0 -37
  295. package/dist/builtin-extensions/pi-subagents/agents/researcher.md +0 -52
  296. package/dist/builtin-extensions/pi-subagents/agents/reviewer.md +0 -79
  297. package/dist/builtin-extensions/pi-subagents/agents/scout.md +0 -50
  298. package/dist/builtin-extensions/pi-subagents/agents/worker.md +0 -55
  299. package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.d.ts +0 -20
  300. package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.d.ts.map +0 -1
  301. package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.js +0 -1273
  302. package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.js.map +0 -1
  303. package/dist/builtin-extensions/pi-subagents/src/agents/agent-memory.d.ts +0 -49
  304. package/dist/builtin-extensions/pi-subagents/src/agents/agent-memory.d.ts.map +0 -1
  305. package/dist/builtin-extensions/pi-subagents/src/agents/agent-memory.js +0 -252
  306. package/dist/builtin-extensions/pi-subagents/src/agents/agent-memory.js.map +0 -1
  307. package/dist/builtin-extensions/pi-subagents/src/agents/agent-scope.d.ts +0 -3
  308. package/dist/builtin-extensions/pi-subagents/src/agents/agent-scope.d.ts.map +0 -1
  309. package/dist/builtin-extensions/pi-subagents/src/agents/agent-scope.js +0 -6
  310. package/dist/builtin-extensions/pi-subagents/src/agents/agent-scope.js.map +0 -1
  311. package/dist/builtin-extensions/pi-subagents/src/agents/agent-selection.d.ts +0 -3
  312. package/dist/builtin-extensions/pi-subagents/src/agents/agent-selection.d.ts.map +0 -1
  313. package/dist/builtin-extensions/pi-subagents/src/agents/agent-selection.js +0 -23
  314. package/dist/builtin-extensions/pi-subagents/src/agents/agent-selection.js.map +0 -1
  315. package/dist/builtin-extensions/pi-subagents/src/agents/agent-serializer.d.ts +0 -8
  316. package/dist/builtin-extensions/pi-subagents/src/agents/agent-serializer.d.ts.map +0 -1
  317. package/dist/builtin-extensions/pi-subagents/src/agents/agent-serializer.js +0 -143
  318. package/dist/builtin-extensions/pi-subagents/src/agents/agent-serializer.js.map +0 -1
  319. package/dist/builtin-extensions/pi-subagents/src/agents/agents.d.ts +0 -176
  320. package/dist/builtin-extensions/pi-subagents/src/agents/agents.d.ts.map +0 -1
  321. package/dist/builtin-extensions/pi-subagents/src/agents/agents.js +0 -1326
  322. package/dist/builtin-extensions/pi-subagents/src/agents/agents.js.map +0 -1
  323. package/dist/builtin-extensions/pi-subagents/src/agents/chain-serializer.d.ts +0 -7
  324. package/dist/builtin-extensions/pi-subagents/src/agents/chain-serializer.d.ts.map +0 -1
  325. package/dist/builtin-extensions/pi-subagents/src/agents/chain-serializer.js +0 -307
  326. package/dist/builtin-extensions/pi-subagents/src/agents/chain-serializer.js.map +0 -1
  327. package/dist/builtin-extensions/pi-subagents/src/agents/identity.d.ts +0 -8
  328. package/dist/builtin-extensions/pi-subagents/src/agents/identity.d.ts.map +0 -1
  329. package/dist/builtin-extensions/pi-subagents/src/agents/identity.js +0 -30
  330. package/dist/builtin-extensions/pi-subagents/src/agents/identity.js.map +0 -1
  331. package/dist/builtin-extensions/pi-subagents/src/agents/proactive-skills.d.ts +0 -35
  332. package/dist/builtin-extensions/pi-subagents/src/agents/proactive-skills.d.ts.map +0 -1
  333. package/dist/builtin-extensions/pi-subagents/src/agents/proactive-skills.js +0 -151
  334. package/dist/builtin-extensions/pi-subagents/src/agents/proactive-skills.js.map +0 -1
  335. package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.d.ts +0 -131
  336. package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.d.ts.map +0 -1
  337. package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.js +0 -491
  338. package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.js.map +0 -1
  339. package/dist/core/behavior-preset.d.ts +0 -60
  340. package/dist/core/behavior-preset.d.ts.map +0 -1
  341. package/dist/core/behavior-preset.js +0 -257
  342. package/dist/core/behavior-preset.js.map +0 -1
@@ -103,7 +103,7 @@ export declare class MainWatchdogRuntime {
103
103
  clearSessionOverride(cwd?: string): WatchdogRuntimeSnapshot;
104
104
  reset(_reason?: string, options?: {
105
105
  clearReviewInputSignature?: boolean;
106
- resetChangeSignature?: boolean;
106
+ clearChangeSignature?: boolean;
107
107
  clearLspLedger?: boolean;
108
108
  }): void;
109
109
  dispose(): void;
@@ -124,6 +124,7 @@ export declare class MainWatchdogRuntime {
124
124
  private reviewDelta;
125
125
  private displayAcceptedReviewWarning;
126
126
  private currentRepoChangeSignature;
127
+ private clearRepoChangeBaseline;
127
128
  private resetRepoChangeBaseline;
128
129
  private resolveReviewChangeSignature;
129
130
  private collectLspDiagnostics;
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/watchdog/runtime.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport { createHash } from \"node:crypto\";\nimport type { ExtensionContext } from \"@ashx-j/lunr\";\nimport { computeWatchdogRepoChangeSignature, eventIndicatesRepoEdit, type WatchdogRepoChangeSignature } from \"./change-signature.ts\";\nimport { WatchdogEmissionGuard } from \"./emission-guard.ts\";\nimport {\n\tcollectWatchdogLspDiagnostics,\n\tformatWatchdogLspDiagnosticsBlock,\n\tWatchdogLspDiagnosticsLedger,\n\twatchdogWarningFromLspDiagnostics,\n\ttype WatchdogLspDiagnosticsFunction,\n} from \"./lsp-diagnostics.ts\";\nimport { resolveWatchdogConfig } from \"./settings.ts\";\nimport { formatWatchdogTurnDelta } from \"./turn-delta.ts\";\nimport {\n\ttype ResolvedWatchdogConfig,\n\ttype WatchdogEndpointConfig,\n\ttype WatchdogLspRuntimeSnapshot,\n\ttype WatchdogRuntimeStatus,\n\ttype WatchdogSettingsError,\n\ttype WatchdogSettingsResult,\n\ttype WatchdogSettingsSource,\n\ttype WatchdogWarning,\n\ttype WatchdogWarningDetails,\n} from \"./types.ts\";\nimport { normalizeWatchdogWarningDetails } from \"./warning-format.ts\";\n\ntype ReviewStopReason = \"stop\" | \"error\" | \"aborted\" | \"length\";\n\nexport interface WatchdogReviewResult {\n\twarnings?: WatchdogWarning[];\n\tstopReason?: ReviewStopReason;\n}\n\nexport interface WatchdogReviewRequest {\n\tdelta: string;\n\tepoch: number;\n\treviewId: number;\n\tconfig: ResolvedWatchdogConfig;\n\temitWarning(warning: WatchdogWarning): boolean;\n\tsignal?: AbortSignal;\n}\n\nexport type WatchdogReviewFunction = (request: WatchdogReviewRequest) => Promise<WatchdogReviewResult | void> | WatchdogReviewResult | void;\n\nexport interface WatchdogRuntimeSnapshot {\n\tstatus: WatchdogRuntimeStatus;\n\tenabled: boolean;\n\tconfig: ResolvedWatchdogConfig;\n\tconfigOk: boolean;\n\terrors: WatchdogSettingsError[];\n\tsources: WatchdogSettingsSource[];\n\tbufferedDeltas: number;\n\tepoch: number;\n\tactiveReviewId?: number;\n\tsessionOverride?: boolean;\n\tsessionModelOverride?: Partial<Pick<WatchdogEndpointConfig, \"model\" | \"thinking\">>;\n\tlastWarning?: WatchdogWarningDetails;\n\tlastError?: string;\n\tfailedReviews: number;\n\tstaleReviews: number;\n\treviewConnected: boolean;\n\treviewDescription: string;\n\tautoFollowQueued: false;\n\treviewTrigger: \"turn-delta\" | \"repo-edits\";\n\tchangedPaths?: string[];\n\tlsp: WatchdogLspRuntimeSnapshot;\n}\n\ninterface Waiter {\n\tresolve(settled: boolean): void;\n\ttimer: ReturnType<typeof setTimeout>;\n}\n\ninterface MainWatchdogRuntimeOptions {\n\tcwd?: string;\n\tresolveConfig?: (cwd: string, options?: { session?: Record<string, unknown> }) => WatchdogSettingsResult;\n\treview?: WatchdogReviewFunction;\n\treviewDescription?: string;\n\tdisplayWarning?: (warning: WatchdogWarningDetails) => void;\n\treviewChangesOnly?: boolean;\n\tlspDiagnostics?: WatchdogLspDiagnosticsFunction;\n}\n\ntype ContextLike = Pick<ExtensionContext, \"cwd\">;\ntype ReviewDeltaOutcome = \"completed\" | \"timeout\" | \"stale\";\n\nconst DEFAULT_REVIEW: WatchdogReviewFunction = () => ({ warnings: [] });\nconst MAX_REVIEW_INPUT_CHARS = 24_000;\nconst REVIEW_DELTA_SEPARATOR = \"\\n\\n---\\n\\n\";\n\nfunction errorMessage(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error);\n}\n\nfunction promptFromBeforeAgentStart(event: unknown): string | undefined {\n\tif (!event || typeof event !== \"object\") return undefined;\n\tconst input = event as { prompt?: unknown; systemPrompt?: unknown };\n\tif (typeof input.prompt === \"string\") return input.prompt;\n\tif (typeof input.systemPrompt === \"string\") return input.systemPrompt;\n\treturn undefined;\n}\n\nfunction reviewInputSignature(input: string): string {\n\treturn createHash(\"sha256\").update(input).digest(\"hex\");\n}\n\nexport class MainWatchdogRuntime {\n\tprivate cwd: string;\n\tprivate readonly resolveConfig: (cwd: string, options?: { session?: Record<string, unknown> }) => WatchdogSettingsResult;\n\tprivate readonly review: WatchdogReviewFunction;\n\tprivate readonly reviewConnected: boolean;\n\tprivate readonly reviewDescription: string;\n\tprivate readonly displayWarning: ((warning: WatchdogWarningDetails) => void) | undefined;\n\tprivate readonly reviewChangesOnly: boolean;\n\tprivate readonly lspDiagnostics: WatchdogLspDiagnosticsFunction;\n\tprivate readonly lspLedger = new WatchdogLspDiagnosticsLedger();\n\tprivate configResult: WatchdogSettingsResult;\n\tprivate sessionOverrideEnabled: boolean | undefined;\n\tprivate sessionModelOverride: Partial<Pick<WatchdogEndpointConfig, \"model\" | \"thinking\">> | undefined;\n\tprivate status: WatchdogRuntimeStatus = \"idle\";\n\tprivate pendingDeltas: string[] = [];\n\tprivate pendingDeltaChars = 0;\n\tprivate guard = new WatchdogEmissionGuard();\n\tprivate guardMaxWarnings: number | null = null;\n\tprivate epoch = 0;\n\tprivate reviewIdCounter = 0;\n\tprivate agentEndIdCounter = 0;\n\tprivate activeAgentEndId: number | undefined;\n\tprivate activeAgentEndAbortController: AbortController | undefined;\n\tprivate activeReviewId: number | undefined;\n\tprivate activeReviewWarning: WatchdogWarningDetails | undefined;\n\tprivate reviewing = false;\n\tprivate waitingAtAgentEnd = false;\n\tprivate disposed = false;\n\tprivate includeUserPromptInNextDelta = false;\n\tprivate userPrompt: string | undefined;\n\tprivate waiters: Waiter[] = [];\n\tprivate lastWarning: WatchdogWarningDetails | undefined;\n\tprivate lastError: string | undefined;\n\tprivate lastReviewInputSignature: string | undefined;\n\tprivate turnStartChangeSignature: WatchdogRepoChangeSignature | undefined;\n\tprivate lastReviewedChangeSignature: string | undefined;\n\tprivate currentChangedPaths: string[] | undefined;\n\tprivate lastLspSnapshot: WatchdogLspRuntimeSnapshot | undefined;\n\tprivate observedRepoEditThisTurn = false;\n\tprivate failedReviews = 0;\n\tprivate staleReviews = 0;\n\n\tconstructor(options: MainWatchdogRuntimeOptions = {}) {\n\t\tthis.cwd = options.cwd ?? process.cwd();\n\t\tthis.resolveConfig = options.resolveConfig ?? resolveWatchdogConfig;\n\t\tthis.review = options.review ?? DEFAULT_REVIEW;\n\t\tthis.reviewConnected = Boolean(options.review);\n\t\tthis.reviewDescription = options.reviewDescription ?? (options.review ? \"injected seam\" : \"not wired\");\n\t\tthis.displayWarning = options.displayWarning;\n\t\tthis.reviewChangesOnly = options.reviewChangesOnly === true;\n\t\tthis.lspDiagnostics = options.lspDiagnostics ?? collectWatchdogLspDiagnostics;\n\t\tthis.configResult = this.resolveConfig(this.cwd);\n\t\tthis.guardMaxWarnings = this.configResult.config.maxWarnings;\n\t\tthis.guard = new WatchdogEmissionGuard({ maxWarnings: this.guardMaxWarnings });\n\t\tthis.turnStartChangeSignature = this.currentRepoChangeSignature();\n\t\tthis.lastReviewedChangeSignature = this.turnStartChangeSignature?.key;\n\t}\n\n\tbindSession(ctx: ContextLike): void {\n\t\tthis.cwd = ctx.cwd;\n\t\tthis.sessionOverrideEnabled = undefined;\n\t\tthis.sessionModelOverride = undefined;\n\t\tthis.reset(\"session_start\", { clearReviewInputSignature: true, resetChangeSignature: true, clearLspLedger: true });\n\t\tthis.refreshConfig(ctx.cwd);\n\t\tthis.resetRepoChangeBaseline();\n\t}\n\n\trefreshConfig(cwd = this.cwd): WatchdogSettingsResult {\n\t\tthis.cwd = cwd;\n\t\tconst wasEnabled = this.isEnabled();\n\t\tconst session = this.sessionOverrideEnabled === undefined && this.sessionModelOverride === undefined\n\t\t\t? undefined\n\t\t\t: {\n\t\t\t\t...(this.sessionOverrideEnabled === undefined ? {} : { enabled: this.sessionOverrideEnabled }),\n\t\t\t\tmain: {\n\t\t\t\t\t...(this.sessionOverrideEnabled === undefined ? {} : { enabled: this.sessionOverrideEnabled }),\n\t\t\t\t\t...(this.sessionModelOverride ?? {}),\n\t\t\t\t},\n\t\t\t};\n\t\tthis.configResult = this.resolveConfig(this.cwd, session === undefined ? undefined : { session });\n\t\tif (this.configResult.config.maxWarnings !== this.guardMaxWarnings) {\n\t\t\tthis.guardMaxWarnings = this.configResult.config.maxWarnings;\n\t\t\tthis.guard = new WatchdogEmissionGuard({ maxWarnings: this.guardMaxWarnings });\n\t\t}\n\t\tif (wasEnabled && !this.isEnabled()) this.invalidateActiveReview(\"watchdog disabled\");\n\t\treturn this.configResult;\n\t}\n\n\tsetSessionEnabled(enabled: boolean, cwd = this.cwd): WatchdogRuntimeSnapshot {\n\t\tthis.sessionOverrideEnabled = enabled;\n\t\tthis.reset(\"session override\");\n\t\tthis.refreshConfig(cwd);\n\t\treturn this.getSnapshot();\n\t}\n\n\tsetSessionModel(patch: { model?: string | null; thinking?: WatchdogEndpointConfig[\"thinking\"] | null }, cwd = this.cwd): WatchdogRuntimeSnapshot {\n\t\tconst next = { ...(this.sessionModelOverride ?? {}) };\n\t\tif (patch.model === null) delete next.model;\n\t\telse if (patch.model !== undefined) next.model = patch.model;\n\t\tif (patch.thinking === null) delete next.thinking;\n\t\telse if (patch.thinking !== undefined) next.thinking = patch.thinking;\n\t\tthis.sessionModelOverride = next.model === undefined && next.thinking === undefined ? undefined : next;\n\t\tthis.reset(\"session model override\");\n\t\tthis.refreshConfig(cwd);\n\t\treturn this.getSnapshot();\n\t}\n\n\tclearSessionModel(cwd = this.cwd): WatchdogRuntimeSnapshot {\n\t\tthis.sessionModelOverride = undefined;\n\t\tthis.reset(\"session model override cleared\");\n\t\tthis.refreshConfig(cwd);\n\t\treturn this.getSnapshot();\n\t}\n\n\tclearSessionOverride(cwd = this.cwd): WatchdogRuntimeSnapshot {\n\t\tthis.sessionOverrideEnabled = undefined;\n\t\tthis.sessionModelOverride = undefined;\n\t\tthis.reset(\"session override cleared\");\n\t\tthis.refreshConfig(cwd);\n\t\treturn this.getSnapshot();\n\t}\n\n\treset(_reason = \"reset\", options: { clearReviewInputSignature?: boolean; resetChangeSignature?: boolean; clearLspLedger?: boolean } = {}): void {\n\t\tthis.abortActiveAgentEnd();\n\t\tthis.epoch++;\n\t\tthis.status = \"idle\";\n\t\tthis.clearPendingDeltas();\n\t\tthis.reviewing = false;\n\t\tthis.waitingAtAgentEnd = false;\n\t\tthis.activeReviewId = undefined;\n\t\tthis.activeReviewWarning = undefined;\n\t\tthis.includeUserPromptInNextDelta = false;\n\t\tthis.userPrompt = undefined;\n\t\tthis.lastError = undefined;\n\t\tthis.currentChangedPaths = undefined;\n\t\tthis.observedRepoEditThisTurn = false;\n\t\tif (options.clearLspLedger) {\n\t\t\tthis.lspLedger.reset();\n\t\t\tthis.lastLspSnapshot = undefined;\n\t\t}\n\t\tif (options.clearReviewInputSignature) this.lastReviewInputSignature = undefined;\n\t\tif (options.resetChangeSignature) this.resetRepoChangeBaseline({ reviewed: true });\n\t\tthis.guard.reset();\n\t\tthis.resolveWaiters(true);\n\t}\n\n\tdispose(): void {\n\t\tthis.disposed = true;\n\t\tthis.abortActiveAgentEnd();\n\t\tthis.epoch++;\n\t\tthis.status = \"idle\";\n\t\tthis.clearPendingDeltas();\n\t\tthis.reviewing = false;\n\t\tthis.waitingAtAgentEnd = false;\n\t\tthis.activeReviewId = undefined;\n\t\tthis.activeReviewWarning = undefined;\n\t\tthis.lastReviewInputSignature = undefined;\n\t\tthis.currentChangedPaths = undefined;\n\t\tthis.lastLspSnapshot = undefined;\n\t\tthis.lspLedger.reset();\n\t\tthis.observedRepoEditThisTurn = false;\n\t\tthis.resolveWaiters(false);\n\t}\n\n\thandleBeforeAgentStart(event: unknown, ctx: ContextLike): void {\n\t\tif (this.disposed) return;\n\t\tthis.reset(\"before_agent_start\");\n\t\tthis.refreshConfig(ctx.cwd);\n\t\tthis.userPrompt = promptFromBeforeAgentStart(event);\n\t\tthis.includeUserPromptInNextDelta = Boolean(this.userPrompt?.trim());\n\t\tthis.resetRepoChangeBaseline();\n\t}\n\n\thandleTurnEnd(event: unknown, ctx: ContextLike): void {\n\t\tif (this.disposed) return;\n\t\tthis.refreshConfig(ctx.cwd);\n\t\tif (!this.isEnabled()) return;\n\t\ttry {\n\t\t\tthis.observedRepoEditThisTurn ||= eventIndicatesRepoEdit(event);\n\t\t\tconst delta = formatWatchdogTurnDelta({\n\t\t\t\tincludeUserPrompt: this.includeUserPromptInNextDelta,\n\t\t\t\tuserPrompt: this.userPrompt,\n\t\t\t\tevents: [event],\n\t\t\t});\n\t\t\tthis.includeUserPromptInNextDelta = false;\n\t\t\tthis.enqueueDelta(delta);\n\t\t} catch (error) {\n\t\t\tthis.fail(`Failed to format watchdog turn delta: ${errorMessage(error)}`);\n\t\t}\n\t}\n\n\tenqueueDelta(delta: string): void {\n\t\tif (this.disposed || !delta.trim() || !this.isEnabled()) return;\n\t\tthis.appendBoundedDelta(delta);\n\t\tif (!this.reviewing && !this.waitingAtAgentEnd) this.status = \"queued\";\n\t}\n\n\tasync handleAgentEnd(_event: unknown, ctx: ContextLike): Promise<void> {\n\t\tif (this.disposed) return;\n\t\tthis.refreshConfig(ctx.cwd);\n\t\tif (!this.isEnabled()) return;\n\t\tconst changeSignature = this.resolveReviewChangeSignature(ctx.cwd);\n\t\tif (this.reviewChangesOnly && !changeSignature) {\n\t\t\tthis.clearPendingDeltas();\n\t\t\tif (this.status === \"queued\") this.status = \"idle\";\n\t\t\tthis.resolveWaiters(true);\n\t\t\treturn;\n\t\t}\n\t\tif (changeSignature && changeSignature.key === this.lastReviewedChangeSignature) {\n\t\t\tthis.clearPendingDeltas();\n\t\t\tthis.status = \"idle\";\n\t\t\tthis.resolveWaiters(true);\n\t\t\treturn;\n\t\t}\n\t\tthis.waitingAtAgentEnd = true;\n\t\tconst agentEndEpoch = this.epoch;\n\t\tconst agentEndId = ++this.agentEndIdCounter;\n\t\tconst lspAbortController = new AbortController();\n\t\tthis.activeAgentEndId = agentEndId;\n\t\tthis.activeAgentEndAbortController = lspAbortController;\n\t\ttry {\n\t\t\tthis.guard.startModelUpdate();\n\t\t\tconst lspBlock = await this.collectLspDiagnostics(changeSignature, {\n\t\t\t\tepoch: agentEndEpoch,\n\t\t\t\tagentEndId,\n\t\t\t\tsignal: lspAbortController.signal,\n\t\t\t});\n\t\t\tif (this.activeAgentEndAbortController === lspAbortController) this.activeAgentEndAbortController = undefined;\n\t\t\tif (!this.isAgentEndCurrent(agentEndEpoch, agentEndId)) return;\n\t\t\tconst delta = this.buildReviewInput(changeSignature, lspBlock);\n\t\t\tthis.clearPendingDeltas();\n\t\t\tif (!delta.trim()) {\n\t\t\t\tthis.waitingAtAgentEnd = false;\n\t\t\t\tif (this.status === \"queued\") this.status = \"idle\";\n\t\t\t\tthis.resolveWaiters(true);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst signature = reviewInputSignature(delta);\n\t\t\tif (!this.reviewChangesOnly && signature === this.lastReviewInputSignature) {\n\t\t\t\tthis.waitingAtAgentEnd = false;\n\t\t\t\tthis.status = \"idle\";\n\t\t\t\tthis.resolveWaiters(true);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst outcome = await this.reviewDelta(delta, this.configResult.config.agentEndTimeoutMs);\n\t\t\tthis.waitingAtAgentEnd = false;\n\t\t\tif (outcome === \"timeout\") {\n\t\t\t\tthis.staleReviews++;\n\t\t\t\tthis.invalidateActiveReview(\"agent-end timeout\");\n\t\t\t\tthis.status = \"stale\";\n\t\t\t\tthis.markLastWarningStale();\n\t\t\t\tthis.resolveWaiters(true);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (outcome === \"completed\" && this.status !== \"failed\" && this.status !== \"stale\") {\n\t\t\t\tthis.lastReviewInputSignature = signature;\n\t\t\t\tif (changeSignature) this.lastReviewedChangeSignature = changeSignature.key;\n\t\t\t\tthis.currentChangedPaths = changeSignature?.changedPaths;\n\t\t\t\tthis.status = \"idle\";\n\t\t\t}\n\t\t\tthis.resolveWaiters(true);\n\t\t} finally {\n\t\t\tif (this.activeAgentEndAbortController === lspAbortController) this.activeAgentEndAbortController = undefined;\n\t\t\tif (this.activeAgentEndId === agentEndId) this.activeAgentEndId = undefined;\n\t\t}\n\t}\n\n\trecordDisplayedWarning(warning: WatchdogWarning): WatchdogWarningDetails {\n\t\tconst details = normalizeWatchdogWarningDetails(warning, { state: \"displayed\", source: warning.source ?? \"main\" });\n\t\tthis.lastWarning = details;\n\t\treturn details;\n\t}\n\n\tgetSnapshot(cwd?: string): WatchdogRuntimeSnapshot {\n\t\tif (cwd) this.refreshConfig(cwd);\n\t\treturn {\n\t\t\tstatus: this.status,\n\t\t\tenabled: this.isEnabled(),\n\t\t\tconfig: this.configResult.config,\n\t\t\tconfigOk: this.configResult.ok,\n\t\t\terrors: [...this.configResult.errors],\n\t\t\tsources: [...this.configResult.sources],\n\t\t\tbufferedDeltas: this.pendingDeltas.length,\n\t\t\tepoch: this.epoch,\n\t\t\t...(this.activeReviewId !== undefined ? { activeReviewId: this.activeReviewId } : {}),\n\t\t\t...(this.sessionOverrideEnabled !== undefined ? { sessionOverride: this.sessionOverrideEnabled } : {}),\n\t\t\t...(this.sessionModelOverride !== undefined ? { sessionModelOverride: { ...this.sessionModelOverride } } : {}),\n\t\t\t...(this.lastWarning ? { lastWarning: this.lastWarning } : {}),\n\t\t\t...(this.lastError ? { lastError: this.lastError } : {}),\n\t\t\tfailedReviews: this.failedReviews,\n\t\t\tstaleReviews: this.staleReviews,\n\t\t\treviewConnected: this.reviewConnected,\n\t\t\treviewDescription: this.reviewDescription,\n\t\t\tautoFollowQueued: false,\n\t\t\treviewTrigger: this.reviewChangesOnly ? \"repo-edits\" : \"turn-delta\",\n\t\t\t...(this.currentChangedPaths?.length ? { changedPaths: [...this.currentChangedPaths] } : {}),\n\t\t\tlsp: this.lspSnapshot(),\n\t\t};\n\t}\n\n\tasync waitForIdle(timeoutMs = 1_000): Promise<boolean> {\n\t\treturn this.waitForSettled(timeoutMs);\n\t}\n\n\tprivate isEnabled(): boolean {\n\t\treturn this.configResult.ok && this.configResult.config.main.enabled;\n\t}\n\n\tprivate abortActiveAgentEnd(): void {\n\t\tthis.activeAgentEndAbortController?.abort();\n\t\tthis.activeAgentEndAbortController = undefined;\n\t\tthis.activeAgentEndId = undefined;\n\t}\n\n\tprivate isAgentEndCurrent(epoch: number, agentEndId: number): boolean {\n\t\treturn !this.disposed && this.epoch === epoch && this.activeAgentEndId === agentEndId && this.waitingAtAgentEnd && this.isEnabled();\n\t}\n\n\tprivate isCurrent(epoch: number, reviewId: number): boolean {\n\t\treturn !this.disposed && this.epoch === epoch && this.activeReviewId === reviewId;\n\t}\n\n\tprivate acceptWarning(epoch: number, reviewId: number, warning: WatchdogWarning): boolean {\n\t\tif (!this.isCurrent(epoch, reviewId) || !this.isEnabled()) return false;\n\t\tconst decision = this.guard.evaluate(warning);\n\t\tif (!decision.accepted) return false;\n\t\tconst details = normalizeWatchdogWarningDetails(warning, {\n\t\t\tstate: \"candidate\",\n\t\t\tsource: warning.source ?? \"main\",\n\t\t\tidentity: decision.identity,\n\t\t});\n\t\tthis.lastWarning = details;\n\t\tthis.activeReviewWarning = details;\n\t\treturn true;\n\t}\n\n\tprivate displayBoundaryWarning(warning: WatchdogWarning): boolean {\n\t\tif (!this.isEnabled()) return false;\n\t\tconst decision = this.guard.evaluate(warning);\n\t\tif (!decision.accepted) return false;\n\t\tconst details = normalizeWatchdogWarningDetails(warning, {\n\t\t\tstate: \"displayed\",\n\t\t\tsource: warning.source ?? \"main\",\n\t\t\tidentity: decision.identity,\n\t\t\tdisplayedAt: new Date().toISOString(),\n\t\t});\n\t\tthis.lastWarning = details;\n\t\tthis.displayWarning?.(details);\n\t\treturn true;\n\t}\n\n\tprivate invalidateActiveReview(_reason: string): void {\n\t\tthis.abortActiveAgentEnd();\n\t\tthis.epoch++;\n\t\tthis.status = \"idle\";\n\t\tthis.clearPendingDeltas();\n\t\tthis.reviewing = false;\n\t\tthis.waitingAtAgentEnd = false;\n\t\tthis.activeReviewId = undefined;\n\t\tthis.activeReviewWarning = undefined;\n\t}\n\n\tprivate async reviewDelta(delta: string, timeoutMs: number): Promise<ReviewDeltaOutcome> {\n\t\tif (this.reviewing || this.disposed) return \"stale\";\n\t\tthis.reviewing = true;\n\t\tconst reviewEpoch = this.epoch;\n\t\tconst reviewId = ++this.reviewIdCounter;\n\t\tthis.activeReviewId = reviewId;\n\t\tthis.activeReviewWarning = undefined;\n\t\tthis.status = \"reviewing\";\n\t\tlet timeout: ReturnType<typeof setTimeout> | undefined;\n\t\tconst abortController = new AbortController();\n\t\tconst reviewPromise = Promise.resolve().then(() => this.review({\n\t\t\tdelta,\n\t\t\tepoch: reviewEpoch,\n\t\t\treviewId,\n\t\t\tconfig: this.configResult.config,\n\t\t\tsignal: abortController.signal,\n\t\t\temitWarning: (warning) => this.acceptWarning(reviewEpoch, reviewId, warning),\n\t\t}));\n\t\ttry {\n\t\t\tconst result = await Promise.race([\n\t\t\t\treviewPromise,\n\t\t\t\tnew Promise<\"timeout\">((resolve) => {\n\t\t\t\t\ttimeout = setTimeout(() => resolve(\"timeout\"), timeoutMs);\n\t\t\t\t}),\n\t\t\t]);\n\t\t\tif (result === \"timeout\") {\n\t\t\t\tabortController.abort();\n\t\t\t\treturn \"timeout\";\n\t\t\t}\n\t\t\tif (!this.isCurrent(reviewEpoch, reviewId)) return \"stale\";\n\t\t\tfor (const warning of result?.warnings ?? []) this.acceptWarning(reviewEpoch, reviewId, warning);\n\t\t\tif (result?.stopReason && result.stopReason !== \"stop\") {\n\t\t\t\tthis.fail(`Watchdog review ended with stop reason '${result.stopReason}'.`);\n\t\t\t\treturn \"completed\";\n\t\t\t}\n\t\t\tthis.displayAcceptedReviewWarning();\n\t\t\treturn \"completed\";\n\t\t} catch (error) {\n\t\t\tif (this.isCurrent(reviewEpoch, reviewId)) {\n\t\t\t\tthis.fail(`Watchdog review failed: ${errorMessage(error)}`);\n\t\t\t\treturn \"completed\";\n\t\t\t}\n\t\t\treturn \"stale\";\n\t\t} finally {\n\t\t\tif (timeout) clearTimeout(timeout);\n\t\t\tif (this.epoch === reviewEpoch && this.activeReviewId === reviewId) {\n\t\t\t\tthis.reviewing = false;\n\t\t\t\tthis.activeReviewId = undefined;\n\t\t\t\tthis.activeReviewWarning = undefined;\n\t\t\t}\n\t\t\tthis.resolveWaiters(this.isSettled());\n\t\t}\n\t}\n\n\tprivate displayAcceptedReviewWarning(): void {\n\t\tif (!this.activeReviewWarning) return;\n\t\tconst details: WatchdogWarningDetails = {\n\t\t\t...this.activeReviewWarning,\n\t\t\tstate: \"displayed\",\n\t\t\tdisplayedAt: new Date().toISOString(),\n\t\t};\n\t\tthis.lastWarning = details;\n\t\tthis.displayWarning?.(details);\n\t}\n\n\tprivate currentRepoChangeSignature(cwd = this.cwd): WatchdogRepoChangeSignature | undefined {\n\t\treturn this.reviewChangesOnly ? computeWatchdogRepoChangeSignature(cwd) : undefined;\n\t}\n\n\tprivate resetRepoChangeBaseline(options: { cwd?: string; reviewed?: boolean } = {}): void {\n\t\tthis.turnStartChangeSignature = this.currentRepoChangeSignature(options.cwd ?? this.cwd);\n\t\tif (options.reviewed) this.lastReviewedChangeSignature = this.turnStartChangeSignature?.key;\n\t\telse this.lastReviewedChangeSignature ??= this.turnStartChangeSignature?.key;\n\t\tthis.currentChangedPaths = this.turnStartChangeSignature?.changedPaths;\n\t\tthis.observedRepoEditThisTurn = false;\n\t}\n\n\tprivate resolveReviewChangeSignature(cwd = this.cwd): WatchdogRepoChangeSignature | undefined {\n\t\tif (!this.reviewChangesOnly) return undefined;\n\t\tconst current = this.currentRepoChangeSignature(cwd);\n\t\tif (current) {\n\t\t\tthis.currentChangedPaths = current.changedPaths;\n\t\t\tif (current.key === this.turnStartChangeSignature?.key) return undefined;\n\t\t\tif (current.changedPaths.length === 0) return undefined;\n\t\t\treturn current;\n\t\t}\n\t\treturn this.observedRepoEditThisTurn\n\t\t\t? { root: cwd, key: `observed-edit:${this.epoch}:${this.reviewIdCounter}:${this.pendingDeltaChars}`, changedPaths: [] }\n\t\t\t: undefined;\n\t}\n\n\tprivate async collectLspDiagnostics(changeSignature: WatchdogRepoChangeSignature | undefined, current: { epoch: number; agentEndId: number; signal: AbortSignal }): Promise<string> {\n\t\tconst config = this.configResult.config.lsp;\n\t\tif (!config.enabled || !changeSignature?.changedPaths.length) {\n\t\t\tthis.lastLspSnapshot = {\n\t\t\t\tenabled: config.enabled,\n\t\t\t\tstatus: config.enabled ? \"skipped\" : \"disabled\",\n\t\t\t\tcheckedPaths: [],\n\t\t\t\tskippedPaths: [],\n\t\t\t\tdiagnostics: [],\n\t\t\t\tdiagnosticCount: 0,\n\t\t\t\tfreshDiagnosticCount: 0,\n\t\t\t\tupdatedAt: new Date().toISOString(),\n\t\t\t};\n\t\t\treturn \"\";\n\t\t}\n\t\ttry {\n\t\t\tconst raw = await this.lspDiagnostics({\n\t\t\t\tcwd: this.cwd,\n\t\t\t\troot: changeSignature.root,\n\t\t\t\tchangedPaths: changeSignature.changedPaths,\n\t\t\t\tconfig,\n\t\t\t\tsignal: current.signal,\n\t\t\t});\n\t\t\tif (!this.isAgentEndCurrent(current.epoch, current.agentEndId)) return \"\";\n\t\t\tconst diagnosticCount = raw.diagnostics.length;\n\t\t\tconst fresh = this.lspLedger.reduce(raw);\n\t\t\tthis.lastLspSnapshot = {\n\t\t\t\t...fresh,\n\t\t\t\tenabled: true,\n\t\t\t\tdiagnosticCount,\n\t\t\t\tfreshDiagnosticCount: fresh.diagnostics.length,\n\t\t\t\tupdatedAt: new Date().toISOString(),\n\t\t\t};\n\t\t\tconst warning = watchdogWarningFromLspDiagnostics(fresh);\n\t\t\tif (warning) this.displayBoundaryWarning(warning);\n\t\t\treturn formatWatchdogLspDiagnosticsBlock(fresh);\n\t\t} catch (error) {\n\t\t\tif (!this.isAgentEndCurrent(current.epoch, current.agentEndId)) return \"\";\n\t\t\tthis.lastLspSnapshot = {\n\t\t\t\tenabled: true,\n\t\t\t\tstatus: \"failed\",\n\t\t\t\tcheckedPaths: [],\n\t\t\t\tskippedPaths: changeSignature.changedPaths,\n\t\t\t\tdiagnostics: [],\n\t\t\t\tdiagnosticCount: 0,\n\t\t\t\tfreshDiagnosticCount: 0,\n\t\t\t\tmessage: `LSP diagnostics failed: ${errorMessage(error)}`,\n\t\t\t\tupdatedAt: new Date().toISOString(),\n\t\t\t};\n\t\t\treturn \"\";\n\t\t}\n\t}\n\n\tprivate lspSnapshot(): WatchdogLspRuntimeSnapshot {\n\t\tif (this.lastLspSnapshot) return {\n\t\t\t...this.lastLspSnapshot,\n\t\t\tcheckedPaths: [...this.lastLspSnapshot.checkedPaths],\n\t\t\tskippedPaths: [...this.lastLspSnapshot.skippedPaths],\n\t\t\tdiagnostics: [...this.lastLspSnapshot.diagnostics],\n\t\t};\n\t\tconst enabled = this.isEnabled() && this.configResult.config.lsp.enabled;\n\t\treturn {\n\t\t\tenabled,\n\t\t\tstatus: enabled ? \"skipped\" : \"disabled\",\n\t\t\tcheckedPaths: [],\n\t\t\tskippedPaths: [],\n\t\t\tdiagnostics: [],\n\t\t\tdiagnosticCount: 0,\n\t\t\tfreshDiagnosticCount: 0,\n\t\t};\n\t}\n\n\tprivate appendBoundedDelta(delta: string): void {\n\t\tlet entry = delta.trim();\n\t\tif (!entry) return;\n\t\tif (entry.length > MAX_REVIEW_INPUT_CHARS) entry = entry.slice(-MAX_REVIEW_INPUT_CHARS);\n\t\tthis.pendingDeltas.push(entry);\n\t\tthis.pendingDeltaChars += entry.length;\n\t\twhile (this.pendingDeltas.length > 1 && this.pendingDeltaChars + (this.pendingDeltas.length - 1) * REVIEW_DELTA_SEPARATOR.length > MAX_REVIEW_INPUT_CHARS) {\n\t\t\tconst removed = this.pendingDeltas.shift();\n\t\t\tif (removed) this.pendingDeltaChars -= removed.length;\n\t\t}\n\t}\n\n\tprivate buildReviewInput(changeSignature?: WatchdogRepoChangeSignature, lspBlock = \"\"): string {\n\t\tconst input = this.pendingDeltas.join(REVIEW_DELTA_SEPARATOR);\n\t\tconst changes = changeSignature?.changedPaths.length\n\t\t\t? [\"Changed repo paths:\", ...changeSignature.changedPaths.slice(0, 200).map((file) => `- ${file}`)].join(\"\\n\")\n\t\t\t: \"\";\n\t\tconst contextPieces = [changes, lspBlock].filter(Boolean);\n\t\tif (!contextPieces.length) return input.length > MAX_REVIEW_INPUT_CHARS ? input.slice(-MAX_REVIEW_INPUT_CHARS) : input;\n\n\t\tconst maxContextLength = Math.floor(MAX_REVIEW_INPUT_CHARS / 2);\n\t\tconst maxPieceLength = Math.max(1_000, Math.floor(maxContextLength / contextPieces.length));\n\t\tconst boundedContext = contextPieces.map((piece) => piece.length > maxPieceLength\n\t\t\t? `${piece.slice(0, maxPieceLength - 6)}\\n- ...`\n\t\t\t: piece).join(REVIEW_DELTA_SEPARATOR);\n\t\tconst separatorLength = input ? REVIEW_DELTA_SEPARATOR.length : 0;\n\t\tconst inputBudget = MAX_REVIEW_INPUT_CHARS - boundedContext.length - separatorLength;\n\t\tconst boundedInput = inputBudget <= 0\n\t\t\t? \"\"\n\t\t\t: input.length > inputBudget\n\t\t\t\t? input.slice(-inputBudget)\n\t\t\t\t: input;\n\t\treturn [boundedContext, boundedInput].filter(Boolean).join(REVIEW_DELTA_SEPARATOR);\n\t}\n\n\tprivate clearPendingDeltas(): void {\n\t\tthis.pendingDeltas = [];\n\t\tthis.pendingDeltaChars = 0;\n\t}\n\n\tprivate fail(message: string): void {\n\t\tthis.failedReviews++;\n\t\tthis.lastError = message;\n\t\tthis.status = \"failed\";\n\t\tthis.clearPendingDeltas();\n\t\tthis.resolveWaiters(true);\n\t}\n\n\tprivate markLastWarningStale(): void {\n\t\tif (!this.lastWarning || this.lastWarning.state === \"displayed\") return;\n\t\tthis.lastWarning = { ...this.lastWarning, stale: true, state: \"stale\" };\n\t}\n\n\tprivate isSettled(): boolean {\n\t\treturn !this.reviewing && this.pendingDeltas.length === 0;\n\t}\n\n\tprivate waitForSettled(timeoutMs: number): Promise<boolean> {\n\t\tif (this.isSettled()) return Promise.resolve(true);\n\t\treturn new Promise((resolve) => {\n\t\t\tconst waiter: Waiter = {\n\t\t\t\tresolve,\n\t\t\t\ttimer: setTimeout(() => {\n\t\t\t\t\tthis.waiters = this.waiters.filter((entry) => entry !== waiter);\n\t\t\t\t\tresolve(false);\n\t\t\t\t}, timeoutMs),\n\t\t\t};\n\t\t\tthis.waiters.push(waiter);\n\t\t});\n\t}\n\n\tprivate resolveWaiters(settled: boolean): void {\n\t\tif (!settled && !this.disposed) return;\n\t\tconst waiters = this.waiters;\n\t\tthis.waiters = [];\n\t\tfor (const waiter of waiters) {\n\t\t\tclearTimeout(waiter.timer);\n\t\t\twaiter.resolve(settled);\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/watchdog/runtime.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport { createHash } from \"node:crypto\";\nimport type { ExtensionContext } from \"@ashx-j/lunr\";\nimport { computeWatchdogRepoChangeSignature, eventIndicatesRepoEdit, type WatchdogRepoChangeSignature } from \"./change-signature.ts\";\nimport { WatchdogEmissionGuard } from \"./emission-guard.ts\";\nimport {\n\tcollectWatchdogLspDiagnostics,\n\tformatWatchdogLspDiagnosticsBlock,\n\tWatchdogLspDiagnosticsLedger,\n\twatchdogWarningFromLspDiagnostics,\n\ttype WatchdogLspDiagnosticsFunction,\n} from \"./lsp-diagnostics.ts\";\nimport { resolveWatchdogConfig } from \"./settings.ts\";\nimport { formatWatchdogTurnDelta } from \"./turn-delta.ts\";\nimport {\n\ttype ResolvedWatchdogConfig,\n\ttype WatchdogEndpointConfig,\n\ttype WatchdogLspRuntimeSnapshot,\n\ttype WatchdogRuntimeStatus,\n\ttype WatchdogSettingsError,\n\ttype WatchdogSettingsResult,\n\ttype WatchdogSettingsSource,\n\ttype WatchdogWarning,\n\ttype WatchdogWarningDetails,\n} from \"./types.ts\";\nimport { normalizeWatchdogWarningDetails } from \"./warning-format.ts\";\n\ntype ReviewStopReason = \"stop\" | \"error\" | \"aborted\" | \"length\";\n\nexport interface WatchdogReviewResult {\n\twarnings?: WatchdogWarning[];\n\tstopReason?: ReviewStopReason;\n}\n\nexport interface WatchdogReviewRequest {\n\tdelta: string;\n\tepoch: number;\n\treviewId: number;\n\tconfig: ResolvedWatchdogConfig;\n\temitWarning(warning: WatchdogWarning): boolean;\n\tsignal?: AbortSignal;\n}\n\nexport type WatchdogReviewFunction = (request: WatchdogReviewRequest) => Promise<WatchdogReviewResult | void> | WatchdogReviewResult | void;\n\nexport interface WatchdogRuntimeSnapshot {\n\tstatus: WatchdogRuntimeStatus;\n\tenabled: boolean;\n\tconfig: ResolvedWatchdogConfig;\n\tconfigOk: boolean;\n\terrors: WatchdogSettingsError[];\n\tsources: WatchdogSettingsSource[];\n\tbufferedDeltas: number;\n\tepoch: number;\n\tactiveReviewId?: number;\n\tsessionOverride?: boolean;\n\tsessionModelOverride?: Partial<Pick<WatchdogEndpointConfig, \"model\" | \"thinking\">>;\n\tlastWarning?: WatchdogWarningDetails;\n\tlastError?: string;\n\tfailedReviews: number;\n\tstaleReviews: number;\n\treviewConnected: boolean;\n\treviewDescription: string;\n\tautoFollowQueued: false;\n\treviewTrigger: \"turn-delta\" | \"repo-edits\";\n\tchangedPaths?: string[];\n\tlsp: WatchdogLspRuntimeSnapshot;\n}\n\ninterface Waiter {\n\tresolve(settled: boolean): void;\n\ttimer: ReturnType<typeof setTimeout>;\n}\n\ninterface MainWatchdogRuntimeOptions {\n\tcwd?: string;\n\tresolveConfig?: (cwd: string, options?: { session?: Record<string, unknown> }) => WatchdogSettingsResult;\n\treview?: WatchdogReviewFunction;\n\treviewDescription?: string;\n\tdisplayWarning?: (warning: WatchdogWarningDetails) => void;\n\treviewChangesOnly?: boolean;\n\tlspDiagnostics?: WatchdogLspDiagnosticsFunction;\n}\n\ntype ContextLike = Pick<ExtensionContext, \"cwd\">;\ntype ReviewDeltaOutcome = \"completed\" | \"timeout\" | \"stale\";\n\nconst DEFAULT_REVIEW: WatchdogReviewFunction = () => ({ warnings: [] });\nconst MAX_REVIEW_INPUT_CHARS = 24_000;\nconst REVIEW_DELTA_SEPARATOR = \"\\n\\n---\\n\\n\";\n\nfunction errorMessage(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error);\n}\n\nfunction promptFromBeforeAgentStart(event: unknown): string | undefined {\n\tif (!event || typeof event !== \"object\") return undefined;\n\tconst input = event as { prompt?: unknown; systemPrompt?: unknown };\n\tif (typeof input.prompt === \"string\") return input.prompt;\n\tif (typeof input.systemPrompt === \"string\") return input.systemPrompt;\n\treturn undefined;\n}\n\nfunction reviewInputSignature(input: string): string {\n\treturn createHash(\"sha256\").update(input).digest(\"hex\");\n}\n\nexport class MainWatchdogRuntime {\n\tprivate cwd: string;\n\tprivate readonly resolveConfig: (cwd: string, options?: { session?: Record<string, unknown> }) => WatchdogSettingsResult;\n\tprivate readonly review: WatchdogReviewFunction;\n\tprivate readonly reviewConnected: boolean;\n\tprivate readonly reviewDescription: string;\n\tprivate readonly displayWarning: ((warning: WatchdogWarningDetails) => void) | undefined;\n\tprivate readonly reviewChangesOnly: boolean;\n\tprivate readonly lspDiagnostics: WatchdogLspDiagnosticsFunction;\n\tprivate readonly lspLedger = new WatchdogLspDiagnosticsLedger();\n\tprivate configResult: WatchdogSettingsResult;\n\tprivate sessionOverrideEnabled: boolean | undefined;\n\tprivate sessionModelOverride: Partial<Pick<WatchdogEndpointConfig, \"model\" | \"thinking\">> | undefined;\n\tprivate status: WatchdogRuntimeStatus = \"idle\";\n\tprivate pendingDeltas: string[] = [];\n\tprivate pendingDeltaChars = 0;\n\tprivate guard = new WatchdogEmissionGuard();\n\tprivate guardMaxWarnings: number | null = null;\n\tprivate epoch = 0;\n\tprivate reviewIdCounter = 0;\n\tprivate agentEndIdCounter = 0;\n\tprivate activeAgentEndId: number | undefined;\n\tprivate activeAgentEndAbortController: AbortController | undefined;\n\tprivate activeReviewId: number | undefined;\n\tprivate activeReviewWarning: WatchdogWarningDetails | undefined;\n\tprivate reviewing = false;\n\tprivate waitingAtAgentEnd = false;\n\tprivate disposed = false;\n\tprivate includeUserPromptInNextDelta = false;\n\tprivate userPrompt: string | undefined;\n\tprivate waiters: Waiter[] = [];\n\tprivate lastWarning: WatchdogWarningDetails | undefined;\n\tprivate lastError: string | undefined;\n\tprivate lastReviewInputSignature: string | undefined;\n\tprivate turnStartChangeSignature: WatchdogRepoChangeSignature | undefined;\n\tprivate lastReviewedChangeSignature: string | undefined;\n\tprivate currentChangedPaths: string[] | undefined;\n\tprivate lastLspSnapshot: WatchdogLspRuntimeSnapshot | undefined;\n\tprivate observedRepoEditThisTurn = false;\n\tprivate failedReviews = 0;\n\tprivate staleReviews = 0;\n\n\tconstructor(options: MainWatchdogRuntimeOptions = {}) {\n\t\tthis.cwd = options.cwd ?? process.cwd();\n\t\tthis.resolveConfig = options.resolveConfig ?? resolveWatchdogConfig;\n\t\tthis.review = options.review ?? DEFAULT_REVIEW;\n\t\tthis.reviewConnected = Boolean(options.review);\n\t\tthis.reviewDescription = options.reviewDescription ?? (options.review ? \"injected seam\" : \"not wired\");\n\t\tthis.displayWarning = options.displayWarning;\n\t\tthis.reviewChangesOnly = options.reviewChangesOnly === true;\n\t\tthis.lspDiagnostics = options.lspDiagnostics ?? collectWatchdogLspDiagnostics;\n\t\tthis.configResult = this.resolveConfig(this.cwd);\n\t\tthis.guardMaxWarnings = this.configResult.config.maxWarnings;\n\t\tthis.guard = new WatchdogEmissionGuard({ maxWarnings: this.guardMaxWarnings });\n\t}\n\n\tbindSession(ctx: ContextLike): void {\n\t\tthis.cwd = ctx.cwd;\n\t\tthis.sessionOverrideEnabled = undefined;\n\t\tthis.sessionModelOverride = undefined;\n\t\tthis.reset(\"session_start\", { clearReviewInputSignature: true, clearChangeSignature: true, clearLspLedger: true });\n\t\tthis.refreshConfig(ctx.cwd);\n\t}\n\n\trefreshConfig(cwd = this.cwd): WatchdogSettingsResult {\n\t\tthis.cwd = cwd;\n\t\tconst wasEnabled = this.isEnabled();\n\t\tconst session = this.sessionOverrideEnabled === undefined && this.sessionModelOverride === undefined\n\t\t\t? undefined\n\t\t\t: {\n\t\t\t\t...(this.sessionOverrideEnabled === undefined ? {} : { enabled: this.sessionOverrideEnabled }),\n\t\t\t\tmain: {\n\t\t\t\t\t...(this.sessionOverrideEnabled === undefined ? {} : { enabled: this.sessionOverrideEnabled }),\n\t\t\t\t\t...(this.sessionModelOverride ?? {}),\n\t\t\t\t},\n\t\t\t};\n\t\tthis.configResult = this.resolveConfig(this.cwd, session === undefined ? undefined : { session });\n\t\tif (this.configResult.config.maxWarnings !== this.guardMaxWarnings) {\n\t\t\tthis.guardMaxWarnings = this.configResult.config.maxWarnings;\n\t\t\tthis.guard = new WatchdogEmissionGuard({ maxWarnings: this.guardMaxWarnings });\n\t\t}\n\t\tif (wasEnabled && !this.isEnabled()) {\n\t\t\tthis.invalidateActiveReview(\"watchdog disabled\");\n\t\t\tthis.clearRepoChangeBaseline();\n\t\t}\n\t\treturn this.configResult;\n\t}\n\n\tsetSessionEnabled(enabled: boolean, cwd = this.cwd): WatchdogRuntimeSnapshot {\n\t\tthis.sessionOverrideEnabled = enabled;\n\t\tthis.reset(\"session override\");\n\t\tthis.refreshConfig(cwd);\n\t\treturn this.getSnapshot();\n\t}\n\n\tsetSessionModel(patch: { model?: string | null; thinking?: WatchdogEndpointConfig[\"thinking\"] | null }, cwd = this.cwd): WatchdogRuntimeSnapshot {\n\t\tconst next = { ...(this.sessionModelOverride ?? {}) };\n\t\tif (patch.model === null) delete next.model;\n\t\telse if (patch.model !== undefined) next.model = patch.model;\n\t\tif (patch.thinking === null) delete next.thinking;\n\t\telse if (patch.thinking !== undefined) next.thinking = patch.thinking;\n\t\tthis.sessionModelOverride = next.model === undefined && next.thinking === undefined ? undefined : next;\n\t\tthis.reset(\"session model override\");\n\t\tthis.refreshConfig(cwd);\n\t\treturn this.getSnapshot();\n\t}\n\n\tclearSessionModel(cwd = this.cwd): WatchdogRuntimeSnapshot {\n\t\tthis.sessionModelOverride = undefined;\n\t\tthis.reset(\"session model override cleared\");\n\t\tthis.refreshConfig(cwd);\n\t\treturn this.getSnapshot();\n\t}\n\n\tclearSessionOverride(cwd = this.cwd): WatchdogRuntimeSnapshot {\n\t\tthis.sessionOverrideEnabled = undefined;\n\t\tthis.sessionModelOverride = undefined;\n\t\tthis.reset(\"session override cleared\");\n\t\tthis.refreshConfig(cwd);\n\t\treturn this.getSnapshot();\n\t}\n\n\treset(_reason = \"reset\", options: { clearReviewInputSignature?: boolean; clearChangeSignature?: boolean; clearLspLedger?: boolean } = {}): void {\n\t\tthis.abortActiveAgentEnd();\n\t\tthis.epoch++;\n\t\tthis.status = \"idle\";\n\t\tthis.clearPendingDeltas();\n\t\tthis.reviewing = false;\n\t\tthis.waitingAtAgentEnd = false;\n\t\tthis.activeReviewId = undefined;\n\t\tthis.activeReviewWarning = undefined;\n\t\tthis.includeUserPromptInNextDelta = false;\n\t\tthis.userPrompt = undefined;\n\t\tthis.lastError = undefined;\n\t\tthis.currentChangedPaths = undefined;\n\t\tthis.observedRepoEditThisTurn = false;\n\t\tif (options.clearLspLedger) {\n\t\t\tthis.lspLedger.reset();\n\t\t\tthis.lastLspSnapshot = undefined;\n\t\t}\n\t\tif (options.clearReviewInputSignature) this.lastReviewInputSignature = undefined;\n\t\tif (options.clearChangeSignature) this.clearRepoChangeBaseline();\n\t\tthis.guard.reset();\n\t\tthis.resolveWaiters(true);\n\t}\n\n\tdispose(): void {\n\t\tthis.disposed = true;\n\t\tthis.abortActiveAgentEnd();\n\t\tthis.epoch++;\n\t\tthis.status = \"idle\";\n\t\tthis.clearPendingDeltas();\n\t\tthis.reviewing = false;\n\t\tthis.waitingAtAgentEnd = false;\n\t\tthis.activeReviewId = undefined;\n\t\tthis.activeReviewWarning = undefined;\n\t\tthis.lastReviewInputSignature = undefined;\n\t\tthis.clearRepoChangeBaseline();\n\t\tthis.lastLspSnapshot = undefined;\n\t\tthis.lspLedger.reset();\n\t\tthis.resolveWaiters(false);\n\t}\n\n\thandleBeforeAgentStart(event: unknown, ctx: ContextLike): void {\n\t\tif (this.disposed) return;\n\t\tthis.reset(\"before_agent_start\");\n\t\tthis.refreshConfig(ctx.cwd);\n\t\tthis.userPrompt = promptFromBeforeAgentStart(event);\n\t\tthis.includeUserPromptInNextDelta = Boolean(this.userPrompt?.trim());\n\t\tthis.resetRepoChangeBaseline();\n\t}\n\n\thandleTurnEnd(event: unknown, ctx: ContextLike): void {\n\t\tif (this.disposed) return;\n\t\tthis.refreshConfig(ctx.cwd);\n\t\tif (!this.isEnabled()) return;\n\t\ttry {\n\t\t\tthis.observedRepoEditThisTurn ||= eventIndicatesRepoEdit(event);\n\t\t\tconst delta = formatWatchdogTurnDelta({\n\t\t\t\tincludeUserPrompt: this.includeUserPromptInNextDelta,\n\t\t\t\tuserPrompt: this.userPrompt,\n\t\t\t\tevents: [event],\n\t\t\t});\n\t\t\tthis.includeUserPromptInNextDelta = false;\n\t\t\tthis.enqueueDelta(delta);\n\t\t} catch (error) {\n\t\t\tthis.fail(`Failed to format watchdog turn delta: ${errorMessage(error)}`);\n\t\t}\n\t}\n\n\tenqueueDelta(delta: string): void {\n\t\tif (this.disposed || !delta.trim() || !this.isEnabled()) return;\n\t\tthis.appendBoundedDelta(delta);\n\t\tif (!this.reviewing && !this.waitingAtAgentEnd) this.status = \"queued\";\n\t}\n\n\tasync handleAgentEnd(_event: unknown, ctx: ContextLike): Promise<void> {\n\t\tif (this.disposed) return;\n\t\tthis.refreshConfig(ctx.cwd);\n\t\tif (!this.isEnabled()) return;\n\t\tconst changeSignature = this.resolveReviewChangeSignature(ctx.cwd);\n\t\tif (this.reviewChangesOnly && !changeSignature) {\n\t\t\tthis.clearPendingDeltas();\n\t\t\tif (this.status === \"queued\") this.status = \"idle\";\n\t\t\tthis.resolveWaiters(true);\n\t\t\treturn;\n\t\t}\n\t\tif (changeSignature && changeSignature.key === this.lastReviewedChangeSignature) {\n\t\t\tthis.clearPendingDeltas();\n\t\t\tthis.status = \"idle\";\n\t\t\tthis.resolveWaiters(true);\n\t\t\treturn;\n\t\t}\n\t\tthis.waitingAtAgentEnd = true;\n\t\tconst agentEndEpoch = this.epoch;\n\t\tconst agentEndId = ++this.agentEndIdCounter;\n\t\tconst lspAbortController = new AbortController();\n\t\tthis.activeAgentEndId = agentEndId;\n\t\tthis.activeAgentEndAbortController = lspAbortController;\n\t\ttry {\n\t\t\tthis.guard.startModelUpdate();\n\t\t\tconst lspBlock = await this.collectLspDiagnostics(changeSignature, {\n\t\t\t\tepoch: agentEndEpoch,\n\t\t\t\tagentEndId,\n\t\t\t\tsignal: lspAbortController.signal,\n\t\t\t});\n\t\t\tif (this.activeAgentEndAbortController === lspAbortController) this.activeAgentEndAbortController = undefined;\n\t\t\tif (!this.isAgentEndCurrent(agentEndEpoch, agentEndId)) return;\n\t\t\tconst delta = this.buildReviewInput(changeSignature, lspBlock);\n\t\t\tthis.clearPendingDeltas();\n\t\t\tif (!delta.trim()) {\n\t\t\t\tthis.waitingAtAgentEnd = false;\n\t\t\t\tif (this.status === \"queued\") this.status = \"idle\";\n\t\t\t\tthis.resolveWaiters(true);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst signature = reviewInputSignature(delta);\n\t\t\tif (!this.reviewChangesOnly && signature === this.lastReviewInputSignature) {\n\t\t\t\tthis.waitingAtAgentEnd = false;\n\t\t\t\tthis.status = \"idle\";\n\t\t\t\tthis.resolveWaiters(true);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst outcome = await this.reviewDelta(delta, this.configResult.config.agentEndTimeoutMs);\n\t\t\tthis.waitingAtAgentEnd = false;\n\t\t\tif (outcome === \"timeout\") {\n\t\t\t\tthis.staleReviews++;\n\t\t\t\tthis.invalidateActiveReview(\"agent-end timeout\");\n\t\t\t\tthis.status = \"stale\";\n\t\t\t\tthis.markLastWarningStale();\n\t\t\t\tthis.resolveWaiters(true);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (outcome === \"completed\" && this.status !== \"failed\" && this.status !== \"stale\") {\n\t\t\t\tthis.lastReviewInputSignature = signature;\n\t\t\t\tif (changeSignature) this.lastReviewedChangeSignature = changeSignature.key;\n\t\t\t\tthis.currentChangedPaths = changeSignature?.changedPaths;\n\t\t\t\tthis.status = \"idle\";\n\t\t\t}\n\t\t\tthis.resolveWaiters(true);\n\t\t} finally {\n\t\t\tif (this.activeAgentEndAbortController === lspAbortController) this.activeAgentEndAbortController = undefined;\n\t\t\tif (this.activeAgentEndId === agentEndId) this.activeAgentEndId = undefined;\n\t\t}\n\t}\n\n\trecordDisplayedWarning(warning: WatchdogWarning): WatchdogWarningDetails {\n\t\tconst details = normalizeWatchdogWarningDetails(warning, { state: \"displayed\", source: warning.source ?? \"main\" });\n\t\tthis.lastWarning = details;\n\t\treturn details;\n\t}\n\n\tgetSnapshot(cwd?: string): WatchdogRuntimeSnapshot {\n\t\tif (cwd) this.refreshConfig(cwd);\n\t\treturn {\n\t\t\tstatus: this.status,\n\t\t\tenabled: this.isEnabled(),\n\t\t\tconfig: this.configResult.config,\n\t\t\tconfigOk: this.configResult.ok,\n\t\t\terrors: [...this.configResult.errors],\n\t\t\tsources: [...this.configResult.sources],\n\t\t\tbufferedDeltas: this.pendingDeltas.length,\n\t\t\tepoch: this.epoch,\n\t\t\t...(this.activeReviewId !== undefined ? { activeReviewId: this.activeReviewId } : {}),\n\t\t\t...(this.sessionOverrideEnabled !== undefined ? { sessionOverride: this.sessionOverrideEnabled } : {}),\n\t\t\t...(this.sessionModelOverride !== undefined ? { sessionModelOverride: { ...this.sessionModelOverride } } : {}),\n\t\t\t...(this.lastWarning ? { lastWarning: this.lastWarning } : {}),\n\t\t\t...(this.lastError ? { lastError: this.lastError } : {}),\n\t\t\tfailedReviews: this.failedReviews,\n\t\t\tstaleReviews: this.staleReviews,\n\t\t\treviewConnected: this.reviewConnected,\n\t\t\treviewDescription: this.reviewDescription,\n\t\t\tautoFollowQueued: false,\n\t\t\treviewTrigger: this.reviewChangesOnly ? \"repo-edits\" : \"turn-delta\",\n\t\t\t...(this.currentChangedPaths?.length ? { changedPaths: [...this.currentChangedPaths] } : {}),\n\t\t\tlsp: this.lspSnapshot(),\n\t\t};\n\t}\n\n\tasync waitForIdle(timeoutMs = 1_000): Promise<boolean> {\n\t\treturn this.waitForSettled(timeoutMs);\n\t}\n\n\tprivate isEnabled(): boolean {\n\t\treturn this.configResult.ok && this.configResult.config.main.enabled;\n\t}\n\n\tprivate abortActiveAgentEnd(): void {\n\t\tthis.activeAgentEndAbortController?.abort();\n\t\tthis.activeAgentEndAbortController = undefined;\n\t\tthis.activeAgentEndId = undefined;\n\t}\n\n\tprivate isAgentEndCurrent(epoch: number, agentEndId: number): boolean {\n\t\treturn !this.disposed && this.epoch === epoch && this.activeAgentEndId === agentEndId && this.waitingAtAgentEnd && this.isEnabled();\n\t}\n\n\tprivate isCurrent(epoch: number, reviewId: number): boolean {\n\t\treturn !this.disposed && this.epoch === epoch && this.activeReviewId === reviewId;\n\t}\n\n\tprivate acceptWarning(epoch: number, reviewId: number, warning: WatchdogWarning): boolean {\n\t\tif (!this.isCurrent(epoch, reviewId) || !this.isEnabled()) return false;\n\t\tconst decision = this.guard.evaluate(warning);\n\t\tif (!decision.accepted) return false;\n\t\tconst details = normalizeWatchdogWarningDetails(warning, {\n\t\t\tstate: \"candidate\",\n\t\t\tsource: warning.source ?? \"main\",\n\t\t\tidentity: decision.identity,\n\t\t});\n\t\tthis.lastWarning = details;\n\t\tthis.activeReviewWarning = details;\n\t\treturn true;\n\t}\n\n\tprivate displayBoundaryWarning(warning: WatchdogWarning): boolean {\n\t\tif (!this.isEnabled()) return false;\n\t\tconst decision = this.guard.evaluate(warning);\n\t\tif (!decision.accepted) return false;\n\t\tconst details = normalizeWatchdogWarningDetails(warning, {\n\t\t\tstate: \"displayed\",\n\t\t\tsource: warning.source ?? \"main\",\n\t\t\tidentity: decision.identity,\n\t\t\tdisplayedAt: new Date().toISOString(),\n\t\t});\n\t\tthis.lastWarning = details;\n\t\tthis.displayWarning?.(details);\n\t\treturn true;\n\t}\n\n\tprivate invalidateActiveReview(_reason: string): void {\n\t\tthis.abortActiveAgentEnd();\n\t\tthis.epoch++;\n\t\tthis.status = \"idle\";\n\t\tthis.clearPendingDeltas();\n\t\tthis.reviewing = false;\n\t\tthis.waitingAtAgentEnd = false;\n\t\tthis.activeReviewId = undefined;\n\t\tthis.activeReviewWarning = undefined;\n\t}\n\n\tprivate async reviewDelta(delta: string, timeoutMs: number): Promise<ReviewDeltaOutcome> {\n\t\tif (this.reviewing || this.disposed) return \"stale\";\n\t\tthis.reviewing = true;\n\t\tconst reviewEpoch = this.epoch;\n\t\tconst reviewId = ++this.reviewIdCounter;\n\t\tthis.activeReviewId = reviewId;\n\t\tthis.activeReviewWarning = undefined;\n\t\tthis.status = \"reviewing\";\n\t\tlet timeout: ReturnType<typeof setTimeout> | undefined;\n\t\tconst abortController = new AbortController();\n\t\tconst reviewPromise = Promise.resolve().then(() => this.review({\n\t\t\tdelta,\n\t\t\tepoch: reviewEpoch,\n\t\t\treviewId,\n\t\t\tconfig: this.configResult.config,\n\t\t\tsignal: abortController.signal,\n\t\t\temitWarning: (warning) => this.acceptWarning(reviewEpoch, reviewId, warning),\n\t\t}));\n\t\ttry {\n\t\t\tconst result = await Promise.race([\n\t\t\t\treviewPromise,\n\t\t\t\tnew Promise<\"timeout\">((resolve) => {\n\t\t\t\t\ttimeout = setTimeout(() => resolve(\"timeout\"), timeoutMs);\n\t\t\t\t}),\n\t\t\t]);\n\t\t\tif (result === \"timeout\") {\n\t\t\t\tabortController.abort();\n\t\t\t\treturn \"timeout\";\n\t\t\t}\n\t\t\tif (!this.isCurrent(reviewEpoch, reviewId)) return \"stale\";\n\t\t\tfor (const warning of result?.warnings ?? []) this.acceptWarning(reviewEpoch, reviewId, warning);\n\t\t\tif (result?.stopReason && result.stopReason !== \"stop\") {\n\t\t\t\tthis.fail(`Watchdog review ended with stop reason '${result.stopReason}'.`);\n\t\t\t\treturn \"completed\";\n\t\t\t}\n\t\t\tthis.displayAcceptedReviewWarning();\n\t\t\treturn \"completed\";\n\t\t} catch (error) {\n\t\t\tif (this.isCurrent(reviewEpoch, reviewId)) {\n\t\t\t\tthis.fail(`Watchdog review failed: ${errorMessage(error)}`);\n\t\t\t\treturn \"completed\";\n\t\t\t}\n\t\t\treturn \"stale\";\n\t\t} finally {\n\t\t\tif (timeout) clearTimeout(timeout);\n\t\t\tif (this.epoch === reviewEpoch && this.activeReviewId === reviewId) {\n\t\t\t\tthis.reviewing = false;\n\t\t\t\tthis.activeReviewId = undefined;\n\t\t\t\tthis.activeReviewWarning = undefined;\n\t\t\t}\n\t\t\tthis.resolveWaiters(this.isSettled());\n\t\t}\n\t}\n\n\tprivate displayAcceptedReviewWarning(): void {\n\t\tif (!this.activeReviewWarning) return;\n\t\tconst details: WatchdogWarningDetails = {\n\t\t\t...this.activeReviewWarning,\n\t\t\tstate: \"displayed\",\n\t\t\tdisplayedAt: new Date().toISOString(),\n\t\t};\n\t\tthis.lastWarning = details;\n\t\tthis.displayWarning?.(details);\n\t}\n\n\tprivate currentRepoChangeSignature(cwd = this.cwd): WatchdogRepoChangeSignature | undefined {\n\t\treturn this.reviewChangesOnly && this.isEnabled() ? computeWatchdogRepoChangeSignature(cwd) : undefined;\n\t}\n\n\tprivate clearRepoChangeBaseline(): void {\n\t\tthis.turnStartChangeSignature = undefined;\n\t\tthis.lastReviewedChangeSignature = undefined;\n\t\tthis.currentChangedPaths = undefined;\n\t\tthis.observedRepoEditThisTurn = false;\n\t}\n\n\tprivate resetRepoChangeBaseline(): void {\n\t\tthis.turnStartChangeSignature = this.currentRepoChangeSignature();\n\t\tthis.lastReviewedChangeSignature ??= this.turnStartChangeSignature?.key;\n\t\tthis.currentChangedPaths = this.turnStartChangeSignature?.changedPaths;\n\t\tthis.observedRepoEditThisTurn = false;\n\t}\n\n\tprivate resolveReviewChangeSignature(cwd = this.cwd): WatchdogRepoChangeSignature | undefined {\n\t\tif (!this.reviewChangesOnly) return undefined;\n\t\tconst current = this.currentRepoChangeSignature(cwd);\n\t\tif (current) {\n\t\t\tthis.currentChangedPaths = current.changedPaths;\n\t\t\tif (current.key === this.turnStartChangeSignature?.key) return undefined;\n\t\t\tif (current.changedPaths.length === 0) return undefined;\n\t\t\treturn current;\n\t\t}\n\t\treturn this.observedRepoEditThisTurn\n\t\t\t? { root: cwd, key: `observed-edit:${this.epoch}:${this.reviewIdCounter}:${this.pendingDeltaChars}`, changedPaths: [] }\n\t\t\t: undefined;\n\t}\n\n\tprivate async collectLspDiagnostics(changeSignature: WatchdogRepoChangeSignature | undefined, current: { epoch: number; agentEndId: number; signal: AbortSignal }): Promise<string> {\n\t\tconst config = this.configResult.config.lsp;\n\t\tif (!config.enabled || !changeSignature?.changedPaths.length) {\n\t\t\tthis.lastLspSnapshot = {\n\t\t\t\tenabled: config.enabled,\n\t\t\t\tstatus: config.enabled ? \"skipped\" : \"disabled\",\n\t\t\t\tcheckedPaths: [],\n\t\t\t\tskippedPaths: [],\n\t\t\t\tdiagnostics: [],\n\t\t\t\tdiagnosticCount: 0,\n\t\t\t\tfreshDiagnosticCount: 0,\n\t\t\t\tupdatedAt: new Date().toISOString(),\n\t\t\t};\n\t\t\treturn \"\";\n\t\t}\n\t\ttry {\n\t\t\tconst raw = await this.lspDiagnostics({\n\t\t\t\tcwd: this.cwd,\n\t\t\t\troot: changeSignature.root,\n\t\t\t\tchangedPaths: changeSignature.changedPaths,\n\t\t\t\tconfig,\n\t\t\t\tsignal: current.signal,\n\t\t\t});\n\t\t\tif (!this.isAgentEndCurrent(current.epoch, current.agentEndId)) return \"\";\n\t\t\tconst diagnosticCount = raw.diagnostics.length;\n\t\t\tconst fresh = this.lspLedger.reduce(raw);\n\t\t\tthis.lastLspSnapshot = {\n\t\t\t\t...fresh,\n\t\t\t\tenabled: true,\n\t\t\t\tdiagnosticCount,\n\t\t\t\tfreshDiagnosticCount: fresh.diagnostics.length,\n\t\t\t\tupdatedAt: new Date().toISOString(),\n\t\t\t};\n\t\t\tconst warning = watchdogWarningFromLspDiagnostics(fresh);\n\t\t\tif (warning) this.displayBoundaryWarning(warning);\n\t\t\treturn formatWatchdogLspDiagnosticsBlock(fresh);\n\t\t} catch (error) {\n\t\t\tif (!this.isAgentEndCurrent(current.epoch, current.agentEndId)) return \"\";\n\t\t\tthis.lastLspSnapshot = {\n\t\t\t\tenabled: true,\n\t\t\t\tstatus: \"failed\",\n\t\t\t\tcheckedPaths: [],\n\t\t\t\tskippedPaths: changeSignature.changedPaths,\n\t\t\t\tdiagnostics: [],\n\t\t\t\tdiagnosticCount: 0,\n\t\t\t\tfreshDiagnosticCount: 0,\n\t\t\t\tmessage: `LSP diagnostics failed: ${errorMessage(error)}`,\n\t\t\t\tupdatedAt: new Date().toISOString(),\n\t\t\t};\n\t\t\treturn \"\";\n\t\t}\n\t}\n\n\tprivate lspSnapshot(): WatchdogLspRuntimeSnapshot {\n\t\tif (this.lastLspSnapshot) return {\n\t\t\t...this.lastLspSnapshot,\n\t\t\tcheckedPaths: [...this.lastLspSnapshot.checkedPaths],\n\t\t\tskippedPaths: [...this.lastLspSnapshot.skippedPaths],\n\t\t\tdiagnostics: [...this.lastLspSnapshot.diagnostics],\n\t\t};\n\t\tconst enabled = this.isEnabled() && this.configResult.config.lsp.enabled;\n\t\treturn {\n\t\t\tenabled,\n\t\t\tstatus: enabled ? \"skipped\" : \"disabled\",\n\t\t\tcheckedPaths: [],\n\t\t\tskippedPaths: [],\n\t\t\tdiagnostics: [],\n\t\t\tdiagnosticCount: 0,\n\t\t\tfreshDiagnosticCount: 0,\n\t\t};\n\t}\n\n\tprivate appendBoundedDelta(delta: string): void {\n\t\tlet entry = delta.trim();\n\t\tif (!entry) return;\n\t\tif (entry.length > MAX_REVIEW_INPUT_CHARS) entry = entry.slice(-MAX_REVIEW_INPUT_CHARS);\n\t\tthis.pendingDeltas.push(entry);\n\t\tthis.pendingDeltaChars += entry.length;\n\t\twhile (this.pendingDeltas.length > 1 && this.pendingDeltaChars + (this.pendingDeltas.length - 1) * REVIEW_DELTA_SEPARATOR.length > MAX_REVIEW_INPUT_CHARS) {\n\t\t\tconst removed = this.pendingDeltas.shift();\n\t\t\tif (removed) this.pendingDeltaChars -= removed.length;\n\t\t}\n\t}\n\n\tprivate buildReviewInput(changeSignature?: WatchdogRepoChangeSignature, lspBlock = \"\"): string {\n\t\tconst input = this.pendingDeltas.join(REVIEW_DELTA_SEPARATOR);\n\t\tconst changes = changeSignature?.changedPaths.length\n\t\t\t? [\"Changed repo paths:\", ...changeSignature.changedPaths.slice(0, 200).map((file) => `- ${file}`)].join(\"\\n\")\n\t\t\t: \"\";\n\t\tconst contextPieces = [changes, lspBlock].filter(Boolean);\n\t\tif (!contextPieces.length) return input.length > MAX_REVIEW_INPUT_CHARS ? input.slice(-MAX_REVIEW_INPUT_CHARS) : input;\n\n\t\tconst maxContextLength = Math.floor(MAX_REVIEW_INPUT_CHARS / 2);\n\t\tconst maxPieceLength = Math.max(1_000, Math.floor(maxContextLength / contextPieces.length));\n\t\tconst boundedContext = contextPieces.map((piece) => piece.length > maxPieceLength\n\t\t\t? `${piece.slice(0, maxPieceLength - 6)}\\n- ...`\n\t\t\t: piece).join(REVIEW_DELTA_SEPARATOR);\n\t\tconst separatorLength = input ? REVIEW_DELTA_SEPARATOR.length : 0;\n\t\tconst inputBudget = MAX_REVIEW_INPUT_CHARS - boundedContext.length - separatorLength;\n\t\tconst boundedInput = inputBudget <= 0\n\t\t\t? \"\"\n\t\t\t: input.length > inputBudget\n\t\t\t\t? input.slice(-inputBudget)\n\t\t\t\t: input;\n\t\treturn [boundedContext, boundedInput].filter(Boolean).join(REVIEW_DELTA_SEPARATOR);\n\t}\n\n\tprivate clearPendingDeltas(): void {\n\t\tthis.pendingDeltas = [];\n\t\tthis.pendingDeltaChars = 0;\n\t}\n\n\tprivate fail(message: string): void {\n\t\tthis.failedReviews++;\n\t\tthis.lastError = message;\n\t\tthis.status = \"failed\";\n\t\tthis.clearPendingDeltas();\n\t\tthis.resolveWaiters(true);\n\t}\n\n\tprivate markLastWarningStale(): void {\n\t\tif (!this.lastWarning || this.lastWarning.state === \"displayed\") return;\n\t\tthis.lastWarning = { ...this.lastWarning, stale: true, state: \"stale\" };\n\t}\n\n\tprivate isSettled(): boolean {\n\t\treturn !this.reviewing && this.pendingDeltas.length === 0;\n\t}\n\n\tprivate waitForSettled(timeoutMs: number): Promise<boolean> {\n\t\tif (this.isSettled()) return Promise.resolve(true);\n\t\treturn new Promise((resolve) => {\n\t\t\tconst waiter: Waiter = {\n\t\t\t\tresolve,\n\t\t\t\ttimer: setTimeout(() => {\n\t\t\t\t\tthis.waiters = this.waiters.filter((entry) => entry !== waiter);\n\t\t\t\t\tresolve(false);\n\t\t\t\t}, timeoutMs),\n\t\t\t};\n\t\t\tthis.waiters.push(waiter);\n\t\t});\n\t}\n\n\tprivate resolveWaiters(settled: boolean): void {\n\t\tif (!settled && !this.disposed) return;\n\t\tconst waiters = this.waiters;\n\t\tthis.waiters = [];\n\t\tfor (const waiter of waiters) {\n\t\t\tclearTimeout(waiter.timer);\n\t\t\twaiter.resolve(settled);\n\t\t}\n\t}\n}\n"]}
@@ -78,16 +78,13 @@ export class MainWatchdogRuntime {
78
78
  this.configResult = this.resolveConfig(this.cwd);
79
79
  this.guardMaxWarnings = this.configResult.config.maxWarnings;
80
80
  this.guard = new WatchdogEmissionGuard({ maxWarnings: this.guardMaxWarnings });
81
- this.turnStartChangeSignature = this.currentRepoChangeSignature();
82
- this.lastReviewedChangeSignature = this.turnStartChangeSignature?.key;
83
81
  }
84
82
  bindSession(ctx) {
85
83
  this.cwd = ctx.cwd;
86
84
  this.sessionOverrideEnabled = undefined;
87
85
  this.sessionModelOverride = undefined;
88
- this.reset("session_start", { clearReviewInputSignature: true, resetChangeSignature: true, clearLspLedger: true });
86
+ this.reset("session_start", { clearReviewInputSignature: true, clearChangeSignature: true, clearLspLedger: true });
89
87
  this.refreshConfig(ctx.cwd);
90
- this.resetRepoChangeBaseline();
91
88
  }
92
89
  refreshConfig(cwd = this.cwd) {
93
90
  this.cwd = cwd;
@@ -106,8 +103,10 @@ export class MainWatchdogRuntime {
106
103
  this.guardMaxWarnings = this.configResult.config.maxWarnings;
107
104
  this.guard = new WatchdogEmissionGuard({ maxWarnings: this.guardMaxWarnings });
108
105
  }
109
- if (wasEnabled && !this.isEnabled())
106
+ if (wasEnabled && !this.isEnabled()) {
110
107
  this.invalidateActiveReview("watchdog disabled");
108
+ this.clearRepoChangeBaseline();
109
+ }
111
110
  return this.configResult;
112
111
  }
113
112
  setSessionEnabled(enabled, cwd = this.cwd) {
@@ -164,8 +163,8 @@ export class MainWatchdogRuntime {
164
163
  }
165
164
  if (options.clearReviewInputSignature)
166
165
  this.lastReviewInputSignature = undefined;
167
- if (options.resetChangeSignature)
168
- this.resetRepoChangeBaseline({ reviewed: true });
166
+ if (options.clearChangeSignature)
167
+ this.clearRepoChangeBaseline();
169
168
  this.guard.reset();
170
169
  this.resolveWaiters(true);
171
170
  }
@@ -180,10 +179,9 @@ export class MainWatchdogRuntime {
180
179
  this.activeReviewId = undefined;
181
180
  this.activeReviewWarning = undefined;
182
181
  this.lastReviewInputSignature = undefined;
183
- this.currentChangedPaths = undefined;
182
+ this.clearRepoChangeBaseline();
184
183
  this.lastLspSnapshot = undefined;
185
184
  this.lspLedger.reset();
186
- this.observedRepoEditThisTurn = false;
187
185
  this.resolveWaiters(false);
188
186
  }
189
187
  handleBeforeAgentStart(event, ctx) {
@@ -462,14 +460,17 @@ export class MainWatchdogRuntime {
462
460
  this.displayWarning?.(details);
463
461
  }
464
462
  currentRepoChangeSignature(cwd = this.cwd) {
465
- return this.reviewChangesOnly ? computeWatchdogRepoChangeSignature(cwd) : undefined;
466
- }
467
- resetRepoChangeBaseline(options = {}) {
468
- this.turnStartChangeSignature = this.currentRepoChangeSignature(options.cwd ?? this.cwd);
469
- if (options.reviewed)
470
- this.lastReviewedChangeSignature = this.turnStartChangeSignature?.key;
471
- else
472
- this.lastReviewedChangeSignature ??= this.turnStartChangeSignature?.key;
463
+ return this.reviewChangesOnly && this.isEnabled() ? computeWatchdogRepoChangeSignature(cwd) : undefined;
464
+ }
465
+ clearRepoChangeBaseline() {
466
+ this.turnStartChangeSignature = undefined;
467
+ this.lastReviewedChangeSignature = undefined;
468
+ this.currentChangedPaths = undefined;
469
+ this.observedRepoEditThisTurn = false;
470
+ }
471
+ resetRepoChangeBaseline() {
472
+ this.turnStartChangeSignature = this.currentRepoChangeSignature();
473
+ this.lastReviewedChangeSignature ??= this.turnStartChangeSignature?.key;
473
474
  this.currentChangedPaths = this.turnStartChangeSignature?.changedPaths;
474
475
  this.observedRepoEditThisTurn = false;
475
476
  }
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/watchdog/runtime.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport { createHash } from \"node:crypto\";\nimport type { ExtensionContext } from \"@ashx-j/lunr\";\nimport { computeWatchdogRepoChangeSignature, eventIndicatesRepoEdit, type WatchdogRepoChangeSignature } from \"./change-signature.ts\";\nimport { WatchdogEmissionGuard } from \"./emission-guard.ts\";\nimport {\n\tcollectWatchdogLspDiagnostics,\n\tformatWatchdogLspDiagnosticsBlock,\n\tWatchdogLspDiagnosticsLedger,\n\twatchdogWarningFromLspDiagnostics,\n\ttype WatchdogLspDiagnosticsFunction,\n} from \"./lsp-diagnostics.ts\";\nimport { resolveWatchdogConfig } from \"./settings.ts\";\nimport { formatWatchdogTurnDelta } from \"./turn-delta.ts\";\nimport {\n\ttype ResolvedWatchdogConfig,\n\ttype WatchdogEndpointConfig,\n\ttype WatchdogLspRuntimeSnapshot,\n\ttype WatchdogRuntimeStatus,\n\ttype WatchdogSettingsError,\n\ttype WatchdogSettingsResult,\n\ttype WatchdogSettingsSource,\n\ttype WatchdogWarning,\n\ttype WatchdogWarningDetails,\n} from \"./types.ts\";\nimport { normalizeWatchdogWarningDetails } from \"./warning-format.ts\";\n\ntype ReviewStopReason = \"stop\" | \"error\" | \"aborted\" | \"length\";\n\nexport interface WatchdogReviewResult {\n\twarnings?: WatchdogWarning[];\n\tstopReason?: ReviewStopReason;\n}\n\nexport interface WatchdogReviewRequest {\n\tdelta: string;\n\tepoch: number;\n\treviewId: number;\n\tconfig: ResolvedWatchdogConfig;\n\temitWarning(warning: WatchdogWarning): boolean;\n\tsignal?: AbortSignal;\n}\n\nexport type WatchdogReviewFunction = (request: WatchdogReviewRequest) => Promise<WatchdogReviewResult | void> | WatchdogReviewResult | void;\n\nexport interface WatchdogRuntimeSnapshot {\n\tstatus: WatchdogRuntimeStatus;\n\tenabled: boolean;\n\tconfig: ResolvedWatchdogConfig;\n\tconfigOk: boolean;\n\terrors: WatchdogSettingsError[];\n\tsources: WatchdogSettingsSource[];\n\tbufferedDeltas: number;\n\tepoch: number;\n\tactiveReviewId?: number;\n\tsessionOverride?: boolean;\n\tsessionModelOverride?: Partial<Pick<WatchdogEndpointConfig, \"model\" | \"thinking\">>;\n\tlastWarning?: WatchdogWarningDetails;\n\tlastError?: string;\n\tfailedReviews: number;\n\tstaleReviews: number;\n\treviewConnected: boolean;\n\treviewDescription: string;\n\tautoFollowQueued: false;\n\treviewTrigger: \"turn-delta\" | \"repo-edits\";\n\tchangedPaths?: string[];\n\tlsp: WatchdogLspRuntimeSnapshot;\n}\n\ninterface Waiter {\n\tresolve(settled: boolean): void;\n\ttimer: ReturnType<typeof setTimeout>;\n}\n\ninterface MainWatchdogRuntimeOptions {\n\tcwd?: string;\n\tresolveConfig?: (cwd: string, options?: { session?: Record<string, unknown> }) => WatchdogSettingsResult;\n\treview?: WatchdogReviewFunction;\n\treviewDescription?: string;\n\tdisplayWarning?: (warning: WatchdogWarningDetails) => void;\n\treviewChangesOnly?: boolean;\n\tlspDiagnostics?: WatchdogLspDiagnosticsFunction;\n}\n\ntype ContextLike = Pick<ExtensionContext, \"cwd\">;\ntype ReviewDeltaOutcome = \"completed\" | \"timeout\" | \"stale\";\n\nconst DEFAULT_REVIEW: WatchdogReviewFunction = () => ({ warnings: [] });\nconst MAX_REVIEW_INPUT_CHARS = 24_000;\nconst REVIEW_DELTA_SEPARATOR = \"\\n\\n---\\n\\n\";\n\nfunction errorMessage(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error);\n}\n\nfunction promptFromBeforeAgentStart(event: unknown): string | undefined {\n\tif (!event || typeof event !== \"object\") return undefined;\n\tconst input = event as { prompt?: unknown; systemPrompt?: unknown };\n\tif (typeof input.prompt === \"string\") return input.prompt;\n\tif (typeof input.systemPrompt === \"string\") return input.systemPrompt;\n\treturn undefined;\n}\n\nfunction reviewInputSignature(input: string): string {\n\treturn createHash(\"sha256\").update(input).digest(\"hex\");\n}\n\nexport class MainWatchdogRuntime {\n\tprivate cwd: string;\n\tprivate readonly resolveConfig: (cwd: string, options?: { session?: Record<string, unknown> }) => WatchdogSettingsResult;\n\tprivate readonly review: WatchdogReviewFunction;\n\tprivate readonly reviewConnected: boolean;\n\tprivate readonly reviewDescription: string;\n\tprivate readonly displayWarning: ((warning: WatchdogWarningDetails) => void) | undefined;\n\tprivate readonly reviewChangesOnly: boolean;\n\tprivate readonly lspDiagnostics: WatchdogLspDiagnosticsFunction;\n\tprivate readonly lspLedger = new WatchdogLspDiagnosticsLedger();\n\tprivate configResult: WatchdogSettingsResult;\n\tprivate sessionOverrideEnabled: boolean | undefined;\n\tprivate sessionModelOverride: Partial<Pick<WatchdogEndpointConfig, \"model\" | \"thinking\">> | undefined;\n\tprivate status: WatchdogRuntimeStatus = \"idle\";\n\tprivate pendingDeltas: string[] = [];\n\tprivate pendingDeltaChars = 0;\n\tprivate guard = new WatchdogEmissionGuard();\n\tprivate guardMaxWarnings: number | null = null;\n\tprivate epoch = 0;\n\tprivate reviewIdCounter = 0;\n\tprivate agentEndIdCounter = 0;\n\tprivate activeAgentEndId: number | undefined;\n\tprivate activeAgentEndAbortController: AbortController | undefined;\n\tprivate activeReviewId: number | undefined;\n\tprivate activeReviewWarning: WatchdogWarningDetails | undefined;\n\tprivate reviewing = false;\n\tprivate waitingAtAgentEnd = false;\n\tprivate disposed = false;\n\tprivate includeUserPromptInNextDelta = false;\n\tprivate userPrompt: string | undefined;\n\tprivate waiters: Waiter[] = [];\n\tprivate lastWarning: WatchdogWarningDetails | undefined;\n\tprivate lastError: string | undefined;\n\tprivate lastReviewInputSignature: string | undefined;\n\tprivate turnStartChangeSignature: WatchdogRepoChangeSignature | undefined;\n\tprivate lastReviewedChangeSignature: string | undefined;\n\tprivate currentChangedPaths: string[] | undefined;\n\tprivate lastLspSnapshot: WatchdogLspRuntimeSnapshot | undefined;\n\tprivate observedRepoEditThisTurn = false;\n\tprivate failedReviews = 0;\n\tprivate staleReviews = 0;\n\n\tconstructor(options: MainWatchdogRuntimeOptions = {}) {\n\t\tthis.cwd = options.cwd ?? process.cwd();\n\t\tthis.resolveConfig = options.resolveConfig ?? resolveWatchdogConfig;\n\t\tthis.review = options.review ?? DEFAULT_REVIEW;\n\t\tthis.reviewConnected = Boolean(options.review);\n\t\tthis.reviewDescription = options.reviewDescription ?? (options.review ? \"injected seam\" : \"not wired\");\n\t\tthis.displayWarning = options.displayWarning;\n\t\tthis.reviewChangesOnly = options.reviewChangesOnly === true;\n\t\tthis.lspDiagnostics = options.lspDiagnostics ?? collectWatchdogLspDiagnostics;\n\t\tthis.configResult = this.resolveConfig(this.cwd);\n\t\tthis.guardMaxWarnings = this.configResult.config.maxWarnings;\n\t\tthis.guard = new WatchdogEmissionGuard({ maxWarnings: this.guardMaxWarnings });\n\t\tthis.turnStartChangeSignature = this.currentRepoChangeSignature();\n\t\tthis.lastReviewedChangeSignature = this.turnStartChangeSignature?.key;\n\t}\n\n\tbindSession(ctx: ContextLike): void {\n\t\tthis.cwd = ctx.cwd;\n\t\tthis.sessionOverrideEnabled = undefined;\n\t\tthis.sessionModelOverride = undefined;\n\t\tthis.reset(\"session_start\", { clearReviewInputSignature: true, resetChangeSignature: true, clearLspLedger: true });\n\t\tthis.refreshConfig(ctx.cwd);\n\t\tthis.resetRepoChangeBaseline();\n\t}\n\n\trefreshConfig(cwd = this.cwd): WatchdogSettingsResult {\n\t\tthis.cwd = cwd;\n\t\tconst wasEnabled = this.isEnabled();\n\t\tconst session = this.sessionOverrideEnabled === undefined && this.sessionModelOverride === undefined\n\t\t\t? undefined\n\t\t\t: {\n\t\t\t\t...(this.sessionOverrideEnabled === undefined ? {} : { enabled: this.sessionOverrideEnabled }),\n\t\t\t\tmain: {\n\t\t\t\t\t...(this.sessionOverrideEnabled === undefined ? {} : { enabled: this.sessionOverrideEnabled }),\n\t\t\t\t\t...(this.sessionModelOverride ?? {}),\n\t\t\t\t},\n\t\t\t};\n\t\tthis.configResult = this.resolveConfig(this.cwd, session === undefined ? undefined : { session });\n\t\tif (this.configResult.config.maxWarnings !== this.guardMaxWarnings) {\n\t\t\tthis.guardMaxWarnings = this.configResult.config.maxWarnings;\n\t\t\tthis.guard = new WatchdogEmissionGuard({ maxWarnings: this.guardMaxWarnings });\n\t\t}\n\t\tif (wasEnabled && !this.isEnabled()) this.invalidateActiveReview(\"watchdog disabled\");\n\t\treturn this.configResult;\n\t}\n\n\tsetSessionEnabled(enabled: boolean, cwd = this.cwd): WatchdogRuntimeSnapshot {\n\t\tthis.sessionOverrideEnabled = enabled;\n\t\tthis.reset(\"session override\");\n\t\tthis.refreshConfig(cwd);\n\t\treturn this.getSnapshot();\n\t}\n\n\tsetSessionModel(patch: { model?: string | null; thinking?: WatchdogEndpointConfig[\"thinking\"] | null }, cwd = this.cwd): WatchdogRuntimeSnapshot {\n\t\tconst next = { ...(this.sessionModelOverride ?? {}) };\n\t\tif (patch.model === null) delete next.model;\n\t\telse if (patch.model !== undefined) next.model = patch.model;\n\t\tif (patch.thinking === null) delete next.thinking;\n\t\telse if (patch.thinking !== undefined) next.thinking = patch.thinking;\n\t\tthis.sessionModelOverride = next.model === undefined && next.thinking === undefined ? undefined : next;\n\t\tthis.reset(\"session model override\");\n\t\tthis.refreshConfig(cwd);\n\t\treturn this.getSnapshot();\n\t}\n\n\tclearSessionModel(cwd = this.cwd): WatchdogRuntimeSnapshot {\n\t\tthis.sessionModelOverride = undefined;\n\t\tthis.reset(\"session model override cleared\");\n\t\tthis.refreshConfig(cwd);\n\t\treturn this.getSnapshot();\n\t}\n\n\tclearSessionOverride(cwd = this.cwd): WatchdogRuntimeSnapshot {\n\t\tthis.sessionOverrideEnabled = undefined;\n\t\tthis.sessionModelOverride = undefined;\n\t\tthis.reset(\"session override cleared\");\n\t\tthis.refreshConfig(cwd);\n\t\treturn this.getSnapshot();\n\t}\n\n\treset(_reason = \"reset\", options: { clearReviewInputSignature?: boolean; resetChangeSignature?: boolean; clearLspLedger?: boolean } = {}): void {\n\t\tthis.abortActiveAgentEnd();\n\t\tthis.epoch++;\n\t\tthis.status = \"idle\";\n\t\tthis.clearPendingDeltas();\n\t\tthis.reviewing = false;\n\t\tthis.waitingAtAgentEnd = false;\n\t\tthis.activeReviewId = undefined;\n\t\tthis.activeReviewWarning = undefined;\n\t\tthis.includeUserPromptInNextDelta = false;\n\t\tthis.userPrompt = undefined;\n\t\tthis.lastError = undefined;\n\t\tthis.currentChangedPaths = undefined;\n\t\tthis.observedRepoEditThisTurn = false;\n\t\tif (options.clearLspLedger) {\n\t\t\tthis.lspLedger.reset();\n\t\t\tthis.lastLspSnapshot = undefined;\n\t\t}\n\t\tif (options.clearReviewInputSignature) this.lastReviewInputSignature = undefined;\n\t\tif (options.resetChangeSignature) this.resetRepoChangeBaseline({ reviewed: true });\n\t\tthis.guard.reset();\n\t\tthis.resolveWaiters(true);\n\t}\n\n\tdispose(): void {\n\t\tthis.disposed = true;\n\t\tthis.abortActiveAgentEnd();\n\t\tthis.epoch++;\n\t\tthis.status = \"idle\";\n\t\tthis.clearPendingDeltas();\n\t\tthis.reviewing = false;\n\t\tthis.waitingAtAgentEnd = false;\n\t\tthis.activeReviewId = undefined;\n\t\tthis.activeReviewWarning = undefined;\n\t\tthis.lastReviewInputSignature = undefined;\n\t\tthis.currentChangedPaths = undefined;\n\t\tthis.lastLspSnapshot = undefined;\n\t\tthis.lspLedger.reset();\n\t\tthis.observedRepoEditThisTurn = false;\n\t\tthis.resolveWaiters(false);\n\t}\n\n\thandleBeforeAgentStart(event: unknown, ctx: ContextLike): void {\n\t\tif (this.disposed) return;\n\t\tthis.reset(\"before_agent_start\");\n\t\tthis.refreshConfig(ctx.cwd);\n\t\tthis.userPrompt = promptFromBeforeAgentStart(event);\n\t\tthis.includeUserPromptInNextDelta = Boolean(this.userPrompt?.trim());\n\t\tthis.resetRepoChangeBaseline();\n\t}\n\n\thandleTurnEnd(event: unknown, ctx: ContextLike): void {\n\t\tif (this.disposed) return;\n\t\tthis.refreshConfig(ctx.cwd);\n\t\tif (!this.isEnabled()) return;\n\t\ttry {\n\t\t\tthis.observedRepoEditThisTurn ||= eventIndicatesRepoEdit(event);\n\t\t\tconst delta = formatWatchdogTurnDelta({\n\t\t\t\tincludeUserPrompt: this.includeUserPromptInNextDelta,\n\t\t\t\tuserPrompt: this.userPrompt,\n\t\t\t\tevents: [event],\n\t\t\t});\n\t\t\tthis.includeUserPromptInNextDelta = false;\n\t\t\tthis.enqueueDelta(delta);\n\t\t} catch (error) {\n\t\t\tthis.fail(`Failed to format watchdog turn delta: ${errorMessage(error)}`);\n\t\t}\n\t}\n\n\tenqueueDelta(delta: string): void {\n\t\tif (this.disposed || !delta.trim() || !this.isEnabled()) return;\n\t\tthis.appendBoundedDelta(delta);\n\t\tif (!this.reviewing && !this.waitingAtAgentEnd) this.status = \"queued\";\n\t}\n\n\tasync handleAgentEnd(_event: unknown, ctx: ContextLike): Promise<void> {\n\t\tif (this.disposed) return;\n\t\tthis.refreshConfig(ctx.cwd);\n\t\tif (!this.isEnabled()) return;\n\t\tconst changeSignature = this.resolveReviewChangeSignature(ctx.cwd);\n\t\tif (this.reviewChangesOnly && !changeSignature) {\n\t\t\tthis.clearPendingDeltas();\n\t\t\tif (this.status === \"queued\") this.status = \"idle\";\n\t\t\tthis.resolveWaiters(true);\n\t\t\treturn;\n\t\t}\n\t\tif (changeSignature && changeSignature.key === this.lastReviewedChangeSignature) {\n\t\t\tthis.clearPendingDeltas();\n\t\t\tthis.status = \"idle\";\n\t\t\tthis.resolveWaiters(true);\n\t\t\treturn;\n\t\t}\n\t\tthis.waitingAtAgentEnd = true;\n\t\tconst agentEndEpoch = this.epoch;\n\t\tconst agentEndId = ++this.agentEndIdCounter;\n\t\tconst lspAbortController = new AbortController();\n\t\tthis.activeAgentEndId = agentEndId;\n\t\tthis.activeAgentEndAbortController = lspAbortController;\n\t\ttry {\n\t\t\tthis.guard.startModelUpdate();\n\t\t\tconst lspBlock = await this.collectLspDiagnostics(changeSignature, {\n\t\t\t\tepoch: agentEndEpoch,\n\t\t\t\tagentEndId,\n\t\t\t\tsignal: lspAbortController.signal,\n\t\t\t});\n\t\t\tif (this.activeAgentEndAbortController === lspAbortController) this.activeAgentEndAbortController = undefined;\n\t\t\tif (!this.isAgentEndCurrent(agentEndEpoch, agentEndId)) return;\n\t\t\tconst delta = this.buildReviewInput(changeSignature, lspBlock);\n\t\t\tthis.clearPendingDeltas();\n\t\t\tif (!delta.trim()) {\n\t\t\t\tthis.waitingAtAgentEnd = false;\n\t\t\t\tif (this.status === \"queued\") this.status = \"idle\";\n\t\t\t\tthis.resolveWaiters(true);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst signature = reviewInputSignature(delta);\n\t\t\tif (!this.reviewChangesOnly && signature === this.lastReviewInputSignature) {\n\t\t\t\tthis.waitingAtAgentEnd = false;\n\t\t\t\tthis.status = \"idle\";\n\t\t\t\tthis.resolveWaiters(true);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst outcome = await this.reviewDelta(delta, this.configResult.config.agentEndTimeoutMs);\n\t\t\tthis.waitingAtAgentEnd = false;\n\t\t\tif (outcome === \"timeout\") {\n\t\t\t\tthis.staleReviews++;\n\t\t\t\tthis.invalidateActiveReview(\"agent-end timeout\");\n\t\t\t\tthis.status = \"stale\";\n\t\t\t\tthis.markLastWarningStale();\n\t\t\t\tthis.resolveWaiters(true);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (outcome === \"completed\" && this.status !== \"failed\" && this.status !== \"stale\") {\n\t\t\t\tthis.lastReviewInputSignature = signature;\n\t\t\t\tif (changeSignature) this.lastReviewedChangeSignature = changeSignature.key;\n\t\t\t\tthis.currentChangedPaths = changeSignature?.changedPaths;\n\t\t\t\tthis.status = \"idle\";\n\t\t\t}\n\t\t\tthis.resolveWaiters(true);\n\t\t} finally {\n\t\t\tif (this.activeAgentEndAbortController === lspAbortController) this.activeAgentEndAbortController = undefined;\n\t\t\tif (this.activeAgentEndId === agentEndId) this.activeAgentEndId = undefined;\n\t\t}\n\t}\n\n\trecordDisplayedWarning(warning: WatchdogWarning): WatchdogWarningDetails {\n\t\tconst details = normalizeWatchdogWarningDetails(warning, { state: \"displayed\", source: warning.source ?? \"main\" });\n\t\tthis.lastWarning = details;\n\t\treturn details;\n\t}\n\n\tgetSnapshot(cwd?: string): WatchdogRuntimeSnapshot {\n\t\tif (cwd) this.refreshConfig(cwd);\n\t\treturn {\n\t\t\tstatus: this.status,\n\t\t\tenabled: this.isEnabled(),\n\t\t\tconfig: this.configResult.config,\n\t\t\tconfigOk: this.configResult.ok,\n\t\t\terrors: [...this.configResult.errors],\n\t\t\tsources: [...this.configResult.sources],\n\t\t\tbufferedDeltas: this.pendingDeltas.length,\n\t\t\tepoch: this.epoch,\n\t\t\t...(this.activeReviewId !== undefined ? { activeReviewId: this.activeReviewId } : {}),\n\t\t\t...(this.sessionOverrideEnabled !== undefined ? { sessionOverride: this.sessionOverrideEnabled } : {}),\n\t\t\t...(this.sessionModelOverride !== undefined ? { sessionModelOverride: { ...this.sessionModelOverride } } : {}),\n\t\t\t...(this.lastWarning ? { lastWarning: this.lastWarning } : {}),\n\t\t\t...(this.lastError ? { lastError: this.lastError } : {}),\n\t\t\tfailedReviews: this.failedReviews,\n\t\t\tstaleReviews: this.staleReviews,\n\t\t\treviewConnected: this.reviewConnected,\n\t\t\treviewDescription: this.reviewDescription,\n\t\t\tautoFollowQueued: false,\n\t\t\treviewTrigger: this.reviewChangesOnly ? \"repo-edits\" : \"turn-delta\",\n\t\t\t...(this.currentChangedPaths?.length ? { changedPaths: [...this.currentChangedPaths] } : {}),\n\t\t\tlsp: this.lspSnapshot(),\n\t\t};\n\t}\n\n\tasync waitForIdle(timeoutMs = 1_000): Promise<boolean> {\n\t\treturn this.waitForSettled(timeoutMs);\n\t}\n\n\tprivate isEnabled(): boolean {\n\t\treturn this.configResult.ok && this.configResult.config.main.enabled;\n\t}\n\n\tprivate abortActiveAgentEnd(): void {\n\t\tthis.activeAgentEndAbortController?.abort();\n\t\tthis.activeAgentEndAbortController = undefined;\n\t\tthis.activeAgentEndId = undefined;\n\t}\n\n\tprivate isAgentEndCurrent(epoch: number, agentEndId: number): boolean {\n\t\treturn !this.disposed && this.epoch === epoch && this.activeAgentEndId === agentEndId && this.waitingAtAgentEnd && this.isEnabled();\n\t}\n\n\tprivate isCurrent(epoch: number, reviewId: number): boolean {\n\t\treturn !this.disposed && this.epoch === epoch && this.activeReviewId === reviewId;\n\t}\n\n\tprivate acceptWarning(epoch: number, reviewId: number, warning: WatchdogWarning): boolean {\n\t\tif (!this.isCurrent(epoch, reviewId) || !this.isEnabled()) return false;\n\t\tconst decision = this.guard.evaluate(warning);\n\t\tif (!decision.accepted) return false;\n\t\tconst details = normalizeWatchdogWarningDetails(warning, {\n\t\t\tstate: \"candidate\",\n\t\t\tsource: warning.source ?? \"main\",\n\t\t\tidentity: decision.identity,\n\t\t});\n\t\tthis.lastWarning = details;\n\t\tthis.activeReviewWarning = details;\n\t\treturn true;\n\t}\n\n\tprivate displayBoundaryWarning(warning: WatchdogWarning): boolean {\n\t\tif (!this.isEnabled()) return false;\n\t\tconst decision = this.guard.evaluate(warning);\n\t\tif (!decision.accepted) return false;\n\t\tconst details = normalizeWatchdogWarningDetails(warning, {\n\t\t\tstate: \"displayed\",\n\t\t\tsource: warning.source ?? \"main\",\n\t\t\tidentity: decision.identity,\n\t\t\tdisplayedAt: new Date().toISOString(),\n\t\t});\n\t\tthis.lastWarning = details;\n\t\tthis.displayWarning?.(details);\n\t\treturn true;\n\t}\n\n\tprivate invalidateActiveReview(_reason: string): void {\n\t\tthis.abortActiveAgentEnd();\n\t\tthis.epoch++;\n\t\tthis.status = \"idle\";\n\t\tthis.clearPendingDeltas();\n\t\tthis.reviewing = false;\n\t\tthis.waitingAtAgentEnd = false;\n\t\tthis.activeReviewId = undefined;\n\t\tthis.activeReviewWarning = undefined;\n\t}\n\n\tprivate async reviewDelta(delta: string, timeoutMs: number): Promise<ReviewDeltaOutcome> {\n\t\tif (this.reviewing || this.disposed) return \"stale\";\n\t\tthis.reviewing = true;\n\t\tconst reviewEpoch = this.epoch;\n\t\tconst reviewId = ++this.reviewIdCounter;\n\t\tthis.activeReviewId = reviewId;\n\t\tthis.activeReviewWarning = undefined;\n\t\tthis.status = \"reviewing\";\n\t\tlet timeout: ReturnType<typeof setTimeout> | undefined;\n\t\tconst abortController = new AbortController();\n\t\tconst reviewPromise = Promise.resolve().then(() => this.review({\n\t\t\tdelta,\n\t\t\tepoch: reviewEpoch,\n\t\t\treviewId,\n\t\t\tconfig: this.configResult.config,\n\t\t\tsignal: abortController.signal,\n\t\t\temitWarning: (warning) => this.acceptWarning(reviewEpoch, reviewId, warning),\n\t\t}));\n\t\ttry {\n\t\t\tconst result = await Promise.race([\n\t\t\t\treviewPromise,\n\t\t\t\tnew Promise<\"timeout\">((resolve) => {\n\t\t\t\t\ttimeout = setTimeout(() => resolve(\"timeout\"), timeoutMs);\n\t\t\t\t}),\n\t\t\t]);\n\t\t\tif (result === \"timeout\") {\n\t\t\t\tabortController.abort();\n\t\t\t\treturn \"timeout\";\n\t\t\t}\n\t\t\tif (!this.isCurrent(reviewEpoch, reviewId)) return \"stale\";\n\t\t\tfor (const warning of result?.warnings ?? []) this.acceptWarning(reviewEpoch, reviewId, warning);\n\t\t\tif (result?.stopReason && result.stopReason !== \"stop\") {\n\t\t\t\tthis.fail(`Watchdog review ended with stop reason '${result.stopReason}'.`);\n\t\t\t\treturn \"completed\";\n\t\t\t}\n\t\t\tthis.displayAcceptedReviewWarning();\n\t\t\treturn \"completed\";\n\t\t} catch (error) {\n\t\t\tif (this.isCurrent(reviewEpoch, reviewId)) {\n\t\t\t\tthis.fail(`Watchdog review failed: ${errorMessage(error)}`);\n\t\t\t\treturn \"completed\";\n\t\t\t}\n\t\t\treturn \"stale\";\n\t\t} finally {\n\t\t\tif (timeout) clearTimeout(timeout);\n\t\t\tif (this.epoch === reviewEpoch && this.activeReviewId === reviewId) {\n\t\t\t\tthis.reviewing = false;\n\t\t\t\tthis.activeReviewId = undefined;\n\t\t\t\tthis.activeReviewWarning = undefined;\n\t\t\t}\n\t\t\tthis.resolveWaiters(this.isSettled());\n\t\t}\n\t}\n\n\tprivate displayAcceptedReviewWarning(): void {\n\t\tif (!this.activeReviewWarning) return;\n\t\tconst details: WatchdogWarningDetails = {\n\t\t\t...this.activeReviewWarning,\n\t\t\tstate: \"displayed\",\n\t\t\tdisplayedAt: new Date().toISOString(),\n\t\t};\n\t\tthis.lastWarning = details;\n\t\tthis.displayWarning?.(details);\n\t}\n\n\tprivate currentRepoChangeSignature(cwd = this.cwd): WatchdogRepoChangeSignature | undefined {\n\t\treturn this.reviewChangesOnly ? computeWatchdogRepoChangeSignature(cwd) : undefined;\n\t}\n\n\tprivate resetRepoChangeBaseline(options: { cwd?: string; reviewed?: boolean } = {}): void {\n\t\tthis.turnStartChangeSignature = this.currentRepoChangeSignature(options.cwd ?? this.cwd);\n\t\tif (options.reviewed) this.lastReviewedChangeSignature = this.turnStartChangeSignature?.key;\n\t\telse this.lastReviewedChangeSignature ??= this.turnStartChangeSignature?.key;\n\t\tthis.currentChangedPaths = this.turnStartChangeSignature?.changedPaths;\n\t\tthis.observedRepoEditThisTurn = false;\n\t}\n\n\tprivate resolveReviewChangeSignature(cwd = this.cwd): WatchdogRepoChangeSignature | undefined {\n\t\tif (!this.reviewChangesOnly) return undefined;\n\t\tconst current = this.currentRepoChangeSignature(cwd);\n\t\tif (current) {\n\t\t\tthis.currentChangedPaths = current.changedPaths;\n\t\t\tif (current.key === this.turnStartChangeSignature?.key) return undefined;\n\t\t\tif (current.changedPaths.length === 0) return undefined;\n\t\t\treturn current;\n\t\t}\n\t\treturn this.observedRepoEditThisTurn\n\t\t\t? { root: cwd, key: `observed-edit:${this.epoch}:${this.reviewIdCounter}:${this.pendingDeltaChars}`, changedPaths: [] }\n\t\t\t: undefined;\n\t}\n\n\tprivate async collectLspDiagnostics(changeSignature: WatchdogRepoChangeSignature | undefined, current: { epoch: number; agentEndId: number; signal: AbortSignal }): Promise<string> {\n\t\tconst config = this.configResult.config.lsp;\n\t\tif (!config.enabled || !changeSignature?.changedPaths.length) {\n\t\t\tthis.lastLspSnapshot = {\n\t\t\t\tenabled: config.enabled,\n\t\t\t\tstatus: config.enabled ? \"skipped\" : \"disabled\",\n\t\t\t\tcheckedPaths: [],\n\t\t\t\tskippedPaths: [],\n\t\t\t\tdiagnostics: [],\n\t\t\t\tdiagnosticCount: 0,\n\t\t\t\tfreshDiagnosticCount: 0,\n\t\t\t\tupdatedAt: new Date().toISOString(),\n\t\t\t};\n\t\t\treturn \"\";\n\t\t}\n\t\ttry {\n\t\t\tconst raw = await this.lspDiagnostics({\n\t\t\t\tcwd: this.cwd,\n\t\t\t\troot: changeSignature.root,\n\t\t\t\tchangedPaths: changeSignature.changedPaths,\n\t\t\t\tconfig,\n\t\t\t\tsignal: current.signal,\n\t\t\t});\n\t\t\tif (!this.isAgentEndCurrent(current.epoch, current.agentEndId)) return \"\";\n\t\t\tconst diagnosticCount = raw.diagnostics.length;\n\t\t\tconst fresh = this.lspLedger.reduce(raw);\n\t\t\tthis.lastLspSnapshot = {\n\t\t\t\t...fresh,\n\t\t\t\tenabled: true,\n\t\t\t\tdiagnosticCount,\n\t\t\t\tfreshDiagnosticCount: fresh.diagnostics.length,\n\t\t\t\tupdatedAt: new Date().toISOString(),\n\t\t\t};\n\t\t\tconst warning = watchdogWarningFromLspDiagnostics(fresh);\n\t\t\tif (warning) this.displayBoundaryWarning(warning);\n\t\t\treturn formatWatchdogLspDiagnosticsBlock(fresh);\n\t\t} catch (error) {\n\t\t\tif (!this.isAgentEndCurrent(current.epoch, current.agentEndId)) return \"\";\n\t\t\tthis.lastLspSnapshot = {\n\t\t\t\tenabled: true,\n\t\t\t\tstatus: \"failed\",\n\t\t\t\tcheckedPaths: [],\n\t\t\t\tskippedPaths: changeSignature.changedPaths,\n\t\t\t\tdiagnostics: [],\n\t\t\t\tdiagnosticCount: 0,\n\t\t\t\tfreshDiagnosticCount: 0,\n\t\t\t\tmessage: `LSP diagnostics failed: ${errorMessage(error)}`,\n\t\t\t\tupdatedAt: new Date().toISOString(),\n\t\t\t};\n\t\t\treturn \"\";\n\t\t}\n\t}\n\n\tprivate lspSnapshot(): WatchdogLspRuntimeSnapshot {\n\t\tif (this.lastLspSnapshot) return {\n\t\t\t...this.lastLspSnapshot,\n\t\t\tcheckedPaths: [...this.lastLspSnapshot.checkedPaths],\n\t\t\tskippedPaths: [...this.lastLspSnapshot.skippedPaths],\n\t\t\tdiagnostics: [...this.lastLspSnapshot.diagnostics],\n\t\t};\n\t\tconst enabled = this.isEnabled() && this.configResult.config.lsp.enabled;\n\t\treturn {\n\t\t\tenabled,\n\t\t\tstatus: enabled ? \"skipped\" : \"disabled\",\n\t\t\tcheckedPaths: [],\n\t\t\tskippedPaths: [],\n\t\t\tdiagnostics: [],\n\t\t\tdiagnosticCount: 0,\n\t\t\tfreshDiagnosticCount: 0,\n\t\t};\n\t}\n\n\tprivate appendBoundedDelta(delta: string): void {\n\t\tlet entry = delta.trim();\n\t\tif (!entry) return;\n\t\tif (entry.length > MAX_REVIEW_INPUT_CHARS) entry = entry.slice(-MAX_REVIEW_INPUT_CHARS);\n\t\tthis.pendingDeltas.push(entry);\n\t\tthis.pendingDeltaChars += entry.length;\n\t\twhile (this.pendingDeltas.length > 1 && this.pendingDeltaChars + (this.pendingDeltas.length - 1) * REVIEW_DELTA_SEPARATOR.length > MAX_REVIEW_INPUT_CHARS) {\n\t\t\tconst removed = this.pendingDeltas.shift();\n\t\t\tif (removed) this.pendingDeltaChars -= removed.length;\n\t\t}\n\t}\n\n\tprivate buildReviewInput(changeSignature?: WatchdogRepoChangeSignature, lspBlock = \"\"): string {\n\t\tconst input = this.pendingDeltas.join(REVIEW_DELTA_SEPARATOR);\n\t\tconst changes = changeSignature?.changedPaths.length\n\t\t\t? [\"Changed repo paths:\", ...changeSignature.changedPaths.slice(0, 200).map((file) => `- ${file}`)].join(\"\\n\")\n\t\t\t: \"\";\n\t\tconst contextPieces = [changes, lspBlock].filter(Boolean);\n\t\tif (!contextPieces.length) return input.length > MAX_REVIEW_INPUT_CHARS ? input.slice(-MAX_REVIEW_INPUT_CHARS) : input;\n\n\t\tconst maxContextLength = Math.floor(MAX_REVIEW_INPUT_CHARS / 2);\n\t\tconst maxPieceLength = Math.max(1_000, Math.floor(maxContextLength / contextPieces.length));\n\t\tconst boundedContext = contextPieces.map((piece) => piece.length > maxPieceLength\n\t\t\t? `${piece.slice(0, maxPieceLength - 6)}\\n- ...`\n\t\t\t: piece).join(REVIEW_DELTA_SEPARATOR);\n\t\tconst separatorLength = input ? REVIEW_DELTA_SEPARATOR.length : 0;\n\t\tconst inputBudget = MAX_REVIEW_INPUT_CHARS - boundedContext.length - separatorLength;\n\t\tconst boundedInput = inputBudget <= 0\n\t\t\t? \"\"\n\t\t\t: input.length > inputBudget\n\t\t\t\t? input.slice(-inputBudget)\n\t\t\t\t: input;\n\t\treturn [boundedContext, boundedInput].filter(Boolean).join(REVIEW_DELTA_SEPARATOR);\n\t}\n\n\tprivate clearPendingDeltas(): void {\n\t\tthis.pendingDeltas = [];\n\t\tthis.pendingDeltaChars = 0;\n\t}\n\n\tprivate fail(message: string): void {\n\t\tthis.failedReviews++;\n\t\tthis.lastError = message;\n\t\tthis.status = \"failed\";\n\t\tthis.clearPendingDeltas();\n\t\tthis.resolveWaiters(true);\n\t}\n\n\tprivate markLastWarningStale(): void {\n\t\tif (!this.lastWarning || this.lastWarning.state === \"displayed\") return;\n\t\tthis.lastWarning = { ...this.lastWarning, stale: true, state: \"stale\" };\n\t}\n\n\tprivate isSettled(): boolean {\n\t\treturn !this.reviewing && this.pendingDeltas.length === 0;\n\t}\n\n\tprivate waitForSettled(timeoutMs: number): Promise<boolean> {\n\t\tif (this.isSettled()) return Promise.resolve(true);\n\t\treturn new Promise((resolve) => {\n\t\t\tconst waiter: Waiter = {\n\t\t\t\tresolve,\n\t\t\t\ttimer: setTimeout(() => {\n\t\t\t\t\tthis.waiters = this.waiters.filter((entry) => entry !== waiter);\n\t\t\t\t\tresolve(false);\n\t\t\t\t}, timeoutMs),\n\t\t\t};\n\t\t\tthis.waiters.push(waiter);\n\t\t});\n\t}\n\n\tprivate resolveWaiters(settled: boolean): void {\n\t\tif (!settled && !this.disposed) return;\n\t\tconst waiters = this.waiters;\n\t\tthis.waiters = [];\n\t\tfor (const waiter of waiters) {\n\t\t\tclearTimeout(waiter.timer);\n\t\t\twaiter.resolve(settled);\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/watchdog/runtime.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport { createHash } from \"node:crypto\";\nimport type { ExtensionContext } from \"@ashx-j/lunr\";\nimport { computeWatchdogRepoChangeSignature, eventIndicatesRepoEdit, type WatchdogRepoChangeSignature } from \"./change-signature.ts\";\nimport { WatchdogEmissionGuard } from \"./emission-guard.ts\";\nimport {\n\tcollectWatchdogLspDiagnostics,\n\tformatWatchdogLspDiagnosticsBlock,\n\tWatchdogLspDiagnosticsLedger,\n\twatchdogWarningFromLspDiagnostics,\n\ttype WatchdogLspDiagnosticsFunction,\n} from \"./lsp-diagnostics.ts\";\nimport { resolveWatchdogConfig } from \"./settings.ts\";\nimport { formatWatchdogTurnDelta } from \"./turn-delta.ts\";\nimport {\n\ttype ResolvedWatchdogConfig,\n\ttype WatchdogEndpointConfig,\n\ttype WatchdogLspRuntimeSnapshot,\n\ttype WatchdogRuntimeStatus,\n\ttype WatchdogSettingsError,\n\ttype WatchdogSettingsResult,\n\ttype WatchdogSettingsSource,\n\ttype WatchdogWarning,\n\ttype WatchdogWarningDetails,\n} from \"./types.ts\";\nimport { normalizeWatchdogWarningDetails } from \"./warning-format.ts\";\n\ntype ReviewStopReason = \"stop\" | \"error\" | \"aborted\" | \"length\";\n\nexport interface WatchdogReviewResult {\n\twarnings?: WatchdogWarning[];\n\tstopReason?: ReviewStopReason;\n}\n\nexport interface WatchdogReviewRequest {\n\tdelta: string;\n\tepoch: number;\n\treviewId: number;\n\tconfig: ResolvedWatchdogConfig;\n\temitWarning(warning: WatchdogWarning): boolean;\n\tsignal?: AbortSignal;\n}\n\nexport type WatchdogReviewFunction = (request: WatchdogReviewRequest) => Promise<WatchdogReviewResult | void> | WatchdogReviewResult | void;\n\nexport interface WatchdogRuntimeSnapshot {\n\tstatus: WatchdogRuntimeStatus;\n\tenabled: boolean;\n\tconfig: ResolvedWatchdogConfig;\n\tconfigOk: boolean;\n\terrors: WatchdogSettingsError[];\n\tsources: WatchdogSettingsSource[];\n\tbufferedDeltas: number;\n\tepoch: number;\n\tactiveReviewId?: number;\n\tsessionOverride?: boolean;\n\tsessionModelOverride?: Partial<Pick<WatchdogEndpointConfig, \"model\" | \"thinking\">>;\n\tlastWarning?: WatchdogWarningDetails;\n\tlastError?: string;\n\tfailedReviews: number;\n\tstaleReviews: number;\n\treviewConnected: boolean;\n\treviewDescription: string;\n\tautoFollowQueued: false;\n\treviewTrigger: \"turn-delta\" | \"repo-edits\";\n\tchangedPaths?: string[];\n\tlsp: WatchdogLspRuntimeSnapshot;\n}\n\ninterface Waiter {\n\tresolve(settled: boolean): void;\n\ttimer: ReturnType<typeof setTimeout>;\n}\n\ninterface MainWatchdogRuntimeOptions {\n\tcwd?: string;\n\tresolveConfig?: (cwd: string, options?: { session?: Record<string, unknown> }) => WatchdogSettingsResult;\n\treview?: WatchdogReviewFunction;\n\treviewDescription?: string;\n\tdisplayWarning?: (warning: WatchdogWarningDetails) => void;\n\treviewChangesOnly?: boolean;\n\tlspDiagnostics?: WatchdogLspDiagnosticsFunction;\n}\n\ntype ContextLike = Pick<ExtensionContext, \"cwd\">;\ntype ReviewDeltaOutcome = \"completed\" | \"timeout\" | \"stale\";\n\nconst DEFAULT_REVIEW: WatchdogReviewFunction = () => ({ warnings: [] });\nconst MAX_REVIEW_INPUT_CHARS = 24_000;\nconst REVIEW_DELTA_SEPARATOR = \"\\n\\n---\\n\\n\";\n\nfunction errorMessage(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error);\n}\n\nfunction promptFromBeforeAgentStart(event: unknown): string | undefined {\n\tif (!event || typeof event !== \"object\") return undefined;\n\tconst input = event as { prompt?: unknown; systemPrompt?: unknown };\n\tif (typeof input.prompt === \"string\") return input.prompt;\n\tif (typeof input.systemPrompt === \"string\") return input.systemPrompt;\n\treturn undefined;\n}\n\nfunction reviewInputSignature(input: string): string {\n\treturn createHash(\"sha256\").update(input).digest(\"hex\");\n}\n\nexport class MainWatchdogRuntime {\n\tprivate cwd: string;\n\tprivate readonly resolveConfig: (cwd: string, options?: { session?: Record<string, unknown> }) => WatchdogSettingsResult;\n\tprivate readonly review: WatchdogReviewFunction;\n\tprivate readonly reviewConnected: boolean;\n\tprivate readonly reviewDescription: string;\n\tprivate readonly displayWarning: ((warning: WatchdogWarningDetails) => void) | undefined;\n\tprivate readonly reviewChangesOnly: boolean;\n\tprivate readonly lspDiagnostics: WatchdogLspDiagnosticsFunction;\n\tprivate readonly lspLedger = new WatchdogLspDiagnosticsLedger();\n\tprivate configResult: WatchdogSettingsResult;\n\tprivate sessionOverrideEnabled: boolean | undefined;\n\tprivate sessionModelOverride: Partial<Pick<WatchdogEndpointConfig, \"model\" | \"thinking\">> | undefined;\n\tprivate status: WatchdogRuntimeStatus = \"idle\";\n\tprivate pendingDeltas: string[] = [];\n\tprivate pendingDeltaChars = 0;\n\tprivate guard = new WatchdogEmissionGuard();\n\tprivate guardMaxWarnings: number | null = null;\n\tprivate epoch = 0;\n\tprivate reviewIdCounter = 0;\n\tprivate agentEndIdCounter = 0;\n\tprivate activeAgentEndId: number | undefined;\n\tprivate activeAgentEndAbortController: AbortController | undefined;\n\tprivate activeReviewId: number | undefined;\n\tprivate activeReviewWarning: WatchdogWarningDetails | undefined;\n\tprivate reviewing = false;\n\tprivate waitingAtAgentEnd = false;\n\tprivate disposed = false;\n\tprivate includeUserPromptInNextDelta = false;\n\tprivate userPrompt: string | undefined;\n\tprivate waiters: Waiter[] = [];\n\tprivate lastWarning: WatchdogWarningDetails | undefined;\n\tprivate lastError: string | undefined;\n\tprivate lastReviewInputSignature: string | undefined;\n\tprivate turnStartChangeSignature: WatchdogRepoChangeSignature | undefined;\n\tprivate lastReviewedChangeSignature: string | undefined;\n\tprivate currentChangedPaths: string[] | undefined;\n\tprivate lastLspSnapshot: WatchdogLspRuntimeSnapshot | undefined;\n\tprivate observedRepoEditThisTurn = false;\n\tprivate failedReviews = 0;\n\tprivate staleReviews = 0;\n\n\tconstructor(options: MainWatchdogRuntimeOptions = {}) {\n\t\tthis.cwd = options.cwd ?? process.cwd();\n\t\tthis.resolveConfig = options.resolveConfig ?? resolveWatchdogConfig;\n\t\tthis.review = options.review ?? DEFAULT_REVIEW;\n\t\tthis.reviewConnected = Boolean(options.review);\n\t\tthis.reviewDescription = options.reviewDescription ?? (options.review ? \"injected seam\" : \"not wired\");\n\t\tthis.displayWarning = options.displayWarning;\n\t\tthis.reviewChangesOnly = options.reviewChangesOnly === true;\n\t\tthis.lspDiagnostics = options.lspDiagnostics ?? collectWatchdogLspDiagnostics;\n\t\tthis.configResult = this.resolveConfig(this.cwd);\n\t\tthis.guardMaxWarnings = this.configResult.config.maxWarnings;\n\t\tthis.guard = new WatchdogEmissionGuard({ maxWarnings: this.guardMaxWarnings });\n\t}\n\n\tbindSession(ctx: ContextLike): void {\n\t\tthis.cwd = ctx.cwd;\n\t\tthis.sessionOverrideEnabled = undefined;\n\t\tthis.sessionModelOverride = undefined;\n\t\tthis.reset(\"session_start\", { clearReviewInputSignature: true, clearChangeSignature: true, clearLspLedger: true });\n\t\tthis.refreshConfig(ctx.cwd);\n\t}\n\n\trefreshConfig(cwd = this.cwd): WatchdogSettingsResult {\n\t\tthis.cwd = cwd;\n\t\tconst wasEnabled = this.isEnabled();\n\t\tconst session = this.sessionOverrideEnabled === undefined && this.sessionModelOverride === undefined\n\t\t\t? undefined\n\t\t\t: {\n\t\t\t\t...(this.sessionOverrideEnabled === undefined ? {} : { enabled: this.sessionOverrideEnabled }),\n\t\t\t\tmain: {\n\t\t\t\t\t...(this.sessionOverrideEnabled === undefined ? {} : { enabled: this.sessionOverrideEnabled }),\n\t\t\t\t\t...(this.sessionModelOverride ?? {}),\n\t\t\t\t},\n\t\t\t};\n\t\tthis.configResult = this.resolveConfig(this.cwd, session === undefined ? undefined : { session });\n\t\tif (this.configResult.config.maxWarnings !== this.guardMaxWarnings) {\n\t\t\tthis.guardMaxWarnings = this.configResult.config.maxWarnings;\n\t\t\tthis.guard = new WatchdogEmissionGuard({ maxWarnings: this.guardMaxWarnings });\n\t\t}\n\t\tif (wasEnabled && !this.isEnabled()) {\n\t\t\tthis.invalidateActiveReview(\"watchdog disabled\");\n\t\t\tthis.clearRepoChangeBaseline();\n\t\t}\n\t\treturn this.configResult;\n\t}\n\n\tsetSessionEnabled(enabled: boolean, cwd = this.cwd): WatchdogRuntimeSnapshot {\n\t\tthis.sessionOverrideEnabled = enabled;\n\t\tthis.reset(\"session override\");\n\t\tthis.refreshConfig(cwd);\n\t\treturn this.getSnapshot();\n\t}\n\n\tsetSessionModel(patch: { model?: string | null; thinking?: WatchdogEndpointConfig[\"thinking\"] | null }, cwd = this.cwd): WatchdogRuntimeSnapshot {\n\t\tconst next = { ...(this.sessionModelOverride ?? {}) };\n\t\tif (patch.model === null) delete next.model;\n\t\telse if (patch.model !== undefined) next.model = patch.model;\n\t\tif (patch.thinking === null) delete next.thinking;\n\t\telse if (patch.thinking !== undefined) next.thinking = patch.thinking;\n\t\tthis.sessionModelOverride = next.model === undefined && next.thinking === undefined ? undefined : next;\n\t\tthis.reset(\"session model override\");\n\t\tthis.refreshConfig(cwd);\n\t\treturn this.getSnapshot();\n\t}\n\n\tclearSessionModel(cwd = this.cwd): WatchdogRuntimeSnapshot {\n\t\tthis.sessionModelOverride = undefined;\n\t\tthis.reset(\"session model override cleared\");\n\t\tthis.refreshConfig(cwd);\n\t\treturn this.getSnapshot();\n\t}\n\n\tclearSessionOverride(cwd = this.cwd): WatchdogRuntimeSnapshot {\n\t\tthis.sessionOverrideEnabled = undefined;\n\t\tthis.sessionModelOverride = undefined;\n\t\tthis.reset(\"session override cleared\");\n\t\tthis.refreshConfig(cwd);\n\t\treturn this.getSnapshot();\n\t}\n\n\treset(_reason = \"reset\", options: { clearReviewInputSignature?: boolean; clearChangeSignature?: boolean; clearLspLedger?: boolean } = {}): void {\n\t\tthis.abortActiveAgentEnd();\n\t\tthis.epoch++;\n\t\tthis.status = \"idle\";\n\t\tthis.clearPendingDeltas();\n\t\tthis.reviewing = false;\n\t\tthis.waitingAtAgentEnd = false;\n\t\tthis.activeReviewId = undefined;\n\t\tthis.activeReviewWarning = undefined;\n\t\tthis.includeUserPromptInNextDelta = false;\n\t\tthis.userPrompt = undefined;\n\t\tthis.lastError = undefined;\n\t\tthis.currentChangedPaths = undefined;\n\t\tthis.observedRepoEditThisTurn = false;\n\t\tif (options.clearLspLedger) {\n\t\t\tthis.lspLedger.reset();\n\t\t\tthis.lastLspSnapshot = undefined;\n\t\t}\n\t\tif (options.clearReviewInputSignature) this.lastReviewInputSignature = undefined;\n\t\tif (options.clearChangeSignature) this.clearRepoChangeBaseline();\n\t\tthis.guard.reset();\n\t\tthis.resolveWaiters(true);\n\t}\n\n\tdispose(): void {\n\t\tthis.disposed = true;\n\t\tthis.abortActiveAgentEnd();\n\t\tthis.epoch++;\n\t\tthis.status = \"idle\";\n\t\tthis.clearPendingDeltas();\n\t\tthis.reviewing = false;\n\t\tthis.waitingAtAgentEnd = false;\n\t\tthis.activeReviewId = undefined;\n\t\tthis.activeReviewWarning = undefined;\n\t\tthis.lastReviewInputSignature = undefined;\n\t\tthis.clearRepoChangeBaseline();\n\t\tthis.lastLspSnapshot = undefined;\n\t\tthis.lspLedger.reset();\n\t\tthis.resolveWaiters(false);\n\t}\n\n\thandleBeforeAgentStart(event: unknown, ctx: ContextLike): void {\n\t\tif (this.disposed) return;\n\t\tthis.reset(\"before_agent_start\");\n\t\tthis.refreshConfig(ctx.cwd);\n\t\tthis.userPrompt = promptFromBeforeAgentStart(event);\n\t\tthis.includeUserPromptInNextDelta = Boolean(this.userPrompt?.trim());\n\t\tthis.resetRepoChangeBaseline();\n\t}\n\n\thandleTurnEnd(event: unknown, ctx: ContextLike): void {\n\t\tif (this.disposed) return;\n\t\tthis.refreshConfig(ctx.cwd);\n\t\tif (!this.isEnabled()) return;\n\t\ttry {\n\t\t\tthis.observedRepoEditThisTurn ||= eventIndicatesRepoEdit(event);\n\t\t\tconst delta = formatWatchdogTurnDelta({\n\t\t\t\tincludeUserPrompt: this.includeUserPromptInNextDelta,\n\t\t\t\tuserPrompt: this.userPrompt,\n\t\t\t\tevents: [event],\n\t\t\t});\n\t\t\tthis.includeUserPromptInNextDelta = false;\n\t\t\tthis.enqueueDelta(delta);\n\t\t} catch (error) {\n\t\t\tthis.fail(`Failed to format watchdog turn delta: ${errorMessage(error)}`);\n\t\t}\n\t}\n\n\tenqueueDelta(delta: string): void {\n\t\tif (this.disposed || !delta.trim() || !this.isEnabled()) return;\n\t\tthis.appendBoundedDelta(delta);\n\t\tif (!this.reviewing && !this.waitingAtAgentEnd) this.status = \"queued\";\n\t}\n\n\tasync handleAgentEnd(_event: unknown, ctx: ContextLike): Promise<void> {\n\t\tif (this.disposed) return;\n\t\tthis.refreshConfig(ctx.cwd);\n\t\tif (!this.isEnabled()) return;\n\t\tconst changeSignature = this.resolveReviewChangeSignature(ctx.cwd);\n\t\tif (this.reviewChangesOnly && !changeSignature) {\n\t\t\tthis.clearPendingDeltas();\n\t\t\tif (this.status === \"queued\") this.status = \"idle\";\n\t\t\tthis.resolveWaiters(true);\n\t\t\treturn;\n\t\t}\n\t\tif (changeSignature && changeSignature.key === this.lastReviewedChangeSignature) {\n\t\t\tthis.clearPendingDeltas();\n\t\t\tthis.status = \"idle\";\n\t\t\tthis.resolveWaiters(true);\n\t\t\treturn;\n\t\t}\n\t\tthis.waitingAtAgentEnd = true;\n\t\tconst agentEndEpoch = this.epoch;\n\t\tconst agentEndId = ++this.agentEndIdCounter;\n\t\tconst lspAbortController = new AbortController();\n\t\tthis.activeAgentEndId = agentEndId;\n\t\tthis.activeAgentEndAbortController = lspAbortController;\n\t\ttry {\n\t\t\tthis.guard.startModelUpdate();\n\t\t\tconst lspBlock = await this.collectLspDiagnostics(changeSignature, {\n\t\t\t\tepoch: agentEndEpoch,\n\t\t\t\tagentEndId,\n\t\t\t\tsignal: lspAbortController.signal,\n\t\t\t});\n\t\t\tif (this.activeAgentEndAbortController === lspAbortController) this.activeAgentEndAbortController = undefined;\n\t\t\tif (!this.isAgentEndCurrent(agentEndEpoch, agentEndId)) return;\n\t\t\tconst delta = this.buildReviewInput(changeSignature, lspBlock);\n\t\t\tthis.clearPendingDeltas();\n\t\t\tif (!delta.trim()) {\n\t\t\t\tthis.waitingAtAgentEnd = false;\n\t\t\t\tif (this.status === \"queued\") this.status = \"idle\";\n\t\t\t\tthis.resolveWaiters(true);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst signature = reviewInputSignature(delta);\n\t\t\tif (!this.reviewChangesOnly && signature === this.lastReviewInputSignature) {\n\t\t\t\tthis.waitingAtAgentEnd = false;\n\t\t\t\tthis.status = \"idle\";\n\t\t\t\tthis.resolveWaiters(true);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst outcome = await this.reviewDelta(delta, this.configResult.config.agentEndTimeoutMs);\n\t\t\tthis.waitingAtAgentEnd = false;\n\t\t\tif (outcome === \"timeout\") {\n\t\t\t\tthis.staleReviews++;\n\t\t\t\tthis.invalidateActiveReview(\"agent-end timeout\");\n\t\t\t\tthis.status = \"stale\";\n\t\t\t\tthis.markLastWarningStale();\n\t\t\t\tthis.resolveWaiters(true);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (outcome === \"completed\" && this.status !== \"failed\" && this.status !== \"stale\") {\n\t\t\t\tthis.lastReviewInputSignature = signature;\n\t\t\t\tif (changeSignature) this.lastReviewedChangeSignature = changeSignature.key;\n\t\t\t\tthis.currentChangedPaths = changeSignature?.changedPaths;\n\t\t\t\tthis.status = \"idle\";\n\t\t\t}\n\t\t\tthis.resolveWaiters(true);\n\t\t} finally {\n\t\t\tif (this.activeAgentEndAbortController === lspAbortController) this.activeAgentEndAbortController = undefined;\n\t\t\tif (this.activeAgentEndId === agentEndId) this.activeAgentEndId = undefined;\n\t\t}\n\t}\n\n\trecordDisplayedWarning(warning: WatchdogWarning): WatchdogWarningDetails {\n\t\tconst details = normalizeWatchdogWarningDetails(warning, { state: \"displayed\", source: warning.source ?? \"main\" });\n\t\tthis.lastWarning = details;\n\t\treturn details;\n\t}\n\n\tgetSnapshot(cwd?: string): WatchdogRuntimeSnapshot {\n\t\tif (cwd) this.refreshConfig(cwd);\n\t\treturn {\n\t\t\tstatus: this.status,\n\t\t\tenabled: this.isEnabled(),\n\t\t\tconfig: this.configResult.config,\n\t\t\tconfigOk: this.configResult.ok,\n\t\t\terrors: [...this.configResult.errors],\n\t\t\tsources: [...this.configResult.sources],\n\t\t\tbufferedDeltas: this.pendingDeltas.length,\n\t\t\tepoch: this.epoch,\n\t\t\t...(this.activeReviewId !== undefined ? { activeReviewId: this.activeReviewId } : {}),\n\t\t\t...(this.sessionOverrideEnabled !== undefined ? { sessionOverride: this.sessionOverrideEnabled } : {}),\n\t\t\t...(this.sessionModelOverride !== undefined ? { sessionModelOverride: { ...this.sessionModelOverride } } : {}),\n\t\t\t...(this.lastWarning ? { lastWarning: this.lastWarning } : {}),\n\t\t\t...(this.lastError ? { lastError: this.lastError } : {}),\n\t\t\tfailedReviews: this.failedReviews,\n\t\t\tstaleReviews: this.staleReviews,\n\t\t\treviewConnected: this.reviewConnected,\n\t\t\treviewDescription: this.reviewDescription,\n\t\t\tautoFollowQueued: false,\n\t\t\treviewTrigger: this.reviewChangesOnly ? \"repo-edits\" : \"turn-delta\",\n\t\t\t...(this.currentChangedPaths?.length ? { changedPaths: [...this.currentChangedPaths] } : {}),\n\t\t\tlsp: this.lspSnapshot(),\n\t\t};\n\t}\n\n\tasync waitForIdle(timeoutMs = 1_000): Promise<boolean> {\n\t\treturn this.waitForSettled(timeoutMs);\n\t}\n\n\tprivate isEnabled(): boolean {\n\t\treturn this.configResult.ok && this.configResult.config.main.enabled;\n\t}\n\n\tprivate abortActiveAgentEnd(): void {\n\t\tthis.activeAgentEndAbortController?.abort();\n\t\tthis.activeAgentEndAbortController = undefined;\n\t\tthis.activeAgentEndId = undefined;\n\t}\n\n\tprivate isAgentEndCurrent(epoch: number, agentEndId: number): boolean {\n\t\treturn !this.disposed && this.epoch === epoch && this.activeAgentEndId === agentEndId && this.waitingAtAgentEnd && this.isEnabled();\n\t}\n\n\tprivate isCurrent(epoch: number, reviewId: number): boolean {\n\t\treturn !this.disposed && this.epoch === epoch && this.activeReviewId === reviewId;\n\t}\n\n\tprivate acceptWarning(epoch: number, reviewId: number, warning: WatchdogWarning): boolean {\n\t\tif (!this.isCurrent(epoch, reviewId) || !this.isEnabled()) return false;\n\t\tconst decision = this.guard.evaluate(warning);\n\t\tif (!decision.accepted) return false;\n\t\tconst details = normalizeWatchdogWarningDetails(warning, {\n\t\t\tstate: \"candidate\",\n\t\t\tsource: warning.source ?? \"main\",\n\t\t\tidentity: decision.identity,\n\t\t});\n\t\tthis.lastWarning = details;\n\t\tthis.activeReviewWarning = details;\n\t\treturn true;\n\t}\n\n\tprivate displayBoundaryWarning(warning: WatchdogWarning): boolean {\n\t\tif (!this.isEnabled()) return false;\n\t\tconst decision = this.guard.evaluate(warning);\n\t\tif (!decision.accepted) return false;\n\t\tconst details = normalizeWatchdogWarningDetails(warning, {\n\t\t\tstate: \"displayed\",\n\t\t\tsource: warning.source ?? \"main\",\n\t\t\tidentity: decision.identity,\n\t\t\tdisplayedAt: new Date().toISOString(),\n\t\t});\n\t\tthis.lastWarning = details;\n\t\tthis.displayWarning?.(details);\n\t\treturn true;\n\t}\n\n\tprivate invalidateActiveReview(_reason: string): void {\n\t\tthis.abortActiveAgentEnd();\n\t\tthis.epoch++;\n\t\tthis.status = \"idle\";\n\t\tthis.clearPendingDeltas();\n\t\tthis.reviewing = false;\n\t\tthis.waitingAtAgentEnd = false;\n\t\tthis.activeReviewId = undefined;\n\t\tthis.activeReviewWarning = undefined;\n\t}\n\n\tprivate async reviewDelta(delta: string, timeoutMs: number): Promise<ReviewDeltaOutcome> {\n\t\tif (this.reviewing || this.disposed) return \"stale\";\n\t\tthis.reviewing = true;\n\t\tconst reviewEpoch = this.epoch;\n\t\tconst reviewId = ++this.reviewIdCounter;\n\t\tthis.activeReviewId = reviewId;\n\t\tthis.activeReviewWarning = undefined;\n\t\tthis.status = \"reviewing\";\n\t\tlet timeout: ReturnType<typeof setTimeout> | undefined;\n\t\tconst abortController = new AbortController();\n\t\tconst reviewPromise = Promise.resolve().then(() => this.review({\n\t\t\tdelta,\n\t\t\tepoch: reviewEpoch,\n\t\t\treviewId,\n\t\t\tconfig: this.configResult.config,\n\t\t\tsignal: abortController.signal,\n\t\t\temitWarning: (warning) => this.acceptWarning(reviewEpoch, reviewId, warning),\n\t\t}));\n\t\ttry {\n\t\t\tconst result = await Promise.race([\n\t\t\t\treviewPromise,\n\t\t\t\tnew Promise<\"timeout\">((resolve) => {\n\t\t\t\t\ttimeout = setTimeout(() => resolve(\"timeout\"), timeoutMs);\n\t\t\t\t}),\n\t\t\t]);\n\t\t\tif (result === \"timeout\") {\n\t\t\t\tabortController.abort();\n\t\t\t\treturn \"timeout\";\n\t\t\t}\n\t\t\tif (!this.isCurrent(reviewEpoch, reviewId)) return \"stale\";\n\t\t\tfor (const warning of result?.warnings ?? []) this.acceptWarning(reviewEpoch, reviewId, warning);\n\t\t\tif (result?.stopReason && result.stopReason !== \"stop\") {\n\t\t\t\tthis.fail(`Watchdog review ended with stop reason '${result.stopReason}'.`);\n\t\t\t\treturn \"completed\";\n\t\t\t}\n\t\t\tthis.displayAcceptedReviewWarning();\n\t\t\treturn \"completed\";\n\t\t} catch (error) {\n\t\t\tif (this.isCurrent(reviewEpoch, reviewId)) {\n\t\t\t\tthis.fail(`Watchdog review failed: ${errorMessage(error)}`);\n\t\t\t\treturn \"completed\";\n\t\t\t}\n\t\t\treturn \"stale\";\n\t\t} finally {\n\t\t\tif (timeout) clearTimeout(timeout);\n\t\t\tif (this.epoch === reviewEpoch && this.activeReviewId === reviewId) {\n\t\t\t\tthis.reviewing = false;\n\t\t\t\tthis.activeReviewId = undefined;\n\t\t\t\tthis.activeReviewWarning = undefined;\n\t\t\t}\n\t\t\tthis.resolveWaiters(this.isSettled());\n\t\t}\n\t}\n\n\tprivate displayAcceptedReviewWarning(): void {\n\t\tif (!this.activeReviewWarning) return;\n\t\tconst details: WatchdogWarningDetails = {\n\t\t\t...this.activeReviewWarning,\n\t\t\tstate: \"displayed\",\n\t\t\tdisplayedAt: new Date().toISOString(),\n\t\t};\n\t\tthis.lastWarning = details;\n\t\tthis.displayWarning?.(details);\n\t}\n\n\tprivate currentRepoChangeSignature(cwd = this.cwd): WatchdogRepoChangeSignature | undefined {\n\t\treturn this.reviewChangesOnly && this.isEnabled() ? computeWatchdogRepoChangeSignature(cwd) : undefined;\n\t}\n\n\tprivate clearRepoChangeBaseline(): void {\n\t\tthis.turnStartChangeSignature = undefined;\n\t\tthis.lastReviewedChangeSignature = undefined;\n\t\tthis.currentChangedPaths = undefined;\n\t\tthis.observedRepoEditThisTurn = false;\n\t}\n\n\tprivate resetRepoChangeBaseline(): void {\n\t\tthis.turnStartChangeSignature = this.currentRepoChangeSignature();\n\t\tthis.lastReviewedChangeSignature ??= this.turnStartChangeSignature?.key;\n\t\tthis.currentChangedPaths = this.turnStartChangeSignature?.changedPaths;\n\t\tthis.observedRepoEditThisTurn = false;\n\t}\n\n\tprivate resolveReviewChangeSignature(cwd = this.cwd): WatchdogRepoChangeSignature | undefined {\n\t\tif (!this.reviewChangesOnly) return undefined;\n\t\tconst current = this.currentRepoChangeSignature(cwd);\n\t\tif (current) {\n\t\t\tthis.currentChangedPaths = current.changedPaths;\n\t\t\tif (current.key === this.turnStartChangeSignature?.key) return undefined;\n\t\t\tif (current.changedPaths.length === 0) return undefined;\n\t\t\treturn current;\n\t\t}\n\t\treturn this.observedRepoEditThisTurn\n\t\t\t? { root: cwd, key: `observed-edit:${this.epoch}:${this.reviewIdCounter}:${this.pendingDeltaChars}`, changedPaths: [] }\n\t\t\t: undefined;\n\t}\n\n\tprivate async collectLspDiagnostics(changeSignature: WatchdogRepoChangeSignature | undefined, current: { epoch: number; agentEndId: number; signal: AbortSignal }): Promise<string> {\n\t\tconst config = this.configResult.config.lsp;\n\t\tif (!config.enabled || !changeSignature?.changedPaths.length) {\n\t\t\tthis.lastLspSnapshot = {\n\t\t\t\tenabled: config.enabled,\n\t\t\t\tstatus: config.enabled ? \"skipped\" : \"disabled\",\n\t\t\t\tcheckedPaths: [],\n\t\t\t\tskippedPaths: [],\n\t\t\t\tdiagnostics: [],\n\t\t\t\tdiagnosticCount: 0,\n\t\t\t\tfreshDiagnosticCount: 0,\n\t\t\t\tupdatedAt: new Date().toISOString(),\n\t\t\t};\n\t\t\treturn \"\";\n\t\t}\n\t\ttry {\n\t\t\tconst raw = await this.lspDiagnostics({\n\t\t\t\tcwd: this.cwd,\n\t\t\t\troot: changeSignature.root,\n\t\t\t\tchangedPaths: changeSignature.changedPaths,\n\t\t\t\tconfig,\n\t\t\t\tsignal: current.signal,\n\t\t\t});\n\t\t\tif (!this.isAgentEndCurrent(current.epoch, current.agentEndId)) return \"\";\n\t\t\tconst diagnosticCount = raw.diagnostics.length;\n\t\t\tconst fresh = this.lspLedger.reduce(raw);\n\t\t\tthis.lastLspSnapshot = {\n\t\t\t\t...fresh,\n\t\t\t\tenabled: true,\n\t\t\t\tdiagnosticCount,\n\t\t\t\tfreshDiagnosticCount: fresh.diagnostics.length,\n\t\t\t\tupdatedAt: new Date().toISOString(),\n\t\t\t};\n\t\t\tconst warning = watchdogWarningFromLspDiagnostics(fresh);\n\t\t\tif (warning) this.displayBoundaryWarning(warning);\n\t\t\treturn formatWatchdogLspDiagnosticsBlock(fresh);\n\t\t} catch (error) {\n\t\t\tif (!this.isAgentEndCurrent(current.epoch, current.agentEndId)) return \"\";\n\t\t\tthis.lastLspSnapshot = {\n\t\t\t\tenabled: true,\n\t\t\t\tstatus: \"failed\",\n\t\t\t\tcheckedPaths: [],\n\t\t\t\tskippedPaths: changeSignature.changedPaths,\n\t\t\t\tdiagnostics: [],\n\t\t\t\tdiagnosticCount: 0,\n\t\t\t\tfreshDiagnosticCount: 0,\n\t\t\t\tmessage: `LSP diagnostics failed: ${errorMessage(error)}`,\n\t\t\t\tupdatedAt: new Date().toISOString(),\n\t\t\t};\n\t\t\treturn \"\";\n\t\t}\n\t}\n\n\tprivate lspSnapshot(): WatchdogLspRuntimeSnapshot {\n\t\tif (this.lastLspSnapshot) return {\n\t\t\t...this.lastLspSnapshot,\n\t\t\tcheckedPaths: [...this.lastLspSnapshot.checkedPaths],\n\t\t\tskippedPaths: [...this.lastLspSnapshot.skippedPaths],\n\t\t\tdiagnostics: [...this.lastLspSnapshot.diagnostics],\n\t\t};\n\t\tconst enabled = this.isEnabled() && this.configResult.config.lsp.enabled;\n\t\treturn {\n\t\t\tenabled,\n\t\t\tstatus: enabled ? \"skipped\" : \"disabled\",\n\t\t\tcheckedPaths: [],\n\t\t\tskippedPaths: [],\n\t\t\tdiagnostics: [],\n\t\t\tdiagnosticCount: 0,\n\t\t\tfreshDiagnosticCount: 0,\n\t\t};\n\t}\n\n\tprivate appendBoundedDelta(delta: string): void {\n\t\tlet entry = delta.trim();\n\t\tif (!entry) return;\n\t\tif (entry.length > MAX_REVIEW_INPUT_CHARS) entry = entry.slice(-MAX_REVIEW_INPUT_CHARS);\n\t\tthis.pendingDeltas.push(entry);\n\t\tthis.pendingDeltaChars += entry.length;\n\t\twhile (this.pendingDeltas.length > 1 && this.pendingDeltaChars + (this.pendingDeltas.length - 1) * REVIEW_DELTA_SEPARATOR.length > MAX_REVIEW_INPUT_CHARS) {\n\t\t\tconst removed = this.pendingDeltas.shift();\n\t\t\tif (removed) this.pendingDeltaChars -= removed.length;\n\t\t}\n\t}\n\n\tprivate buildReviewInput(changeSignature?: WatchdogRepoChangeSignature, lspBlock = \"\"): string {\n\t\tconst input = this.pendingDeltas.join(REVIEW_DELTA_SEPARATOR);\n\t\tconst changes = changeSignature?.changedPaths.length\n\t\t\t? [\"Changed repo paths:\", ...changeSignature.changedPaths.slice(0, 200).map((file) => `- ${file}`)].join(\"\\n\")\n\t\t\t: \"\";\n\t\tconst contextPieces = [changes, lspBlock].filter(Boolean);\n\t\tif (!contextPieces.length) return input.length > MAX_REVIEW_INPUT_CHARS ? input.slice(-MAX_REVIEW_INPUT_CHARS) : input;\n\n\t\tconst maxContextLength = Math.floor(MAX_REVIEW_INPUT_CHARS / 2);\n\t\tconst maxPieceLength = Math.max(1_000, Math.floor(maxContextLength / contextPieces.length));\n\t\tconst boundedContext = contextPieces.map((piece) => piece.length > maxPieceLength\n\t\t\t? `${piece.slice(0, maxPieceLength - 6)}\\n- ...`\n\t\t\t: piece).join(REVIEW_DELTA_SEPARATOR);\n\t\tconst separatorLength = input ? REVIEW_DELTA_SEPARATOR.length : 0;\n\t\tconst inputBudget = MAX_REVIEW_INPUT_CHARS - boundedContext.length - separatorLength;\n\t\tconst boundedInput = inputBudget <= 0\n\t\t\t? \"\"\n\t\t\t: input.length > inputBudget\n\t\t\t\t? input.slice(-inputBudget)\n\t\t\t\t: input;\n\t\treturn [boundedContext, boundedInput].filter(Boolean).join(REVIEW_DELTA_SEPARATOR);\n\t}\n\n\tprivate clearPendingDeltas(): void {\n\t\tthis.pendingDeltas = [];\n\t\tthis.pendingDeltaChars = 0;\n\t}\n\n\tprivate fail(message: string): void {\n\t\tthis.failedReviews++;\n\t\tthis.lastError = message;\n\t\tthis.status = \"failed\";\n\t\tthis.clearPendingDeltas();\n\t\tthis.resolveWaiters(true);\n\t}\n\n\tprivate markLastWarningStale(): void {\n\t\tif (!this.lastWarning || this.lastWarning.state === \"displayed\") return;\n\t\tthis.lastWarning = { ...this.lastWarning, stale: true, state: \"stale\" };\n\t}\n\n\tprivate isSettled(): boolean {\n\t\treturn !this.reviewing && this.pendingDeltas.length === 0;\n\t}\n\n\tprivate waitForSettled(timeoutMs: number): Promise<boolean> {\n\t\tif (this.isSettled()) return Promise.resolve(true);\n\t\treturn new Promise((resolve) => {\n\t\t\tconst waiter: Waiter = {\n\t\t\t\tresolve,\n\t\t\t\ttimer: setTimeout(() => {\n\t\t\t\t\tthis.waiters = this.waiters.filter((entry) => entry !== waiter);\n\t\t\t\t\tresolve(false);\n\t\t\t\t}, timeoutMs),\n\t\t\t};\n\t\t\tthis.waiters.push(waiter);\n\t\t});\n\t}\n\n\tprivate resolveWaiters(settled: boolean): void {\n\t\tif (!settled && !this.disposed) return;\n\t\tconst waiters = this.waiters;\n\t\tthis.waiters = [];\n\t\tfor (const waiter of waiters) {\n\t\t\tclearTimeout(waiter.timer);\n\t\t\twaiter.resolve(settled);\n\t\t}\n\t}\n}\n"]}
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * simple-memory — a minimal one-file memory extension for pi.
3
3
  *
4
- * One memory file (~/.lunr/simple-memory/memory.md), one memory per line.
5
- * Loaded into the system prompt every turn (before_agent_start); never truncated.
4
+ * One memory file (~/.lunr/simple-memory/memory.md), one durable fact per line.
5
+ * Loaded into the system prompt every turn while agent memory is enabled.
6
6
  * Tools: memory_add, memory_remove, memory_load.
7
7
  * Command: /memory-char-cap [n] — view or set the character cap (1..30000, default 5000).
8
8
  *
@@ -1 +1 @@
1
- {"version":3,"file":"simple-pi-memory.d.ts","sourceRoot":"","sources":["../../src/builtin-extensions/simple-pi-memory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAsCH,UAAU,UAAU;IACnB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,UAAU,YAAY;IACrB,YAAY,CAAC,IAAI,EAAE;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,OAAO,CAAC;QACpB,OAAO,CACN,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,OAAO,EACjB,GAAG,EAAE,OAAO,GACV,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC;KACpC,GAAG,IAAI,CAAC;IACT,eAAe,CACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;QACR,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;KACjE,GACC,IAAI,CAAC;IACR,EAAE,CACD,KAAK,EAAE,oBAAoB,EAC3B,OAAO,EAAE,CACR,KAAK,EAAE,qBAAqB,EAC5B,GAAG,EAAE,OAAO,KAEV,OAAO,CAAC;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,GACzC;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GACzB,IAAI,GACL,IAAI,CAAC;CACR;AAED,UAAU,qBAAqB;IAC9B,IAAI,EAAE,oBAAoB,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,cAAc;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE;QACH,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,IAAI,CAAC;KACpE,CAAC;CACF;AAyED,MAAM,CAAC,OAAO,WAAW,EAAE,EAAE,YAAY,GAAG,IAAI,CA2I/C","sourcesContent":["/**\n * simple-memory — a minimal one-file memory extension for pi.\n *\n * One memory file (~/.lunr/simple-memory/memory.md), one memory per line.\n * Loaded into the system prompt every turn (before_agent_start); never truncated.\n * Tools: memory_add, memory_remove, memory_load.\n * Command: /memory-char-cap [n] — view or set the character cap (1..30000, default 5000).\n *\n * Loaded by pi via jiti — no build step, plain TypeScript.\n *\n * Types are declared inline (see the batxj-thinking extension for why:\n * pi-coding-agent's index.d.ts re-exports from internal .d.ts files with\n * subpath imports that fail under `tsc --noEmit index.ts`). `Type` is a\n * runtime value imported from @sinclair/typebox (a peer dependency) for tool\n * parameter schemas.\n */\n\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { Type } from \"@sinclair/typebox\";\n// lunr: concrete core-module import (never the package barrel) — resolves the\n// memory dir next to the lunr agent dir instead of the hardcoded ~/.pi below.\nimport { getAgentDir } from \"../config.js\";\n\n// ---------------------------------------------------------------------------\n// Paths and config\n// ---------------------------------------------------------------------------\n// lunr: was join(homedir(), \".pi\", \"simple-memory\") — leaked lunr memory into a\n// real pi install's ~/.pi. Now a sibling of the lunr agent dir (~/.lunr/simple-memory).\n// Old files are copied over by the core startup migration (migrations.ts).\nconst BASE_DIR = join(dirname(getAgentDir()), \"simple-memory\");\nconst MEMORY_FILE = join(BASE_DIR, \"memory.md\");\nconst CONFIG_FILE = join(BASE_DIR, \"config.json\");\n\nconst DEFAULT_CHAR_CAP = 5000;\nconst MIN_CHAR_CAP = 1;\nconst MAX_CHAR_CAP = 30000;\n\n// lunr: inside lunR the cap lives in lunR settings, exposed by core on\n// globalThis under Symbol.for(\"@lunr/memory-cap\") (registered from main.ts).\n// The config.json fallback below only matters when no bridge exists.\ninterface MemoryCapBridge {\n\tgetCharCap(): number;\n\tsetCharCap(cap: number): void;\n}\n\nfunction getCapBridge(): MemoryCapBridge | undefined {\n\treturn (globalThis as Record<symbol, unknown>)[Symbol.for(\"@lunr/memory-cap\")] as MemoryCapBridge | undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Inline structural types (self-contained for `tsc --noEmit index.ts`)\n// ---------------------------------------------------------------------------\ninterface ToolResult {\n\tcontent: { type: \"text\"; text: string }[];\n\tdetails?: Record<string, unknown>;\n}\n\ninterface ExtensionAPI {\n\tregisterTool(tool: {\n\t\tname: string;\n\t\tlabel?: string;\n\t\tdescription: string;\n\t\tparameters: unknown;\n\t\texecute(\n\t\t\ttoolCallId: string,\n\t\t\tparams: Record<string, unknown>,\n\t\t\tsignal: AbortSignal,\n\t\t\tonUpdate: unknown,\n\t\t\tctx: unknown,\n\t\t): Promise<ToolResult> | ToolResult;\n\t}): void;\n\tregisterCommand(\n\t\tname: string,\n\t\toptions: {\n\t\t\tdescription?: string;\n\t\t\thandler(args: string, ctx: CommandContext): Promise<void> | void;\n\t\t},\n\t): void;\n\ton(\n\t\tevent: \"before_agent_start\",\n\t\thandler: (\n\t\t\tevent: BeforeAgentStartEvent,\n\t\t\tctx: unknown,\n\t\t) =>\n\t\t\t| Promise<{ systemPrompt?: string } | void>\n\t\t\t| { systemPrompt?: string }\n\t\t\t| void,\n\t): void;\n}\n\ninterface BeforeAgentStartEvent {\n\ttype: \"before_agent_start\";\n\tprompt?: string;\n\tsystemPrompt: string;\n}\n\ninterface CommandContext {\n\tmode: string;\n\tui: {\n\t\tnotify(message: string, level?: \"info\" | \"warning\" | \"error\"): void;\n\t};\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\nfunction ensureDir(): void {\n\tif (!existsSync(BASE_DIR)) mkdirSync(BASE_DIR, { recursive: true });\n}\n\nfunction readMemory(): string {\n\tif (!existsSync(MEMORY_FILE)) return \"\";\n\treturn readFileSync(MEMORY_FILE, \"utf-8\");\n}\n\nfunction writeMemoryRaw(text: string): void {\n\tensureDir();\n\twriteFileSync(MEMORY_FILE, text, \"utf-8\");\n}\n\n// Non-empty lines, in order. Normalizes the file (drops blank lines).\nfunction memoryLines(): string[] {\n\tconst text = readMemory();\n\tif (!text.trim()) return [];\n\treturn text.split(\"\\n\").filter((l) => l.trim().length > 0);\n}\n\nfunction clampCap(n: number): number {\n\tif (!Number.isFinite(n)) return DEFAULT_CHAR_CAP;\n\tn = Math.trunc(n);\n\tif (n < MIN_CHAR_CAP) return MIN_CHAR_CAP;\n\tif (n > MAX_CHAR_CAP) return MAX_CHAR_CAP;\n\treturn n;\n}\n\nfunction readCap(): number {\n\tconst bridge = getCapBridge();\n\tif (bridge) return clampCap(bridge.getCharCap());\n\tif (!existsSync(CONFIG_FILE)) return DEFAULT_CHAR_CAP;\n\ttry {\n\t\tconst cfg = JSON.parse(readFileSync(CONFIG_FILE, \"utf-8\"));\n\t\tif (typeof cfg.charCap === \"number\" && Number.isFinite(cfg.charCap)) {\n\t\t\treturn clampCap(cfg.charCap);\n\t\t}\n\t} catch {\n\t\t// corrupt config — fall back to default\n\t}\n\treturn DEFAULT_CHAR_CAP;\n}\n\nfunction writeCap(cap: number): void {\n\tconst bridge = getCapBridge();\n\tif (bridge) {\n\t\tbridge.setCharCap(clampCap(cap));\n\t\treturn;\n\t}\n\tensureDir();\n\twriteFileSync(CONFIG_FILE, JSON.stringify({ charCap: cap }, null, 2), \"utf-8\");\n}\n\nfunction todayStamp(): string {\n\tconst d = new Date();\n\tconst p = (x: number) => String(x).padStart(2, \"0\");\n\treturn `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())}`;\n}\n\n// Strip a leading \"[YYYY-MM-DD] \" date prefix so dedup compares bare content.\nfunction stripDate(line: string): string {\n\treturn line.replace(/^\\[\\d{4}-\\d{2}-\\d{2}\\]\\s*/, \"\");\n}\n\n// ---------------------------------------------------------------------------\n// Extension\n// ---------------------------------------------------------------------------\nexport default function (pi: ExtensionAPI): void {\n\t// --- Inject memory into the system prompt every turn ---\n\tpi.on(\"before_agent_start\", async (event) => {\n\t\tconst mem = readMemory();\n\t\tif (!mem.trim()) return; // inject nothing when empty\n\t\tconst block =\n\t\t\t\"\\n\\n## Memory (durable facts about the user; apply these; change them with the memory tools)\\n\" +\n\t\t\tmem.trimEnd();\n\t\treturn { systemPrompt: event.systemPrompt + block };\n\t});\n\n\t// --- memory_add ---\n\tpi.registerTool({\n\t\tname: \"memory_add\",\n\t\tlabel: \"Memory Add\",\n\t\tdescription: [\n\t\t\t\"Add one durable memory about the user (a fact, preference, or decision).\",\n\t\t\t\"Each memory is a single line; a [YYYY-MM-DD] date prefix is added automatically.\",\n\t\t\t\"An optional #tag improves readability (e.g. #preference).\",\n\t\t\t\"Refuses if the content already exists (exact match) or if the file is at the character cap.\",\n\t\t].join(\"\\n\"),\n\t\tparameters: Type.Object({\n\t\t\tcontent: Type.String({\n\t\t\t\tdescription: \"The memory text (one line). You may include a #tag.\",\n\t\t\t}),\n\t\t}),\n\t\tasync execute(_id, params) {\n\t\t\tconst content = String(params.content ?? \"\").replace(/[\\r\\n]+/g, \" \").trim();\n\t\t\tif (!content) {\n\t\t\t\treturn { content: [{ type: \"text\", text: \"memory_add: content is empty.\" }] };\n\t\t\t}\n\t\t\tconst lines = memoryLines();\n\t\t\t// exact-content dedup (compare bare content, ignoring the date prefix)\n\t\t\tif (lines.some((l) => stripDate(l) === content)) {\n\t\t\t\treturn { content: [{ type: \"text\", text: \"Already in memory (not added).\" }] };\n\t\t\t}\n\t\t\tconst cap = readCap();\n\t\t\tconst newLine = `[${todayStamp()}] ${content}`;\n\t\t\tconst sep = lines.length > 0 ? \"\\n\" : \"\";\n\t\t\tconst prospective = lines.join(\"\\n\") + sep + newLine + \"\\n\";\n\t\t\tif (prospective.length > cap) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: `Memory full: ${readMemory().length}/${cap} chars. Remove a memory first (memory_remove).`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t}\n\t\t\twriteMemoryRaw(prospective);\n\t\t\treturn {\n\t\t\t\tcontent: [\n\t\t\t\t\t{ type: \"text\", text: `Added memory (${prospective.length}/${cap} chars): ${newLine}` },\n\t\t\t\t],\n\t\t\t};\n\t\t},\n\t});\n\n\t// --- memory_remove ---\n\tpi.registerTool({\n\t\tname: \"memory_remove\",\n\t\tlabel: \"Memory Remove\",\n\t\tdescription: [\n\t\t\t\"Remove one memory by its exact line text, as shown by memory_load.\",\n\t\t\t\"Deletes only an exact, full-line match (including the date prefix).\",\n\t\t\t\"Returns 'not found' if no line matches exactly.\",\n\t\t].join(\"\\n\"),\n\t\tparameters: Type.Object({\n\t\t\tline: Type.String({\n\t\t\t\tdescription: \"The exact memory line to remove (verbatim, including the date prefix).\",\n\t\t\t}),\n\t\t}),\n\t\tasync execute(_id, params) {\n\t\t\tconst target = String(params.line ?? \"\").trim();\n\t\t\tif (!target) {\n\t\t\t\treturn { content: [{ type: \"text\", text: \"memory_remove: line is empty.\" }] };\n\t\t\t}\n\t\t\tconst lines = memoryLines();\n\t\t\tconst remaining = lines.filter((l) => l !== target);\n\t\t\tif (remaining.length === lines.length) {\n\t\t\t\treturn { content: [{ type: \"text\", text: `Not found (no exact match): ${target}` }] };\n\t\t\t}\n\t\t\twriteMemoryRaw(remaining.length > 0 ? remaining.join(\"\\n\") + \"\\n\" : \"\");\n\t\t\treturn { content: [{ type: \"text\", text: `Removed memory: ${target}` }] };\n\t\t},\n\t});\n\n\t// --- memory_load ---\n\tpi.registerTool({\n\t\tname: \"memory_load\",\n\t\tlabel: \"Memory Load\",\n\t\tdescription: [\n\t\t\t\"Read the current memory file and show all memories with the size/cap.\",\n\t\t\t\"Use this to re-read memory after editing the file by hand, or to inspect it.\",\n\t\t].join(\"\\n\"),\n\t\tparameters: Type.Object({}),\n\t\tasync execute() {\n\t\t\tconst raw = readMemory();\n\t\t\tconst cap = readCap();\n\t\t\tif (!raw.trim()) {\n\t\t\t\treturn { content: [{ type: \"text\", text: `Memory is empty (0/${cap} chars).` }] };\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tcontent: [\n\t\t\t\t\t{ type: \"text\", text: `Memory (${raw.length}/${cap} chars):\\n${raw.trimEnd()}` },\n\t\t\t\t],\n\t\t\t};\n\t\t},\n\t});\n\n\t// --- /memory-char-cap command ---\n\tpi.registerCommand(\"memory-char-cap\", {\n\t\tdescription: \"View or set the memory character cap (1..30000). Default 5000.\",\n\t\thandler(args, ctx) {\n\t\t\tconst trimmed = args.trim();\n\t\t\tif (!trimmed) {\n\t\t\t\tctx.ui.notify(`Memory character cap: ${readCap()}`, \"info\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst n = Number(trimmed);\n\t\t\tif (!Number.isFinite(n) || !Number.isInteger(n) || n < MIN_CHAR_CAP || n > MAX_CHAR_CAP) {\n\t\t\t\tctx.ui.notify(\n\t\t\t\t\t`Invalid cap. Must be an integer between ${MIN_CHAR_CAP} and ${MAX_CHAR_CAP}.`,\n\t\t\t\t\t\"error\",\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (n < readMemory().length) {\n\t\t\t\tctx.ui.notify(\n\t\t\t\t\t`Your memory file already exceeds this character cap. Edit memory file at ${MEMORY_FILE}`,\n\t\t\t\t\t\"warning\",\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\twriteCap(n);\n\t\t\tctx.ui.notify(`Memory character cap set to ${n}.`, \"info\");\n\t\t},\n\t});\n}"]}
1
+ {"version":3,"file":"simple-pi-memory.d.ts","sourceRoot":"","sources":["../../src/builtin-extensions/simple-pi-memory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAuDH,UAAU,UAAU;IACnB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,UAAU,YAAY;IACrB,YAAY,CAAC,IAAI,EAAE;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,OAAO,CAAC;QACpB,OAAO,CACN,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,OAAO,EACjB,GAAG,EAAE,OAAO,GACV,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC;KACpC,GAAG,IAAI,CAAC;IACT,eAAe,CACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;QACR,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;KACjE,GACC,IAAI,CAAC;IACR,EAAE,CACD,KAAK,EAAE,oBAAoB,EAC3B,OAAO,EAAE,CACR,KAAK,EAAE,qBAAqB,EAC5B,GAAG,EAAE,OAAO,KAEV,OAAO,CAAC;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,GACzC;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GACzB,IAAI,GACL,IAAI,CAAC;CACR;AAED,UAAU,qBAAqB;IAC9B,IAAI,EAAE,oBAAoB,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,cAAc;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE;QACH,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,IAAI,CAAC;KACpE,CAAC;CACF;AA4ED,MAAM,CAAC,OAAO,WAAW,EAAE,EAAE,YAAY,GAAG,IAAI,CAgJ/C","sourcesContent":["/**\n * simple-memory — a minimal one-file memory extension for pi.\n *\n * One memory file (~/.lunr/simple-memory/memory.md), one durable fact per line.\n * Loaded into the system prompt every turn while agent memory is enabled.\n * Tools: memory_add, memory_remove, memory_load.\n * Command: /memory-char-cap [n] — view or set the character cap (1..30000, default 5000).\n *\n * Loaded by pi via jiti — no build step, plain TypeScript.\n *\n * Types are declared inline (see the batxj-thinking extension for why:\n * pi-coding-agent's index.d.ts re-exports from internal .d.ts files with\n * subpath imports that fail under `tsc --noEmit index.ts`). `Type` is a\n * runtime value imported from @sinclair/typebox (a peer dependency) for tool\n * parameter schemas.\n */\n\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { Type } from \"@sinclair/typebox\";\n// lunr: concrete core-module import (never the package barrel) — resolves the\n// memory dir next to the lunr agent dir instead of the hardcoded ~/.pi below.\nimport { getAgentDir } from \"../config.js\";\n\n// ---------------------------------------------------------------------------\n// Paths and config\n// ---------------------------------------------------------------------------\n// lunr: was join(homedir(), \".pi\", \"simple-memory\") — leaked lunr memory into a\n// real pi install's ~/.pi. Now a sibling of the lunr agent dir (~/.lunr/simple-memory).\n// Old files are copied over by the core startup migration (migrations.ts).\nfunction baseDir(): string {\n\treturn join(dirname(getAgentDir()), \"simple-memory\");\n}\n\nfunction memoryFile(): string {\n\treturn join(baseDir(), \"memory.md\");\n}\n\nfunction configFile(): string {\n\treturn join(baseDir(), \"config.json\");\n}\n\nconst DEFAULT_CHAR_CAP = 5000;\nconst MIN_CHAR_CAP = 1;\nconst MAX_CHAR_CAP = 30000;\n\n// lunr: inside lunR the cap lives in lunR settings, exposed by core on\n// globalThis under Symbol.for(\"@lunr/memory-cap\") (registered from main.ts).\n// The config.json fallback below only matters when no bridge exists.\ninterface MemoryCapBridge {\n\tisEnabled(): boolean;\n\tgetCharCap(): number;\n\tsetCharCap(cap: number): void;\n}\n\nfunction getCapBridge(): MemoryCapBridge | undefined {\n\treturn (globalThis as Record<symbol, unknown>)[Symbol.for(\"@lunr/memory-cap\")] as MemoryCapBridge | undefined;\n}\n\nfunction isMemoryEnabled(): boolean {\n\treturn getCapBridge()?.isEnabled() ?? true;\n}\n\nfunction disabledResult(): ToolResult {\n\treturn { content: [{ type: \"text\", text: \"Agent memory is disabled in /settings.\" }] };\n}\n\n// ---------------------------------------------------------------------------\n// Inline structural types (self-contained for `tsc --noEmit index.ts`)\n// ---------------------------------------------------------------------------\ninterface ToolResult {\n\tcontent: { type: \"text\"; text: string }[];\n\tdetails?: Record<string, unknown>;\n}\n\ninterface ExtensionAPI {\n\tregisterTool(tool: {\n\t\tname: string;\n\t\tlabel?: string;\n\t\tdescription: string;\n\t\tparameters: unknown;\n\t\texecute(\n\t\t\ttoolCallId: string,\n\t\t\tparams: Record<string, unknown>,\n\t\t\tsignal: AbortSignal,\n\t\t\tonUpdate: unknown,\n\t\t\tctx: unknown,\n\t\t): Promise<ToolResult> | ToolResult;\n\t}): void;\n\tregisterCommand(\n\t\tname: string,\n\t\toptions: {\n\t\t\tdescription?: string;\n\t\t\thandler(args: string, ctx: CommandContext): Promise<void> | void;\n\t\t},\n\t): void;\n\ton(\n\t\tevent: \"before_agent_start\",\n\t\thandler: (\n\t\t\tevent: BeforeAgentStartEvent,\n\t\t\tctx: unknown,\n\t\t) =>\n\t\t\t| Promise<{ systemPrompt?: string } | void>\n\t\t\t| { systemPrompt?: string }\n\t\t\t| void,\n\t): void;\n}\n\ninterface BeforeAgentStartEvent {\n\ttype: \"before_agent_start\";\n\tprompt?: string;\n\tsystemPrompt: string;\n}\n\ninterface CommandContext {\n\tmode: string;\n\tui: {\n\t\tnotify(message: string, level?: \"info\" | \"warning\" | \"error\"): void;\n\t};\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\nfunction ensureDir(): void {\n\tconst dir = baseDir();\n\tif (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n}\n\nfunction readMemory(): string {\n\tconst file = memoryFile();\n\tif (!existsSync(file)) return \"\";\n\treturn readFileSync(file, \"utf-8\");\n}\n\nfunction writeMemoryRaw(text: string): void {\n\tensureDir();\n\twriteFileSync(memoryFile(), text, \"utf-8\");\n}\n\n// Non-empty lines, in order. Normalizes the file (drops blank lines).\nfunction memoryLines(): string[] {\n\tconst text = readMemory();\n\tif (!text.trim()) return [];\n\treturn text.split(\"\\n\").filter((l) => l.trim().length > 0);\n}\n\nfunction clampCap(n: number): number {\n\tif (!Number.isFinite(n)) return DEFAULT_CHAR_CAP;\n\tn = Math.trunc(n);\n\tif (n < MIN_CHAR_CAP) return MIN_CHAR_CAP;\n\tif (n > MAX_CHAR_CAP) return MAX_CHAR_CAP;\n\treturn n;\n}\n\nfunction readCap(): number {\n\tconst bridge = getCapBridge();\n\tif (bridge) return clampCap(bridge.getCharCap());\n\tconst file = configFile();\n\tif (!existsSync(file)) return DEFAULT_CHAR_CAP;\n\ttry {\n\t\tconst cfg = JSON.parse(readFileSync(file, \"utf-8\"));\n\t\tif (typeof cfg.charCap === \"number\" && Number.isFinite(cfg.charCap)) {\n\t\t\treturn clampCap(cfg.charCap);\n\t\t}\n\t} catch {\n\t\t// corrupt config — fall back to default\n\t}\n\treturn DEFAULT_CHAR_CAP;\n}\n\nfunction writeCap(cap: number): void {\n\tconst bridge = getCapBridge();\n\tif (bridge) {\n\t\tbridge.setCharCap(clampCap(cap));\n\t\treturn;\n\t}\n\tensureDir();\n\twriteFileSync(configFile(), JSON.stringify({ charCap: cap }, null, 2), \"utf-8\");\n}\n\nfunction todayStamp(): string {\n\tconst d = new Date();\n\tconst p = (x: number) => String(x).padStart(2, \"0\");\n\treturn `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())}`;\n}\n\n// Strip a leading \"[YYYY-MM-DD] \" date prefix so dedup compares bare content.\nfunction stripDate(line: string): string {\n\treturn line.replace(/^\\[\\d{4}-\\d{2}-\\d{2}\\]\\s*/, \"\");\n}\n\n// ---------------------------------------------------------------------------\n// Extension\n// ---------------------------------------------------------------------------\nexport default function (pi: ExtensionAPI): void {\n\t// --- Inject memory into the system prompt every turn ---\n\tpi.on(\"before_agent_start\", async (event) => {\n\t\tif (!isMemoryEnabled()) return;\n\t\tconst mem = readMemory();\n\t\tif (!mem.trim()) return; // inject nothing when empty\n\t\tconst block =\n\t\t\t\"\\n\\n## Memory (durable facts; apply these; change them only with the memory tools)\\n\" +\n\t\t\tmem.trimEnd();\n\t\treturn { systemPrompt: event.systemPrompt + block };\n\t});\n\n\t// --- memory_add ---\n\tpi.registerTool({\n\t\tname: \"memory_add\",\n\t\tlabel: \"Memory Add\",\n\t\tdescription: [\n\t\t\t\"Add one durable fact about the user or their environment.\",\n\t\t\t\"Store only established facts and stable preferences, never behavior instructions, task state, transcripts, guesses, or secrets.\",\n\t\t\t\"Each memory is a single line; a [YYYY-MM-DD] date prefix is added automatically.\",\n\t\t\t\"An optional #tag improves readability (e.g. #preference).\",\n\t\t\t\"Refuses if the content already exists (exact match) or if the file is at the character cap.\",\n\t\t].join(\"\\n\"),\n\t\tparameters: Type.Object({\n\t\t\tcontent: Type.String({\n\t\t\t\tdescription: \"The memory text (one line). You may include a #tag.\",\n\t\t\t}),\n\t\t}),\n\t\tasync execute(_id, params) {\n\t\t\tif (!isMemoryEnabled()) return disabledResult();\n\t\t\tconst content = String(params.content ?? \"\").replace(/[\\r\\n]+/g, \" \").trim();\n\t\t\tif (!content) {\n\t\t\t\treturn { content: [{ type: \"text\", text: \"memory_add: content is empty.\" }] };\n\t\t\t}\n\t\t\tconst lines = memoryLines();\n\t\t\t// exact-content dedup (compare bare content, ignoring the date prefix)\n\t\t\tif (lines.some((l) => stripDate(l) === content)) {\n\t\t\t\treturn { content: [{ type: \"text\", text: \"Already in memory (not added).\" }] };\n\t\t\t}\n\t\t\tconst cap = readCap();\n\t\t\tconst newLine = `[${todayStamp()}] ${content}`;\n\t\t\tconst sep = lines.length > 0 ? \"\\n\" : \"\";\n\t\t\tconst prospective = lines.join(\"\\n\") + sep + newLine + \"\\n\";\n\t\t\tif (prospective.length > cap) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: `Memory full: ${readMemory().length}/${cap} chars. Remove a memory first (memory_remove).`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t}\n\t\t\twriteMemoryRaw(prospective);\n\t\t\treturn {\n\t\t\t\tcontent: [\n\t\t\t\t\t{ type: \"text\", text: `Added memory (${prospective.length}/${cap} chars): ${newLine}` },\n\t\t\t\t],\n\t\t\t};\n\t\t},\n\t});\n\n\t// --- memory_remove ---\n\tpi.registerTool({\n\t\tname: \"memory_remove\",\n\t\tlabel: \"Memory Remove\",\n\t\tdescription: [\n\t\t\t\"Remove one memory by its exact line text, as shown by memory_load.\",\n\t\t\t\"Deletes only an exact, full-line match (including the date prefix).\",\n\t\t\t\"Returns 'not found' if no line matches exactly.\",\n\t\t].join(\"\\n\"),\n\t\tparameters: Type.Object({\n\t\t\tline: Type.String({\n\t\t\t\tdescription: \"The exact memory line to remove (verbatim, including the date prefix).\",\n\t\t\t}),\n\t\t}),\n\t\tasync execute(_id, params) {\n\t\t\tif (!isMemoryEnabled()) return disabledResult();\n\t\t\tconst target = String(params.line ?? \"\").trim();\n\t\t\tif (!target) {\n\t\t\t\treturn { content: [{ type: \"text\", text: \"memory_remove: line is empty.\" }] };\n\t\t\t}\n\t\t\tconst lines = memoryLines();\n\t\t\tconst remaining = lines.filter((l) => l !== target);\n\t\t\tif (remaining.length === lines.length) {\n\t\t\t\treturn { content: [{ type: \"text\", text: `Not found (no exact match): ${target}` }] };\n\t\t\t}\n\t\t\twriteMemoryRaw(remaining.length > 0 ? remaining.join(\"\\n\") + \"\\n\" : \"\");\n\t\t\treturn { content: [{ type: \"text\", text: `Removed memory: ${target}` }] };\n\t\t},\n\t});\n\n\t// --- memory_load ---\n\tpi.registerTool({\n\t\tname: \"memory_load\",\n\t\tlabel: \"Memory Load\",\n\t\tdescription: [\n\t\t\t\"Read the current memory file and show all memories with the size/cap.\",\n\t\t\t\"Use this to inspect durable facts before adding, correcting, or removing one.\",\n\t\t].join(\"\\n\"),\n\t\tparameters: Type.Object({}),\n\t\tasync execute() {\n\t\t\tif (!isMemoryEnabled()) return disabledResult();\n\t\t\tconst raw = readMemory();\n\t\t\tconst cap = readCap();\n\t\t\tif (!raw.trim()) {\n\t\t\t\treturn { content: [{ type: \"text\", text: `Memory is empty (0/${cap} chars).` }] };\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tcontent: [\n\t\t\t\t\t{ type: \"text\", text: `Memory (${raw.length}/${cap} chars):\\n${raw.trimEnd()}` },\n\t\t\t\t],\n\t\t\t};\n\t\t},\n\t});\n\n\t// --- /memory-char-cap command ---\n\tpi.registerCommand(\"memory-char-cap\", {\n\t\tdescription: \"View or set the memory character cap (1..30000). Default 5000.\",\n\t\thandler(args, ctx) {\n\t\t\tconst trimmed = args.trim();\n\t\t\tif (!trimmed) {\n\t\t\t\tctx.ui.notify(`Memory character cap: ${readCap()}`, \"info\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst n = Number(trimmed);\n\t\t\tif (!Number.isFinite(n) || !Number.isInteger(n) || n < MIN_CHAR_CAP || n > MAX_CHAR_CAP) {\n\t\t\t\tctx.ui.notify(\n\t\t\t\t\t`Invalid cap. Must be an integer between ${MIN_CHAR_CAP} and ${MAX_CHAR_CAP}.`,\n\t\t\t\t\t\"error\",\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (n < readMemory().length) {\n\t\t\t\tctx.ui.notify(\n\t\t\t\t\t`Your memory file already exceeds this character cap: ${memoryFile()}`,\n\t\t\t\t\t\"warning\",\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\twriteCap(n);\n\t\t\tctx.ui.notify(`Memory character cap set to ${n}.`, \"info\");\n\t\t},\n\t});\n}\n"]}