@code-yeongyu/senpi 2026.8.3 → 2026.8.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (302) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/README.md +9 -0
  3. package/dist/cli/args.d.ts.map +1 -1
  4. package/dist/cli/args.js +1 -0
  5. package/dist/cli/args.js.map +1 -1
  6. package/dist/client/remote-session.d.ts +2 -2
  7. package/dist/client/transcript.d.ts +1 -1
  8. package/dist/core/agent-session.d.ts +6 -0
  9. package/dist/core/agent-session.d.ts.map +1 -1
  10. package/dist/core/agent-session.js +174 -39
  11. package/dist/core/agent-session.js.map +1 -1
  12. package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts +2 -1
  13. package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts.map +1 -1
  14. package/dist/core/extensions/builtin/compaction/deterministic-fallback.js +126 -26
  15. package/dist/core/extensions/builtin/compaction/deterministic-fallback.js.map +1 -1
  16. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  17. package/dist/core/extensions/builtin/compaction/index.js +12 -7
  18. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  19. package/dist/core/extensions/builtin/compaction/per-turn-cap.d.ts.map +1 -1
  20. package/dist/core/extensions/builtin/compaction/per-turn-cap.js +4 -1
  21. package/dist/core/extensions/builtin/compaction/per-turn-cap.js.map +1 -1
  22. package/dist/core/extensions/builtin/compaction/retained-message-safety.d.ts +4 -0
  23. package/dist/core/extensions/builtin/compaction/retained-message-safety.d.ts.map +1 -0
  24. package/dist/core/extensions/builtin/compaction/retained-message-safety.js +155 -0
  25. package/dist/core/extensions/builtin/compaction/retained-message-safety.js.map +1 -0
  26. package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
  27. package/dist/core/extensions/builtin/compaction/speculative.js +21 -13
  28. package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
  29. package/dist/core/extensions/builtin/goal/cache-warm-renderer.d.ts.map +1 -1
  30. package/dist/core/extensions/builtin/goal/cache-warm-renderer.js +9 -14
  31. package/dist/core/extensions/builtin/goal/cache-warm-renderer.js.map +1 -1
  32. package/dist/core/extensions/builtin/goal/continuation-recovery.d.ts +1 -0
  33. package/dist/core/extensions/builtin/goal/continuation-recovery.d.ts.map +1 -1
  34. package/dist/core/extensions/builtin/goal/continuation-recovery.js +7 -0
  35. package/dist/core/extensions/builtin/goal/continuation-recovery.js.map +1 -1
  36. package/dist/core/extensions/builtin/goal/continuation.d.ts +2 -1
  37. package/dist/core/extensions/builtin/goal/continuation.d.ts.map +1 -1
  38. package/dist/core/extensions/builtin/goal/continuation.js +2 -1
  39. package/dist/core/extensions/builtin/goal/continuation.js.map +1 -1
  40. package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
  41. package/dist/core/extensions/builtin/goal/index.js +26 -11
  42. package/dist/core/extensions/builtin/goal/index.js.map +1 -1
  43. package/dist/core/extensions/builtin/goal/lifecycle-helpers.d.ts +7 -1
  44. package/dist/core/extensions/builtin/goal/lifecycle-helpers.d.ts.map +1 -1
  45. package/dist/core/extensions/builtin/goal/lifecycle-helpers.js +14 -2
  46. package/dist/core/extensions/builtin/goal/lifecycle-helpers.js.map +1 -1
  47. package/dist/core/extensions/builtin/goal/monitor-continuation.d.ts +3 -2
  48. package/dist/core/extensions/builtin/goal/monitor-continuation.d.ts.map +1 -1
  49. package/dist/core/extensions/builtin/goal/monitor-continuation.js +89 -46
  50. package/dist/core/extensions/builtin/goal/monitor-continuation.js.map +1 -1
  51. package/dist/core/extensions/builtin/goal/wait-progress.d.ts +11 -0
  52. package/dist/core/extensions/builtin/goal/wait-progress.d.ts.map +1 -0
  53. package/dist/core/extensions/builtin/goal/wait-progress.js +30 -0
  54. package/dist/core/extensions/builtin/goal/wait-progress.js.map +1 -0
  55. package/dist/core/extensions/builtin/goal/wait-ticker.d.ts +38 -0
  56. package/dist/core/extensions/builtin/goal/wait-ticker.d.ts.map +1 -0
  57. package/dist/core/extensions/builtin/goal/wait-ticker.js +71 -0
  58. package/dist/core/extensions/builtin/goal/wait-ticker.js.map +1 -0
  59. package/dist/core/extensions/builtin/gpt-apply-patch/extension.d.ts.map +1 -1
  60. package/dist/core/extensions/builtin/gpt-apply-patch/extension.js +14 -1
  61. package/dist/core/extensions/builtin/gpt-apply-patch/extension.js.map +1 -1
  62. package/dist/core/extensions/builtin/gpt-apply-patch/types.d.ts +1 -0
  63. package/dist/core/extensions/builtin/gpt-apply-patch/types.d.ts.map +1 -1
  64. package/dist/core/extensions/builtin/gpt-apply-patch/types.js.map +1 -1
  65. package/dist/core/extensions/builtin/loop-guard/renderer.d.ts.map +1 -1
  66. package/dist/core/extensions/builtin/loop-guard/renderer.js +4 -12
  67. package/dist/core/extensions/builtin/loop-guard/renderer.js.map +1 -1
  68. package/dist/core/extensions/builtin/rule-activation/index.d.ts +6 -0
  69. package/dist/core/extensions/builtin/rule-activation/index.d.ts.map +1 -0
  70. package/dist/core/extensions/builtin/rule-activation/index.js +10 -0
  71. package/dist/core/extensions/builtin/rule-activation/index.js.map +1 -0
  72. package/dist/core/extensions/builtin/rule-activation/renderer.d.ts +3 -0
  73. package/dist/core/extensions/builtin/rule-activation/renderer.d.ts.map +1 -0
  74. package/dist/core/extensions/builtin/rule-activation/renderer.js +37 -0
  75. package/dist/core/extensions/builtin/rule-activation/renderer.js.map +1 -0
  76. package/dist/core/extensions/builtin/rule-activation/types.d.ts +15 -0
  77. package/dist/core/extensions/builtin/rule-activation/types.d.ts.map +1 -0
  78. package/dist/core/extensions/builtin/rule-activation/types.js +45 -0
  79. package/dist/core/extensions/builtin/rule-activation/types.js.map +1 -0
  80. package/dist/core/extensions/builtin/rules/config.d.ts +3 -0
  81. package/dist/core/extensions/builtin/rules/config.d.ts.map +1 -0
  82. package/dist/core/extensions/builtin/rules/config.js +24 -0
  83. package/dist/core/extensions/builtin/rules/config.js.map +1 -0
  84. package/dist/core/extensions/builtin/rules/index.d.ts.map +1 -1
  85. package/dist/core/extensions/builtin/rules/index.js +14 -4
  86. package/dist/core/extensions/builtin/rules/index.js.map +1 -1
  87. package/dist/core/extensions/builtin/rules/rules/formatter.d.ts.map +1 -1
  88. package/dist/core/extensions/builtin/rules/rules/formatter.js +21 -5
  89. package/dist/core/extensions/builtin/rules/rules/formatter.js.map +1 -1
  90. package/dist/core/extensions/builtin/rules/rules/types.d.ts +1 -1
  91. package/dist/core/extensions/builtin/rules/rules/types.js.map +1 -1
  92. package/dist/core/extensions/builtin/service-tier.d.ts.map +1 -1
  93. package/dist/core/extensions/builtin/service-tier.js +2 -3
  94. package/dist/core/extensions/builtin/service-tier.js.map +1 -1
  95. package/dist/core/extensions/builtin/ttsr/detectors/repetitive-turns.d.ts +22 -0
  96. package/dist/core/extensions/builtin/ttsr/detectors/repetitive-turns.d.ts.map +1 -0
  97. package/dist/core/extensions/builtin/ttsr/detectors/repetitive-turns.js +93 -0
  98. package/dist/core/extensions/builtin/ttsr/detectors/repetitive-turns.js.map +1 -0
  99. package/dist/core/extensions/builtin/ttsr/index.d.ts.map +1 -1
  100. package/dist/core/extensions/builtin/ttsr/index.js +60 -21
  101. package/dist/core/extensions/builtin/ttsr/index.js.map +1 -1
  102. package/dist/core/extensions/builtin/ttsr/prompts.d.ts +1 -0
  103. package/dist/core/extensions/builtin/ttsr/prompts.d.ts.map +1 -1
  104. package/dist/core/extensions/builtin/ttsr/prompts.js +5 -0
  105. package/dist/core/extensions/builtin/ttsr/prompts.js.map +1 -1
  106. package/dist/core/extensions/builtin/ttsr/repetitive-turns-lane.d.ts +23 -0
  107. package/dist/core/extensions/builtin/ttsr/repetitive-turns-lane.d.ts.map +1 -0
  108. package/dist/core/extensions/builtin/ttsr/repetitive-turns-lane.js +101 -0
  109. package/dist/core/extensions/builtin/ttsr/repetitive-turns-lane.js.map +1 -0
  110. package/dist/core/extensions/builtin/ttsr/stream-remediation.d.ts +15 -0
  111. package/dist/core/extensions/builtin/ttsr/stream-remediation.d.ts.map +1 -0
  112. package/dist/core/extensions/builtin/ttsr/stream-remediation.js +22 -0
  113. package/dist/core/extensions/builtin/ttsr/stream-remediation.js.map +1 -0
  114. package/dist/core/extensions/builtin/ttsr/types.d.ts +1 -1
  115. package/dist/core/extensions/builtin/ttsr/types.d.ts.map +1 -1
  116. package/dist/core/extensions/builtin/ttsr/types.js.map +1 -1
  117. package/dist/core/extensions/notice/adapters.d.ts +15 -0
  118. package/dist/core/extensions/notice/adapters.d.ts.map +1 -0
  119. package/dist/core/extensions/notice/adapters.js +22 -0
  120. package/dist/core/extensions/notice/adapters.js.map +1 -0
  121. package/dist/core/extensions/notice/box.d.ts +8 -0
  122. package/dist/core/extensions/notice/box.d.ts.map +1 -0
  123. package/dist/core/extensions/notice/box.js +17 -0
  124. package/dist/core/extensions/notice/box.js.map +1 -0
  125. package/dist/core/extensions/notice/index.d.ts +4 -0
  126. package/dist/core/extensions/notice/index.d.ts.map +1 -0
  127. package/dist/core/extensions/notice/index.js +3 -0
  128. package/dist/core/extensions/notice/index.js.map +1 -0
  129. package/dist/core/extensions/notice/spec.d.ts +23 -0
  130. package/dist/core/extensions/notice/spec.d.ts.map +1 -0
  131. package/dist/core/extensions/notice/spec.js +2 -0
  132. package/dist/core/extensions/notice/spec.js.map +1 -0
  133. package/dist/core/model-resolver.d.ts.map +1 -1
  134. package/dist/core/model-resolver.js +1 -0
  135. package/dist/core/model-resolver.js.map +1 -1
  136. package/dist/core/model-runtime.d.ts.map +1 -1
  137. package/dist/core/model-runtime.js +2 -2
  138. package/dist/core/model-runtime.js.map +1 -1
  139. package/dist/core/provider-composer.d.ts.map +1 -1
  140. package/dist/core/provider-composer.js +8 -3
  141. package/dist/core/provider-composer.js.map +1 -1
  142. package/dist/core/provider-display-names.d.ts.map +1 -1
  143. package/dist/core/provider-display-names.js +1 -0
  144. package/dist/core/provider-display-names.js.map +1 -1
  145. package/dist/core/retry-fallback/settings.d.ts.map +1 -1
  146. package/dist/core/retry-fallback/settings.js +16 -1
  147. package/dist/core/retry-fallback/settings.js.map +1 -1
  148. package/dist/core/retry-fallback/validate.d.ts.map +1 -1
  149. package/dist/core/retry-fallback/validate.js +15 -2
  150. package/dist/core/retry-fallback/validate.js.map +1 -1
  151. package/dist/core/session-log.js +1 -1
  152. package/dist/core/session-log.js.map +1 -1
  153. package/dist/core/settings-manager.d.ts +7 -0
  154. package/dist/core/settings-manager.d.ts.map +1 -1
  155. package/dist/core/settings-manager.js +13 -0
  156. package/dist/core/settings-manager.js.map +1 -1
  157. package/dist/modes/interactive/components/custom-editor.d.ts +5 -0
  158. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  159. package/dist/modes/interactive/components/custom-editor.js +22 -1
  160. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  161. package/dist/modes/interactive/interactive-mode.d.ts +2 -0
  162. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  163. package/dist/modes/interactive/interactive-mode.js +42 -7
  164. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  165. package/dist/modes/interactive/interactive-stderr-guard.d.ts.map +1 -1
  166. package/dist/modes/interactive/interactive-stderr-guard.js +37 -0
  167. package/dist/modes/interactive/interactive-stderr-guard.js.map +1 -1
  168. package/docs/providers.md +19 -0
  169. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +40 -0
  170. package/node_modules/@code-yeongyu/senpi-codemode/README.md +13 -3
  171. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  172. package/node_modules/@code-yeongyu/senpi-codemode/src/extension/eval-status.ts +1 -1
  173. package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt.ts +6 -6
  174. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-runtime.ts +4 -4
  175. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-manager.ts +2 -2
  176. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-snapshot.ts +2 -2
  177. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-request.ts +20 -2
  178. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool.ts +17 -2
  179. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/render.ts +18 -7
  180. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/types.ts +19 -5
  181. package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
  182. package/node_modules/@earendil-works/pi-ai/README.md +3 -1
  183. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +1 -1
  184. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
  185. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.d.ts.map +1 -1
  186. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js +1 -0
  187. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js.map +1 -1
  188. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +1 -1
  189. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
  190. package/node_modules/@earendil-works/pi-ai/dist/models.js +1 -1
  191. package/node_modules/@earendil-works/pi-ai/dist/models.js.map +1 -1
  192. package/node_modules/@earendil-works/pi-ai/dist/providers/all.d.ts +2 -1
  193. package/node_modules/@earendil-works/pi-ai/dist/providers/all.d.ts.map +1 -1
  194. package/node_modules/@earendil-works/pi-ai/dist/providers/all.js +3 -1
  195. package/node_modules/@earendil-works/pi-ai/dist/providers/all.js.map +1 -1
  196. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  197. package/node_modules/@earendil-works/pi-ai/dist/providers/data/alibaba-token-plan.json +1 -1
  198. package/node_modules/@earendil-works/pi-ai/dist/providers/data/github-copilot.json +1 -1
  199. package/node_modules/@earendil-works/pi-ai/dist/providers/data/huggingface.json +1 -1
  200. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -1
  201. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  202. package/node_modules/@earendil-works/pi-ai/dist/providers/data/qwen-token-plan-cn.json +1 -1
  203. package/node_modules/@earendil-works/pi-ai/dist/providers/data/qwen-token-plan.json +1 -1
  204. package/node_modules/@earendil-works/pi-ai/dist/providers/data/together.json +1 -1
  205. package/node_modules/@earendil-works/pi-ai/dist/providers/ollama.d.ts +9 -0
  206. package/node_modules/@earendil-works/pi-ai/dist/providers/ollama.d.ts.map +1 -0
  207. package/node_modules/@earendil-works/pi-ai/dist/providers/ollama.js +142 -0
  208. package/node_modules/@earendil-works/pi-ai/dist/providers/ollama.js.map +1 -0
  209. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +1 -1
  210. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  211. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  212. package/node_modules/@earendil-works/pi-ai/package.json +1 -1
  213. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  214. package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts.map +1 -1
  215. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js +5 -1
  216. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js.map +1 -1
  217. package/node_modules/@earendil-works/pi-tui/dist/slash-command-autocomplete.d.ts.map +1 -1
  218. package/node_modules/@earendil-works/pi-tui/dist/slash-command-autocomplete.js +36 -8
  219. package/node_modules/@earendil-works/pi-tui/dist/slash-command-autocomplete.js.map +1 -1
  220. package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts +2 -0
  221. package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts.map +1 -1
  222. package/node_modules/@earendil-works/pi-tui/dist/tui.js +49 -33
  223. package/node_modules/@earendil-works/pi-tui/dist/tui.js.map +1 -1
  224. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  225. package/package.json +8 -13
  226. package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/client.d.ts +1 -1
  227. package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/client.js +1 -1
  228. package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/connection.d.ts +1 -1
  229. package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/connection.js +1 -1
  230. package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/errors.d.ts +1 -1
  231. package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/session-handle.d.ts +1 -1
  232. package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/state.d.ts +1 -1
  233. package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/types.d.ts +1 -1
  234. package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/unix.js +1 -1
  235. package/node_modules/@earendil-works/pi-client/CHANGELOG.md +0 -7
  236. package/node_modules/@earendil-works/pi-client/README.md +0 -64
  237. package/node_modules/@earendil-works/pi-client/package.json +0 -56
  238. package/node_modules/@earendil-works/pi-protocol/README.md +0 -68
  239. package/node_modules/@earendil-works/pi-protocol/package.json +0 -48
  240. /package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/client.d.ts.map +0 -0
  241. /package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/client.js.map +0 -0
  242. /package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/connection.d.ts.map +0 -0
  243. /package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/connection.js.map +0 -0
  244. /package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/errors.d.ts.map +0 -0
  245. /package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/errors.js +0 -0
  246. /package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/errors.js.map +0 -0
  247. /package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/index.d.ts +0 -0
  248. /package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/index.d.ts.map +0 -0
  249. /package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/index.js +0 -0
  250. /package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/index.js.map +0 -0
  251. /package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/promise.d.ts +0 -0
  252. /package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/promise.d.ts.map +0 -0
  253. /package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/promise.js +0 -0
  254. /package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/promise.js.map +0 -0
  255. /package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/session-handle.d.ts.map +0 -0
  256. /package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/session-handle.js +0 -0
  257. /package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/session-handle.js.map +0 -0
  258. /package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/state.d.ts.map +0 -0
  259. /package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/state.js +0 -0
  260. /package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/state.js.map +0 -0
  261. /package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/transport.d.ts +0 -0
  262. /package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/transport.d.ts.map +0 -0
  263. /package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/transport.js +0 -0
  264. /package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/transport.js.map +0 -0
  265. /package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/types.d.ts.map +0 -0
  266. /package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/types.js +0 -0
  267. /package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/types.js.map +0 -0
  268. /package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/unix.d.ts +0 -0
  269. /package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/unix.d.ts.map +0 -0
  270. /package/{node_modules/@earendil-works/pi-client/dist → vendor/pi-client}/unix.js.map +0 -0
  271. /package/{node_modules/@earendil-works/pi-protocol/dist → vendor/pi-protocol}/cbor/decoder.d.ts +0 -0
  272. /package/{node_modules/@earendil-works/pi-protocol/dist → vendor/pi-protocol}/cbor/decoder.d.ts.map +0 -0
  273. /package/{node_modules/@earendil-works/pi-protocol/dist → vendor/pi-protocol}/cbor/decoder.js +0 -0
  274. /package/{node_modules/@earendil-works/pi-protocol/dist → vendor/pi-protocol}/cbor/decoder.js.map +0 -0
  275. /package/{node_modules/@earendil-works/pi-protocol/dist → vendor/pi-protocol}/cbor/encoder.d.ts +0 -0
  276. /package/{node_modules/@earendil-works/pi-protocol/dist → vendor/pi-protocol}/cbor/encoder.d.ts.map +0 -0
  277. /package/{node_modules/@earendil-works/pi-protocol/dist → vendor/pi-protocol}/cbor/encoder.js +0 -0
  278. /package/{node_modules/@earendil-works/pi-protocol/dist → vendor/pi-protocol}/cbor/encoder.js.map +0 -0
  279. /package/{node_modules/@earendil-works/pi-protocol/dist → vendor/pi-protocol}/cbor/index.d.ts +0 -0
  280. /package/{node_modules/@earendil-works/pi-protocol/dist → vendor/pi-protocol}/cbor/index.d.ts.map +0 -0
  281. /package/{node_modules/@earendil-works/pi-protocol/dist → vendor/pi-protocol}/cbor/index.js +0 -0
  282. /package/{node_modules/@earendil-works/pi-protocol/dist → vendor/pi-protocol}/cbor/index.js.map +0 -0
  283. /package/{node_modules/@earendil-works/pi-protocol/dist → vendor/pi-protocol}/cbor/options.d.ts +0 -0
  284. /package/{node_modules/@earendil-works/pi-protocol/dist → vendor/pi-protocol}/cbor/options.d.ts.map +0 -0
  285. /package/{node_modules/@earendil-works/pi-protocol/dist → vendor/pi-protocol}/cbor/options.js +0 -0
  286. /package/{node_modules/@earendil-works/pi-protocol/dist → vendor/pi-protocol}/cbor/options.js.map +0 -0
  287. /package/{node_modules/@earendil-works/pi-protocol/dist → vendor/pi-protocol}/codec.d.ts +0 -0
  288. /package/{node_modules/@earendil-works/pi-protocol/dist → vendor/pi-protocol}/codec.d.ts.map +0 -0
  289. /package/{node_modules/@earendil-works/pi-protocol/dist → vendor/pi-protocol}/codec.js +0 -0
  290. /package/{node_modules/@earendil-works/pi-protocol/dist → vendor/pi-protocol}/codec.js.map +0 -0
  291. /package/{node_modules/@earendil-works/pi-protocol/dist → vendor/pi-protocol}/framing.d.ts +0 -0
  292. /package/{node_modules/@earendil-works/pi-protocol/dist → vendor/pi-protocol}/framing.d.ts.map +0 -0
  293. /package/{node_modules/@earendil-works/pi-protocol/dist → vendor/pi-protocol}/framing.js +0 -0
  294. /package/{node_modules/@earendil-works/pi-protocol/dist → vendor/pi-protocol}/framing.js.map +0 -0
  295. /package/{node_modules/@earendil-works/pi-protocol/dist → vendor/pi-protocol}/index.d.ts +0 -0
  296. /package/{node_modules/@earendil-works/pi-protocol/dist → vendor/pi-protocol}/index.d.ts.map +0 -0
  297. /package/{node_modules/@earendil-works/pi-protocol/dist → vendor/pi-protocol}/index.js +0 -0
  298. /package/{node_modules/@earendil-works/pi-protocol/dist → vendor/pi-protocol}/index.js.map +0 -0
  299. /package/{node_modules/@earendil-works/pi-protocol/dist → vendor/pi-protocol}/schemas.d.ts +0 -0
  300. /package/{node_modules/@earendil-works/pi-protocol/dist → vendor/pi-protocol}/schemas.d.ts.map +0 -0
  301. /package/{node_modules/@earendil-works/pi-protocol/dist → vendor/pi-protocol}/schemas.js +0 -0
  302. /package/{node_modules/@earendil-works/pi-protocol/dist → vendor/pi-protocol}/schemas.js.map +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"extension.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/gpt-apply-patch/extension.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Api, Model } from \"@earendil-works/pi-ai\";\nimport { createApplyPatchTool } from \"./tool.ts\";\nimport type {\n\tApplyPatchExtensionAPI,\n\tApplyPatchToolsetState,\n\tApplyPatchToolVariant,\n\tApplyPatchWireMode,\n} from \"./types.ts\";\n\nconst APPLY_PATCH_FREEFORM_APIS = new Set<Api>([\n\t\"openai-responses\",\n\t\"azure-openai-responses\",\n\t\"openai-codex-responses\",\n]);\nconst APPLY_PATCH_JSON_APIS = new Set<Api>([\"openai-completions\"]);\nconst EDIT_TOOL_NAMES = new Set([\"write\", \"edit\"]);\nconst APPLY_PATCH_NAME = \"apply_patch\";\n\nfunction isGptId(model: Pick<Model<string>, \"api\" | \"id\"> | undefined): model is Pick<Model<string>, \"api\" | \"id\"> {\n\treturn model?.id.startsWith(\"gpt-\") ?? false;\n}\n\nexport function getApplyPatchWireMode(model: Pick<Model<string>, \"api\" | \"id\"> | undefined): ApplyPatchWireMode {\n\tif (!isGptId(model)) return \"none\";\n\tif (APPLY_PATCH_FREEFORM_APIS.has(model.api)) return \"freeform\";\n\tif (APPLY_PATCH_JSON_APIS.has(model.api)) return \"json\";\n\treturn \"none\";\n}\n\nexport function isOpenAIGptModel(model: Pick<Model<string>, \"api\" | \"id\"> | undefined): boolean {\n\treturn getApplyPatchWireMode(model) === \"freeform\";\n}\n\nfunction hasEditTools(toolNames: string[]): boolean {\n\treturn toolNames.some((toolName) => EDIT_TOOL_NAMES.has(toolName));\n}\n\nfunction withoutApplyPatch(toolNames: string[]): string[] {\n\treturn toolNames.filter((toolName) => toolName !== APPLY_PATCH_NAME);\n}\n\nfunction replaceEditToolsWithApplyPatch(toolNames: string[]): string[] {\n\tconst hadApplyPatch = toolNames.includes(APPLY_PATCH_NAME);\n\tconst insertIndex = toolNames.findIndex(\n\t\t(toolName) => EDIT_TOOL_NAMES.has(toolName) || toolName === APPLY_PATCH_NAME,\n\t);\n\tconst filteredToolNames = withoutApplyPatch(toolNames).filter((toolName) => !EDIT_TOOL_NAMES.has(toolName));\n\tif (!hasEditTools(toolNames) && !hadApplyPatch) return filteredToolNames;\n\tconst at = insertIndex === -1 ? filteredToolNames.length : Math.min(insertIndex, filteredToolNames.length);\n\treturn [...filteredToolNames.slice(0, at), APPLY_PATCH_NAME, ...filteredToolNames.slice(at)];\n}\n\nfunction hasApplyPatchFailures(details: unknown): boolean {\n\tif (typeof details !== \"object\" || details === null) return false;\n\tconst result = Reflect.get(details, \"result\");\n\tif (typeof result !== \"object\" || result === null) return false;\n\tconst failures = Reflect.get(result, \"failures\");\n\treturn Array.isArray(failures) && failures.length > 0;\n}\n\nfunction syncToolset(\n\tpi: ApplyPatchExtensionAPI,\n\tmodel: Model<string> | undefined,\n\tstate: ApplyPatchToolsetState & { activeVariant?: ApplyPatchToolVariant },\n\tvariants: Readonly<Record<ApplyPatchToolVariant, ReturnType<typeof createApplyPatchTool>>>,\n): void {\n\tconst mode = getApplyPatchWireMode(model);\n\tconst currentToolNames = pi.getActiveTools();\n\tif (mode !== \"none\") {\n\t\tif (state.activeVariant !== mode) {\n\t\t\tpi.registerTool(variants[mode]);\n\t\t\tstate.activeVariant = mode;\n\t\t}\n\t\tconst activeEdit = currentToolNames.filter((toolName) => EDIT_TOOL_NAMES.has(toolName));\n\t\tif (activeEdit.length > 0) state.removedEditToolNames = activeEdit;\n\t\tpi.setActiveTools(replaceEditToolsWithApplyPatch(currentToolNames));\n\t\treturn;\n\t}\n\tif (state.removedEditToolNames.length === 0) {\n\t\tif (currentToolNames.includes(APPLY_PATCH_NAME)) pi.setActiveTools(withoutApplyPatch(currentToolNames));\n\t\treturn;\n\t}\n\tconst registeredNames = new Set(pi.getAllTools().map((tool) => tool.name));\n\tconst restorable = state.removedEditToolNames.filter((toolName) => registeredNames.has(toolName));\n\tconst restored = [...withoutApplyPatch(currentToolNames), ...restorable];\n\tstate.removedEditToolNames = [];\n\tpi.setActiveTools([...new Set(restored)]);\n}\n\nexport function registerApplyPatchExtension(pi: ApplyPatchExtensionAPI): void {\n\tconst state: ApplyPatchToolsetState & { activeVariant?: ApplyPatchToolVariant } = { removedEditToolNames: [] };\n\tconst variants = {\n\t\tfreeform: createApplyPatchTool(\"freeform\"),\n\t\tjson: createApplyPatchTool(\"json\"),\n\t} as const;\n\tstate.activeVariant = \"freeform\";\n\tpi.registerTool(variants.freeform);\n\tpi.on(\"tool_result\", async (event) => {\n\t\tif (event.toolName !== APPLY_PATCH_NAME || event.isError || !hasApplyPatchFailures(event.details)) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn { isError: true };\n\t});\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tsyncToolset(pi, ctx.model, state, variants);\n\t});\n\tpi.on(\"model_select\", async (event) => {\n\t\tsyncToolset(pi, event.model, state, variants);\n\t});\n}\n\nexport default registerApplyPatchExtension;\n"]}
1
+ {"version":3,"file":"extension.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/gpt-apply-patch/extension.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAQjD,MAAM,yBAAyB,GAAG,IAAI,GAAG,CAAM;IAC9C,kBAAkB;IAClB,wBAAwB;IACxB,wBAAwB;CACxB,CAAC,CAAC;AACH,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC;AACnE,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AACnD,MAAM,gBAAgB,GAAG,aAAa,CAAC;AAEvC,SAAS,OAAO,CAAC,KAAoD;IACpE,OAAO,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAoD;IACzF,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IACnC,IAAI,yBAAyB,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;QAAE,OAAO,UAAU,CAAC;IAChE,IAAI,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IACxD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAoD;IACpF,OAAO,qBAAqB,CAAC,KAAK,CAAC,KAAK,UAAU,CAAC;AACpD,CAAC;AAED,SAAS,YAAY,CAAC,SAAmB;IACxC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,iBAAiB,CAAC,SAAmB;IAC7C,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,KAAK,gBAAgB,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,8BAA8B,CAAC,SAAmB;IAC1D,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAG,SAAS,CAAC,SAAS,CACtC,CAAC,QAAQ,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,QAAQ,KAAK,gBAAgB,CAC5E,CAAC;IACF,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC5G,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa;QAAE,OAAO,iBAAiB,CAAC;IACzE,MAAM,EAAE,GAAG,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC3G,OAAO,CAAC,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,gBAAgB,EAAE,GAAG,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9F,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAgB;IAC9C,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAClE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC9C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAChE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACjD,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,WAAW,CACnB,EAA0B,EAC1B,KAAgC,EAChC,KAGC,EACD,QAA0F;IAE1F,MAAM,IAAI,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC1C,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;IACtB,MAAM,gBAAgB,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC;IAC7C,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACrB,IAAI,KAAK,CAAC,aAAa,KAAK,IAAI,EAAE,CAAC;YAClC,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;YAChC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC;QACD,MAAM,UAAU,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QACxF,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,oBAAoB,GAAG,UAAU,CAAC;QACnE,EAAE,CAAC,cAAc,CAAC,8BAA8B,CAAC,gBAAgB,CAAC,CAAC,CAAC;QACpE,OAAO;IACR,CAAC;IACD,IAAI,KAAK,CAAC,oBAAoB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7C,IAAI,gBAAgB,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YAAE,EAAE,CAAC,cAAc,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC,CAAC;QACxG,OAAO;IACR,CAAC;IACD,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3E,MAAM,UAAU,GAAG,KAAK,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClG,MAAM,QAAQ,GAAG,CAAC,GAAG,iBAAiB,CAAC,gBAAgB,CAAC,EAAE,GAAG,UAAU,CAAC,CAAC;IACzE,KAAK,CAAC,oBAAoB,GAAG,EAAE,CAAC;IAChC,EAAE,CAAC,cAAc,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,+BAA+B,CACvC,EAA0B,EAC1B,KAAgD;IAEhD,EAAE,CAAC,yBAAyB,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE;QAC3C,IAAI,QAAQ,KAAK,gBAAgB,IAAI,KAAK,CAAC,QAAQ,KAAK,MAAM;YAAE,OAAO,KAAK,CAAC;QAC7E,MAAM,eAAe,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC;QAC5C,IAAI,eAAe,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7D,EAAE,CAAC,cAAc,CAAC,CAAC,GAAG,eAAe,EAAE,gBAAgB,CAAC,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC;IACb,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,EAA0B;IACrE,MAAM,KAAK,GAGP,EAAE,oBAAoB,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnD,MAAM,QAAQ,GAAG;QAChB,QAAQ,EAAE,oBAAoB,CAAC,UAAU,CAAC;QAC1C,IAAI,EAAE,oBAAoB,CAAC,MAAM,CAAC;KACzB,CAAC;IACX,KAAK,CAAC,aAAa,GAAG,UAAU,CAAC;IACjC,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACnC,+BAA+B,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAC3C,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QACpC,IAAI,KAAK,CAAC,QAAQ,KAAK,gBAAgB,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACnG,OAAO,SAAS,CAAC;QAClB,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QAC5C,WAAW,CAAC,EAAE,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,EAAE,CAAC,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QACrC,WAAW,CAAC,EAAE,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,eAAe,2BAA2B,CAAC","sourcesContent":["import type { Api, Model } from \"@earendil-works/pi-ai\";\nimport { createApplyPatchTool } from \"./tool.ts\";\nimport type {\n\tApplyPatchExtensionAPI,\n\tApplyPatchToolsetState,\n\tApplyPatchToolVariant,\n\tApplyPatchWireMode,\n} from \"./types.ts\";\n\nconst APPLY_PATCH_FREEFORM_APIS = new Set<Api>([\n\t\"openai-responses\",\n\t\"azure-openai-responses\",\n\t\"openai-codex-responses\",\n]);\nconst APPLY_PATCH_JSON_APIS = new Set<Api>([\"openai-completions\"]);\nconst EDIT_TOOL_NAMES = new Set([\"write\", \"edit\"]);\nconst APPLY_PATCH_NAME = \"apply_patch\";\n\nfunction isGptId(model: Pick<Model<string>, \"api\" | \"id\"> | undefined): model is Pick<Model<string>, \"api\" | \"id\"> {\n\treturn model?.id.startsWith(\"gpt-\") ?? false;\n}\n\nexport function getApplyPatchWireMode(model: Pick<Model<string>, \"api\" | \"id\"> | undefined): ApplyPatchWireMode {\n\tif (!isGptId(model)) return \"none\";\n\tif (APPLY_PATCH_FREEFORM_APIS.has(model.api)) return \"freeform\";\n\tif (APPLY_PATCH_JSON_APIS.has(model.api)) return \"json\";\n\treturn \"none\";\n}\n\nexport function isOpenAIGptModel(model: Pick<Model<string>, \"api\" | \"id\"> | undefined): boolean {\n\treturn getApplyPatchWireMode(model) === \"freeform\";\n}\n\nfunction hasEditTools(toolNames: string[]): boolean {\n\treturn toolNames.some((toolName) => EDIT_TOOL_NAMES.has(toolName));\n}\n\nfunction withoutApplyPatch(toolNames: string[]): string[] {\n\treturn toolNames.filter((toolName) => toolName !== APPLY_PATCH_NAME);\n}\n\nfunction replaceEditToolsWithApplyPatch(toolNames: string[]): string[] {\n\tconst hadApplyPatch = toolNames.includes(APPLY_PATCH_NAME);\n\tconst insertIndex = toolNames.findIndex(\n\t\t(toolName) => EDIT_TOOL_NAMES.has(toolName) || toolName === APPLY_PATCH_NAME,\n\t);\n\tconst filteredToolNames = withoutApplyPatch(toolNames).filter((toolName) => !EDIT_TOOL_NAMES.has(toolName));\n\tif (!hasEditTools(toolNames) && !hadApplyPatch) return filteredToolNames;\n\tconst at = insertIndex === -1 ? filteredToolNames.length : Math.min(insertIndex, filteredToolNames.length);\n\treturn [...filteredToolNames.slice(0, at), APPLY_PATCH_NAME, ...filteredToolNames.slice(at)];\n}\n\nfunction hasApplyPatchFailures(details: unknown): boolean {\n\tif (typeof details !== \"object\" || details === null) return false;\n\tconst result = Reflect.get(details, \"result\");\n\tif (typeof result !== \"object\" || result === null) return false;\n\tconst failures = Reflect.get(result, \"failures\");\n\treturn Array.isArray(failures) && failures.length > 0;\n}\n\nfunction syncToolset(\n\tpi: ApplyPatchExtensionAPI,\n\tmodel: Model<string> | undefined,\n\tstate: ApplyPatchToolsetState & {\n\t\tactiveVariant?: ApplyPatchToolVariant;\n\t\twireMode: ApplyPatchWireMode;\n\t},\n\tvariants: Readonly<Record<ApplyPatchToolVariant, ReturnType<typeof createApplyPatchTool>>>,\n): void {\n\tconst mode = getApplyPatchWireMode(model);\n\tstate.wireMode = mode;\n\tconst currentToolNames = pi.getActiveTools();\n\tif (mode !== \"none\") {\n\t\tif (state.activeVariant !== mode) {\n\t\t\tpi.registerTool(variants[mode]);\n\t\t\tstate.activeVariant = mode;\n\t\t}\n\t\tconst activeEdit = currentToolNames.filter((toolName) => EDIT_TOOL_NAMES.has(toolName));\n\t\tif (activeEdit.length > 0) state.removedEditToolNames = activeEdit;\n\t\tpi.setActiveTools(replaceEditToolsWithApplyPatch(currentToolNames));\n\t\treturn;\n\t}\n\tif (state.removedEditToolNames.length === 0) {\n\t\tif (currentToolNames.includes(APPLY_PATCH_NAME)) pi.setActiveTools(withoutApplyPatch(currentToolNames));\n\t\treturn;\n\t}\n\tconst registeredNames = new Set(pi.getAllTools().map((tool) => tool.name));\n\tconst restorable = state.removedEditToolNames.filter((toolName) => registeredNames.has(toolName));\n\tconst restored = [...withoutApplyPatch(currentToolNames), ...restorable];\n\tstate.removedEditToolNames = [];\n\tpi.setActiveTools([...new Set(restored)]);\n}\n\nfunction registerApplyPatchLazyActivator(\n\tpi: ApplyPatchExtensionAPI,\n\tstate: { readonly wireMode: ApplyPatchWireMode },\n): void {\n\tpi.registerLazyToolActivator?.((toolName) => {\n\t\tif (toolName !== APPLY_PATCH_NAME || state.wireMode === \"none\") return false;\n\t\tconst activeToolNames = pi.getActiveTools();\n\t\tif (activeToolNames.includes(APPLY_PATCH_NAME)) return false;\n\t\tpi.setActiveTools([...activeToolNames, APPLY_PATCH_NAME]);\n\t\treturn true;\n\t});\n}\n\nexport function registerApplyPatchExtension(pi: ApplyPatchExtensionAPI): void {\n\tconst state: ApplyPatchToolsetState & {\n\t\tactiveVariant?: ApplyPatchToolVariant;\n\t\twireMode: ApplyPatchWireMode;\n\t} = { removedEditToolNames: [], wireMode: \"none\" };\n\tconst variants = {\n\t\tfreeform: createApplyPatchTool(\"freeform\"),\n\t\tjson: createApplyPatchTool(\"json\"),\n\t} as const;\n\tstate.activeVariant = \"freeform\";\n\tpi.registerTool(variants.freeform);\n\tregisterApplyPatchLazyActivator(pi, state);\n\tpi.on(\"tool_result\", async (event) => {\n\t\tif (event.toolName !== APPLY_PATCH_NAME || event.isError || !hasApplyPatchFailures(event.details)) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn { isError: true };\n\t});\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tsyncToolset(pi, ctx.model, state, variants);\n\t});\n\tpi.on(\"model_select\", async (event) => {\n\t\tsyncToolset(pi, event.model, state, variants);\n\t});\n}\n\nexport default registerApplyPatchExtension;\n"]}
@@ -115,5 +115,6 @@ export type ApplyPatchRenderState = {
115
115
  export type ApplyPatchToolDefinition = ToolDefinition<typeof APPLY_PATCH_PARAMS, ApplyPatchToolDetails | undefined, ApplyPatchRenderState>;
116
116
  export type ApplyPatchExtensionAPI = Pick<ExtensionAPI, "on" | "getActiveTools" | "getAllTools" | "setActiveTools"> & {
117
117
  registerTool: (tool: ApplyPatchToolDefinition) => void;
118
+ registerLazyToolActivator?: ExtensionAPI["registerLazyToolActivator"];
118
119
  };
119
120
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/gpt-apply-patch/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/gpt-apply-patch/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/gpt-apply-patch/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ExtensionAPI, ToolDefinition } from \"../../types.ts\";\nimport type { APPLY_PATCH_PARAMS } from \"./constants.ts\";\n\nexport type ParsedPatch =\n\t| { type: \"add\"; filePath: string; content: string }\n\t| { type: \"delete\"; filePath: string }\n\t| { type: \"update\"; filePath: string; movePath?: string; chunks: PatchChunk[] };\n\nexport type PatchChunk = {\n\tchangeContexts: string[];\n\toldLines: string[];\n\tnewLines: string[];\n\tisEndOfFile: boolean;\n};\n\nexport type ApplyPatchWireMode = \"freeform\" | \"json\" | \"none\";\n\nexport type ApplyPatchToolVariant = Exclude<ApplyPatchWireMode, \"none\">;\n\nexport type ApplyPatchToolsetState = {\n\t/** Exactly the edit-family tools this extension removed at the last non-GPT to GPT transition. */\n\tremovedEditToolNames: string[];\n};\n\nexport type FreeformToolFormat = {\n\ttype: \"grammar\";\n\tsyntax: \"lark\";\n\tdefinition: string;\n};\n\nexport type ApplyPatchParams = {\n\tinput: string;\n};\n\nexport type ApplyPatchOperation = \"add\" | \"delete\" | \"update\";\n\nexport type ApplyPatchPreviewFile = {\n\tfilePath: string;\n\tmovePath?: string;\n\toperation: ApplyPatchOperation;\n\tdiff: string;\n\tpatch?: string;\n\tadded: number;\n\tremoved: number;\n};\n\nexport type ApplyPatchPreview = {\n\tfiles: ApplyPatchPreviewFile[];\n\tadded: number;\n\tremoved: number;\n};\n\nexport type ApplyPatchToolDetails = {\n\tpreview?: ApplyPatchPreview;\n\tprogress?: ApplyPatchProgress;\n\tresult?: ApplyPatchResult;\n};\n\nexport type ApplyPatchProgress = {\n\tapplied: number;\n\tfailed: number;\n\ttotal: number;\n};\n\nexport type ApplyPatchProgressCallback = (progress: ApplyPatchProgress) => Promise<void> | void;\n\nexport type ApplyPatchFailure = {\n\toperationIndex: number;\n\tfilePath: string;\n\toperation: ApplyPatchOperation;\n\tmessage: string;\n\tcode?: string | undefined;\n};\n\nexport type AppliedPatchOperation = {\n\toperationIndex: number;\n\tpreview: ApplyPatchPreviewFile;\n};\n\nexport type ApplyPatchRecoveryInstructions = {\n\tmustReadFiles: string[];\n\tmustNotReadFiles: string[];\n\tfailedFiles: string[];\n};\n\nexport type ApplyPatchResult = {\n\tsummaries: string[];\n\tappliedFiles: string[];\n\tfailures: ApplyPatchFailure[];\n\thasPartialSuccess: boolean;\n\trecoveryInstructions: ApplyPatchRecoveryInstructions;\n\tdetails: {\n\t\tfuzz: number;\n\t\tappliedOperations: AppliedPatchOperation[];\n\t};\n};\n\nexport type AtomicWriteOperations = {\n\twriteFile: (filePath: string, content: string, encoding: \"utf-8\") => Promise<void>;\n\trename: (fromPath: string, toPath: string) => Promise<void>;\n\tunlink: (filePath: string) => Promise<void>;\n};\n\nexport type ApplyPatchThemeColor =\n\t| \"accent\"\n\t| \"error\"\n\t| \"muted\"\n\t| \"toolDiffAdded\"\n\t| \"toolDiffContext\"\n\t| \"toolDiffRemoved\"\n\t| \"toolOutput\"\n\t| \"toolTitle\";\n\nexport type ApplyPatchThemeBg = \"toolErrorBg\" | \"toolPendingBg\" | \"toolSuccessBg\";\n\nexport type ApplyPatchTheme = {\n\tfg: (name: ApplyPatchThemeColor, text: string) => string;\n\tbg: (name: ApplyPatchThemeBg, text: string) => string;\n\tbold: (text: string) => string;\n\tinverse: (text: string) => string;\n};\n\nexport type ApplyPatchRenderState = {\n\tcwd?: string;\n\tpatchText?: string;\n\tcallText?: string;\n\tcollapsed?: string;\n\texpanded?: string;\n\tstreamingInput?: string;\n\tstreamingParser?: { pushDelta: (delta: string) => ParsedPatch[] };\n\tstreamingHunks?: ParsedPatch[];\n\tstreamingError?: string;\n};\n\nexport type ApplyPatchToolDefinition = ToolDefinition<\n\ttypeof APPLY_PATCH_PARAMS,\n\tApplyPatchToolDetails | undefined,\n\tApplyPatchRenderState\n>;\n\nexport type ApplyPatchExtensionAPI = Pick<ExtensionAPI, \"on\" | \"getActiveTools\" | \"getAllTools\" | \"setActiveTools\"> & {\n\tregisterTool: (tool: ApplyPatchToolDefinition) => void;\n};\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/gpt-apply-patch/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ExtensionAPI, ToolDefinition } from \"../../types.ts\";\nimport type { APPLY_PATCH_PARAMS } from \"./constants.ts\";\n\nexport type ParsedPatch =\n\t| { type: \"add\"; filePath: string; content: string }\n\t| { type: \"delete\"; filePath: string }\n\t| { type: \"update\"; filePath: string; movePath?: string; chunks: PatchChunk[] };\n\nexport type PatchChunk = {\n\tchangeContexts: string[];\n\toldLines: string[];\n\tnewLines: string[];\n\tisEndOfFile: boolean;\n};\n\nexport type ApplyPatchWireMode = \"freeform\" | \"json\" | \"none\";\n\nexport type ApplyPatchToolVariant = Exclude<ApplyPatchWireMode, \"none\">;\n\nexport type ApplyPatchToolsetState = {\n\t/** Exactly the edit-family tools this extension removed at the last non-GPT to GPT transition. */\n\tremovedEditToolNames: string[];\n};\n\nexport type FreeformToolFormat = {\n\ttype: \"grammar\";\n\tsyntax: \"lark\";\n\tdefinition: string;\n};\n\nexport type ApplyPatchParams = {\n\tinput: string;\n};\n\nexport type ApplyPatchOperation = \"add\" | \"delete\" | \"update\";\n\nexport type ApplyPatchPreviewFile = {\n\tfilePath: string;\n\tmovePath?: string;\n\toperation: ApplyPatchOperation;\n\tdiff: string;\n\tpatch?: string;\n\tadded: number;\n\tremoved: number;\n};\n\nexport type ApplyPatchPreview = {\n\tfiles: ApplyPatchPreviewFile[];\n\tadded: number;\n\tremoved: number;\n};\n\nexport type ApplyPatchToolDetails = {\n\tpreview?: ApplyPatchPreview;\n\tprogress?: ApplyPatchProgress;\n\tresult?: ApplyPatchResult;\n};\n\nexport type ApplyPatchProgress = {\n\tapplied: number;\n\tfailed: number;\n\ttotal: number;\n};\n\nexport type ApplyPatchProgressCallback = (progress: ApplyPatchProgress) => Promise<void> | void;\n\nexport type ApplyPatchFailure = {\n\toperationIndex: number;\n\tfilePath: string;\n\toperation: ApplyPatchOperation;\n\tmessage: string;\n\tcode?: string | undefined;\n};\n\nexport type AppliedPatchOperation = {\n\toperationIndex: number;\n\tpreview: ApplyPatchPreviewFile;\n};\n\nexport type ApplyPatchRecoveryInstructions = {\n\tmustReadFiles: string[];\n\tmustNotReadFiles: string[];\n\tfailedFiles: string[];\n};\n\nexport type ApplyPatchResult = {\n\tsummaries: string[];\n\tappliedFiles: string[];\n\tfailures: ApplyPatchFailure[];\n\thasPartialSuccess: boolean;\n\trecoveryInstructions: ApplyPatchRecoveryInstructions;\n\tdetails: {\n\t\tfuzz: number;\n\t\tappliedOperations: AppliedPatchOperation[];\n\t};\n};\n\nexport type AtomicWriteOperations = {\n\twriteFile: (filePath: string, content: string, encoding: \"utf-8\") => Promise<void>;\n\trename: (fromPath: string, toPath: string) => Promise<void>;\n\tunlink: (filePath: string) => Promise<void>;\n};\n\nexport type ApplyPatchThemeColor =\n\t| \"accent\"\n\t| \"error\"\n\t| \"muted\"\n\t| \"toolDiffAdded\"\n\t| \"toolDiffContext\"\n\t| \"toolDiffRemoved\"\n\t| \"toolOutput\"\n\t| \"toolTitle\";\n\nexport type ApplyPatchThemeBg = \"toolErrorBg\" | \"toolPendingBg\" | \"toolSuccessBg\";\n\nexport type ApplyPatchTheme = {\n\tfg: (name: ApplyPatchThemeColor, text: string) => string;\n\tbg: (name: ApplyPatchThemeBg, text: string) => string;\n\tbold: (text: string) => string;\n\tinverse: (text: string) => string;\n};\n\nexport type ApplyPatchRenderState = {\n\tcwd?: string;\n\tpatchText?: string;\n\tcallText?: string;\n\tcollapsed?: string;\n\texpanded?: string;\n\tstreamingInput?: string;\n\tstreamingParser?: { pushDelta: (delta: string) => ParsedPatch[] };\n\tstreamingHunks?: ParsedPatch[];\n\tstreamingError?: string;\n};\n\nexport type ApplyPatchToolDefinition = ToolDefinition<\n\ttypeof APPLY_PATCH_PARAMS,\n\tApplyPatchToolDetails | undefined,\n\tApplyPatchRenderState\n>;\n\nexport type ApplyPatchExtensionAPI = Pick<ExtensionAPI, \"on\" | \"getActiveTools\" | \"getAllTools\" | \"setActiveTools\"> & {\n\tregisterTool: (tool: ApplyPatchToolDefinition) => void;\n\tregisterLazyToolActivator?: ExtensionAPI[\"registerLazyToolActivator\"];\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/loop-guard/renderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAKzD,eAAO,MAAM,qBAAqB,EAAE,eAAe,CAAC,kBAAkB,CAUrE,CAAC"}
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/loop-guard/renderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,eAAO,MAAM,qBAAqB,EAAE,eAAe,CAAC,kBAAkB,CAIpE,CAAC"}
@@ -1,18 +1,10 @@
1
- import { Box, Text } from "@earendil-works/pi-tui";
2
- const BOLD = "\u001b[1m";
3
- const BOLD_OFF = "\u001b[22m";
4
- export const renderLoopGuardNotice = (message, options, theme) => {
1
+ import { noticeMessageRenderer } from "../../notice/index.js";
2
+ export const renderLoopGuardNotice = noticeMessageRenderer((message) => {
5
3
  const details = message.details;
6
4
  if (details === undefined)
7
5
  return undefined;
8
- const box = new Box(1, 1, (text) => theme.bg("customMessageBg", text));
9
- box.addChild(new Text(theme.fg("accent", `${BOLD}${titleLine(details)}${BOLD_OFF}`), 0, 0));
10
- box.addChild(new Text(theme.fg("dim", whyLine(details)), 0, 0));
11
- if (options.expanded) {
12
- box.addChild(new Text(theme.fg("dim", expandedLine(details)), 0, 0));
13
- }
14
- return box;
15
- };
6
+ return { title: titleLine(details), why: whyLine(details), expandedLine: expandedLine(details) };
7
+ });
16
8
  function titleLine(detection) {
17
9
  switch (detection.kind) {
18
10
  case "identical":
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/loop-guard/renderer.ts"],"names":[],"mappings":"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","sourcesContent":["import { Box, Text } from \"@earendil-works/pi-tui\";\nimport type { MessageRenderer } from \"../../types.ts\";\nimport type { LoopGuardDetection } from \"./detectors.ts\";\n\nconst BOLD = \"\\u001b[1m\";\nconst BOLD_OFF = \"\\u001b[22m\";\n\nexport const renderLoopGuardNotice: MessageRenderer<LoopGuardDetection> = (message, options, theme) => {\n\tconst details = message.details;\n\tif (details === undefined) return undefined;\n\tconst box = new Box(1, 1, (text) => theme.bg(\"customMessageBg\", text));\n\tbox.addChild(new Text(theme.fg(\"accent\", `${BOLD}${titleLine(details)}${BOLD_OFF}`), 0, 0));\n\tbox.addChild(new Text(theme.fg(\"dim\", whyLine(details)), 0, 0));\n\tif (options.expanded) {\n\t\tbox.addChild(new Text(theme.fg(\"dim\", expandedLine(details)), 0, 0));\n\t}\n\treturn box;\n};\n\nfunction titleLine(detection: LoopGuardDetection): string {\n\tswitch (detection.kind) {\n\t\tcase \"identical\":\n\t\t\treturn `⚠ Loop guard · identical calls ×${detection.count} (${detection.toolName})`;\n\t\tcase \"similar\":\n\t\t\treturn `⚠ Loop guard · near-identical calls ×${detection.count} (${detection.toolName})`;\n\t\tcase \"cycle\":\n\t\t\treturn `⚠ Loop guard · repeating pattern ×${detection.count} (period ${detection.period})`;\n\t}\n}\n\nfunction whyLine(detection: LoopGuardDetection): string {\n\tswitch (detection.kind) {\n\t\tcase \"identical\":\n\t\t\treturn \"Same tool, same arguments, again. The agent was told to reuse the result or change the call.\";\n\t\tcase \"similar\": {\n\t\t\tconst percent = Math.round(detection.similarity * 100);\n\t\t\treturn `Argument similarity ~${percent}%. The agent was told to verify this is distinct work, not a lazy loop.`;\n\t\t}\n\t\tcase \"cycle\": {\n\t\t\tconst pattern = detection.cycleTools.join(\" -> \");\n\t\t\treturn `Tool-call cycle [${pattern}]. The agent was told to break the rotation or justify the progress.`;\n\t\t}\n\t}\n}\n\nfunction expandedLine(detection: LoopGuardDetection): string {\n\tswitch (detection.kind) {\n\t\tcase \"identical\":\n\t\t\treturn `tool ${detection.toolName} · ${detection.count} consecutive identical calls when the reminder fired`;\n\t\tcase \"similar\":\n\t\t\treturn `tool ${detection.toolName} · ${detection.count} consecutive same-tool calls at ~${Math.round(detection.similarity * 100)}% args similarity`;\n\t\tcase \"cycle\":\n\t\t\treturn `cycle ${detection.cycleTools.join(\" -> \")} · ${detection.count} full repetitions in the tracked window`;\n\t}\n}\n"]}
1
+ {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/loop-guard/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAI9D,MAAM,CAAC,MAAM,qBAAqB,GAAwC,qBAAqB,CAAC,CAAC,OAAO,EAAE,EAAE;IAC3G,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAChC,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC5C,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;AAClG,CAAC,CAAC,CAAC;AAEH,SAAS,SAAS,CAAC,SAA6B;IAC/C,QAAQ,SAAS,CAAC,IAAI,EAAE,CAAC;QACxB,KAAK,WAAW;YACf,OAAO,mCAAmC,SAAS,CAAC,KAAK,KAAK,SAAS,CAAC,QAAQ,GAAG,CAAC;QACrF,KAAK,SAAS;YACb,OAAO,wCAAwC,SAAS,CAAC,KAAK,KAAK,SAAS,CAAC,QAAQ,GAAG,CAAC;QAC1F,KAAK,OAAO;YACX,OAAO,qCAAqC,SAAS,CAAC,KAAK,YAAY,SAAS,CAAC,MAAM,GAAG,CAAC;IAC7F,CAAC;AACF,CAAC;AAED,SAAS,OAAO,CAAC,SAA6B;IAC7C,QAAQ,SAAS,CAAC,IAAI,EAAE,CAAC;QACxB,KAAK,WAAW;YACf,OAAO,8FAA8F,CAAC;QACvG,KAAK,SAAS,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC;YACvD,OAAO,wBAAwB,OAAO,yEAAyE,CAAC;QACjH,CAAC;QACD,KAAK,OAAO,EAAE,CAAC;YACd,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAClD,OAAO,oBAAoB,OAAO,sEAAsE,CAAC;QAC1G,CAAC;IACF,CAAC;AACF,CAAC;AAED,SAAS,YAAY,CAAC,SAA6B;IAClD,QAAQ,SAAS,CAAC,IAAI,EAAE,CAAC;QACxB,KAAK,WAAW;YACf,OAAO,QAAQ,SAAS,CAAC,QAAQ,MAAM,SAAS,CAAC,KAAK,sDAAsD,CAAC;QAC9G,KAAK,SAAS;YACb,OAAO,QAAQ,SAAS,CAAC,QAAQ,MAAM,SAAS,CAAC,KAAK,oCAAoC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,GAAG,GAAG,CAAC,mBAAmB,CAAC;QACrJ,KAAK,OAAO;YACX,OAAO,SAAS,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,SAAS,CAAC,KAAK,yCAAyC,CAAC;IAClH,CAAC;AACF,CAAC","sourcesContent":["import { noticeMessageRenderer } from \"../../notice/index.ts\";\nimport type { MessageRenderer } from \"../../types.ts\";\nimport type { LoopGuardDetection } from \"./detectors.ts\";\n\nexport const renderLoopGuardNotice: MessageRenderer<LoopGuardDetection> = noticeMessageRenderer((message) => {\n\tconst details = message.details;\n\tif (details === undefined) return undefined;\n\treturn { title: titleLine(details), why: whyLine(details), expandedLine: expandedLine(details) };\n});\n\nfunction titleLine(detection: LoopGuardDetection): string {\n\tswitch (detection.kind) {\n\t\tcase \"identical\":\n\t\t\treturn `⚠ Loop guard · identical calls ×${detection.count} (${detection.toolName})`;\n\t\tcase \"similar\":\n\t\t\treturn `⚠ Loop guard · near-identical calls ×${detection.count} (${detection.toolName})`;\n\t\tcase \"cycle\":\n\t\t\treturn `⚠ Loop guard · repeating pattern ×${detection.count} (period ${detection.period})`;\n\t}\n}\n\nfunction whyLine(detection: LoopGuardDetection): string {\n\tswitch (detection.kind) {\n\t\tcase \"identical\":\n\t\t\treturn \"Same tool, same arguments, again. The agent was told to reuse the result or change the call.\";\n\t\tcase \"similar\": {\n\t\t\tconst percent = Math.round(detection.similarity * 100);\n\t\t\treturn `Argument similarity ~${percent}%. The agent was told to verify this is distinct work, not a lazy loop.`;\n\t\t}\n\t\tcase \"cycle\": {\n\t\t\tconst pattern = detection.cycleTools.join(\" -> \");\n\t\t\treturn `Tool-call cycle [${pattern}]. The agent was told to break the rotation or justify the progress.`;\n\t\t}\n\t}\n}\n\nfunction expandedLine(detection: LoopGuardDetection): string {\n\tswitch (detection.kind) {\n\t\tcase \"identical\":\n\t\t\treturn `tool ${detection.toolName} · ${detection.count} consecutive identical calls when the reminder fired`;\n\t\tcase \"similar\":\n\t\t\treturn `tool ${detection.toolName} · ${detection.count} consecutive same-tool calls at ~${Math.round(detection.similarity * 100)}% args similarity`;\n\t\tcase \"cycle\":\n\t\t\treturn `cycle ${detection.cycleTools.join(\" -> \")} · ${detection.count} full repetitions in the tracked window`;\n\t}\n}\n"]}
@@ -0,0 +1,6 @@
1
+ import type { ExtensionAPI } from "../../types.ts";
2
+ import { type RuleActivationDetails } from "./types.ts";
3
+ export { type ProjectRulesActivationDetails, RULE_ACTIVATION_ENTRY_TYPE, type RuleActivationDetails, type TtsrActivationDetails, } from "./types.ts";
4
+ export declare function registerRuleActivationRenderer(pi: ExtensionAPI): void;
5
+ export declare function appendRuleActivation(pi: ExtensionAPI, details: RuleActivationDetails): void;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/rule-activation/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,OAAO,EAA8B,KAAK,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEpF,OAAO,EACN,KAAK,6BAA6B,EAClC,0BAA0B,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,GAC1B,MAAM,YAAY,CAAC;AAEpB,wBAAgB,8BAA8B,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAErE;AAED,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,qBAAqB,GAAG,IAAI,CAE3F"}
@@ -0,0 +1,10 @@
1
+ import { renderRuleActivationEntry } from "./renderer.js";
2
+ import { RULE_ACTIVATION_ENTRY_TYPE } from "./types.js";
3
+ export { RULE_ACTIVATION_ENTRY_TYPE, } from "./types.js";
4
+ export function registerRuleActivationRenderer(pi) {
5
+ pi.registerEntryRenderer(RULE_ACTIVATION_ENTRY_TYPE, renderRuleActivationEntry);
6
+ }
7
+ export function appendRuleActivation(pi, details) {
8
+ pi.appendEntry(RULE_ACTIVATION_ENTRY_TYPE, details);
9
+ }
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/rule-activation/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,0BAA0B,EAA8B,MAAM,YAAY,CAAC;AAEpF,OAAO,EAEN,0BAA0B,GAG1B,MAAM,YAAY,CAAC;AAEpB,MAAM,UAAU,8BAA8B,CAAC,EAAgB;IAC9D,EAAE,CAAC,qBAAqB,CAAC,0BAA0B,EAAE,yBAAyB,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,EAAgB,EAAE,OAA8B;IACpF,EAAE,CAAC,WAAW,CAAC,0BAA0B,EAAE,OAAO,CAAC,CAAC;AACrD,CAAC","sourcesContent":["import type { ExtensionAPI } from \"../../types.ts\";\nimport { renderRuleActivationEntry } from \"./renderer.ts\";\nimport { RULE_ACTIVATION_ENTRY_TYPE, type RuleActivationDetails } from \"./types.ts\";\n\nexport {\n\ttype ProjectRulesActivationDetails,\n\tRULE_ACTIVATION_ENTRY_TYPE,\n\ttype RuleActivationDetails,\n\ttype TtsrActivationDetails,\n} from \"./types.ts\";\n\nexport function registerRuleActivationRenderer(pi: ExtensionAPI): void {\n\tpi.registerEntryRenderer(RULE_ACTIVATION_ENTRY_TYPE, renderRuleActivationEntry);\n}\n\nexport function appendRuleActivation(pi: ExtensionAPI, details: RuleActivationDetails): void {\n\tpi.appendEntry(RULE_ACTIVATION_ENTRY_TYPE, details);\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { EntryRenderer } from "../../types.ts";
2
+ export declare const renderRuleActivationEntry: EntryRenderer<unknown>;
3
+ //# sourceMappingURL=renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/rule-activation/renderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGpD,eAAO,MAAM,yBAAyB,EAAE,aAAa,CAAC,OAAO,CAI3D,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { noticeEntryRenderer } from "../../notice/index.js";
2
+ import { parseRuleActivationDetails } from "./types.js";
3
+ export const renderRuleActivationEntry = noticeEntryRenderer((entry) => {
4
+ const details = parseRuleActivationDetails(entry.data);
5
+ if (details === undefined)
6
+ return undefined;
7
+ return { title: titleLine(details), why: summaryLine(details), expandedLine: detailLine(details) };
8
+ });
9
+ function titleLine(details) {
10
+ switch (details.kind) {
11
+ case "project-rules":
12
+ return `● Project rules · ${details.targetPath}`;
13
+ case "ttsr":
14
+ return `⚠ Stream rule · ${details.owner}`;
15
+ }
16
+ }
17
+ function summaryLine(details) {
18
+ switch (details.kind) {
19
+ case "project-rules": {
20
+ const noun = details.rules.length === 1 ? "instruction" : "instructions";
21
+ return `${details.rules.length} ${noun} matched and injected for this tool result.`;
22
+ }
23
+ case "ttsr":
24
+ return details.remediation === "nudge"
25
+ ? "Output interrupted; a corrective nudge was queued."
26
+ : "Corrupted generation discarded; bounded provider retry started.";
27
+ }
28
+ }
29
+ function detailLine(details) {
30
+ switch (details.kind) {
31
+ case "project-rules":
32
+ return details.rules.map((rule) => `rule ${rule}`).join("\n");
33
+ case "ttsr":
34
+ return `remediation ${details.remediation} · observed ${details.rules.join(", ")}`;
35
+ }
36
+ }
37
+ //# sourceMappingURL=renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/rule-activation/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAE,0BAA0B,EAA8B,MAAM,YAAY,CAAC;AAEpF,MAAM,CAAC,MAAM,yBAAyB,GAA2B,mBAAmB,CAAC,CAAC,KAAK,EAAE,EAAE;IAC9F,MAAM,OAAO,GAAG,0BAA0B,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACvD,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC5C,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;AACpG,CAAC,CAAC,CAAC;AAEH,SAAS,SAAS,CAAC,OAA8B;IAChD,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACtB,KAAK,eAAe;YACnB,OAAO,qBAAqB,OAAO,CAAC,UAAU,EAAE,CAAC;QAClD,KAAK,MAAM;YACV,OAAO,mBAAmB,OAAO,CAAC,KAAK,EAAE,CAAC;IAC5C,CAAC;AACF,CAAC;AAED,SAAS,WAAW,CAAC,OAA8B;IAClD,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACtB,KAAK,eAAe,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,cAAc,CAAC;YACzE,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,6CAA6C,CAAC;QACrF,CAAC;QACD,KAAK,MAAM;YACV,OAAO,OAAO,CAAC,WAAW,KAAK,OAAO;gBACrC,CAAC,CAAC,oDAAoD;gBACtD,CAAC,CAAC,iEAAiE,CAAC;IACvE,CAAC;AACF,CAAC;AAED,SAAS,UAAU,CAAC,OAA8B;IACjD,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACtB,KAAK,eAAe;YACnB,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/D,KAAK,MAAM;YACV,OAAO,eAAe,OAAO,CAAC,WAAW,eAAe,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACrF,CAAC;AACF,CAAC","sourcesContent":["import { noticeEntryRenderer } from \"../../notice/index.ts\";\nimport type { EntryRenderer } from \"../../types.ts\";\nimport { parseRuleActivationDetails, type RuleActivationDetails } from \"./types.ts\";\n\nexport const renderRuleActivationEntry: EntryRenderer<unknown> = noticeEntryRenderer((entry) => {\n\tconst details = parseRuleActivationDetails(entry.data);\n\tif (details === undefined) return undefined;\n\treturn { title: titleLine(details), why: summaryLine(details), expandedLine: detailLine(details) };\n});\n\nfunction titleLine(details: RuleActivationDetails): string {\n\tswitch (details.kind) {\n\t\tcase \"project-rules\":\n\t\t\treturn `● Project rules · ${details.targetPath}`;\n\t\tcase \"ttsr\":\n\t\t\treturn `⚠ Stream rule · ${details.owner}`;\n\t}\n}\n\nfunction summaryLine(details: RuleActivationDetails): string {\n\tswitch (details.kind) {\n\t\tcase \"project-rules\": {\n\t\t\tconst noun = details.rules.length === 1 ? \"instruction\" : \"instructions\";\n\t\t\treturn `${details.rules.length} ${noun} matched and injected for this tool result.`;\n\t\t}\n\t\tcase \"ttsr\":\n\t\t\treturn details.remediation === \"nudge\"\n\t\t\t\t? \"Output interrupted; a corrective nudge was queued.\"\n\t\t\t\t: \"Corrupted generation discarded; bounded provider retry started.\";\n\t}\n}\n\nfunction detailLine(details: RuleActivationDetails): string {\n\tswitch (details.kind) {\n\t\tcase \"project-rules\":\n\t\t\treturn details.rules.map((rule) => `rule ${rule}`).join(\"\\n\");\n\t\tcase \"ttsr\":\n\t\t\treturn `remediation ${details.remediation} · observed ${details.rules.join(\", \")}`;\n\t}\n}\n"]}
@@ -0,0 +1,15 @@
1
+ export declare const RULE_ACTIVATION_ENTRY_TYPE = "rule-activation";
2
+ export interface ProjectRulesActivationDetails {
3
+ readonly kind: "project-rules";
4
+ readonly targetPath: string;
5
+ readonly rules: readonly string[];
6
+ }
7
+ export interface TtsrActivationDetails {
8
+ readonly kind: "ttsr";
9
+ readonly owner: string;
10
+ readonly rules: readonly string[];
11
+ readonly remediation: "nudge" | "provider-error";
12
+ }
13
+ export type RuleActivationDetails = ProjectRulesActivationDetails | TtsrActivationDetails;
14
+ export declare function parseRuleActivationDetails(value: unknown): RuleActivationDetails | undefined;
15
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/rule-activation/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,0BAA0B,oBAAoB,CAAC;AAE5D,MAAM,WAAW,6BAA6B;IAC7C,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,OAAO,GAAG,gBAAgB,CAAC;CACjD;AAED,MAAM,MAAM,qBAAqB,GAAG,6BAA6B,GAAG,qBAAqB,CAAC;AAE1F,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,qBAAqB,GAAG,SAAS,CAW5F"}
@@ -0,0 +1,45 @@
1
+ export const RULE_ACTIVATION_ENTRY_TYPE = "rule-activation";
2
+ export function parseRuleActivationDetails(value) {
3
+ if (!isObject(value))
4
+ return undefined;
5
+ const kind = Reflect.get(value, "kind");
6
+ switch (kind) {
7
+ case "project-rules":
8
+ return parseProjectRulesActivation(value);
9
+ case "ttsr":
10
+ return parseTtsrActivation(value);
11
+ default:
12
+ return undefined;
13
+ }
14
+ }
15
+ function parseProjectRulesActivation(value) {
16
+ const targetPath = Reflect.get(value, "targetPath");
17
+ const rules = stringList(Reflect.get(value, "rules"));
18
+ if (typeof targetPath !== "string" || targetPath.length === 0 || rules === undefined)
19
+ return undefined;
20
+ return { kind: "project-rules", targetPath, rules };
21
+ }
22
+ function parseTtsrActivation(value) {
23
+ const owner = Reflect.get(value, "owner");
24
+ const rules = stringList(Reflect.get(value, "rules"));
25
+ const remediation = Reflect.get(value, "remediation");
26
+ if (typeof owner !== "string" ||
27
+ owner.length === 0 ||
28
+ rules === undefined ||
29
+ (remediation !== "nudge" && remediation !== "provider-error")) {
30
+ return undefined;
31
+ }
32
+ return { kind: "ttsr", owner, rules, remediation };
33
+ }
34
+ function stringList(value) {
35
+ if (!Array.isArray(value) ||
36
+ value.length === 0 ||
37
+ !value.every((entry) => typeof entry === "string" && entry.length > 0)) {
38
+ return undefined;
39
+ }
40
+ return value;
41
+ }
42
+ function isObject(value) {
43
+ return typeof value === "object" && value !== null && !Array.isArray(value);
44
+ }
45
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/rule-activation/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,0BAA0B,GAAG,iBAAiB,CAAC;AAiB5D,MAAM,UAAU,0BAA0B,CAAC,KAAc;IACxD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACxC,QAAQ,IAAI,EAAE,CAAC;QACd,KAAK,eAAe;YACnB,OAAO,2BAA2B,CAAC,KAAK,CAAC,CAAC;QAC3C,KAAK,MAAM;YACV,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACnC;YACC,OAAO,SAAS,CAAC;IACnB,CAAC;AACF,CAAC;AAED,SAAS,2BAA2B,CAAC,KAAa;IACjD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IACtD,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACvG,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;AACrD,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa;IACzC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IACtD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IACtD,IACC,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,CAAC,MAAM,KAAK,CAAC;QAClB,KAAK,KAAK,SAAS;QACnB,CAAC,WAAW,KAAK,OAAO,IAAI,WAAW,KAAK,gBAAgB,CAAC,EAC5D,CAAC;QACF,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;AACpD,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IACjC,IACC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACrB,KAAK,CAAC,MAAM,KAAK,CAAC;QAClB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EACrE,CAAC;QACF,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC","sourcesContent":["export const RULE_ACTIVATION_ENTRY_TYPE = \"rule-activation\";\n\nexport interface ProjectRulesActivationDetails {\n\treadonly kind: \"project-rules\";\n\treadonly targetPath: string;\n\treadonly rules: readonly string[];\n}\n\nexport interface TtsrActivationDetails {\n\treadonly kind: \"ttsr\";\n\treadonly owner: string;\n\treadonly rules: readonly string[];\n\treadonly remediation: \"nudge\" | \"provider-error\";\n}\n\nexport type RuleActivationDetails = ProjectRulesActivationDetails | TtsrActivationDetails;\n\nexport function parseRuleActivationDetails(value: unknown): RuleActivationDetails | undefined {\n\tif (!isObject(value)) return undefined;\n\tconst kind = Reflect.get(value, \"kind\");\n\tswitch (kind) {\n\t\tcase \"project-rules\":\n\t\t\treturn parseProjectRulesActivation(value);\n\t\tcase \"ttsr\":\n\t\t\treturn parseTtsrActivation(value);\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n\nfunction parseProjectRulesActivation(value: object): ProjectRulesActivationDetails | undefined {\n\tconst targetPath = Reflect.get(value, \"targetPath\");\n\tconst rules = stringList(Reflect.get(value, \"rules\"));\n\tif (typeof targetPath !== \"string\" || targetPath.length === 0 || rules === undefined) return undefined;\n\treturn { kind: \"project-rules\", targetPath, rules };\n}\n\nfunction parseTtsrActivation(value: object): TtsrActivationDetails | undefined {\n\tconst owner = Reflect.get(value, \"owner\");\n\tconst rules = stringList(Reflect.get(value, \"rules\"));\n\tconst remediation = Reflect.get(value, \"remediation\");\n\tif (\n\t\ttypeof owner !== \"string\" ||\n\t\towner.length === 0 ||\n\t\trules === undefined ||\n\t\t(remediation !== \"nudge\" && remediation !== \"provider-error\")\n\t) {\n\t\treturn undefined;\n\t}\n\treturn { kind: \"ttsr\", owner, rules, remediation };\n}\n\nfunction stringList(value: unknown): readonly string[] | undefined {\n\tif (\n\t\t!Array.isArray(value) ||\n\t\tvalue.length === 0 ||\n\t\t!value.every((entry) => typeof entry === \"string\" && entry.length > 0)\n\t) {\n\t\treturn undefined;\n\t}\n\treturn value;\n}\n\nfunction isObject(value: unknown): value is object {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { PiRulesConfig } from "./rules/types.ts";
2
+ export declare function configFromEnvironment(env?: NodeJS.ProcessEnv): PiRulesConfig;
3
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/rules/config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAItD,wBAAgB,qBAAqB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,aAAa,CAOzF"}
@@ -0,0 +1,24 @@
1
+ import { defaultConfig } from "./rules/engine.js";
2
+ const TRUTHY_VALUES = new Set(["1", "true", "yes", "on"]);
3
+ export function configFromEnvironment(env = process.env) {
4
+ const config = defaultConfig();
5
+ const disabled = readEnv(env, "PI_RULES_DISABLED");
6
+ config.disabled = disabled !== undefined && TRUTHY_VALUES.has(disabled.trim().toLowerCase());
7
+ config.maxRuleChars = parsePositiveInteger(readEnv(env, "PI_RULES_MAX_RULE_CHARS")) ?? config.maxRuleChars;
8
+ config.maxResultChars = parsePositiveInteger(readEnv(env, "PI_RULES_MAX_RESULT_CHARS")) ?? config.maxResultChars;
9
+ return config;
10
+ }
11
+ function readEnv(env, name) {
12
+ const value = env[name];
13
+ return typeof value === "string" && value.trim().length > 0 ? value : undefined;
14
+ }
15
+ function parsePositiveInteger(value) {
16
+ if (value === undefined)
17
+ return undefined;
18
+ const normalized = value.trim();
19
+ if (!/^\d+$/.test(normalized))
20
+ return undefined;
21
+ const parsed = Number(normalized);
22
+ return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : undefined;
23
+ }
24
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/rules/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGlD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AAE1D,MAAM,UAAU,qBAAqB,CAAC,GAAG,GAAsB,OAAO,CAAC,GAAG;IACzE,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;IACnD,MAAM,CAAC,QAAQ,GAAG,QAAQ,KAAK,SAAS,IAAI,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IAC7F,MAAM,CAAC,YAAY,GAAG,oBAAoB,CAAC,OAAO,CAAC,GAAG,EAAE,yBAAyB,CAAC,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC;IAC3G,MAAM,CAAC,cAAc,GAAG,oBAAoB,CAAC,OAAO,CAAC,GAAG,EAAE,2BAA2B,CAAC,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC;IACjH,OAAO,MAAM,CAAC;AACf,CAAC;AAED,SAAS,OAAO,CAAC,GAAsB,EAAE,IAAY;IACpD,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;IACxB,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACjF,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAyB;IACtD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;QAAE,OAAO,SAAS,CAAC;IAChD,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAClC,OAAO,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AACxE,CAAC","sourcesContent":["import { defaultConfig } from \"./rules/engine.ts\";\nimport type { PiRulesConfig } from \"./rules/types.ts\";\n\nconst TRUTHY_VALUES = new Set([\"1\", \"true\", \"yes\", \"on\"]);\n\nexport function configFromEnvironment(env: NodeJS.ProcessEnv = process.env): PiRulesConfig {\n\tconst config = defaultConfig();\n\tconst disabled = readEnv(env, \"PI_RULES_DISABLED\");\n\tconfig.disabled = disabled !== undefined && TRUTHY_VALUES.has(disabled.trim().toLowerCase());\n\tconfig.maxRuleChars = parsePositiveInteger(readEnv(env, \"PI_RULES_MAX_RULE_CHARS\")) ?? config.maxRuleChars;\n\tconfig.maxResultChars = parsePositiveInteger(readEnv(env, \"PI_RULES_MAX_RESULT_CHARS\")) ?? config.maxResultChars;\n\treturn config;\n}\n\nfunction readEnv(env: NodeJS.ProcessEnv, name: string): string | undefined {\n\tconst value = env[name];\n\treturn typeof value === \"string\" && value.trim().length > 0 ? value : undefined;\n}\n\nfunction parsePositiveInteger(value: string | undefined): number | undefined {\n\tif (value === undefined) return undefined;\n\tconst normalized = value.trim();\n\tif (!/^\\d+$/.test(normalized)) return undefined;\n\tconst parsed = Number(normalized);\n\treturn Number.isSafeInteger(parsed) && parsed > 0 ? parsed : undefined;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/rules/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAanD,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAkI/D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/rules/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAenD,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CA0I/D"}
@@ -1,7 +1,9 @@
1
1
  import { readFileSync, realpathSync } from "node:fs";
2
2
  import { isAbsolute, relative } from "node:path";
3
+ import { appendRuleActivation, registerRuleActivationRenderer } from "../rule-activation/index.js";
3
4
  import { registerSlashCommands } from "./commands.js";
4
- import { createEngine, defaultConfig } from "./rules/engine.js";
5
+ import { configFromEnvironment } from "./config.js";
6
+ import { createEngine } from "./rules/engine.js";
5
7
  import { findRuleCandidates } from "./rules/finder.js";
6
8
  import { findProjectRoot } from "./rules/project-root.js";
7
9
  import { extractToolPaths } from "./rules/tool-paths.js";
@@ -17,7 +19,8 @@ export default function piRulesExtension(pi) {
17
19
  default: "both",
18
20
  description: "Rule injection mode: static, dynamic, both, or off.",
19
21
  });
20
- const config = defaultConfig();
22
+ const config = configFromEnvironment();
23
+ const envDisabled = config.disabled;
21
24
  const engine = createEngine(config, {
22
25
  findCandidates: findRuleCandidates,
23
26
  readFile: (path) => {
@@ -32,11 +35,12 @@ export default function piRulesExtension(pi) {
32
35
  extractToolPaths,
33
36
  });
34
37
  registerSlashCommands(pi, engine);
38
+ registerRuleActivationRenderer(pi);
35
39
  function syncConfigFromFlags() {
36
40
  const disabled = pi.getFlag("pi-rules-disabled");
37
41
  const mode = pi.getFlag("pi-rules-mode");
38
42
  if (typeof disabled === "boolean") {
39
- engine.config.disabled = disabled;
43
+ engine.config.disabled = disabled || envDisabled;
40
44
  }
41
45
  if (typeof mode === "string" && isPiRulesMode(mode)) {
42
46
  engine.config.mode = mode;
@@ -107,10 +111,16 @@ export default function piRulesExtension(pi) {
107
111
  return undefined;
108
112
  }
109
113
  const firstPendingTarget = pendingFingerprints[0]?.targetPath ?? firstTargetPath;
110
- const block = engine.formatDynamic(rules, displayPath(ctx.cwd, firstPendingTarget));
114
+ const targetPath = displayPath(ctx.cwd, firstPendingTarget);
115
+ const block = engine.formatDynamic(rules, targetPath);
111
116
  for (const rule of rules) {
112
117
  engine.markDynamicInjected(firstTargetPath, rule);
113
118
  }
119
+ appendRuleActivation(pi, {
120
+ kind: "project-rules",
121
+ targetPath,
122
+ rules: rules.map((rule) => rule.relativePath),
123
+ });
114
124
  return { content: [...event.content, { type: "text", text: block }] };
115
125
  });
116
126
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/rules/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync, realpathSync } from \"node:fs\";\nimport { isAbsolute, relative } from \"node:path\";\n\nimport type { ExtensionAPI } from \"../../types.ts\";\n\nimport { registerSlashCommands } from \"./commands.ts\";\nimport { createEngine, defaultConfig } from \"./rules/engine.ts\";\nimport { findRuleCandidates } from \"./rules/finder.ts\";\nimport { findProjectRoot } from \"./rules/project-root.ts\";\nimport { extractToolPaths } from \"./rules/tool-paths.ts\";\nimport type { PiRulesConfig } from \"./rules/types.ts\";\n\ntype PiRulesMode = PiRulesConfig[\"mode\"];\n\nconst MODE_VALUES = new Set<string>([\"static\", \"dynamic\", \"both\", \"off\"]);\n\nexport default function piRulesExtension(pi: ExtensionAPI): void {\n\tpi.registerFlag(\"pi-rules-disabled\", {\n\t\ttype: \"boolean\",\n\t\tdefault: false,\n\t\tdescription: \"Disable pi-rules hooks.\",\n\t});\n\tpi.registerFlag(\"pi-rules-mode\", {\n\t\ttype: \"string\",\n\t\tdefault: \"both\",\n\t\tdescription: \"Rule injection mode: static, dynamic, both, or off.\",\n\t});\n\tconst config = defaultConfig();\n\tconst engine = createEngine(config, {\n\t\tfindCandidates: findRuleCandidates,\n\t\treadFile: (path) => {\n\t\t\ttry {\n\t\t\t\treturn readFileSync(path, \"utf-8\");\n\t\t\t} catch {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t},\n\t\tfindProjectRoot,\n\t\textractToolPaths,\n\t});\n\tregisterSlashCommands(pi, engine);\n\n\tfunction syncConfigFromFlags(): void {\n\t\tconst disabled = pi.getFlag(\"pi-rules-disabled\");\n\t\tconst mode = pi.getFlag(\"pi-rules-mode\");\n\n\t\tif (typeof disabled === \"boolean\") {\n\t\t\tengine.config.disabled = disabled;\n\t\t}\n\t\tif (typeof mode === \"string\" && isPiRulesMode(mode)) {\n\t\t\tengine.config.mode = mode;\n\t\t}\n\t}\n\n\tpi.on(\"session_start\", async (event, ctx) => {\n\t\tsyncConfigFromFlags();\n\t\tif (engine.config.disabled) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tengine.resetSession(ctx.cwd);\n\t\tpi.appendEntry(\"pi-rules.scan\", { cwd: ctx.cwd, reason: event.reason });\n\t\treturn undefined;\n\t});\n\n\tpi.on(\"session_compact\", async (event, ctx) => {\n\t\t// Rejected compactions do not mutate session state; do not reset rules.\n\t\tif (!event.accepted) return undefined;\n\t\tengine.resetSession(ctx.cwd);\n\t\tpi.appendEntry(\"pi-rules.scan\", { cwd: ctx.cwd, reason: \"compact\" });\n\t\treturn undefined;\n\t});\n\n\tpi.on(\"before_agent_start\", async (event, ctx) => {\n\t\tsyncConfigFromFlags();\n\t\tif (engine.config.disabled || engine.config.mode === \"off\" || engine.config.mode === \"dynamic\") {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst loaded = engine.loadStaticRules(ctx.cwd);\n\t\tconst nativeContextPaths = new Set(\n\t\t\tevent.systemPromptOptions.contextFiles?.flatMap((contextFile) => pathKeys(contextFile.path)) ?? [],\n\t\t);\n\t\tfor (const rule of loaded.rules) {\n\t\t\tif (nativeContextPaths.has(rule.path) || nativeContextPaths.has(rule.realPath)) {\n\t\t\t\tengine.markStaticInjected(rule);\n\t\t\t}\n\t\t}\n\t\t// Deliberately NOT gated on isStaticInjected: the host re-emits this from the BASE prompt\n\t\t// every user prompt, so a prior turn's mark would drop the block from turn 2 onward. The\n\t\t// marks below serve only the dynamic tool_result path.\n\t\tconst rules = loaded.rules.filter(\n\t\t\t(rule) => !nativeContextPaths.has(rule.path) && !nativeContextPaths.has(rule.realPath),\n\t\t);\n\n\t\tif (rules.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst block = engine.formatStatic(rules);\n\t\tfor (const rule of rules) {\n\t\t\tengine.markStaticInjected(rule);\n\t\t}\n\n\t\treturn { systemPrompt: event.systemPrompt + block };\n\t});\n\n\tpi.on(\"tool_result\", async (event, ctx) => {\n\t\tsyncConfigFromFlags();\n\t\tif (engine.config.disabled || engine.config.mode === \"off\" || engine.config.mode === \"static\" || event.isError) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst targetPaths = extractToolPaths(event, ctx.cwd);\n\t\tconst firstTargetPath = targetPaths[0];\n\t\tif (firstTargetPath === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst fingerprints = engine.fingerprintDynamicTargets(ctx.cwd, targetPaths);\n\t\tconst pendingFingerprints = fingerprints.filter((target) => !engine.isDynamicTargetFingerprintCurrent(target));\n\t\tif (pendingFingerprints.length === 0) {\n\t\t\tengine.commitDynamicTargetFingerprints(fingerprints);\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst loaded = engine.loadDynamicRules(\n\t\t\tctx.cwd,\n\t\t\tpendingFingerprints.map((target) => target.targetPath),\n\t\t);\n\t\tengine.commitDynamicTargetFingerprints(fingerprints);\n\t\tconst rules = loaded.rules.filter(\n\t\t\t(rule) => !engine.isStaticInjected(rule) && !engine.isDynamicInjected(firstTargetPath, rule),\n\t\t);\n\t\tif (rules.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst firstPendingTarget = pendingFingerprints[0]?.targetPath ?? firstTargetPath;\n\t\tconst block = engine.formatDynamic(rules, displayPath(ctx.cwd, firstPendingTarget));\n\t\tfor (const rule of rules) {\n\t\t\tengine.markDynamicInjected(firstTargetPath, rule);\n\t\t}\n\n\t\treturn { content: [...event.content, { type: \"text\", text: block }] };\n\t});\n}\n\nfunction isPiRulesMode(value: string): value is PiRulesMode {\n\treturn MODE_VALUES.has(value);\n}\n\nfunction pathKeys(filePath: string): string[] {\n\ttry {\n\t\treturn [filePath, realpathSync.native(filePath)];\n\t} catch {\n\t\treturn [filePath];\n\t}\n}\n\nfunction displayPath(cwd: string, filePath: string): string {\n\treturn isAbsolute(filePath) ? relative(cwd, filePath) : filePath;\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/rules/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync, realpathSync } from \"node:fs\";\nimport { isAbsolute, relative } from \"node:path\";\n\nimport type { ExtensionAPI } from \"../../types.ts\";\n\nimport { appendRuleActivation, registerRuleActivationRenderer } from \"../rule-activation/index.ts\";\nimport { registerSlashCommands } from \"./commands.ts\";\nimport { configFromEnvironment } from \"./config.ts\";\nimport { createEngine } from \"./rules/engine.ts\";\nimport { findRuleCandidates } from \"./rules/finder.ts\";\nimport { findProjectRoot } from \"./rules/project-root.ts\";\nimport { extractToolPaths } from \"./rules/tool-paths.ts\";\nimport type { PiRulesConfig } from \"./rules/types.ts\";\n\ntype PiRulesMode = PiRulesConfig[\"mode\"];\n\nconst MODE_VALUES = new Set<string>([\"static\", \"dynamic\", \"both\", \"off\"]);\n\nexport default function piRulesExtension(pi: ExtensionAPI): void {\n\tpi.registerFlag(\"pi-rules-disabled\", {\n\t\ttype: \"boolean\",\n\t\tdefault: false,\n\t\tdescription: \"Disable pi-rules hooks.\",\n\t});\n\tpi.registerFlag(\"pi-rules-mode\", {\n\t\ttype: \"string\",\n\t\tdefault: \"both\",\n\t\tdescription: \"Rule injection mode: static, dynamic, both, or off.\",\n\t});\n\tconst config = configFromEnvironment();\n\tconst envDisabled = config.disabled;\n\tconst engine = createEngine(config, {\n\t\tfindCandidates: findRuleCandidates,\n\t\treadFile: (path) => {\n\t\t\ttry {\n\t\t\t\treturn readFileSync(path, \"utf-8\");\n\t\t\t} catch {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t},\n\t\tfindProjectRoot,\n\t\textractToolPaths,\n\t});\n\tregisterSlashCommands(pi, engine);\n\tregisterRuleActivationRenderer(pi);\n\n\tfunction syncConfigFromFlags(): void {\n\t\tconst disabled = pi.getFlag(\"pi-rules-disabled\");\n\t\tconst mode = pi.getFlag(\"pi-rules-mode\");\n\n\t\tif (typeof disabled === \"boolean\") {\n\t\t\tengine.config.disabled = disabled || envDisabled;\n\t\t}\n\t\tif (typeof mode === \"string\" && isPiRulesMode(mode)) {\n\t\t\tengine.config.mode = mode;\n\t\t}\n\t}\n\n\tpi.on(\"session_start\", async (event, ctx) => {\n\t\tsyncConfigFromFlags();\n\t\tif (engine.config.disabled) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tengine.resetSession(ctx.cwd);\n\t\tpi.appendEntry(\"pi-rules.scan\", { cwd: ctx.cwd, reason: event.reason });\n\t\treturn undefined;\n\t});\n\n\tpi.on(\"session_compact\", async (event, ctx) => {\n\t\t// Rejected compactions do not mutate session state; do not reset rules.\n\t\tif (!event.accepted) return undefined;\n\t\tengine.resetSession(ctx.cwd);\n\t\tpi.appendEntry(\"pi-rules.scan\", { cwd: ctx.cwd, reason: \"compact\" });\n\t\treturn undefined;\n\t});\n\n\tpi.on(\"before_agent_start\", async (event, ctx) => {\n\t\tsyncConfigFromFlags();\n\t\tif (engine.config.disabled || engine.config.mode === \"off\" || engine.config.mode === \"dynamic\") {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst loaded = engine.loadStaticRules(ctx.cwd);\n\t\tconst nativeContextPaths = new Set(\n\t\t\tevent.systemPromptOptions.contextFiles?.flatMap((contextFile) => pathKeys(contextFile.path)) ?? [],\n\t\t);\n\t\tfor (const rule of loaded.rules) {\n\t\t\tif (nativeContextPaths.has(rule.path) || nativeContextPaths.has(rule.realPath)) {\n\t\t\t\tengine.markStaticInjected(rule);\n\t\t\t}\n\t\t}\n\t\t// Deliberately NOT gated on isStaticInjected: the host re-emits this from the BASE prompt\n\t\t// every user prompt, so a prior turn's mark would drop the block from turn 2 onward. The\n\t\t// marks below serve only the dynamic tool_result path.\n\t\tconst rules = loaded.rules.filter(\n\t\t\t(rule) => !nativeContextPaths.has(rule.path) && !nativeContextPaths.has(rule.realPath),\n\t\t);\n\n\t\tif (rules.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst block = engine.formatStatic(rules);\n\t\tfor (const rule of rules) {\n\t\t\tengine.markStaticInjected(rule);\n\t\t}\n\n\t\treturn { systemPrompt: event.systemPrompt + block };\n\t});\n\n\tpi.on(\"tool_result\", async (event, ctx) => {\n\t\tsyncConfigFromFlags();\n\t\tif (engine.config.disabled || engine.config.mode === \"off\" || engine.config.mode === \"static\" || event.isError) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst targetPaths = extractToolPaths(event, ctx.cwd);\n\t\tconst firstTargetPath = targetPaths[0];\n\t\tif (firstTargetPath === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst fingerprints = engine.fingerprintDynamicTargets(ctx.cwd, targetPaths);\n\t\tconst pendingFingerprints = fingerprints.filter((target) => !engine.isDynamicTargetFingerprintCurrent(target));\n\t\tif (pendingFingerprints.length === 0) {\n\t\t\tengine.commitDynamicTargetFingerprints(fingerprints);\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst loaded = engine.loadDynamicRules(\n\t\t\tctx.cwd,\n\t\t\tpendingFingerprints.map((target) => target.targetPath),\n\t\t);\n\t\tengine.commitDynamicTargetFingerprints(fingerprints);\n\t\tconst rules = loaded.rules.filter(\n\t\t\t(rule) => !engine.isStaticInjected(rule) && !engine.isDynamicInjected(firstTargetPath, rule),\n\t\t);\n\t\tif (rules.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst firstPendingTarget = pendingFingerprints[0]?.targetPath ?? firstTargetPath;\n\t\tconst targetPath = displayPath(ctx.cwd, firstPendingTarget);\n\t\tconst block = engine.formatDynamic(rules, targetPath);\n\t\tfor (const rule of rules) {\n\t\t\tengine.markDynamicInjected(firstTargetPath, rule);\n\t\t}\n\t\tappendRuleActivation(pi, {\n\t\t\tkind: \"project-rules\",\n\t\t\ttargetPath,\n\t\t\trules: rules.map((rule) => rule.relativePath),\n\t\t});\n\n\t\treturn { content: [...event.content, { type: \"text\", text: block }] };\n\t});\n}\n\nfunction isPiRulesMode(value: string): value is PiRulesMode {\n\treturn MODE_VALUES.has(value);\n}\n\nfunction pathKeys(filePath: string): string[] {\n\ttry {\n\t\treturn [filePath, realpathSync.native(filePath)];\n\t} catch {\n\t\treturn [filePath];\n\t}\n}\n\nfunction displayPath(cwd: string, filePath: string): string {\n\treturn isAbsolute(filePath) ? relative(cwd, filePath) : filePath;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/rules/rules/formatter.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,WAAW,aAAa;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;CACvB;AAyCD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,CAUlG;AAcD,wBAAgB,kBAAkB,CACjC,KAAK,EAAE,aAAa,CAAC,UAAU,CAAC,EAChC,kBAAkB,EAAE,MAAM,EAC1B,OAAO,EAAE,aAAa,GACpB,MAAM,CAQR"}
1
+ {"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/rules/rules/formatter.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,WAAW,aAAa;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;CACvB;AA2DD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,CAYlG;AAcD,wBAAgB,kBAAkB,CACjC,KAAK,EAAE,aAAa,CAAC,UAAU,CAAC,EAChC,kBAAkB,EAAE,MAAM,EAC1B,OAAO,EAAE,aAAa,GACpB,MAAM,CAaR"}
@@ -3,6 +3,20 @@ import { truncateBudget, truncateRule } from "./truncator.js";
3
3
  function formatRule(rule) {
4
4
  return `Instructions from: ${rule.path}\n${rule.body}`;
5
5
  }
6
+ function formatWithinResultBudget(rules, options, render) {
7
+ let bodyBudget = options.maxResultChars;
8
+ while (bodyBudget > 0) {
9
+ const truncatedRules = truncateRules(rules, { ...options, maxResultChars: bodyBudget });
10
+ if (truncatedRules.length === 0)
11
+ return "";
12
+ const block = render(truncatedRules);
13
+ const overflow = block.length - options.maxResultChars;
14
+ if (overflow <= 0)
15
+ return block;
16
+ bodyBudget = Math.max(0, bodyBudget - overflow);
17
+ }
18
+ return "";
19
+ }
6
20
  function truncateRules(rules, options) {
7
21
  const perRuleTruncated = rules.map((rule) => ({
8
22
  path: rule.path,
@@ -32,9 +46,11 @@ export function formatStaticBlock(rules, options) {
32
46
  if (rules.length === 0) {
33
47
  return "";
34
48
  }
35
- const body = neutralizeEnvelopeMarkers(`${PROJECT_RULES_HEADING}\n${truncateRules(rules, options).map(formatRule).join("\n\n")}`);
36
- const envelope = `${PROJECT_RULES_START_MARKER}\n${body}\n${PROJECT_RULES_END_MARKER}`;
37
- return `\n\n${PROJECT_RULES_REGION_START_MARKER}\n${envelope}\n${PROJECT_RULES_REGION_END_MARKER}`;
49
+ return formatWithinResultBudget(rules, options, (truncatedRules) => {
50
+ const body = neutralizeEnvelopeMarkers(`${PROJECT_RULES_HEADING}\n${truncatedRules.map(formatRule).join("\n\n")}`);
51
+ const envelope = `${PROJECT_RULES_START_MARKER}\n${body}\n${PROJECT_RULES_END_MARKER}`;
52
+ return `\n\n${PROJECT_RULES_REGION_START_MARKER}\n${envelope}\n${PROJECT_RULES_REGION_END_MARKER}`;
53
+ });
38
54
  }
39
55
  /**
40
56
  * A raw region sentinel inside a rule would terminate extraction early and drop every rule after it;
@@ -51,8 +67,8 @@ export function formatDynamicBlock(rules, targetRelativePath, options) {
51
67
  if (rules.length === 0) {
52
68
  return "";
53
69
  }
54
- return `\n\nAdditional project instructions matched for ${targetRelativePath}:\n\n${truncateRules(rules, options)
70
+ return formatWithinResultBudget(rules, options, (truncatedRules) => `\n\nAdditional project instructions matched for ${targetRelativePath}:\n\n${truncatedRules
55
71
  .map(formatRule)
56
- .join("\n\n")}`;
72
+ .join("\n\n")}`);
57
73
  }
58
74
  //# sourceMappingURL=formatter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/rules/rules/formatter.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tPROJECT_RULES_END_MARKER,\n\tPROJECT_RULES_HEADING,\n\tPROJECT_RULES_REGION_END_MARKER,\n\tPROJECT_RULES_REGION_START_MARKER,\n\tPROJECT_RULES_START_MARKER,\n} from \"./constants.ts\";\nimport { truncateBudget, truncateRule } from \"./truncator.ts\";\nimport type { LoadedRule } from \"./types.ts\";\n\nexport interface FormatOptions {\n\tmaxRuleChars: number;\n\tmaxResultChars: number;\n}\n\ntype TruncatedRule = {\n\tpath: string;\n\trelativePath: string;\n\tbody: string;\n};\n\nfunction formatRule(rule: TruncatedRule): string {\n\treturn `Instructions from: ${rule.path}\\n${rule.body}`;\n}\n\nfunction truncateRules(rules: ReadonlyArray<LoadedRule>, options: FormatOptions): TruncatedRule[] {\n\tconst perRuleTruncated = rules.map((rule) => ({\n\t\tpath: rule.path,\n\t\trelativePath: rule.relativePath,\n\t\tbody: truncateRule(rule.body, { maxChars: options.maxRuleChars, relativePath: rule.relativePath }).body,\n\t}));\n\tconst budgetedRules = truncateBudget({\n\t\trules: perRuleTruncated.map((rule) => ({ body: rule.body, relativePath: rule.relativePath })),\n\t\tmaxResultChars: options.maxResultChars,\n\t});\n\tconst truncatedRules: TruncatedRule[] = [];\n\n\tfor (let index = 0; index < budgetedRules.length; index += 1) {\n\t\tconst sourceRule = perRuleTruncated[index];\n\t\tconst budgetedRule = budgetedRules[index];\n\t\tif (sourceRule === undefined || budgetedRule === undefined) {\n\t\t\tcontinue;\n\t\t}\n\n\t\ttruncatedRules.push({\n\t\t\tpath: sourceRule.path,\n\t\t\trelativePath: budgetedRule.relativePath,\n\t\t\tbody: budgetedRule.body,\n\t\t});\n\t}\n\n\treturn truncatedRules;\n}\n\nexport function formatStaticBlock(rules: ReadonlyArray<LoadedRule>, options: FormatOptions): string {\n\tif (rules.length === 0) {\n\t\treturn \"\";\n\t}\n\n\tconst body = neutralizeEnvelopeMarkers(\n\t\t`${PROJECT_RULES_HEADING}\\n${truncateRules(rules, options).map(formatRule).join(\"\\n\\n\")}`,\n\t);\n\tconst envelope = `${PROJECT_RULES_START_MARKER}\\n${body}\\n${PROJECT_RULES_END_MARKER}`;\n\treturn `\\n\\n${PROJECT_RULES_REGION_START_MARKER}\\n${envelope}\\n${PROJECT_RULES_REGION_END_MARKER}`;\n}\n\n/**\n * A raw region sentinel inside a rule would terminate extraction early and drop every rule after it;\n * a raw semantic marker would instead corrupt the envelope structure the model reads.\n */\nfunction neutralizeEnvelopeMarkers(text: string): string {\n\treturn text\n\t\t.replaceAll(PROJECT_RULES_REGION_START_MARKER, \"&lt;!--senpi:project-rules:1:start--&gt;\")\n\t\t.replaceAll(PROJECT_RULES_REGION_END_MARKER, \"&lt;!--senpi:project-rules:1:end--&gt;\")\n\t\t.replaceAll(PROJECT_RULES_START_MARKER, \"&lt;project_rules&gt;\")\n\t\t.replaceAll(PROJECT_RULES_END_MARKER, \"&lt;/project_rules&gt;\");\n}\n\nexport function formatDynamicBlock(\n\trules: ReadonlyArray<LoadedRule>,\n\ttargetRelativePath: string,\n\toptions: FormatOptions,\n): string {\n\tif (rules.length === 0) {\n\t\treturn \"\";\n\t}\n\n\treturn `\\n\\nAdditional project instructions matched for ${targetRelativePath}:\\n\\n${truncateRules(rules, options)\n\t\t.map(formatRule)\n\t\t.join(\"\\n\\n\")}`;\n}\n"]}
1
+ {"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/rules/rules/formatter.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tPROJECT_RULES_END_MARKER,\n\tPROJECT_RULES_HEADING,\n\tPROJECT_RULES_REGION_END_MARKER,\n\tPROJECT_RULES_REGION_START_MARKER,\n\tPROJECT_RULES_START_MARKER,\n} from \"./constants.ts\";\nimport { truncateBudget, truncateRule } from \"./truncator.ts\";\nimport type { LoadedRule } from \"./types.ts\";\n\nexport interface FormatOptions {\n\tmaxRuleChars: number;\n\tmaxResultChars: number;\n}\n\ntype TruncatedRule = {\n\tpath: string;\n\trelativePath: string;\n\tbody: string;\n};\n\nfunction formatRule(rule: TruncatedRule): string {\n\treturn `Instructions from: ${rule.path}\\n${rule.body}`;\n}\n\nfunction formatWithinResultBudget(\n\trules: ReadonlyArray<LoadedRule>,\n\toptions: FormatOptions,\n\trender: (truncatedRules: ReadonlyArray<TruncatedRule>) => string,\n): string {\n\tlet bodyBudget = options.maxResultChars;\n\twhile (bodyBudget > 0) {\n\t\tconst truncatedRules = truncateRules(rules, { ...options, maxResultChars: bodyBudget });\n\t\tif (truncatedRules.length === 0) return \"\";\n\n\t\tconst block = render(truncatedRules);\n\t\tconst overflow = block.length - options.maxResultChars;\n\t\tif (overflow <= 0) return block;\n\t\tbodyBudget = Math.max(0, bodyBudget - overflow);\n\t}\n\treturn \"\";\n}\n\nfunction truncateRules(rules: ReadonlyArray<LoadedRule>, options: FormatOptions): TruncatedRule[] {\n\tconst perRuleTruncated = rules.map((rule) => ({\n\t\tpath: rule.path,\n\t\trelativePath: rule.relativePath,\n\t\tbody: truncateRule(rule.body, { maxChars: options.maxRuleChars, relativePath: rule.relativePath }).body,\n\t}));\n\tconst budgetedRules = truncateBudget({\n\t\trules: perRuleTruncated.map((rule) => ({ body: rule.body, relativePath: rule.relativePath })),\n\t\tmaxResultChars: options.maxResultChars,\n\t});\n\tconst truncatedRules: TruncatedRule[] = [];\n\n\tfor (let index = 0; index < budgetedRules.length; index += 1) {\n\t\tconst sourceRule = perRuleTruncated[index];\n\t\tconst budgetedRule = budgetedRules[index];\n\t\tif (sourceRule === undefined || budgetedRule === undefined) {\n\t\t\tcontinue;\n\t\t}\n\n\t\ttruncatedRules.push({\n\t\t\tpath: sourceRule.path,\n\t\t\trelativePath: budgetedRule.relativePath,\n\t\t\tbody: budgetedRule.body,\n\t\t});\n\t}\n\n\treturn truncatedRules;\n}\n\nexport function formatStaticBlock(rules: ReadonlyArray<LoadedRule>, options: FormatOptions): string {\n\tif (rules.length === 0) {\n\t\treturn \"\";\n\t}\n\n\treturn formatWithinResultBudget(rules, options, (truncatedRules) => {\n\t\tconst body = neutralizeEnvelopeMarkers(\n\t\t\t`${PROJECT_RULES_HEADING}\\n${truncatedRules.map(formatRule).join(\"\\n\\n\")}`,\n\t\t);\n\t\tconst envelope = `${PROJECT_RULES_START_MARKER}\\n${body}\\n${PROJECT_RULES_END_MARKER}`;\n\t\treturn `\\n\\n${PROJECT_RULES_REGION_START_MARKER}\\n${envelope}\\n${PROJECT_RULES_REGION_END_MARKER}`;\n\t});\n}\n\n/**\n * A raw region sentinel inside a rule would terminate extraction early and drop every rule after it;\n * a raw semantic marker would instead corrupt the envelope structure the model reads.\n */\nfunction neutralizeEnvelopeMarkers(text: string): string {\n\treturn text\n\t\t.replaceAll(PROJECT_RULES_REGION_START_MARKER, \"&lt;!--senpi:project-rules:1:start--&gt;\")\n\t\t.replaceAll(PROJECT_RULES_REGION_END_MARKER, \"&lt;!--senpi:project-rules:1:end--&gt;\")\n\t\t.replaceAll(PROJECT_RULES_START_MARKER, \"&lt;project_rules&gt;\")\n\t\t.replaceAll(PROJECT_RULES_END_MARKER, \"&lt;/project_rules&gt;\");\n}\n\nexport function formatDynamicBlock(\n\trules: ReadonlyArray<LoadedRule>,\n\ttargetRelativePath: string,\n\toptions: FormatOptions,\n): string {\n\tif (rules.length === 0) {\n\t\treturn \"\";\n\t}\n\n\treturn formatWithinResultBudget(\n\t\trules,\n\t\toptions,\n\t\t(truncatedRules) =>\n\t\t\t`\\n\\nAdditional project instructions matched for ${targetRelativePath}:\\n\\n${truncatedRules\n\t\t\t\t.map(formatRule)\n\t\t\t\t.join(\"\\n\\n\")}`,\n\t);\n}\n"]}
@@ -90,7 +90,7 @@ export interface TruncationResult {
90
90
  originalLength: number;
91
91
  }
92
92
  /**
93
- * Configuration knobs resolved from env vars and package.json.
93
+ * Configuration knobs resolved from environment variables.
94
94
  */
95
95
  export interface PiRulesConfig {
96
96
  disabled: boolean;